From 03901f36bfcabefd92f9b93db363b6982199431f Mon Sep 17 00:00:00 2001 From: PKiran <39373750+kiranparajuli589@users.noreply.github.com> Date: Tue, 6 Apr 2021 21:32:31 +0545 Subject: [PATCH 01/70] [tests-only] bump core commit id 2021/04/06 (#1614) --- .drone.env | 2 +- .../expected-failures-on-EOS-storage.md | 198 +++--- .../expected-failures-on-OCIS-storage.md | 608 ++++++++--------- .../expected-failures-on-OWNCLOUD-storage.md | 626 +++++++++--------- .../expected-failures-on-S3NG-storage.md | 609 ++++++++--------- 5 files changed, 1023 insertions(+), 1020 deletions(-) diff --git a/.drone.env b/.drone.env index 33dafb2008..905719775a 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=bf88f4d4a96d981008131fbb2fcbab7d51dfa600 +CORE_COMMITID=03130a083c1422dc0e2bd3cd888ac69f01483716 CORE_BRANCH=master diff --git a/tests/acceptance/expected-failures-on-EOS-storage.md b/tests/acceptance/expected-failures-on-EOS-storage.md index 18cd4916c1..a85eb26c00 100644 --- a/tests/acceptance/expected-failures-on-EOS-storage.md +++ b/tests/acceptance/expected-failures-on-EOS-storage.md @@ -81,17 +81,17 @@ - [apiAuthOcs/ocsPUTAuth.feature:10](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthOcs/ocsPUTAuth.feature#L10) ### [users can access each-others data using the new webdav API](https://github.com/owncloud/ocis/issues/1347) -- [apiAuthWebDav/webDavLOCKAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavLOCKAuth.feature#L38) -- [apiAuthWebDav/webDavMKCOLAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMKCOLAuth.feature#L37) +- [apiAuthWebDav/webDavLOCKAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavLOCKAuth.feature#L40) +- [apiAuthWebDav/webDavMKCOLAuth.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMKCOLAuth.feature#L36) ### [renaming a resource does not work](https://github.com/owncloud/ocis-reva/issues/14) -- [apiAuthWebDav/webDavMOVEAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMOVEAuth.feature#L37) +- [apiAuthWebDav/webDavMOVEAuth.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMOVEAuth.feature#L39) ### [send POST requests to another user's webDav endpoints as normal user](https://github.com/owncloud/ocis/issues/1287) -- [apiAuthWebDav/webDavPOSTAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPOSTAuth.feature#L38) +- [apiAuthWebDav/webDavPOSTAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPOSTAuth.feature#L40) ### [users can access each-others data using the new webdav API](https://github.com/owncloud/ocis/issues/1347) -- [apiAuthWebDav/webDavPUTAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPUTAuth.feature#L38) +- [apiAuthWebDav/webDavPUTAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPUTAuth.feature#L40) ### [Default capabilities for normal user not same as in oC-core](https://github.com/owncloud/ocis/issues/1285) ### [Difference in response content of status.php and default capabilities](https://github.com/owncloud/ocis/issues/1286) @@ -123,26 +123,26 @@ - [apiFavorites/favorites.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiFavorites/favorites.feature#L229) - [apiWebdavOperations/search.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L42) - [apiWebdavOperations/search.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L43) -- [apiWebdavOperations/search.feature:57](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L57) -- [apiWebdavOperations/search.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L58) -- [apiWebdavOperations/search.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L74) -- [apiWebdavOperations/search.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L75) -- [apiWebdavOperations/search.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L83) -- [apiWebdavOperations/search.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L84) -- [apiWebdavOperations/search.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L101) -- [apiWebdavOperations/search.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L102) -- [apiWebdavOperations/search.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L119) -- [apiWebdavOperations/search.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L120) -- [apiWebdavOperations/search.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L138) -- [apiWebdavOperations/search.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L139) -- [apiWebdavOperations/search.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L165) -- [apiWebdavOperations/search.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L166) -- [apiWebdavOperations/search.feature:191](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L191) -- [apiWebdavOperations/search.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L192) -- [apiWebdavOperations/search.feature:210](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L210) -- [apiWebdavOperations/search.feature:211](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L211) -- [apiWebdavOperations/search.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L213) -- [apiWebdavOperations/search.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L229) +- [apiWebdavOperations/search.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L59) +- [apiWebdavOperations/search.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L59) +- [apiWebdavOperations/search.feature:76](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L76) +- [apiWebdavOperations/search.feature:76](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L76) +- [apiWebdavOperations/search.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L85) +- [apiWebdavOperations/search.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L85) +- [apiWebdavOperations/search.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L103) +- [apiWebdavOperations/search.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L103) +- [apiWebdavOperations/search.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L121) +- [apiWebdavOperations/search.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L121) +- [apiWebdavOperations/search.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L140) +- [apiWebdavOperations/search.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L140) +- [apiWebdavOperations/search.feature:167](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L167) +- [apiWebdavOperations/search.feature:167](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L167) +- [apiWebdavOperations/search.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L193) +- [apiWebdavOperations/search.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L193) +- [apiWebdavOperations/search.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L212) +- [apiWebdavOperations/search.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L212) +- [apiWebdavOperations/search.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L214) +- [apiWebdavOperations/search.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L230) ### [Cannot set mtime on upload](https://github.com/owncloud/product/issues/271) - [apiSharePublicLink1/createPublicLinkShare.feature:786](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L786) @@ -646,28 +646,28 @@ - [apiWebdavMove1/moveFolder.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolder.feature#L35) - [apiWebdavMove1/moveFolder.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolder.feature#L47) - [apiWebdavMove1/moveFolder.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolder.feature#L48) -- [apiWebdavMove2/moveFile.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L89) -- [apiWebdavMove2/moveFile.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L90) -- [apiWebdavMove2/moveFile.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L91) -- [apiWebdavMove2/moveFile.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L92) -- [apiWebdavMove2/moveFile.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L112) -- [apiWebdavMove2/moveFile.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L113) -- [apiWebdavMove2/moveFile.feature:136](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L136) -- [apiWebdavMove2/moveFile.feature:137](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L137) -- [apiWebdavMove2/moveFile.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L138) -- [apiWebdavMove2/moveFile.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L139) -- [apiWebdavMove2/moveFile.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L160) -- [apiWebdavMove2/moveFile.feature:161](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L161) -- [apiWebdavMove2/moveFile.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L181) -- [apiWebdavMove2/moveFile.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L182) -- [apiWebdavMove2/moveFile.feature:200](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L200) -- [apiWebdavMove2/moveFile.feature:201](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L201) -- [apiWebdavMove2/moveFile.feature:219](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L219) -- [apiWebdavMove2/moveFile.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L220) -- [apiWebdavMove2/moveFile.feature:255](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L255) -- [apiWebdavMove2/moveFile.feature:256](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L256) -- [apiWebdavMove2/moveFile.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L272) -- [apiWebdavMove2/moveFile.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L273) +- [apiWebdavMove2/moveFile.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L99) +- [apiWebdavMove2/moveFile.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L100) +- [apiWebdavMove2/moveFile.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L101) +- [apiWebdavMove2/moveFile.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L102) +- [apiWebdavMove2/moveFile.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L122) +- [apiWebdavMove2/moveFile.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L123) +- [apiWebdavMove2/moveFile.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L146) +- [apiWebdavMove2/moveFile.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L147) +- [apiWebdavMove2/moveFile.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L148) +- [apiWebdavMove2/moveFile.feature:149](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L149) +- [apiWebdavMove2/moveFile.feature:170](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L170) +- [apiWebdavMove2/moveFile.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L171) +- [apiWebdavMove2/moveFile.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L192) +- [apiWebdavMove2/moveFile.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L193) +- [apiWebdavMove2/moveFile.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L213) +- [apiWebdavMove2/moveFile.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L214) +- [apiWebdavMove2/moveFile.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L234) +- [apiWebdavMove2/moveFile.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L235) +- [apiWebdavMove2/moveFile.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L290) +- [apiWebdavMove2/moveFile.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L291) +- [apiWebdavMove2/moveFile.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L290) +- [apiWebdavMove2/moveFile.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L291) ### [file cannot contain ? character](https://github.com/owncloud/ocis/issues/1259) - [apiWebdavMove2/moveFile.feature:292](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L292) @@ -693,8 +693,8 @@ - [apiWebdavOperations/refuseAccess.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L21) - [apiWebdavOperations/refuseAccess.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L22) -- [apiWebdavOperations/refuseAccess.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L33) -- [apiWebdavOperations/refuseAccess.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L34) +- [apiWebdavOperations/refuseAccess.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L35) +- [apiWebdavOperations/refuseAccess.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L35) ### [listing received shares does not work](https://github.com/owncloud/ocis-reva/issues/11) - [apiWebdavProperties1/copyFile.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/copyFile.feature#L65) @@ -924,63 +924,63 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:53](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature#L53) ### [renaming a resource does not work](https://github.com/owncloud/ocis-reva/issues/14) -- [apiWebdavMove1/moveFileAsync.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L26) -- [apiWebdavMove1/moveFileAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L27) -- [apiWebdavMove1/moveFileAsync.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L28) -- [apiWebdavMove1/moveFileAsync.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L29) -- [apiWebdavMove1/moveFileAsync.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L30) -- [apiWebdavMove1/moveFileAsync.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L31) +- [apiWebdavMove1/moveFileAsync.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L32) - [apiWebdavMove1/moveFileAsync.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L33) -- [apiWebdavMove1/moveFileAsync.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L46) -- [apiWebdavMove1/moveFileAsync.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L59) -- [apiWebdavMove1/moveFileAsync.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L73) -- [apiWebdavMove1/moveFileAsync.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L88) -- [apiWebdavMove1/moveFileAsync.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L107) -- [apiWebdavMove1/moveFileAsync.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L125) -- [apiWebdavMove1/moveFileAsync.feature:135](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L135) -- [apiWebdavMove1/moveFileAsync.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L141) -- [apiWebdavMove1/moveFileAsync.feature:156](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L156) -- [apiWebdavMove1/moveFileAsync.feature:173](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L173) -- [apiWebdavMove1/moveFileAsync.feature:174](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L174) -- [apiWebdavMove1/moveFileAsync.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L184) -- [apiWebdavMove1/moveFileAsync.feature:185](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L185) -- [apiWebdavMove1/moveFileAsync.feature:204](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L204) -- [apiWebdavMove1/moveFileAsync.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L205) -- [apiWebdavMove1/moveFileAsync.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L224) -- [apiWebdavMove1/moveFileAsync.feature:225](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L225) -- [apiWebdavMove1/moveFileAsync.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L234) -- [apiWebdavMove1/moveFileAsync.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L235) -- [apiWebdavMove1/moveFileAsync.feature:240](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L240) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L12) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L18) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L26) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L12) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L19) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L27) +- [apiWebdavMove1/moveFileAsync.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L32) +- [apiWebdavMove1/moveFileAsync.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L35) +- [apiWebdavMove1/moveFileAsync.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L32) +- [apiWebdavMove1/moveFileAsync.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L35) +- [apiWebdavMove1/moveFileAsync.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L35) +- [apiWebdavMove1/moveFileAsync.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L49) +- [apiWebdavMove1/moveFileAsync.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L62) +- [apiWebdavMove1/moveFileAsync.feature:77](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L77) +- [apiWebdavMove1/moveFileAsync.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L94) +- [apiWebdavMove1/moveFileAsync.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L113) +- [apiWebdavMove1/moveFileAsync.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L132) +- [apiWebdavMove1/moveFileAsync.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L142) +- [apiWebdavMove1/moveFileAsync.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L148) +- [apiWebdavMove1/moveFileAsync.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L164) +- [apiWebdavMove1/moveFileAsync.feature:183](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L183) +- [apiWebdavMove1/moveFileAsync.feature:195](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L195) +- [apiWebdavMove1/moveFileAsync.feature:195](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L195) +- [apiWebdavMove1/moveFileAsync.feature:196](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L196) +- [apiWebdavMove1/moveFileAsync.feature:226](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L226) +- [apiWebdavMove1/moveFileAsync.feature:216](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L216) +- [apiWebdavMove1/moveFileAsync.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L246) +- [apiWebdavMove1/moveFileAsync.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L236) +- [apiWebdavMove1/moveFileAsync.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L245) +- [apiWebdavMove1/moveFileAsync.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L246) +- [apiWebdavMove1/moveFileAsync.feature:251](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L251) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L13) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L19) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L27) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L13) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L20) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L29) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L21) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L22) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L35) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L36) -- [apiWebdavMove1/moveFolderToBlacklistedName.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L70) -- [apiWebdavMove1/moveFolderToBlacklistedName.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L71) +- [apiWebdavMove1/moveFolderToBlacklistedName.feature:72](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L72) +- [apiWebdavMove1/moveFolderToBlacklistedName.feature:72](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L72) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L21) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L22) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L34) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L35) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L70) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L71) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L18) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L19) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L29) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L30) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L62) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L63) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L18) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L19) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L28) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L29) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L63) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L64) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L36) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L36) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:72](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L72) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L73) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L20) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L20) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L31) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L31) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L64) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L65) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L20) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L20) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L30) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L31) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L66) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L67) ### [blacklisted filenames like .htaccess & file.parts can be uploaded](https://github.com/owncloud/ocis/issues/1345) - [apiWebdavProperties1/copyFile.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/copyFile.feature#L103) diff --git a/tests/acceptance/expected-failures-on-OCIS-storage.md b/tests/acceptance/expected-failures-on-OCIS-storage.md index df14c9ad6a..ae29e5034c 100644 --- a/tests/acceptance/expected-failures-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-on-OCIS-storage.md @@ -633,30 +633,30 @@ File and sync features in a shared scenario - [apiSharees/sharees.feature:703](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharees/sharees.feature#L703) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) -- [apiShareManagementToShares/acceptShares.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L22) -- [apiShareManagementToShares/acceptShares.feature:223](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L223) -- [apiShareManagementToShares/acceptShares.feature:270](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L270) -- [apiShareManagementToShares/acceptShares.feature:342](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L342) -- [apiShareManagementToShares/acceptShares.feature:378](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L378) -- [apiShareManagementToShares/acceptShares.feature:417](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L417) +- [apiShareManagementToShares/acceptShares.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L30) +- [apiShareManagementToShares/acceptShares.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L234) +- [apiShareManagementToShares/acceptShares.feature:281](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L281) +- [apiShareManagementToShares/acceptShares.feature:355](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L355) +- [apiShareManagementToShares/acceptShares.feature:393](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L393) +- [apiShareManagementToShares/acceptShares.feature:436](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L436) #### User cannot create a folder named Share -- [apiShareManagementToShares/acceptShares.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L279) -- [apiShareManagementToShares/acceptShares.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L298) +- [apiShareManagementToShares/acceptShares.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L290) +- [apiShareManagementToShares/acceptShares.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L309) #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) -- [apiShareManagementToShares/acceptShares.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L71) -- [apiShareManagementToShares/acceptShares.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L162) -- [apiShareManagementToShares/acceptShares.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L175) -- [apiShareManagementToShares/acceptShares.feature:196](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L196) -- [apiShareManagementToShares/acceptShares.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L249) -- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L28) -- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L48) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L140) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L141) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:176](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L176) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:177](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L177) +- [apiShareManagementToShares/acceptShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L82) +- [apiShareManagementToShares/acceptShares.feature:173](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L173) +- [apiShareManagementToShares/acceptShares.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L186) +- [apiShareManagementToShares/acceptShares.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L207) +- [apiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L260) +- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L31) +- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L52) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L138) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L139) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L171) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:172](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L172) #### [file_target in share response](https://github.com/owncloud/product/issues/203) @@ -664,46 +664,46 @@ File and sync features in a shared scenario - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L37) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L66) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L67) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L91) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L92) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L94) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L93) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L95) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L97) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L96) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L98) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:155](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L155) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L99) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:156](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L156) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:288](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L288) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:289](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L289) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:305](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L305) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:306](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L306) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L157) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L290) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L291) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:308](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L308) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L309) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L46) - [apiShareManagementToShares/mergeShare.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L32) - [apiShareManagementToShares/mergeShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L42) - [apiShareManagementToShares/mergeShare.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L89) #### [Shares are not deleted when user is deleted](https://github.com/owncloud/ocis/issues/1258) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L100) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L101) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L102) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:179](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L179) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L180) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:204](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L204) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L205) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L236) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:237](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L237) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L258) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:259](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L259) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:324](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L324) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:325](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L325) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:362](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L362) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:363](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L363) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:392](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L392) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:461](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L461) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:462](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L462) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:497](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L497) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:498](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L498) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:501](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L501) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L181) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L182) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L206) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L207) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:238](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L238) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:239](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L239) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L260) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:261](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L261) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:328](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L328) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:329](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L329) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:368](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L368) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:369](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L369) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:398](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L398) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:467](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L467) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:468](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L468) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:504](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L504) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:505](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L505) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:508](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L508) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L28) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L29) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L89) @@ -715,14 +715,14 @@ File and sync features in a shared scenario - [apiShareManagementBasicToShares/deleteShareFromShares.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L44) #### [file_target in share response](https://github.com/owncloud/product/issues/203) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:367](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L367) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:529](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L529) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:547](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L547) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:565](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L565) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:373](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L373) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:536](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L536) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L554) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:572](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L572) #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:342](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L342) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:343](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L343) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L347) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:348](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L348) #### [File deletion using dav gives unique string in filename in the trashbin](https://github.com/owncloud/product/issues/178) @@ -732,12 +732,12 @@ File and sync features in a shared scenario cannot share a folder with create permission #### [Listing shares via ocs API does not show path for parent folders](https://github.com/owncloud/ocis/issues/1231) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:118](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L118) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:130](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L130) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L181) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L182) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L120) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L132) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:183](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L183) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L184) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:185](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L185) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L186) #### [Shares are not deleted when user is deleted](https://github.com/owncloud/ocis/issues/1258) - [apiShareOperationsToShares/gettingShares.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/gettingShares.feature#L24) @@ -897,18 +897,18 @@ File and sync features in a shared scenario - [apiSharePublicLink1/createPublicLinkShare.feature:685](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L685) - [apiSharePublicLink1/createPublicLinkShare.feature:735](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L735) - [apiSharePublicLink1/createPublicLinkShare.feature:736](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L736) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:163](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L163) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L164) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L165) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L166) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L42) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L43) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:69](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L69) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L70) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L97) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L98) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:135](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L135) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:136](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L136) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:167](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L167) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:168](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L168) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L44) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L45) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L74) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L75) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:104](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L104) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L105) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L146) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L147) #### [Public cannot upload file with mtime set on a public link share with new version of WebDAV API](https://github.com/owncloud/core/issues/37605) @@ -1148,8 +1148,8 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiTrashbin/trashbinSharingToShares.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L24) - [apiTrashbin/trashbinSharingToShares.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L25) -- [apiShareManagementToShares/acceptShares.feature:469](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L469) -- [apiShareManagementToShares/acceptShares.feature:470](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L470) +- [apiShareManagementToShares/acceptShares.feature:489](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L489) +- [apiShareManagementToShares/acceptShares.feature:490](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L490) #### [deleting a file inside a received shared folder is moved to the trash-bin of the sharer not the receiver](https://github.com/owncloud/ocis/issues/1124) @@ -1259,42 +1259,42 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareOperationsToShares/changingFilesShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/changingFilesShare.feature#L63) Scenario Outline: Moving a file into a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L89) -- [apiWebdavMove2/moveFile.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L90) -- [apiWebdavMove2/moveFile.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L91) -- [apiWebdavMove2/moveFile.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L92) +- [apiWebdavMove2/moveFile.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L99) +- [apiWebdavMove2/moveFile.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L100) +- [apiWebdavMove2/moveFile.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L101) +- [apiWebdavMove2/moveFile.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L102) Scenario Outline: Moving a file out of a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L112) -- [apiWebdavMove2/moveFile.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L113) +- [apiWebdavMove2/moveFile.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L122) +- [apiWebdavMove2/moveFile.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L123) Scenario Outline: Moving a folder into a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:136](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L136) -- [apiWebdavMove2/moveFile.feature:137](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L137) -- [apiWebdavMove2/moveFile.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L138) -- [apiWebdavMove2/moveFile.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L139) +- [apiWebdavMove2/moveFile.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L146) +- [apiWebdavMove2/moveFile.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L147) +- [apiWebdavMove2/moveFile.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L148) +- [apiWebdavMove2/moveFile.feature:149](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L149) Scenario Outline: Moving a folder out of a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L160) -- [apiWebdavMove2/moveFile.feature:161](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L161) +- [apiWebdavMove2/moveFile.feature:170](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L170) +- [apiWebdavMove2/moveFile.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L171) Scenario Outline: Moving a file to a shared folder with no permissions -- [apiWebdavMove2/moveFile.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L181) -- [apiWebdavMove2/moveFile.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L182) +- [apiWebdavMove2/moveFile.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L192) +- [apiWebdavMove2/moveFile.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L193) Scenario Outline: Moving a file to overwrite a file in a shared folder with no permissions -- [apiWebdavMove2/moveFile.feature:200](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L200) -- [apiWebdavMove2/moveFile.feature:201](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L201) +- [apiWebdavMove2/moveFile.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L213) +- [apiWebdavMove2/moveFile.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L214) Scenario Outline: rename a file into an invalid filename -- [apiWebdavMove2/moveFile.feature:219](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L219) -- [apiWebdavMove2/moveFile.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L220) +- [apiWebdavMove2/moveFile.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L234) +- [apiWebdavMove2/moveFile.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L235) Scenario Outline: Checking file id after a move between received shares -- [apiWebdavMove2/moveFile.feature:255](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L255) -- [apiWebdavMove2/moveFile.feature:256](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L256) -Scenario Outline: Renaming a file to a path with extension .part should not be possible - [apiWebdavMove2/moveFile.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L272) - [apiWebdavMove2/moveFile.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L273) +Scenario Outline: Renaming a file to a path with extension .part should not be possible +- [apiWebdavMove2/moveFile.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L290) +- [apiWebdavMove2/moveFile.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L291) #### [OCIS-storage overwriting a file as share receiver, does not create a new file version for the sharer](https://github.com/owncloud/ocis/issues/766) - [apiVersions/fileVersionsSharingToShares.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L33) #### [restoring an older version of a shared file deletes the share](https://github.com/owncloud/ocis/issues/765) -- [apiShareManagementToShares/acceptShares.feature:473](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L473) +- [apiShareManagementToShares/acceptShares.feature:493](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L493) - [apiVersions/fileVersionsSharingToShares.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L44) #### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) @@ -1316,64 +1316,61 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) #### [Expiration date for user shares is not implemented](https://github.com/owncloud/ocis/issues/1250) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L26) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L27) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:55](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L55) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L56) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L83) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L84) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:110](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L110) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:111](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L111) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:137](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L137) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L138) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L159) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L160) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:190](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L190) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:191](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L191) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L220) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L221) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L249) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:250](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L250) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L279) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:280](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L280) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:300](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L300) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:301](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L301) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:322](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L322) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:323](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L323) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:344](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L344) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:345](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L345) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:367](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L367) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:368](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L368) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:385](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L385) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:386](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L386) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:403](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L403) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:404](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L404) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:426](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L426) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:427](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L427) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:450](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L450) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:451](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L451) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:474](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L474) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:475](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L475) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:499](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L499) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:500](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L500) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:521](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L521) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:522](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L522) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:543](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L543) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:544](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L544) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:563](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L563) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:564](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L564) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:581](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L581) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:582](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L582) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:603](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L603) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:604](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L604) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:628](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L628) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:629](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L629) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:630](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L630) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L29) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L30) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L58) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L59) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L86) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L87) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L113) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:114](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L114) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L140) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L141) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L162) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:163](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L163) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L193) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:194](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L194) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:223](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L223) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L224) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:252](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L252) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:253](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L253) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:282](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L282) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L283) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:303](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L303) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:304](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L304) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:325](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L325) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:326](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L326) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L347) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:348](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L348) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:370](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L370) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:371](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L371) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:388](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L388) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:389](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L389) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:406](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L406) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:407](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L407) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:429](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L429) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:430](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L430) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:453](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L453) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:454](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L454) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:477](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L477) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:478](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L478) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:502](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L502) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:503](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L503) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:524](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L524) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:525](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L525) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:546](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L546) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:547](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L547) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:566](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L566) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:567](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L567) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:584](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L584) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:585](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L585) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:606](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L606) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:607](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L607) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:631](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L631) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:632](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L632) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:653](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L653) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:654](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L654) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:655](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L655) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:633](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L633) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:634](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L634) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:635](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L635) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:656](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L656) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:657](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L657) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:658](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L658) @@ -1383,61 +1380,64 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:662](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L662) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:663](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L663) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:664](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L664) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:685](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L685) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:686](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L686) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:687](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L687) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:665](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L665) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:666](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L666) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:667](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L667) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:688](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L688) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:689](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L689) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:690](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L690) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:711](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L711) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:712](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L712) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:713](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L713) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:691](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L691) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:692](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L692) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:693](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L693) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:714](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L714) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:715](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L715) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:716](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L716) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:737](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L737) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:738](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L738) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:759](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L759) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:760](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L760) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:781](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L781) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:782](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L782) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:717](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L717) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:718](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L718) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:719](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L719) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:740](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L740) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:741](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L741) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:762](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L762) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:763](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L763) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:784](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L784) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:785](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L785) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L36) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L37) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L65) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L66) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L85) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L86) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:106](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L106) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L39) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L40) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L68) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:69](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L69) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L87) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L88) - [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L107) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:201](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L201) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:202](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L202) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L108) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L193) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:194](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L194) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:10](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L10) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L34) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L58) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L82) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L46) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L47) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L48) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L49) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:50](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L50) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:51](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L51) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L82) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L83) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L84) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L52) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:53](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L53) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:54](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L54) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L85) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L86) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L87) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:438](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L438) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:439](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L439) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L88) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L89) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L90) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:444](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L444) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:445](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L445) - [apiShareOperationsToShares/accessToShare.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/accessToShare.feature#L74) - [apiShareOperationsToShares/accessToShare.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/accessToShare.feature#L75) #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) - [apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature#L15) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L18) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L21) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L19) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L22) - [apiShareManagementToShares/moveReceivedShare.feature:14](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L14) - [apiShareManagementToShares/moveReceivedShare.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L28) - [apiShareManagementToShares/moveReceivedShare.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L39) @@ -1445,17 +1445,17 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiShareManagementToShares/moveReceivedShare.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L71) - [apiShareManagementToShares/moveReceivedShare.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L73) - [apiShareManagementToShares/moveReceivedShare.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L88) -- [apiShareManagementToShares/moveReceivedShare.feature:118](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L118) -- [apiShareManagementToShares/moveReceivedShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L128) -- [apiShareManagementToShares/moveReceivedShare.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L138) -- [apiShareManagementToShares/moveReceivedShare.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L148) -- [apiShareManagementToShares/moveReceivedShare.feature:158](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L158) -- [apiShareManagementToShares/moveReceivedShare.feature:168](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L168) -- [apiShareManagementToShares/moveReceivedShare.feature:197](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L197) -- [apiShareManagementToShares/moveReceivedShare.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L198) -- [apiShareManagementToShares/moveReceivedShare.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L221) -- [apiShareManagementToShares/moveReceivedShare.feature:222](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L222) -- [apiShareManagementToShares/moveReceivedShare.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L224) +- [apiShareManagementToShares/moveReceivedShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L120) +- [apiShareManagementToShares/moveReceivedShare.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L131) +- [apiShareManagementToShares/moveReceivedShare.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L142) +- [apiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L153) +- [apiShareManagementToShares/moveReceivedShare.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L164) +- [apiShareManagementToShares/moveReceivedShare.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L175) +- [apiShareManagementToShares/moveReceivedShare.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L205) +- [apiShareManagementToShares/moveReceivedShare.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L206) +- [apiShareManagementToShares/moveReceivedShare.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L229) +- [apiShareManagementToShares/moveReceivedShare.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L230) +- [apiShareManagementToShares/moveReceivedShare.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L232) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L59) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L60) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L94) @@ -1472,47 +1472,49 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L283) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:317](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L317) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:318](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L318) -- [apiShareUpdateToShares/updateShare.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L92) -- [apiShareUpdateToShares/updateShare.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L93) -- [apiShareUpdateToShares/updateShare.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L94) -- [apiShareUpdateToShares/updateShare.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L95) - [apiShareUpdateToShares/updateShare.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L96) - [apiShareUpdateToShares/updateShare.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L97) +- [apiShareUpdateToShares/updateShare.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L98) +- [apiShareUpdateToShares/updateShare.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L99) +- [apiShareUpdateToShares/updateShare.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L100) +- [apiShareUpdateToShares/updateShare.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L101) +- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) - [apiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L123) -- [apiShareUpdateToShares/updateShare.feature:155](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L155) +- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) +- [apiShareUpdateToShares/updateShare.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L160) #### [No way to set default folder for received shares](https://github.com/owncloud/ocis/issues/1327) -- [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L21) - [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L22) +- [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L23) #### [Group shares support ](https://github.com/owncloud/ocis/issues/1289) - [apiShareOperationsToShares/gettingShares.feature:188](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/gettingShares.feature#L188) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) #### [Group shares support](https://github.com/owncloud/ocis/issues/1289) -- [apiShareUpdateToShares/updateShare.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L290) -- [apiShareUpdateToShares/updateShare.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L291) -- [apiShareUpdateToShares/updateShare.feature:306](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L306) -- [apiShareUpdateToShares/updateShare.feature:307](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L307) -- [apiShareUpdateToShares/updateShare.feature:334](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L334) -- [apiShareUpdateToShares/updateShare.feature:335](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L335) -- [apiShareUpdateToShares/updateShare.feature:364](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L364) -- [apiShareUpdateToShares/updateShare.feature:365](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L365) +- [apiShareUpdateToShares/updateShare.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L298) +- [apiShareUpdateToShares/updateShare.feature:299](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L299) +- [apiShareUpdateToShares/updateShare.feature:315](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L315) +- [apiShareUpdateToShares/updateShare.feature:316](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L316) +- [apiShareUpdateToShares/updateShare.feature:344](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L344) +- [apiShareUpdateToShares/updateShare.feature:345](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L345) +- [apiShareUpdateToShares/updateShare.feature:375](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L375) +- [apiShareUpdateToShares/updateShare.feature:376](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L376) #### [Group shares support](https://github.com/owncloud/ocis/issues/1289) #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) -- [apiShareUpdateToShares/updateShare.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L61) -- [apiShareUpdateToShares/updateShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L62) -- [apiShareUpdateToShares/updateShare.feature:115](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L115) -- [apiShareUpdateToShares/updateShare.feature:116](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L116) -- [apiShareUpdateToShares/updateShare.feature:117](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L117) -- [apiShareUpdateToShares/updateShare.feature:118](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L118) -- [apiShareUpdateToShares/updateShare.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L119) -- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) -- [apiShareUpdateToShares/updateShare.feature:252](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L252) -- [apiShareUpdateToShares/updateShare.feature:253](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L253) -- [apiShareUpdateToShares/updateShare.feature:265](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L265) -- [apiShareUpdateToShares/updateShare.feature:266](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L266) +- [apiShareUpdateToShares/updateShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L63) +- [apiShareUpdateToShares/updateShare.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L64) +- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) +- [apiShareUpdateToShares/updateShare.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L121) +- [apiShareUpdateToShares/updateShare.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L122) +- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) +- [apiShareUpdateToShares/updateShare.feature:124](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L124) +- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) +- [apiShareUpdateToShares/updateShare.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L258) +- [apiShareUpdateToShares/updateShare.feature:259](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L259) +- [apiShareUpdateToShares/updateShare.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L272) +- [apiShareUpdateToShares/updateShare.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L273) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L34) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L35) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:54](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L54) @@ -1521,17 +1523,17 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p #### [Share additional info](https://github.com/owncloud/ocis/issues/1253) #### [Share extra attributes](https://github.com/owncloud/ocis/issues/1224) #### [Edit user share response has an "name" field](https://github.com/owncloud/ocis/issues/1225) -- [apiShareUpdateToShares/updateShare.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L230) -- [apiShareUpdateToShares/updateShare.feature:231](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L231) +- [apiShareUpdateToShares/updateShare.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L235) +- [apiShareUpdateToShares/updateShare.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L236) #### [user can access version metadata of a received share before accepting it](https://github.com/owncloud/ocis/issues/760) - [apiVersions/fileVersionsSharingToShares.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L279) #### [when a share exists its impossible to share a renamed folder](https://github.com/owncloud/ocis/issues/719) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:611](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L611) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:612](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L612) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:665](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L665) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:666](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L666) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:619](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L619) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:620](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L620) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:674](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L674) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:675](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L675) #### [ocis-storage PROPFIND on a file uploaded by share receiver is not possible](https://github.com/owncloud/ocis/issues/968) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L26) @@ -1549,15 +1551,15 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiWebdavUploadTUS/uploadToShare.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L56) #### [Share lists deleted user as 'user'](https://github.com/owncloud/ocis/issues/903) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:632](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L632) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:633](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L633) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:641](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L641) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:642](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L642) #### [OCIS-storage overwriting a file as share receiver, does not create a new file version for the sharer](https://github.com/owncloud/ocis/issues/766) - [apiVersions/fileVersionsSharingToShares.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L291) #### [deleting a share with wrong authentication returns OCS status 996 / HTTP 500](https://github.com/owncloud/ocis/issues/1229) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:211](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#211) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#212) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#211) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#212) ### User Management User and group management features @@ -1574,8 +1576,6 @@ Scenario Outline: Retrieving folder quota when no quota is set Scenario Outline: Retrieving folder quota when quota is set - [apiWebdavProperties1/getQuota.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L27) - [apiWebdavProperties1/getQuota.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L28) -- [apiWebdavProperties1/getQuota.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L88) -- [apiWebdavProperties1/getQuota.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L89) #### [user-sync endpoint does not exist](https://github.com/owncloud/ocis/issues/1241) - [apiMain/userSync.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/userSync.feature#L18) @@ -1613,26 +1613,26 @@ API, search, favorites, config, capabilities, not existing endpoints, CORS and o #### [server returns 500 when trying to access a not existing file](https://github.com/owncloud/ocis-reva/issues/13) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavDELETEAuth.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L36) Scenario: send DELETE requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavDELETEAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L38) Scenario: send DELETE requests to another user's webDav endpoints as normal user #### [users can access each-others data using the new webdav API](https://github.com/owncloud/ocis/issues/1347) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavLOCKAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavLOCKAuth.feature#L38) Scenario: send LOCK requests to another user's webDav endpoints as normal user -- [apiAuthWebDav/webDavMKCOLAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMKCOLAuth.feature#L37) Scenario: send MKCOL requests to another user's webDav endpoints as normal user -- [apiAuthWebDav/webDavPROPFINDAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPFINDAuth.feature#L37) Scenario: send PROPFIND requests to another user's webDav endpoints as normal user -- [apiAuthWebDav/webDavPROPPATCHAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPPATCHAuth.feature#L38) Scenario: send PROPPATCH requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavLOCKAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavLOCKAuth.feature#L40) Scenario: send LOCK requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavMKCOLAuth.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMKCOLAuth.feature#L36) Scenario: send MKCOL requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPROPFINDAuth.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPFINDAuth.feature#L39) Scenario: send PROPFIND requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPROPPATCHAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPPATCHAuth.feature#L40) Scenario: send PROPPATCH requests to another user's webDav endpoints as normal user #### [renaming a resource does not work](https://github.com/owncloud/ocis-reva/issues/14) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavMOVEAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMOVEAuth.feature#L37) Scenario: send MOVE requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavMOVEAuth.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMOVEAuth.feature#L39) Scenario: send MOVE requests to another user's webDav endpoints as normal user #### [send POST requests to another user's webDav endpoints as normal user](https://github.com/owncloud/ocis/issues/1287) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavPOSTAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPOSTAuth.feature#L38) Scenario: send POST requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPOSTAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPOSTAuth.feature#L40) Scenario: send POST requests to another user's webDav endpoints as normal user #### [PUT request with missing parent must return status code 409](https://github.com/owncloud/ocis/issues/824) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavPUTAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPUTAuth.feature#L38) Scenario: send PUT requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPUTAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPUTAuth.feature#L40) Scenario: send PUT requests to another user's webDav endpoints as normal user #### [Using double slash in URL to access a folder gives 501 and other status codes](https://github.com/owncloud/ocis/issues/1667) - [apiAuthWebDav/webDavSpecialURLs.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavSpecialURLs.feature#L24) @@ -1648,35 +1648,35 @@ Scenario Outline: search for entry by pattern - [apiWebdavOperations/search.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L42) - [apiWebdavOperations/search.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L43) Scenario Outline: search for entries by only some letters from the middle of the entry name -- [apiWebdavOperations/search.feature:57](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L57) - [apiWebdavOperations/search.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L58) +- [apiWebdavOperations/search.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L59) Scenario Outline: search for files by extension -- [apiWebdavOperations/search.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L74) - [apiWebdavOperations/search.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L75) +- [apiWebdavOperations/search.feature:76](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L76) Scenario Outline: search with empty field -- [apiWebdavOperations/search.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L83) - [apiWebdavOperations/search.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L84) +- [apiWebdavOperations/search.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L85) Scenario Outline: limit returned search entries -- [apiWebdavOperations/search.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L101) - [apiWebdavOperations/search.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L102) +- [apiWebdavOperations/search.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L103) Scenario Outline: limit returned search entries to only 1 entry -- [apiWebdavOperations/search.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L119) - [apiWebdavOperations/search.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L120) +- [apiWebdavOperations/search.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L121) Scenario Outline: limit returned search entries to more entires than there are -- [apiWebdavOperations/search.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L138) - [apiWebdavOperations/search.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L139) +- [apiWebdavOperations/search.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L140) Scenario Outline: report extra properties in search entries for a file -- [apiWebdavOperations/search.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L165) - [apiWebdavOperations/search.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L166) +- [apiWebdavOperations/search.feature:167](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L167) Scenario Outline: report extra properties in search entries for a folder -- [apiWebdavOperations/search.feature:191](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L191) - [apiWebdavOperations/search.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L192) +- [apiWebdavOperations/search.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L193) Scenario Outline: search for entry with emoji by pattern -- [apiWebdavOperations/search.feature:210](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L210) - [apiWebdavOperations/search.feature:211](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L211) -- [apiWebdavOperations/search.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L213) Scenario: search for entry by tags using REPORT method -- [apiWebdavOperations/search.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L229) Scenario: share a tagged resource to another internal user and sharee searches for tag using REPORT method -- [apiWebdavOperations/search.feature:254](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L254) Scenario: search for entries across various folders by tags using REPORT method +- [apiWebdavOperations/search.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L212) +- [apiWebdavOperations/search.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L214) Scenario: search for entry by tags using REPORT method +- [apiWebdavOperations/search.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L230) Scenario: share a tagged resource to another internal user and sharee searches for tag using REPORT method +- [apiWebdavOperations/search.feature:255](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L255) Scenario: search for entries across various folders by tags using REPORT method And other missing implementation of favorites - [apiFavorites/favorites.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiFavorites/favorites.feature#L91) @@ -1716,8 +1716,8 @@ Scenario Outline: Unauthenticated call - [apiWebdavOperations/refuseAccess.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L21) - [apiWebdavOperations/refuseAccess.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L22) Scenario Outline: A disabled user cannot use webdav -- [apiWebdavOperations/refuseAccess.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L33) - [apiWebdavOperations/refuseAccess.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L34) +- [apiWebdavOperations/refuseAccess.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L35) #### [trying to access a non-existing resource returns an empty body](https://github.com/owncloud/ocis/issues/1282) @@ -1804,8 +1804,8 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuthOcs/ocsGETAuth.feature:243](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthOcs/ocsGETAuth.feature#L243) #### [app passwords are not possible](https://github.com/owncloud/ocis/issues/1320) -- [apiAuthWebDav/webDavDELETEAuth.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L78) -- [apiAuthWebDav/webDavDELETEAuth.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L92) +- [apiAuthWebDav/webDavDELETEAuth.feature:80](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L80) +- [apiAuthWebDav/webDavDELETEAuth.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L94) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) - [apiCapabilities/capabilities.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L8) @@ -1859,24 +1859,24 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiCapabilities/capabilities.feature:787](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L787) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L25) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L26) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L47) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L48) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L66) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L67) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L87) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L88) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L25) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L44) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L45) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L60) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L61) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L78) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:79](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L79) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L26) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L44) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L45) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L64) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L65) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L83) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L84) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L103) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:104](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L104) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L122) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L123) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L27) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L46) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L47) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L67) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L68) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L87) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L88) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L108) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L109) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L128) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:129](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L129) - [apiMain/caldav.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L8) - [apiMain/caldav.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L15) @@ -1897,8 +1897,8 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiTranslation/translation.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTranslation/translation.feature#L28) #### [Sharing a same file twice to the same group](https://github.com/owncloud/ocis/issues/1710) -[apiShareManagementBasicToShares/createShareToSharesFolder.feature:679](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L679) -[apiShareManagementBasicToShares/createShareToSharesFolder.feature:680](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L680) +[apiShareManagementBasicToShares/createShareToSharesFolder.feature:689](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L689) +[apiShareManagementBasicToShares/createShareToSharesFolder.feature:690](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L690) #### [Request to edit non-existing user by authorized admin gets unauthorized in http response](https://github.com/owncloud/core/issues/38423) [apiAuthOcs/ocsPUTAuth.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthOcs/ocsPUTAuth.feature#L26) @@ -1975,14 +1975,14 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature#L39) - [apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature#L40) #### [cannot set blacklisted file names](https://github.com/owncloud/product/issues/260) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L12) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L18) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L26) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L13) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L19) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L27) #### [cannot set excluded directories](https://github.com/owncloud/product/issues/261) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L12) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L19) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L27) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L13) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L20) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L29) #### [renaming to banned name works](https://github.com/owncloud/ocis/issues/1295) - [apiWebdavMove1/moveFolder.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolder.feature#L21) @@ -1997,32 +1997,32 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavMove1/moveFolderToBlacklistedName.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L22) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L35) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L36) -- [apiWebdavMove1/moveFolderToBlacklistedName.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L70) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L71) +- [apiWebdavMove1/moveFolderToBlacklistedName.feature:72](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L72) #### [cannot set excluded directories](https://github.com/owncloud/product/issues/261) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L21) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L22) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L34) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L35) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L70) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L71) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L36) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:72](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L72) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L73) #### [cannot set blacklisted file names](https://github.com/owncloud/product/issues/260) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L18) - [apiWebdavMove2/moveFileToBlacklistedName.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L19) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L29) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L20) - [apiWebdavMove2/moveFileToBlacklistedName.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L30) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L62) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L63) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L31) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L64) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L65) #### [cannot set excluded directories](https://github.com/owncloud/product/issues/261) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L18) - [apiWebdavMove2/moveFileToExcludedDirectory.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L19) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L28) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L29) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L63) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L64) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L20) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L30) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L31) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L66) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L67) #### [system configuration options missing](https://github.com/owncloud/ocis/issues/1323) - [apiWebdavUpload1/uploadFileToBlacklistedName.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload1/uploadFileToBlacklistedName.feature#L31) @@ -2032,31 +2032,31 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers #### [cannot rename files asynchronously](https://github.com/owncloud/product/issues/259) -- [apiWebdavMove1/moveFileAsync.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L26) -- [apiWebdavMove1/moveFileAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L27) - [apiWebdavMove1/moveFileAsync.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L28) - [apiWebdavMove1/moveFileAsync.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L29) - [apiWebdavMove1/moveFileAsync.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L30) - [apiWebdavMove1/moveFileAsync.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L31) +- [apiWebdavMove1/moveFileAsync.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L32) - [apiWebdavMove1/moveFileAsync.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L33) -- [apiWebdavMove1/moveFileAsync.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L46) -- [apiWebdavMove1/moveFileAsync.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L59) -- [apiWebdavMove1/moveFileAsync.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L73) -- [apiWebdavMove1/moveFileAsync.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L88) -- [apiWebdavMove1/moveFileAsync.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L107) -- [apiWebdavMove1/moveFileAsync.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L125) -- [apiWebdavMove1/moveFileAsync.feature:135](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L135) -- [apiWebdavMove1/moveFileAsync.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L141) -- [apiWebdavMove1/moveFileAsync.feature:204](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L204) -- [apiWebdavMove1/moveFileAsync.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L205) -- [apiWebdavMove1/moveFileAsync.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L224) -- [apiWebdavMove1/moveFileAsync.feature:225](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L225) -- [apiWebdavMove1/moveFileAsync.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L234) +- [apiWebdavMove1/moveFileAsync.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L35) +- [apiWebdavMove1/moveFileAsync.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L49) +- [apiWebdavMove1/moveFileAsync.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L62) +- [apiWebdavMove1/moveFileAsync.feature:77](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L77) +- [apiWebdavMove1/moveFileAsync.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L94) +- [apiWebdavMove1/moveFileAsync.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L113) +- [apiWebdavMove1/moveFileAsync.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L132) +- [apiWebdavMove1/moveFileAsync.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L142) +- [apiWebdavMove1/moveFileAsync.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L148) +- [apiWebdavMove1/moveFileAsync.feature:215](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L215) +- [apiWebdavMove1/moveFileAsync.feature:216](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L216) - [apiWebdavMove1/moveFileAsync.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L235) -- [apiWebdavMove1/moveFileAsync.feature:240](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L240) +- [apiWebdavMove1/moveFileAsync.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L236) +- [apiWebdavMove1/moveFileAsync.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L245) +- [apiWebdavMove1/moveFileAsync.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L246) +- [apiWebdavMove1/moveFileAsync.feature:251](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L251) #### [Checksum feature](https://github.com/owncloud/ocis/issues/1291) -_ocdav: return checksum in upload response for chunked upload_ +_ ocdav: return checksum in upload response for chunked upload_ - [apiMain/checksums.feature:158](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L158) Scenario: Upload new dav chunked file using async MOVE where checksum matches - [apiMain/checksums.feature:174](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L174) Scenario: Upload new dav chunked file using async MOVE where checksum does not match - [apiMain/checksums.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L192) Scenario: Upload new dav chunked file using async MOVE where checksum does not match - retry with correct checksum diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index aadab70136..c0543a5250 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -669,30 +669,30 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiSharees/sharees.feature:703](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharees/sharees.feature#L703) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) -- [apiShareManagementToShares/acceptShares.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L22) -- [apiShareManagementToShares/acceptShares.feature:223](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L223) -- [apiShareManagementToShares/acceptShares.feature:270](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L270) -- [apiShareManagementToShares/acceptShares.feature:342](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L342) -- [apiShareManagementToShares/acceptShares.feature:378](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L378) -- [apiShareManagementToShares/acceptShares.feature:417](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L417) +- [apiShareManagementToShares/acceptShares.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L30) +- [apiShareManagementToShares/acceptShares.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L234) +- [apiShareManagementToShares/acceptShares.feature:281](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L281) +- [apiShareManagementToShares/acceptShares.feature:355](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L355) +- [apiShareManagementToShares/acceptShares.feature:393](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L393) +- [apiShareManagementToShares/acceptShares.feature:436](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L436) #### User cannot create a folder named Share -- [apiShareManagementToShares/acceptShares.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L279) -- [apiShareManagementToShares/acceptShares.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L298) +- [apiShareManagementToShares/acceptShares.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L290) +- [apiShareManagementToShares/acceptShares.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L309) #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) -- [apiShareManagementToShares/acceptShares.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L71) -- [apiShareManagementToShares/acceptShares.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L162) -- [apiShareManagementToShares/acceptShares.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L175) -- [apiShareManagementToShares/acceptShares.feature:196](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L196) -- [apiShareManagementToShares/acceptShares.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L249) -- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L28) -- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L48) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L140) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L141) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:176](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L176) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:177](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L177) +- [apiShareManagementToShares/acceptShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L82) +- [apiShareManagementToShares/acceptShares.feature:173](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L173) +- [apiShareManagementToShares/acceptShares.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L186) +- [apiShareManagementToShares/acceptShares.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L207) +- [apiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L260) +- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L31) +- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L52) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L138) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L139) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L171) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:172](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L172) #### [file_target in share response](https://github.com/owncloud/product/issues/203) @@ -700,46 +700,46 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L37) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L66) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L67) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L91) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L92) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L94) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L93) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L95) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L97) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L96) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L98) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:155](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L155) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L99) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:156](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L156) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:288](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L288) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:289](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L289) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:305](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L305) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:306](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L306) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L157) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L290) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L291) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:308](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L308) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L309) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L46) - [apiShareManagementToShares/mergeShare.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L32) - [apiShareManagementToShares/mergeShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L42) - [apiShareManagementToShares/mergeShare.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L89) #### [Shares are not deleted when user is deleted](https://github.com/owncloud/ocis/issues/1258) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L100) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L101) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L102) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:179](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L179) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L180) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:204](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L204) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L205) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L236) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:237](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L237) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L258) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:259](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L259) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:324](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L324) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:325](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L325) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:362](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L362) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:363](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L363) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:392](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L392) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:461](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L461) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:462](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L462) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:497](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L497) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:498](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L498) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:501](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L501) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L181) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L182) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L206) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L207) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:238](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L238) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:239](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L239) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L260) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:261](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L261) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:328](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L328) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:329](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L329) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:368](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L368) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:369](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L369) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:398](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L398) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:467](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L467) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:468](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L468) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:504](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L504) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:505](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L505) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:508](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L508) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L28) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L29) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L89) @@ -751,14 +751,14 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareManagementBasicToShares/deleteShareFromShares.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L44) #### [file_target in share response](https://github.com/owncloud/product/issues/203) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:367](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L367) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:529](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L529) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:547](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L547) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:565](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L565) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:373](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L373) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:536](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L536) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L554) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:572](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L572) #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:342](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L342) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:343](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L343) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L347) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:348](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L348) #### [File deletion using dav gives unique string in filename in the trashbin](https://github.com/owncloud/product/issues/178) @@ -768,12 +768,12 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: cannot share a folder with create permission #### [Listing shares via ocs API does not show path for parent folders](https://github.com/owncloud/ocis/issues/1231) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:118](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L118) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:130](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L130) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L181) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L182) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L120) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L132) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:183](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L183) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L184) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:185](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L185) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L186) #### [Shares are not deleted when user is deleted](https://github.com/owncloud/ocis/issues/1258) - [apiShareOperationsToShares/gettingShares.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/gettingShares.feature#L24) @@ -923,18 +923,18 @@ cannot share a folder with create permission - [apiSharePublicLink1/createPublicLinkShare.feature:685](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L685) - [apiSharePublicLink1/createPublicLinkShare.feature:735](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L735) - [apiSharePublicLink1/createPublicLinkShare.feature:736](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L736) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:163](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L163) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L164) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L165) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L166) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L42) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L43) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:69](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L69) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L70) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L97) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L98) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:135](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L135) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:136](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L136) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:167](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L167) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:168](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L168) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L44) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L45) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L74) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L75) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:104](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L104) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L105) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L146) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L147) #### [Public cannot upload file with mtime set on a public link share with new version of WebDAV API](https://github.com/owncloud/core/issues/37605) @@ -1278,8 +1278,8 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiTrashbin/trashbinSharingToShares.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L24) - [apiTrashbin/trashbinSharingToShares.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L25) -- [apiShareManagementToShares/acceptShares.feature:469](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L469) -- [apiShareManagementToShares/acceptShares.feature:470](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L470) +- [apiShareManagementToShares/acceptShares.feature:489](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L489) +- [apiShareManagementToShares/acceptShares.feature:490](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L490) #### [deleting a file inside a received shared folder is moved to the trash-bin of the sharer not the receiver](https://github.com/owncloud/ocis/issues/1124) @@ -1336,8 +1336,6 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiMain/quota.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L70) Scenario: Overwriting a file in received folder having insufficient quota - [apiMain/quota.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L84) Scenario: Overwriting a received file having enough quota - [apiMain/quota.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#94) Scenario: Overwriting a received file having insufficient quota -- [apiWebdavProperties1/getQuota.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L88) -- [apiWebdavProperties1/getQuota.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L89) Scenario Outline: Retrieving folder quota of shared folder with quota when no quota is set for recipient - [apiWebdavProperties1/getQuota.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L48) - [apiWebdavProperties1/getQuota.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L49) @@ -1396,39 +1394,39 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareOperationsToShares/changingFilesShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/changingFilesShare.feature#L63) Scenario Outline: Moving a file into a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L89) -- [apiWebdavMove2/moveFile.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L90) -- [apiWebdavMove2/moveFile.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L91) -- [apiWebdavMove2/moveFile.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L92) +- [apiWebdavMove2/moveFile.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L99) +- [apiWebdavMove2/moveFile.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L100) +- [apiWebdavMove2/moveFile.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L101) +- [apiWebdavMove2/moveFile.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L102) Scenario Outline: Moving a file out of a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L112) -- [apiWebdavMove2/moveFile.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L113) +- [apiWebdavMove2/moveFile.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L122) +- [apiWebdavMove2/moveFile.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L123) Scenario Outline: Moving a folder into a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:136](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L136) -- [apiWebdavMove2/moveFile.feature:137](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L137) -- [apiWebdavMove2/moveFile.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L138) -- [apiWebdavMove2/moveFile.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L139) +- [apiWebdavMove2/moveFile.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L146) +- [apiWebdavMove2/moveFile.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L147) +- [apiWebdavMove2/moveFile.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L148) +- [apiWebdavMove2/moveFile.feature:149](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L149) Scenario Outline: Moving a folder out of a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L160) -- [apiWebdavMove2/moveFile.feature:161](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L161) +- [apiWebdavMove2/moveFile.feature:170](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L170) +- [apiWebdavMove2/moveFile.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L171) Scenario Outline: Moving a file to a shared folder with no permissions -- [apiWebdavMove2/moveFile.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L181) -- [apiWebdavMove2/moveFile.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L182) +- [apiWebdavMove2/moveFile.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L192) +- [apiWebdavMove2/moveFile.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L193) Scenario Outline: Moving a file to overwrite a file in a shared folder with no permissions -- [apiWebdavMove2/moveFile.feature:200](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L200) -- [apiWebdavMove2/moveFile.feature:201](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L201) +- [apiWebdavMove2/moveFile.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L213) +- [apiWebdavMove2/moveFile.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L214) Scenario Outline: rename a file into an invalid filename -- [apiWebdavMove2/moveFile.feature:219](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L219) -- [apiWebdavMove2/moveFile.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L220) +- [apiWebdavMove2/moveFile.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L234) +- [apiWebdavMove2/moveFile.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L235) Scenario Outline: Checking file id after a move between received shares -- [apiWebdavMove2/moveFile.feature:255](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L255) -- [apiWebdavMove2/moveFile.feature:256](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L256) - Scenario Outline: Renaming a file to a path with extension .part should not be possible - [apiWebdavMove2/moveFile.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L272) - [apiWebdavMove2/moveFile.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L273) + Scenario Outline: Renaming a file to a path with extension .part should not be possible +- [apiWebdavMove2/moveFile.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L290) +- [apiWebdavMove2/moveFile.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L291) #### [restoring an older version of a shared file deletes the share](https://github.com/owncloud/ocis/issues/765) -- [apiShareManagementToShares/acceptShares.feature:473](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L473) +- [apiShareManagementToShares/acceptShares.feature:493](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L493) - [apiVersions/fileVersionsSharingToShares.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L44) #### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) @@ -1454,64 +1452,61 @@ Scenario Outline: Moving a file into a shared folder as the sharee and as the sh #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) #### [Expiration date for user shares is not implemented](https://github.com/owncloud/ocis/issues/1250) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L26) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L27) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:55](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L55) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L56) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L83) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L84) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:110](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L110) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:111](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L111) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:137](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L137) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L138) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L159) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L160) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:190](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L190) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:191](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L191) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L220) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L221) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L249) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:250](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L250) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L279) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:280](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L280) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:300](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L300) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:301](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L301) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:322](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L322) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:323](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L323) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:344](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L344) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:345](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L345) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:367](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L367) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:368](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L368) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:385](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L385) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:386](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L386) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:403](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L403) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:404](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L404) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:426](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L426) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:427](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L427) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:450](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L450) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:451](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L451) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:474](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L474) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:475](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L475) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:499](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L499) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:500](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L500) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:521](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L521) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:522](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L522) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:543](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L543) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:544](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L544) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:563](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L563) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:564](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L564) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:581](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L581) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:582](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L582) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:603](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L603) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:604](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L604) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:628](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L628) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:629](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L629) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:630](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L630) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L29) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L30) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L58) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L59) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L86) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L87) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L113) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:114](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L114) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L140) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L141) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L162) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:163](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L163) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L193) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:194](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L194) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:223](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L223) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L224) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:252](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L252) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:253](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L253) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:282](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L282) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L283) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:303](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L303) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:304](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L304) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:325](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L325) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:326](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L326) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L347) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:348](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L348) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:370](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L370) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:371](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L371) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:388](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L388) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:389](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L389) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:406](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L406) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:407](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L407) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:429](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L429) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:430](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L430) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:453](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L453) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:454](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L454) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:477](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L477) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:478](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L478) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:502](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L502) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:503](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L503) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:524](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L524) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:525](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L525) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:546](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L546) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:547](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L547) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:566](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L566) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:567](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L567) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:584](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L584) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:585](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L585) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:606](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L606) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:607](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L607) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:631](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L631) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:632](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L632) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:653](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L653) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:654](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L654) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:655](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L655) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:633](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L633) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:634](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L634) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:635](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L635) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:656](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L656) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:657](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L657) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:658](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L658) @@ -1521,61 +1516,64 @@ Scenario Outline: Moving a file into a shared folder as the sharee and as the sh - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:662](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L662) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:663](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L663) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:664](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L664) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:685](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L685) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:686](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L686) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:687](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L687) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:665](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L665) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:666](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L666) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:667](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L667) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:688](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L688) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:689](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L689) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:690](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L690) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:711](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L711) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:712](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L712) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:713](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L713) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:691](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L691) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:692](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L692) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:693](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L693) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:714](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L714) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:715](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L715) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:716](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L716) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:737](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L737) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:738](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L738) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:759](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L759) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:760](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L760) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:781](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L781) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:782](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L782) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:717](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L717) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:718](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L718) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:719](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L719) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:740](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L740) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:741](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L741) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:762](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L762) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:763](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L763) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:784](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L784) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:785](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L785) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L36) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L37) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L65) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L66) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L85) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L86) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:106](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L106) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L39) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L40) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L68) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:69](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L69) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L87) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L88) - [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L107) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:201](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L201) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:202](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L202) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L108) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L193) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:194](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L194) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:10](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L10) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L34) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L58) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L82) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L46) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L47) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L48) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L49) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:50](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L50) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:51](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L51) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L82) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L83) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L84) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L52) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:53](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L53) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:54](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L54) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L85) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L86) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L87) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:438](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L438) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:439](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L439) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L88) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L89) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L90) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:444](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L444) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:445](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L445) - [apiShareOperationsToShares/accessToShare.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/accessToShare.feature#L74) - [apiShareOperationsToShares/accessToShare.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/accessToShare.feature#L75) #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) - [apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature#L15) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L18) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L21) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L19) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L22) - [apiShareManagementToShares/moveReceivedShare.feature:14](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L14) - [apiShareManagementToShares/moveReceivedShare.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L28) - [apiShareManagementToShares/moveReceivedShare.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L39) @@ -1583,17 +1581,17 @@ Scenario Outline: Moving a file into a shared folder as the sharee and as the sh - [apiShareManagementToShares/moveReceivedShare.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L71) - [apiShareManagementToShares/moveReceivedShare.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L73) - [apiShareManagementToShares/moveReceivedShare.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L88) -- [apiShareManagementToShares/moveReceivedShare.feature:118](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L118) -- [apiShareManagementToShares/moveReceivedShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L128) -- [apiShareManagementToShares/moveReceivedShare.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L138) -- [apiShareManagementToShares/moveReceivedShare.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L148) -- [apiShareManagementToShares/moveReceivedShare.feature:158](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L158) -- [apiShareManagementToShares/moveReceivedShare.feature:168](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L168) -- [apiShareManagementToShares/moveReceivedShare.feature:197](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L197) -- [apiShareManagementToShares/moveReceivedShare.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L198) -- [apiShareManagementToShares/moveReceivedShare.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L221) -- [apiShareManagementToShares/moveReceivedShare.feature:222](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L222) -- [apiShareManagementToShares/moveReceivedShare.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L224) +- [apiShareManagementToShares/moveReceivedShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L120) +- [apiShareManagementToShares/moveReceivedShare.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L131) +- [apiShareManagementToShares/moveReceivedShare.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L142) +- [apiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L153) +- [apiShareManagementToShares/moveReceivedShare.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L164) +- [apiShareManagementToShares/moveReceivedShare.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L175) +- [apiShareManagementToShares/moveReceivedShare.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L205) +- [apiShareManagementToShares/moveReceivedShare.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L206) +- [apiShareManagementToShares/moveReceivedShare.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L229) +- [apiShareManagementToShares/moveReceivedShare.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L230) +- [apiShareManagementToShares/moveReceivedShare.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L232) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L59) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L60) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L94) @@ -1610,19 +1608,21 @@ Scenario Outline: Moving a file into a shared folder as the sharee and as the sh - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L283) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:317](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L317) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:318](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L318) -- [apiShareUpdateToShares/updateShare.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L92) -- [apiShareUpdateToShares/updateShare.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L93) -- [apiShareUpdateToShares/updateShare.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L94) -- [apiShareUpdateToShares/updateShare.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L95) - [apiShareUpdateToShares/updateShare.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L96) - [apiShareUpdateToShares/updateShare.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L97) +- [apiShareUpdateToShares/updateShare.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L98) +- [apiShareUpdateToShares/updateShare.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L99) +- [apiShareUpdateToShares/updateShare.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L100) +- [apiShareUpdateToShares/updateShare.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L101) +- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) - [apiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L123) -- [apiShareUpdateToShares/updateShare.feature:155](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L155) +- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) +- [apiShareUpdateToShares/updateShare.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L160) The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareManagementToShares/moveReceivedShare.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L102) -- [apiShareManagementToShares/moveReceivedShare.feature:110](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L110) +- [apiShareManagementToShares/moveReceivedShare.feature:111](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L111) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L73) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L74) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L108) @@ -1642,37 +1642,37 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiSharePublicLink2/multilinkSharing.feature:187](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink2/multilinkSharing.feature#L187) #### [No way to set default folder for received shares](https://github.com/owncloud/ocis/issues/1327) -- [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L21) - [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L22) +- [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L23) #### [Group shares support ](https://github.com/owncloud/ocis/issues/1289) - [apiShareOperationsToShares/gettingShares.feature:188](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/gettingShares.feature#L184) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) #### [Group shares support](https://github.com/owncloud/ocis/issues/1289) -- [apiShareUpdateToShares/updateShare.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L290) -- [apiShareUpdateToShares/updateShare.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L291) -- [apiShareUpdateToShares/updateShare.feature:306](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L306) -- [apiShareUpdateToShares/updateShare.feature:307](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L307) -- [apiShareUpdateToShares/updateShare.feature:334](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L334) -- [apiShareUpdateToShares/updateShare.feature:335](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L335) -- [apiShareUpdateToShares/updateShare.feature:364](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L364) -- [apiShareUpdateToShares/updateShare.feature:365](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L365) +- [apiShareUpdateToShares/updateShare.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L298) +- [apiShareUpdateToShares/updateShare.feature:299](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L299) +- [apiShareUpdateToShares/updateShare.feature:315](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L315) +- [apiShareUpdateToShares/updateShare.feature:316](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L316) +- [apiShareUpdateToShares/updateShare.feature:344](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L344) +- [apiShareUpdateToShares/updateShare.feature:345](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L345) +- [apiShareUpdateToShares/updateShare.feature:375](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L375) +- [apiShareUpdateToShares/updateShare.feature:376](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L376) #### [Group shares support](https://github.com/owncloud/ocis/issues/1289) #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) -- [apiShareUpdateToShares/updateShare.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L61) -- [apiShareUpdateToShares/updateShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L62) -- [apiShareUpdateToShares/updateShare.feature:115](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L115) -- [apiShareUpdateToShares/updateShare.feature:116](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L116) -- [apiShareUpdateToShares/updateShare.feature:117](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L117) -- [apiShareUpdateToShares/updateShare.feature:118](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L118) -- [apiShareUpdateToShares/updateShare.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L119) -- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) -- [apiShareUpdateToShares/updateShare.feature:252](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L252) -- [apiShareUpdateToShares/updateShare.feature:253](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L253) -- [apiShareUpdateToShares/updateShare.feature:265](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L265) -- [apiShareUpdateToShares/updateShare.feature:266](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L266) +- [apiShareUpdateToShares/updateShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L63) +- [apiShareUpdateToShares/updateShare.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L64) +- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) +- [apiShareUpdateToShares/updateShare.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L121) +- [apiShareUpdateToShares/updateShare.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L122) +- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) +- [apiShareUpdateToShares/updateShare.feature:124](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L124) +- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) +- [apiShareUpdateToShares/updateShare.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L258) +- [apiShareUpdateToShares/updateShare.feature:259](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L259) +- [apiShareUpdateToShares/updateShare.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L272) +- [apiShareUpdateToShares/updateShare.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L273) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L34) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L35) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:54](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L54) @@ -1681,29 +1681,29 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: #### [Share additional info](https://github.com/owncloud/ocis/issues/1253) #### [Share extra attributes](https://github.com/owncloud/ocis/issues/1224) #### [Edit user share response has an "name" field](https://github.com/owncloud/ocis/issues/1225) -- [apiShareUpdateToShares/updateShare.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L230) -- [apiShareUpdateToShares/updateShare.feature:231](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L231) +- [apiShareUpdateToShares/updateShare.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L235) +- [apiShareUpdateToShares/updateShare.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L236) #### [user can access version metadata of a received share before accepting it](https://github.com/owncloud/ocis/issues/760) - [apiVersions/fileVersionsSharingToShares.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L279) #### [when a share exists its impossible to share a renamed folder](https://github.com/owncloud/ocis/issues/719) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:611](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L611) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:612](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L612) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:665](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L665) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:666](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L666) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:619](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L619) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:620](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L620) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:674](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L674) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:675](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L675) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) - [apiWebdavUploadTUS/uploadToShare.feature:55](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L55) - [apiWebdavUploadTUS/uploadToShare.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L56) #### [Share lists deleted user as 'user'](https://github.com/owncloud/ocis/issues/903) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:632](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L632) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:633](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L633) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:641](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L641) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:642](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L642) #### [deleting a share with wrong authentication returns OCS status 996 / HTTP 500](https://github.com/owncloud/ocis/issues/1229) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:211](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#211) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#212) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#211) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#212) ### User Management User and group management features @@ -1757,26 +1757,26 @@ API, search, favorites, config, capabilities, not existing endpoints, CORS and o #### [server returns 500 when trying to access a not existing file](https://github.com/owncloud/ocis-reva/issues/13) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavDELETEAuth.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L36) Scenario: send DELETE requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavDELETEAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L38) Scenario: send DELETE requests to another user's webDav endpoints as normal user #### [users can access each-others data using the new webdav API](https://github.com/owncloud/ocis/issues/1347) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavLOCKAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavLOCKAuth.feature#L38) Scenario: send LOCK requests to another user's webDav endpoints as normal user -- [apiAuthWebDav/webDavMKCOLAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMKCOLAuth.feature#L37) Scenario: send MKCOL requests to another user's webDav endpoints as normal user -- [apiAuthWebDav/webDavPROPFINDAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPFINDAuth.feature#L37) Scenario: send PROPFIND requests to another user's webDav endpoints as normal user -- [apiAuthWebDav/webDavPROPPATCHAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPPATCHAuth.feature#L38) Scenario: send PROPPATCH requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavLOCKAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavLOCKAuth.feature#L40) Scenario: send LOCK requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavMKCOLAuth.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMKCOLAuth.feature#L36) Scenario: send MKCOL requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPROPFINDAuth.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPFINDAuth.feature#L39) Scenario: send PROPFIND requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPROPPATCHAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPPATCHAuth.feature#L40) Scenario: send PROPPATCH requests to another user's webDav endpoints as normal user #### [renaming a resource does not work](https://github.com/owncloud/ocis-reva/issues/14) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavMOVEAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMOVEAuth.feature#L37) Scenario: send MOVE requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavMOVEAuth.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMOVEAuth.feature#L39) Scenario: send MOVE requests to another user's webDav endpoints as normal user #### [send POST requests to another user's webDav endpoints as normal user](https://github.com/owncloud/ocis/issues/1287) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavPOSTAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPOSTAuth.feature#L38) Scenario: send POST requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPOSTAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPOSTAuth.feature#L40) Scenario: send POST requests to another user's webDav endpoints as normal user #### [PUT request with missing parent must return status code 409](https://github.com/owncloud/ocis/issues/824) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavPUTAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPUTAuth.feature#L38) Scenario: send PUT requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPUTAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPUTAuth.feature#L40) Scenario: send PUT requests to another user's webDav endpoints as normal user #### [Using double slash in URL to access a folder gives 501 and other status codes](https://github.com/owncloud/ocis/issues/1667) - [apiAuthWebDav/webDavSpecialURLs.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavSpecialURLs.feature#L24) @@ -1791,36 +1791,36 @@ _ocdav: api compatibility, return correct status code_ Scenario Outline: search for entry by pattern - [apiWebdavOperations/search.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L42) - [apiWebdavOperations/search.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L43) - Scenario Outline: search for entries by only some letters from the middle of the entry name -- [apiWebdavOperations/search.feature:57](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L57) +Scenario Outline: search for entries by only some letters from the middle of the entry name - [apiWebdavOperations/search.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L58) - Scenario Outline: search for files by extension -- [apiWebdavOperations/search.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L74) +- [apiWebdavOperations/search.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L59) +Scenario Outline: search for files by extension - [apiWebdavOperations/search.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L75) - Scenario Outline: search with empty field -- [apiWebdavOperations/search.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L83) +- [apiWebdavOperations/search.feature:76](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L76) +Scenario Outline: search with empty field - [apiWebdavOperations/search.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L84) - Scenario Outline: limit returned search entries -- [apiWebdavOperations/search.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L101) +- [apiWebdavOperations/search.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L85) +Scenario Outline: limit returned search entries - [apiWebdavOperations/search.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L102) - Scenario Outline: limit returned search entries to only 1 entry -- [apiWebdavOperations/search.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L119) +- [apiWebdavOperations/search.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L103) +Scenario Outline: limit returned search entries to only 1 entry - [apiWebdavOperations/search.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L120) - Scenario Outline: limit returned search entries to more entires than there are -- [apiWebdavOperations/search.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L138) +- [apiWebdavOperations/search.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L121) +Scenario Outline: limit returned search entries to more entires than there are - [apiWebdavOperations/search.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L139) - Scenario Outline: report extra properties in search entries for a file -- [apiWebdavOperations/search.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L165) +- [apiWebdavOperations/search.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L140) +Scenario Outline: report extra properties in search entries for a file - [apiWebdavOperations/search.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L166) - Scenario Outline: report extra properties in search entries for a folder -- [apiWebdavOperations/search.feature:191](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L191) +- [apiWebdavOperations/search.feature:167](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L167) +Scenario Outline: report extra properties in search entries for a folder - [apiWebdavOperations/search.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L192) - Scenario Outline: search for entry with emoji by pattern -- [apiWebdavOperations/search.feature:210](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L210) +- [apiWebdavOperations/search.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L193) +Scenario Outline: search for entry with emoji by pattern - [apiWebdavOperations/search.feature:211](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L211) -- [apiWebdavOperations/search.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L213) Scenario: search for entry by tags using REPORT method -- [apiWebdavOperations/search.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L229) Scenario: share a tagged resource to another internal user and sharee searches for tag using REPORT method -- [apiWebdavOperations/search.feature:254](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L254) Scenario: search for entries across various folders by tags using REPORT method +- [apiWebdavOperations/search.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L212) +- [apiWebdavOperations/search.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L214) Scenario: search for entry by tags using REPORT method +- [apiWebdavOperations/search.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L230) Scenario: share a tagged resource to another internal user and sharee searches for tag using REPORT method +- [apiWebdavOperations/search.feature:255](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L255) Scenario: search for entries across various folders by tags using REPORT method And other missing implementation of favorites - [apiFavorites/favorites.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiFavorites/favorites.feature#L91) @@ -1865,8 +1865,8 @@ Scenario Outline: Unauthenticated call - [apiWebdavOperations/refuseAccess.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L21) - [apiWebdavOperations/refuseAccess.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L22) Scenario Outline: A disabled user cannot use webdav -- [apiWebdavOperations/refuseAccess.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L33) - [apiWebdavOperations/refuseAccess.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L34) +- [apiWebdavOperations/refuseAccess.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L35) #### [trying to access a non-existing resource returns an empty body](https://github.com/owncloud/ocis/issues/1282) @@ -1952,8 +1952,8 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuthOcs/ocsGETAuth.feature:243](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthOcs/ocsGETAuth.feature#L243) #### [app passwords are not possible](https://github.com/owncloud/ocis/issues/1320) -- [apiAuthWebDav/webDavDELETEAuth.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L78) -- [apiAuthWebDav/webDavDELETEAuth.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L92) +- [apiAuthWebDav/webDavDELETEAuth.feature:80](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L80) +- [apiAuthWebDav/webDavDELETEAuth.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L94) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) - [apiCapabilities/capabilities.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L8) @@ -2007,24 +2007,24 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiCapabilities/capabilities.feature:787](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L787) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L25) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L26) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L47) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L48) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L66) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L67) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L87) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L88) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L25) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L44) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L45) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L60) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L61) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L78) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:79](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L79) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L26) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L44) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L45) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L64) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L65) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L83) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L84) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L103) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:104](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L104) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L122) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L123) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L27) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L46) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L47) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L67) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L68) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L87) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L88) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L108) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L109) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L128) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:129](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L129) - [apiMain/caldav.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L8) - [apiMain/caldav.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L15) @@ -2045,8 +2045,8 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiTranslation/translation.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTranslation/translation.feature#L28) #### [Sharing a same file twice to the same group](https://github.com/owncloud/ocis/issues/1710) -[apiShareManagementBasicToShares/createShareToSharesFolder.feature:679](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L679) -[apiShareManagementBasicToShares/createShareToSharesFolder.feature:680](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L680) +[apiShareManagementBasicToShares/createShareToSharesFolder.feature:689](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L689) +[apiShareManagementBasicToShares/createShareToSharesFolder.feature:690](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L690) #### [Request to edit non-existing user by authorized admin gets unauthorized in http response](https://github.com/owncloud/core/issues/38423) [apiAuthOcs/ocsPUTAuth.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthOcs/ocsPUTAuth.feature#L26) @@ -2124,38 +2124,38 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature#L40) #### [cannot rename files asynchronously](https://github.com/owncloud/product/issues/259) -- [apiWebdavMove1/moveFileAsync.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L26) -- [apiWebdavMove1/moveFileAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L27) - [apiWebdavMove1/moveFileAsync.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L28) - [apiWebdavMove1/moveFileAsync.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L29) - [apiWebdavMove1/moveFileAsync.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L30) - [apiWebdavMove1/moveFileAsync.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L31) +- [apiWebdavMove1/moveFileAsync.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L32) - [apiWebdavMove1/moveFileAsync.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L33) -- [apiWebdavMove1/moveFileAsync.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L46) -- [apiWebdavMove1/moveFileAsync.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L59) -- [apiWebdavMove1/moveFileAsync.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L73) -- [apiWebdavMove1/moveFileAsync.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L88) -- [apiWebdavMove1/moveFileAsync.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L107) -- [apiWebdavMove1/moveFileAsync.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L125) -- [apiWebdavMove1/moveFileAsync.feature:135](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L135) -- [apiWebdavMove1/moveFileAsync.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L141) -- [apiWebdavMove1/moveFileAsync.feature:204](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L204) -- [apiWebdavMove1/moveFileAsync.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L205) -- [apiWebdavMove1/moveFileAsync.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L224) -- [apiWebdavMove1/moveFileAsync.feature:225](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L225) -- [apiWebdavMove1/moveFileAsync.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L234) +- [apiWebdavMove1/moveFileAsync.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L35) +- [apiWebdavMove1/moveFileAsync.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L49) +- [apiWebdavMove1/moveFileAsync.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L62) +- [apiWebdavMove1/moveFileAsync.feature:77](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L77) +- [apiWebdavMove1/moveFileAsync.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L94) +- [apiWebdavMove1/moveFileAsync.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L113) +- [apiWebdavMove1/moveFileAsync.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L132) +- [apiWebdavMove1/moveFileAsync.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L142) +- [apiWebdavMove1/moveFileAsync.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L148) +- [apiWebdavMove1/moveFileAsync.feature:215](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L215) +- [apiWebdavMove1/moveFileAsync.feature:216](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L216) - [apiWebdavMove1/moveFileAsync.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L235) -- [apiWebdavMove1/moveFileAsync.feature:240](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L240) +- [apiWebdavMove1/moveFileAsync.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L236) +- [apiWebdavMove1/moveFileAsync.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L245) +- [apiWebdavMove1/moveFileAsync.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L246) +- [apiWebdavMove1/moveFileAsync.feature:251](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L251) #### [cannot set blacklisted file names](https://github.com/owncloud/product/issues/260) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L12) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L18) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L26) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L13) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L19) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L27) #### [cannot set excluded directories](https://github.com/owncloud/product/issues/261) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L12) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L19) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L27) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L13) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L20) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L29) #### [renaming to banned name works](https://github.com/owncloud/ocis/issues/1295) - [apiWebdavMove1/moveFolder.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolder.feature#L21) @@ -2170,32 +2170,32 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavMove1/moveFolderToBlacklistedName.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L22) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L35) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L36) -- [apiWebdavMove1/moveFolderToBlacklistedName.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L70) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L71) +- [apiWebdavMove1/moveFolderToBlacklistedName.feature:72](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L72) #### [cannot set excluded directories](https://github.com/owncloud/product/issues/261) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L21) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L22) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L34) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L35) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L70) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L71) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L36) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:72](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L72) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L73) #### [cannot set blacklisted file names](https://github.com/owncloud/product/issues/260) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L18) - [apiWebdavMove2/moveFileToBlacklistedName.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L19) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L29) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L20) - [apiWebdavMove2/moveFileToBlacklistedName.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L30) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L62) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L63) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L31) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L64) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L65) #### [cannot set excluded directories](https://github.com/owncloud/product/issues/261) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L18) - [apiWebdavMove2/moveFileToExcludedDirectory.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L19) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L28) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L29) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L63) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L64) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L20) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L30) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L31) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L66) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L67) #### [system configuration options missing](https://github.com/owncloud/ocis/issues/1323) diff --git a/tests/acceptance/expected-failures-on-S3NG-storage.md b/tests/acceptance/expected-failures-on-S3NG-storage.md index 985117ef6d..da7745c750 100644 --- a/tests/acceptance/expected-failures-on-S3NG-storage.md +++ b/tests/acceptance/expected-failures-on-S3NG-storage.md @@ -633,30 +633,30 @@ File and sync features in a shared scenario - [apiSharees/sharees.feature:703](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharees/sharees.feature#L703) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) -- [apiShareManagementToShares/acceptShares.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L22) -- [apiShareManagementToShares/acceptShares.feature:223](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L223) -- [apiShareManagementToShares/acceptShares.feature:270](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L270) -- [apiShareManagementToShares/acceptShares.feature:342](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L342) -- [apiShareManagementToShares/acceptShares.feature:378](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L378) -- [apiShareManagementToShares/acceptShares.feature:417](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L417) +- [apiShareManagementToShares/acceptShares.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L30) +- [apiShareManagementToShares/acceptShares.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L234) +- [apiShareManagementToShares/acceptShares.feature:281](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L281) +- [apiShareManagementToShares/acceptShares.feature:355](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L355) +- [apiShareManagementToShares/acceptShares.feature:393](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L393) +- [apiShareManagementToShares/acceptShares.feature:436](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L436) #### User cannot create a folder named Share -- [apiShareManagementToShares/acceptShares.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L279) -- [apiShareManagementToShares/acceptShares.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L298) +- [apiShareManagementToShares/acceptShares.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L290) +- [apiShareManagementToShares/acceptShares.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L309) #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) -- [apiShareManagementToShares/acceptShares.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L71) -- [apiShareManagementToShares/acceptShares.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L162) -- [apiShareManagementToShares/acceptShares.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L175) -- [apiShareManagementToShares/acceptShares.feature:196](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L196) -- [apiShareManagementToShares/acceptShares.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L249) -- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L28) -- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L48) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L140) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L141) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:176](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L176) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:177](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L177) +- [apiShareManagementToShares/acceptShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L82) +- [apiShareManagementToShares/acceptShares.feature:173](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L173) +- [apiShareManagementToShares/acceptShares.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L186) +- [apiShareManagementToShares/acceptShares.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L207) +- [apiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L260) +- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L31) +- [apiShareManagementToShares/acceptSharesToSharesFolder.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L52) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L138) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L139) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L171) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:172](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L172) #### [file_target in share response](https://github.com/owncloud/product/issues/203) @@ -664,46 +664,46 @@ File and sync features in a shared scenario - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L37) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L66) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L67) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L91) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L92) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L94) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L93) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L95) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L97) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L96) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L98) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:155](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L155) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L99) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:156](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L156) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:288](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L288) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:289](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L289) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:305](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L305) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:306](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L306) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L157) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L290) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L291) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:308](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L308) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L309) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L46) - [apiShareManagementToShares/mergeShare.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L32) - [apiShareManagementToShares/mergeShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L42) - [apiShareManagementToShares/mergeShare.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L89) #### [Shares are not deleted when user is deleted](https://github.com/owncloud/ocis/issues/1258) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L100) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L101) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L102) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:179](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L179) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L180) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:204](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L204) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L205) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L236) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:237](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L237) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L258) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:259](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L259) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:324](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L324) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:325](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L325) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:362](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L362) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:363](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L363) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:392](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L392) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:461](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L461) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:462](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L462) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:497](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L497) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:498](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L498) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:501](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L501) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L181) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L182) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L206) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L207) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:238](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L238) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:239](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L239) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L260) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:261](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L261) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:328](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L328) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:329](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L329) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:368](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L368) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:369](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L369) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:398](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L398) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:467](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L467) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:468](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L468) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:504](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L504) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:505](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L505) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:508](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L508) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L28) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L29) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L89) @@ -715,14 +715,14 @@ File and sync features in a shared scenario - [apiShareManagementBasicToShares/deleteShareFromShares.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L44) #### [file_target in share response](https://github.com/owncloud/product/issues/203) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:367](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L367) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:529](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L529) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:547](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L547) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:565](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L565) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:373](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L373) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:536](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L536) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L554) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:572](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L572) #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:342](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L342) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:343](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L343) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L347) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:348](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L348) #### [File deletion using dav gives unique string in filename in the trashbin](https://github.com/owncloud/product/issues/178) @@ -732,12 +732,12 @@ File and sync features in a shared scenario cannot share a folder with create permission #### [Listing shares via ocs API does not show path for parent folders](https://github.com/owncloud/ocis/issues/1231) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:118](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L118) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:130](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L130) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L181) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L182) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L120) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L132) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:183](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L183) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L184) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:185](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L185) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L186) #### [Shares are not deleted when user is deleted](https://github.com/owncloud/ocis/issues/1258) - [apiShareOperationsToShares/gettingShares.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/gettingShares.feature#L24) @@ -897,18 +897,18 @@ File and sync features in a shared scenario - [apiSharePublicLink1/createPublicLinkShare.feature:685](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L685) - [apiSharePublicLink1/createPublicLinkShare.feature:735](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L735) - [apiSharePublicLink1/createPublicLinkShare.feature:736](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/createPublicLinkShare.feature#L736) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:163](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L163) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L164) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L165) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L166) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L42) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L43) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:69](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L69) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L70) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L97) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L98) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:135](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L135) -- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:136](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L136) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:167](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L167) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:168](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L168) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L44) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L45) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L74) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L75) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:104](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L104) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L105) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L146) +- [apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/excludeGroupFromReceivingSharesToSharesFolder.feature#L147) #### [Public cannot upload file with mtime set on a public link share with new version of WebDAV API](https://github.com/owncloud/core/issues/37605) @@ -1148,8 +1148,8 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiTrashbin/trashbinSharingToShares.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L24) - [apiTrashbin/trashbinSharingToShares.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L25) -- [apiShareManagementToShares/acceptShares.feature:469](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L469) -- [apiShareManagementToShares/acceptShares.feature:470](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L470) +- [apiShareManagementToShares/acceptShares.feature:489](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L489) +- [apiShareManagementToShares/acceptShares.feature:490](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L490) #### [deleting a file inside a received shared folder is moved to the trash-bin of the sharer not the receiver](https://github.com/owncloud/ocis/issues/1124) @@ -1205,8 +1205,6 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiMain/quota.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L70) Scenario: Overwriting a file in received folder having enough quota - [apiMain/quota.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L84) Scenario: Overwriting a file in received folder having insufficient quota - [apiMain/quota.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L94) Scenario: Overwriting a received file having enough quota -- [apiWebdavProperties1/getQuota.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L88) -- [apiWebdavProperties1/getQuota.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L89) Scenario Outline: Retrieving folder quota of shared folder with quota when no quota is set for recipient - [apiWebdavProperties1/getQuota.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L48) - [apiWebdavProperties1/getQuota.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L49) @@ -1261,42 +1259,45 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareOperationsToShares/changingFilesShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/changingFilesShare.feature#L63) Scenario Outline: Moving a file into a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L89) -- [apiWebdavMove2/moveFile.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L90) -- [apiWebdavMove2/moveFile.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L91) -- [apiWebdavMove2/moveFile.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L92) +- [apiWebdavMove2/moveFile.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L99) +- [apiWebdavMove2/moveFile.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L100) +- [apiWebdavMove2/moveFile.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L101) +- [apiWebdavMove2/moveFile.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L102) Scenario Outline: Moving a file out of a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L112) -- [apiWebdavMove2/moveFile.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L113) +- [apiWebdavMove2/moveFile.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L122) +- [apiWebdavMove2/moveFile.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L123) Scenario Outline: Moving a folder into a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:136](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L136) -- [apiWebdavMove2/moveFile.feature:137](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L137) -- [apiWebdavMove2/moveFile.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L138) -- [apiWebdavMove2/moveFile.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L139) +- [apiWebdavMove2/moveFile.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L146) +- [apiWebdavMove2/moveFile.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L147) +- [apiWebdavMove2/moveFile.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L148) +- [apiWebdavMove2/moveFile.feature:149](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L149) Scenario Outline: Moving a folder out of a shared folder as the sharee and as the sharer -- [apiWebdavMove2/moveFile.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L160) -- [apiWebdavMove2/moveFile.feature:161](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L161) +- [apiWebdavMove2/moveFile.feature:170](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L170) +- [apiWebdavMove2/moveFile.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L171) Scenario Outline: Moving a file to a shared folder with no permissions -- [apiWebdavMove2/moveFile.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L181) -- [apiWebdavMove2/moveFile.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L182) +- [apiWebdavMove2/moveFile.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L192) +- [apiWebdavMove2/moveFile.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L193) Scenario Outline: Moving a file to overwrite a file in a shared folder with no permissions -- [apiWebdavMove2/moveFile.feature:200](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L200) -- [apiWebdavMove2/moveFile.feature:201](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L201) +- [apiWebdavMove2/moveFile.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L213) +- [apiWebdavMove2/moveFile.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L214) Scenario Outline: rename a file into an invalid filename -- [apiWebdavMove2/moveFile.feature:219](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L219) -- [apiWebdavMove2/moveFile.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L220) +- [apiWebdavMove2/moveFile.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L234) +- [apiWebdavMove2/moveFile.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L235) Scenario Outline: Checking file id after a move between received shares -- [apiWebdavMove2/moveFile.feature:255](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L255) -- [apiWebdavMove2/moveFile.feature:256](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L256) -Scenario Outline: Renaming a file to a path with extension .part should not be possible - [apiWebdavMove2/moveFile.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L272) - [apiWebdavMove2/moveFile.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L273) +Scenario Outline: Checking file id after a move between received shares +- [apiWebdavMove2/moveFile.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L290) +- [apiWebdavMove2/moveFile.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L291) +Scenario Outline: Renaming a file to a path with extension .part should not be possible +- [apiWebdavMove2/moveFile.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L290) +- [apiWebdavMove2/moveFile.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L291) #### [OCIS-storage overwriting a file as share receiver, does not create a new file version for the sharer](https://github.com/owncloud/ocis/issues/766) - [apiVersions/fileVersionsSharingToShares.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L33) #### [restoring an older version of a shared file deletes the share](https://github.com/owncloud/ocis/issues/765) -- [apiShareManagementToShares/acceptShares.feature:473](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L473) +- [apiShareManagementToShares/acceptShares.feature:493](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L493) - [apiVersions/fileVersionsSharingToShares.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L44) #### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) @@ -1318,64 +1319,61 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) #### [Expiration date for user shares is not implemented](https://github.com/owncloud/ocis/issues/1250) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L26) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L27) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:55](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L55) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L56) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L83) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L84) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:110](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L110) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:111](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L111) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:137](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L137) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L138) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L159) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L160) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:190](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L190) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:191](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L191) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L220) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L221) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L249) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:250](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L250) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L279) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:280](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L280) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:300](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L300) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:301](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L301) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:322](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L322) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:323](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L323) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:344](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L344) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:345](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L345) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:367](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L367) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:368](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L368) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:385](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L385) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:386](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L386) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:403](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L403) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:404](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L404) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:426](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L426) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:427](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L427) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:450](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L450) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:451](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L451) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:474](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L474) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:475](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L475) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:499](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L499) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:500](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L500) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:521](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L521) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:522](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L522) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:543](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L543) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:544](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L544) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:563](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L563) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:564](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L564) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:581](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L581) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:582](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L582) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:603](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L603) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:604](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L604) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:628](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L628) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:629](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L629) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:630](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L630) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L29) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L30) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L58) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L59) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L86) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L87) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L113) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:114](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L114) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L140) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L141) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L162) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:163](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L163) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L193) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:194](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L194) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:223](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L223) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L224) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:252](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L252) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:253](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L253) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:282](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L282) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L283) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:303](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L303) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:304](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L304) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:325](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L325) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:326](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L326) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L347) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:348](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L348) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:370](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L370) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:371](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L371) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:388](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L388) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:389](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L389) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:406](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L406) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:407](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L407) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:429](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L429) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:430](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L430) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:453](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L453) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:454](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L454) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:477](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L477) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:478](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L478) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:502](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L502) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:503](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L503) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:524](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L524) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:525](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L525) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:546](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L546) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:547](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L547) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:566](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L566) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:567](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L567) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:584](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L584) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:585](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L585) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:606](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L606) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:607](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L607) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:631](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L631) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:632](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L632) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:653](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L653) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:654](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L654) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:655](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L655) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:633](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L633) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:634](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L634) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:635](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L635) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:656](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L656) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:657](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L657) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:658](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L658) @@ -1385,61 +1383,64 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:662](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L662) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:663](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L663) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:664](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L664) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:685](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L685) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:686](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L686) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:687](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L687) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:665](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L665) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:666](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L666) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:667](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L667) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:688](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L688) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:689](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L689) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:690](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L690) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:711](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L711) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:712](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L712) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:713](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L713) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:691](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L691) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:692](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L692) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:693](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L693) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:714](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L714) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:715](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L715) - [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:716](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L716) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:737](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L737) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:738](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L738) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:759](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L759) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:760](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L760) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:781](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L781) -- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:782](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L782) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:717](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L717) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:718](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L718) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:719](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L719) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:740](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L740) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:741](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L741) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:762](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L762) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:763](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L763) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:784](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L784) +- [apiShareCreateSpecialToShares1/createShareExpirationDate.feature:785](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareExpirationDate.feature#L785) #### [sharing with group not available](https://github.com/owncloud/product/issues/293) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L36) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L37) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L65) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L66) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L85) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L86) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:106](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L106) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L39) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L40) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L68) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:69](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L69) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L87) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L88) - [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L107) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:201](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L201) -- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:202](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L202) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L108) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L193) +- [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:194](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L194) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:10](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L10) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L34) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L58) - [apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L82) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L46) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L47) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L48) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L49) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:50](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L50) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:51](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L51) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L82) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L83) -- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L84) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L52) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:53](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L53) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:54](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L54) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L85) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L86) - [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L87) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:438](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L438) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:439](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L439) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L88) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L89) +- [apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareGroupCaseSensitive.feature#L90) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:444](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L444) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:445](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L445) - [apiShareOperationsToShares/accessToShare.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/accessToShare.feature#L74) - [apiShareOperationsToShares/accessToShare.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/accessToShare.feature#L75) #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) - [apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature#L15) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L18) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L21) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L19) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L22) - [apiShareManagementToShares/moveReceivedShare.feature:14](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L14) - [apiShareManagementToShares/moveReceivedShare.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L28) - [apiShareManagementToShares/moveReceivedShare.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L39) @@ -1447,17 +1448,17 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiShareManagementToShares/moveReceivedShare.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L71) - [apiShareManagementToShares/moveReceivedShare.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L73) - [apiShareManagementToShares/moveReceivedShare.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L88) -- [apiShareManagementToShares/moveReceivedShare.feature:118](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L118) -- [apiShareManagementToShares/moveReceivedShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L128) -- [apiShareManagementToShares/moveReceivedShare.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L138) -- [apiShareManagementToShares/moveReceivedShare.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L148) -- [apiShareManagementToShares/moveReceivedShare.feature:158](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L158) -- [apiShareManagementToShares/moveReceivedShare.feature:168](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L168) -- [apiShareManagementToShares/moveReceivedShare.feature:197](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L197) -- [apiShareManagementToShares/moveReceivedShare.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L198) -- [apiShareManagementToShares/moveReceivedShare.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L221) -- [apiShareManagementToShares/moveReceivedShare.feature:222](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L222) -- [apiShareManagementToShares/moveReceivedShare.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L224) +- [apiShareManagementToShares/moveReceivedShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L120) +- [apiShareManagementToShares/moveReceivedShare.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L131) +- [apiShareManagementToShares/moveReceivedShare.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L142) +- [apiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L153) +- [apiShareManagementToShares/moveReceivedShare.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L164) +- [apiShareManagementToShares/moveReceivedShare.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L175) +- [apiShareManagementToShares/moveReceivedShare.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L205) +- [apiShareManagementToShares/moveReceivedShare.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L206) +- [apiShareManagementToShares/moveReceivedShare.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L229) +- [apiShareManagementToShares/moveReceivedShare.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L230) +- [apiShareManagementToShares/moveReceivedShare.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L232) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L59) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L60) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L94) @@ -1474,47 +1475,49 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L283) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:317](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L317) - [apiShareOperationsToShares/getWebDAVSharePermissions.feature:318](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/getWebDAVSharePermissions.feature#L318) -- [apiShareUpdateToShares/updateShare.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L92) -- [apiShareUpdateToShares/updateShare.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L93) -- [apiShareUpdateToShares/updateShare.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L94) -- [apiShareUpdateToShares/updateShare.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L95) - [apiShareUpdateToShares/updateShare.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L96) - [apiShareUpdateToShares/updateShare.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L97) +- [apiShareUpdateToShares/updateShare.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L98) +- [apiShareUpdateToShares/updateShare.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L99) +- [apiShareUpdateToShares/updateShare.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L100) +- [apiShareUpdateToShares/updateShare.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L101) +- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) - [apiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L123) -- [apiShareUpdateToShares/updateShare.feature:155](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L155) +- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) +- [apiShareUpdateToShares/updateShare.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L160) #### [No way to set default folder for received shares](https://github.com/owncloud/ocis/issues/1327) -- [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L21) - [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L22) +- [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L23) #### [Group shares support ](https://github.com/owncloud/ocis/issues/1289) - [apiShareOperationsToShares/gettingShares.feature:188](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares/gettingShares.feature#L188) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) #### [Group shares support](https://github.com/owncloud/ocis/issues/1289) -- [apiShareUpdateToShares/updateShare.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L290) -- [apiShareUpdateToShares/updateShare.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L291) -- [apiShareUpdateToShares/updateShare.feature:306](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L306) -- [apiShareUpdateToShares/updateShare.feature:307](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L307) -- [apiShareUpdateToShares/updateShare.feature:334](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L334) -- [apiShareUpdateToShares/updateShare.feature:335](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L335) -- [apiShareUpdateToShares/updateShare.feature:364](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L364) -- [apiShareUpdateToShares/updateShare.feature:365](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L365) +- [apiShareUpdateToShares/updateShare.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L298) +- [apiShareUpdateToShares/updateShare.feature:299](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L299) +- [apiShareUpdateToShares/updateShare.feature:315](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L315) +- [apiShareUpdateToShares/updateShare.feature:316](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L316) +- [apiShareUpdateToShares/updateShare.feature:344](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L344) +- [apiShareUpdateToShares/updateShare.feature:345](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L345) +- [apiShareUpdateToShares/updateShare.feature:375](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L375) +- [apiShareUpdateToShares/updateShare.feature:376](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L376) #### [Group shares support](https://github.com/owncloud/ocis/issues/1289) #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) -- [apiShareUpdateToShares/updateShare.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L61) -- [apiShareUpdateToShares/updateShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L62) -- [apiShareUpdateToShares/updateShare.feature:115](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L115) -- [apiShareUpdateToShares/updateShare.feature:116](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L116) -- [apiShareUpdateToShares/updateShare.feature:117](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L117) -- [apiShareUpdateToShares/updateShare.feature:118](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L118) -- [apiShareUpdateToShares/updateShare.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L119) -- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) -- [apiShareUpdateToShares/updateShare.feature:252](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L252) -- [apiShareUpdateToShares/updateShare.feature:253](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L253) -- [apiShareUpdateToShares/updateShare.feature:265](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L265) -- [apiShareUpdateToShares/updateShare.feature:266](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L266) +- [apiShareUpdateToShares/updateShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L63) +- [apiShareUpdateToShares/updateShare.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L64) +- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) +- [apiShareUpdateToShares/updateShare.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L121) +- [apiShareUpdateToShares/updateShare.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L122) +- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) +- [apiShareUpdateToShares/updateShare.feature:124](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L124) +- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) +- [apiShareUpdateToShares/updateShare.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L258) +- [apiShareUpdateToShares/updateShare.feature:259](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L259) +- [apiShareUpdateToShares/updateShare.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L272) +- [apiShareUpdateToShares/updateShare.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L273) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L34) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L35) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:54](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L54) @@ -1523,17 +1526,17 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p #### [Share additional info](https://github.com/owncloud/ocis/issues/1253) #### [Share extra attributes](https://github.com/owncloud/ocis/issues/1224) #### [Edit user share response has an "name" field](https://github.com/owncloud/ocis/issues/1225) -- [apiShareUpdateToShares/updateShare.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L230) -- [apiShareUpdateToShares/updateShare.feature:231](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L231) +- [apiShareUpdateToShares/updateShare.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L235) +- [apiShareUpdateToShares/updateShare.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L236) #### [user can access version metadata of a received share before accepting it](https://github.com/owncloud/ocis/issues/760) - [apiVersions/fileVersionsSharingToShares.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L279) #### [when a share exists its impossible to share a renamed folder](https://github.com/owncloud/ocis/issues/719) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:611](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L611) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:612](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L612) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:665](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L665) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:666](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L666) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:619](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L619) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:620](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L620) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:674](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L674) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:675](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L675) #### [ocis-storage PROPFIND on a file uploaded by share receiver is not possible](https://github.com/owncloud/ocis/issues/968) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L26) @@ -1551,15 +1554,15 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiWebdavUploadTUS/uploadToShare.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L56) #### [Share lists deleted user as 'user'](https://github.com/owncloud/ocis/issues/903) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:632](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L632) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:633](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L633) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:641](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L641) +- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:642](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L642) #### [OCIS-storage overwriting a file as share receiver, does not create a new file version for the sharer](https://github.com/owncloud/ocis/issues/766) - [apiVersions/fileVersionsSharingToShares.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L291) #### [deleting a share with wrong authentication returns OCS status 996 / HTTP 500](https://github.com/owncloud/ocis/issues/1229) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:211](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#211) -- [apiShareManagementBasicToShares/deleteShareFromShares.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#212) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#211) +- [apiShareManagementBasicToShares/deleteShareFromShares.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#212) ### User Management User and group management features @@ -1615,26 +1618,26 @@ API, search, favorites, config, capabilities, not existing endpoints, CORS and o #### [server returns 500 when trying to access a not existing file](https://github.com/owncloud/ocis-reva/issues/13) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavDELETEAuth.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L36) Scenario: send DELETE requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavDELETEAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L38) Scenario: send DELETE requests to another user's webDav endpoints as normal user #### [users can access each-others data using the new webdav API](https://github.com/owncloud/ocis/issues/1347) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavLOCKAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavLOCKAuth.feature#L38) Scenario: send LOCK requests to another user's webDav endpoints as normal user -- [apiAuthWebDav/webDavMKCOLAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMKCOLAuth.feature#L37) Scenario: send MKCOL requests to another user's webDav endpoints as normal user -- [apiAuthWebDav/webDavPROPFINDAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPFINDAuth.feature#L37) Scenario: send PROPFIND requests to another user's webDav endpoints as normal user -- [apiAuthWebDav/webDavPROPPATCHAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPPATCHAuth.feature#L38) Scenario: send PROPPATCH requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavLOCKAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavLOCKAuth.feature#L40) Scenario: send LOCK requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavMKCOLAuth.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMKCOLAuth.feature#L36) Scenario: send MKCOL requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPROPFINDAuth.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPFINDAuth.feature#L39) Scenario: send PROPFIND requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPROPPATCHAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPROPPATCHAuth.feature#L40) Scenario: send PROPPATCH requests to another user's webDav endpoints as normal user #### [renaming a resource does not work](https://github.com/owncloud/ocis-reva/issues/14) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavMOVEAuth.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMOVEAuth.feature#L37) Scenario: send MOVE requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavMOVEAuth.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavMOVEAuth.feature#L39) Scenario: send MOVE requests to another user's webDav endpoints as normal user #### [send POST requests to another user's webDav endpoints as normal user](https://github.com/owncloud/ocis/issues/1287) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavPOSTAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPOSTAuth.feature#L38) Scenario: send POST requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPOSTAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPOSTAuth.feature#L40) Scenario: send POST requests to another user's webDav endpoints as normal user #### [PUT request with missing parent must return status code 409](https://github.com/owncloud/ocis/issues/824) _ocdav: api compatibility, return correct status code_ -- [apiAuthWebDav/webDavPUTAuth.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPUTAuth.feature#L38) Scenario: send PUT requests to another user's webDav endpoints as normal user +- [apiAuthWebDav/webDavPUTAuth.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavPUTAuth.feature#L40) Scenario: send PUT requests to another user's webDav endpoints as normal user #### [Using double slash in URL to access a folder gives 501 and other status codes](https://github.com/owncloud/ocis/issues/1667) - [apiAuthWebDav/webDavSpecialURLs.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavSpecialURLs.feature#L24) @@ -1650,35 +1653,35 @@ Scenario Outline: search for entry by pattern - [apiWebdavOperations/search.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L42) - [apiWebdavOperations/search.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L43) Scenario Outline: search for entries by only some letters from the middle of the entry name -- [apiWebdavOperations/search.feature:57](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L57) - [apiWebdavOperations/search.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L58) +- [apiWebdavOperations/search.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L59) Scenario Outline: search for files by extension -- [apiWebdavOperations/search.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L74) - [apiWebdavOperations/search.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L75) +- [apiWebdavOperations/search.feature:76](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L76) Scenario Outline: search with empty field -- [apiWebdavOperations/search.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L83) - [apiWebdavOperations/search.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L84) +- [apiWebdavOperations/search.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L85) Scenario Outline: limit returned search entries -- [apiWebdavOperations/search.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L101) - [apiWebdavOperations/search.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L102) +- [apiWebdavOperations/search.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L103) Scenario Outline: limit returned search entries to only 1 entry -- [apiWebdavOperations/search.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L119) - [apiWebdavOperations/search.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L120) +- [apiWebdavOperations/search.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L121) Scenario Outline: limit returned search entries to more entires than there are -- [apiWebdavOperations/search.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L138) - [apiWebdavOperations/search.feature:139](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L139) +- [apiWebdavOperations/search.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L140) Scenario Outline: report extra properties in search entries for a file -- [apiWebdavOperations/search.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L165) - [apiWebdavOperations/search.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L166) +- [apiWebdavOperations/search.feature:167](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L167) Scenario Outline: report extra properties in search entries for a folder -- [apiWebdavOperations/search.feature:191](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L191) - [apiWebdavOperations/search.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L192) +- [apiWebdavOperations/search.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L193) Scenario Outline: search for entry with emoji by pattern -- [apiWebdavOperations/search.feature:210](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L210) - [apiWebdavOperations/search.feature:211](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L211) -- [apiWebdavOperations/search.feature:213](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L213) Scenario: search for entry by tags using REPORT method -- [apiWebdavOperations/search.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L229) Scenario: share a tagged resource to another internal user and sharee searches for tag using REPORT method -- [apiWebdavOperations/search.feature:254](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L254) Scenario: search for entries across various folders by tags using REPORT method +- [apiWebdavOperations/search.feature:212](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L212) +- [apiWebdavOperations/search.feature:214](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L214) Scenario: search for entry by tags using REPORT method +- [apiWebdavOperations/search.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L230) Scenario: share a tagged resource to another internal user and sharee searches for tag using REPORT method +- [apiWebdavOperations/search.feature:255](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/search.feature#L255) Scenario: search for entries across various folders by tags using REPORT method And other missing implementation of favorites - [apiFavorites/favorites.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiFavorites/favorites.feature#L91) @@ -1718,8 +1721,8 @@ Scenario Outline: Unauthenticated call - [apiWebdavOperations/refuseAccess.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L21) - [apiWebdavOperations/refuseAccess.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L22) Scenario Outline: A disabled user cannot use webdav -- [apiWebdavOperations/refuseAccess.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L33) - [apiWebdavOperations/refuseAccess.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L34) +- [apiWebdavOperations/refuseAccess.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/refuseAccess.feature#L35) #### [trying to access a non-existing resource returns an empty body](https://github.com/owncloud/ocis/issues/1282) @@ -1806,8 +1809,8 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuthOcs/ocsGETAuth.feature:243](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthOcs/ocsGETAuth.feature#L243) #### [app passwords are not possible](https://github.com/owncloud/ocis/issues/1320) -- [apiAuthWebDav/webDavDELETEAuth.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L78) -- [apiAuthWebDav/webDavDELETEAuth.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L92) +- [apiAuthWebDav/webDavDELETEAuth.feature:80](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L80) +- [apiAuthWebDav/webDavDELETEAuth.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthWebDav/webDavDELETEAuth.feature#L94) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) - [apiCapabilities/capabilities.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L8) @@ -1861,24 +1864,24 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiCapabilities/capabilities.feature:787](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L787) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L25) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L26) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L47) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L48) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L66) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L67) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L87) -- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L88) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L25) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L44) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L45) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L60) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L61) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L78) +- [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:79](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L79) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L26) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L44) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L45) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L64) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L65) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:83](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L83) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L84) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L103) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:104](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L104) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L122) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L123) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L27) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L46) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L47) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L67) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L68) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L87) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L88) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L108) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L109) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L128) +- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:129](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L129) - [apiMain/caldav.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L8) - [apiMain/caldav.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L15) @@ -1899,8 +1902,8 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiTranslation/translation.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTranslation/translation.feature#L28) #### [Sharing a same file twice to the same group](https://github.com/owncloud/ocis/issues/1710) -[apiShareManagementBasicToShares/createShareToSharesFolder.feature:679](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L679) -[apiShareManagementBasicToShares/createShareToSharesFolder.feature:680](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L680) +[apiShareManagementBasicToShares/createShareToSharesFolder.feature:689](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L689) +[apiShareManagementBasicToShares/createShareToSharesFolder.feature:690](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L690) #### [Request to edit non-existing user by authorized admin gets unauthorized in http response](https://github.com/owncloud/core/issues/38423) [apiAuthOcs/ocsPUTAuth.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuthOcs/ocsPUTAuth.feature#L26) @@ -1977,14 +1980,14 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature#L39) - [apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature#L40) #### [cannot set blacklisted file names](https://github.com/owncloud/product/issues/260) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L12) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L18) -- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L26) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L13) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L19) +- [apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToBlacklistedNameAsync.feature#L27) #### [cannot set excluded directories](https://github.com/owncloud/product/issues/261) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L12) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L19) -- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L27) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L13) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L20) +- [apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature#L29) #### [renaming to banned name works](https://github.com/owncloud/ocis/issues/1295) - [apiWebdavMove1/moveFolder.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolder.feature#L21) @@ -1999,32 +2002,32 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavMove1/moveFolderToBlacklistedName.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L22) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L35) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L36) -- [apiWebdavMove1/moveFolderToBlacklistedName.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L70) - [apiWebdavMove1/moveFolderToBlacklistedName.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L71) +- [apiWebdavMove1/moveFolderToBlacklistedName.feature:72](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToBlacklistedName.feature#L72) #### [cannot set excluded directories](https://github.com/owncloud/product/issues/261) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:21](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L21) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L22) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L34) - [apiWebdavMove1/moveFolderToExcludedDirectory.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L35) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L70) -- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L71) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L36) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:72](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L72) +- [apiWebdavMove1/moveFolderToExcludedDirectory.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFolderToExcludedDirectory.feature#L73) #### [cannot set blacklisted file names](https://github.com/owncloud/product/issues/260) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L18) - [apiWebdavMove2/moveFileToBlacklistedName.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L19) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L29) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L20) - [apiWebdavMove2/moveFileToBlacklistedName.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L30) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L62) -- [apiWebdavMove2/moveFileToBlacklistedName.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L63) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L31) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L64) +- [apiWebdavMove2/moveFileToBlacklistedName.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToBlacklistedName.feature#L65) #### [cannot set excluded directories](https://github.com/owncloud/product/issues/261) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L18) - [apiWebdavMove2/moveFileToExcludedDirectory.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L19) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L28) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L29) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L63) -- [apiWebdavMove2/moveFileToExcludedDirectory.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L64) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L20) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L30) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L31) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L66) +- [apiWebdavMove2/moveFileToExcludedDirectory.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFileToExcludedDirectory.feature#L67) #### [system configuration options missing](https://github.com/owncloud/ocis/issues/1323) - [apiWebdavUpload1/uploadFileToBlacklistedName.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload1/uploadFileToBlacklistedName.feature#L31) @@ -2034,28 +2037,28 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers #### [cannot rename files asynchronously](https://github.com/owncloud/product/issues/259) -- [apiWebdavMove1/moveFileAsync.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L26) -- [apiWebdavMove1/moveFileAsync.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L27) - [apiWebdavMove1/moveFileAsync.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L28) - [apiWebdavMove1/moveFileAsync.feature:29](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L29) - [apiWebdavMove1/moveFileAsync.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L30) - [apiWebdavMove1/moveFileAsync.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L31) +- [apiWebdavMove1/moveFileAsync.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L32) - [apiWebdavMove1/moveFileAsync.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L33) -- [apiWebdavMove1/moveFileAsync.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L46) -- [apiWebdavMove1/moveFileAsync.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L59) -- [apiWebdavMove1/moveFileAsync.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L73) -- [apiWebdavMove1/moveFileAsync.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L88) -- [apiWebdavMove1/moveFileAsync.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L107) -- [apiWebdavMove1/moveFileAsync.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L125) -- [apiWebdavMove1/moveFileAsync.feature:135](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L135) -- [apiWebdavMove1/moveFileAsync.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L141) -- [apiWebdavMove1/moveFileAsync.feature:204](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L204) -- [apiWebdavMove1/moveFileAsync.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L205) -- [apiWebdavMove1/moveFileAsync.feature:224](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L224) -- [apiWebdavMove1/moveFileAsync.feature:225](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L225) -- [apiWebdavMove1/moveFileAsync.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L234) +- [apiWebdavMove1/moveFileAsync.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L35) +- [apiWebdavMove1/moveFileAsync.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L49) +- [apiWebdavMove1/moveFileAsync.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L62) +- [apiWebdavMove1/moveFileAsync.feature:77](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L77) +- [apiWebdavMove1/moveFileAsync.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L94) +- [apiWebdavMove1/moveFileAsync.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L113) +- [apiWebdavMove1/moveFileAsync.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L132) +- [apiWebdavMove1/moveFileAsync.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L142) +- [apiWebdavMove1/moveFileAsync.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L148) +- [apiWebdavMove1/moveFileAsync.feature:215](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L215) +- [apiWebdavMove1/moveFileAsync.feature:216](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L216) - [apiWebdavMove1/moveFileAsync.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L235) -- [apiWebdavMove1/moveFileAsync.feature:240](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L240) +- [apiWebdavMove1/moveFileAsync.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L236) +- [apiWebdavMove1/moveFileAsync.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L245) +- [apiWebdavMove1/moveFileAsync.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L246) +- [apiWebdavMove1/moveFileAsync.feature:251](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L251) #### [Checksum feature](https://github.com/owncloud/ocis/issues/1291) _ocdav: return checksum in upload response for chunked upload_ From 42d43c982ec2c32a5a8704dea12285601102f128 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Apr 2021 17:48:07 +0200 Subject: [PATCH 02/70] [Build-deps]: Bump github.com/go-ldap/ldap/v3 from 3.2.4 to 3.3.0 (#1613) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 552c8b856f..d2fb86880a 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/cs3org/go-cs3apis v0.0.0-20210325133324-32b03d75a535 github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/eventials/go-tus v0.0.0-20200718001131-45c7ec8f5d59 - github.com/go-ldap/ldap/v3 v3.2.4 + github.com/go-ldap/ldap/v3 v3.3.0 github.com/go-openapi/errors v0.19.6 // indirect github.com/go-openapi/strfmt v0.19.2 // indirect github.com/go-sql-driver/mysql v1.5.0 diff --git a/go.sum b/go.sum index ffcd389bcd..7cfbf4c9f2 100644 --- a/go.sum +++ b/go.sum @@ -194,8 +194,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 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-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-ldap/ldap/v3 v3.2.4 h1:PFavAq2xTgzo/loE8qNXcQaofAaqIpI4WgaLdv+1l3E= -github.com/go-ldap/ldap/v3 v3.2.4/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= +github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ= +github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= 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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= From 695231ffd3ee6c07f655c384687131f6df93d048 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Apr 2021 17:51:19 +0200 Subject: [PATCH 03/70] [Build-deps]: Bump github.com/aws/aws-sdk-go from 1.37.30 to 1.38.13 (#1612) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d2fb86880a..965b9715f6 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible github.com/ReneKroon/ttlcache/v2 v2.3.0 - github.com/aws/aws-sdk-go v1.37.30 + github.com/aws/aws-sdk-go v1.38.13 github.com/c-bata/go-prompt v0.2.5 github.com/cheggaaa/pb v1.0.29 github.com/coreos/go-oidc v2.2.1+incompatible diff --git a/go.sum b/go.sum index 7cfbf4c9f2..15a2488391 100644 --- a/go.sum +++ b/go.sum @@ -83,8 +83,8 @@ github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQ github.com/aws/aws-sdk-go v1.20.1/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.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.37.30 h1:fZeVg3QuTkWE/dEvPQbK6AL32+3G9ofJfGFSPS1XLH0= -github.com/aws/aws-sdk-go v1.37.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.38.13 h1:ICZ8czsU+nrx6cOXfI/xA4ZZEOekCIZs2+nsaDWxw84= +github.com/aws/aws-sdk-go v1.38.13/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-xray-sdk-go v0.9.4/go.mod h1:XtMKdBQfpVut+tJEwI7+dJFRxxRdxHDyVNp2tHXRq04= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= From 3a661148a51e34b52a6b7612c1f3465f4096fdaf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Apr 2021 17:51:37 +0200 Subject: [PATCH 04/70] [Build-deps]: Bump github.com/onsi/ginkgo from 1.15.2 to 1.16.0 (#1611) --- go.mod | 2 +- go.sum | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 965b9715f6..6b157f5cd9 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/minio/minio-go/v7 v7.0.10 github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/mapstructure v1.4.1 - github.com/onsi/ginkgo v1.15.2 + github.com/onsi/ginkgo v1.16.0 github.com/onsi/gomega v1.11.0 github.com/ory/fosite v0.39.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 15a2488391..41752e575c 100644 --- a/go.sum +++ b/go.sum @@ -210,6 +210,7 @@ github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gG github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobuffalo/attrs v0.1.0/go.mod h1:fmNpaWyHM0tRm8gCZWKx8yY9fvaNLo2PyzBNSrBZ5Hw= 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= @@ -796,8 +797,8 @@ github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.15.2 h1:l77YT15o814C2qVL47NOyjV/6RbaP7kKdrvZnxQ3Org= -github.com/onsi/ginkgo v1.15.2/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o= +github.com/onsi/ginkgo v1.16.0 h1:NBrNLB37exjJLxXtFOktx6CISBdS1aF8+7MwKlTV8U4= +github.com/onsi/ginkgo v1.16.0/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= 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= From d691efcf319a1a14b4a5dda4b01aceeb1ed40279 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Apr 2021 17:51:52 +0200 Subject: [PATCH 05/70] [Build-deps]: Bump github.com/go-sql-driver/mysql from 1.5.0 to 1.6.0 (#1606) --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 6b157f5cd9..70cd635d26 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/go-ldap/ldap/v3 v3.3.0 github.com/go-openapi/errors v0.19.6 // indirect github.com/go-openapi/strfmt v0.19.2 // indirect - github.com/go-sql-driver/mysql v1.5.0 + github.com/go-sql-driver/mysql v1.6.0 github.com/golang/protobuf v1.5.2 github.com/gomodule/redigo v1.8.4 github.com/google/go-github v17.0.0+incompatible diff --git a/go.sum b/go.sum index 41752e575c..fc9a5d7f84 100644 --- a/go.sum +++ b/go.sum @@ -206,8 +206,9 @@ github.com/go-openapi/strfmt v0.19.2 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncC github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= 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 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= From a8c61401b662d8e09175416c0556da8ef3ba8ed6 Mon Sep 17 00:00:00 2001 From: "Zyad A. Ali" Date: Wed, 7 Apr 2021 08:32:38 +0200 Subject: [PATCH 06/70] docs: update "getting-started" and "concepts" (#1609) Direct sentences towards users rather than developers, and remove placeholder text. --- docs/content/en/docs/concepts/_index.md | 12 +----------- docs/content/en/docs/getting-started/_index.md | 3 +-- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/docs/content/en/docs/concepts/_index.md b/docs/content/en/docs/concepts/_index.md index 989e5a554d..76125286a5 100644 --- a/docs/content/en/docs/concepts/_index.md +++ b/docs/content/en/docs/concepts/_index.md @@ -3,15 +3,5 @@ title: "Concepts" linkTitle: "Concepts" weight: 10 description: > - What does your user need to understand about your project in order to use it - or potentially contribute to it? + What do you need to understand about Reva in order to use it - or potentially contribute to it? --- - -{{% pageinfo %}} -This is a placeholder page that shows you how to use this template site. -{{% /pageinfo %}} - -For many projects, users may not need much information beyond the information in the [Overview](/docs/overview/), so this section is **optional**. However if there are areas where your users will need a more detailed understanding of a given term or feature in order to do anything useful with your project (or to not make mistakes when using it) put that information in this section. For example, you may want to add some conceptual pages if you have a large project with many components and a complex architecture. - -Remember to focus on what the user needs to know, not just what you think is interesting about your project! If they don’t need to understand your original design decisions to use or contribute to the project, don’t put them in, or include your design docs in your repo and link to them. Similarly, most users will probably need to know more about how features work when in use rather than how they are implemented. Consider a separate architecture page for more detailed implementation and system design information that potential project contributors can consult. - - diff --git a/docs/content/en/docs/getting-started/_index.md b/docs/content/en/docs/getting-started/_index.md index 1b7490bbae..a669f5781a 100644 --- a/docs/content/en/docs/getting-started/_index.md +++ b/docs/content/en/docs/getting-started/_index.md @@ -3,6 +3,5 @@ title: "Getting Started" linkTitle: "Getting Started" weight: 2 description: > - What does your user need to know to try your project? + What do you need to know to try Reva? --- - From 3d7c824fd211807a717f2d9a2366bdd461898723 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Fri, 9 Apr 2021 08:38:10 +0200 Subject: [PATCH 07/70] Add wrappers for EOS and EOS Home storage drivers (#1624) --- changelog/unreleased/eos-wrappers.md | 9 ++ .../storageprovider/storageprovider.go | 5 +- pkg/cbox/loader/loader.go | 2 + pkg/cbox/publicshare/sql/sql.go | 2 +- .../storage/eoshomewrapper/eoshomewrapper.go | 123 ++++++++++++++++++ pkg/cbox/storage/eoswrapper/eoswrapper.go | 123 ++++++++++++++++++ 6 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 changelog/unreleased/eos-wrappers.md create mode 100644 pkg/cbox/storage/eoshomewrapper/eoshomewrapper.go create mode 100644 pkg/cbox/storage/eoswrapper/eoswrapper.go diff --git a/changelog/unreleased/eos-wrappers.md b/changelog/unreleased/eos-wrappers.md new file mode 100644 index 0000000000..05abb44975 --- /dev/null +++ b/changelog/unreleased/eos-wrappers.md @@ -0,0 +1,9 @@ +Enhancement: Add wrappers for EOS and EOS Home storage drivers + +For CERNBox, we need the mount ID to be configured according to the owner of a +resource. Setting this in the storageprovider means having different instances +of this service to cater to different users, which does not scale. This driver +forms a wrapper around the EOS driver and sets the mount ID according to a +configurable mapping based on the owner of the resource. + +https://github.com/cs3org/reva/pull/1624 diff --git a/internal/grpc/services/storageprovider/storageprovider.go b/internal/grpc/services/storageprovider/storageprovider.go index 424e24e008..729e660eee 100644 --- a/internal/grpc/services/storageprovider/storageprovider.go +++ b/internal/grpc/services/storageprovider/storageprovider.go @@ -1142,7 +1142,10 @@ func (s *service) trimMountPrefix(fn string) (string, error) { } func (s *service) wrap(ctx context.Context, ri *provider.ResourceInfo) error { - ri.Id.StorageId = s.mountID + if ri.Id.StorageId == "" { + // For wrapper drivers, the storage ID might already be set. In that case, skip setting it + ri.Id.StorageId = s.mountID + } ri.Path = path.Join(s.mountPath, ri.Path) return nil } diff --git a/pkg/cbox/loader/loader.go b/pkg/cbox/loader/loader.go index a46b40c90a..a215a8aa03 100644 --- a/pkg/cbox/loader/loader.go +++ b/pkg/cbox/loader/loader.go @@ -23,5 +23,7 @@ import ( _ "github.com/cs3org/reva/pkg/cbox/group/rest" _ "github.com/cs3org/reva/pkg/cbox/publicshare/sql" _ "github.com/cs3org/reva/pkg/cbox/share/sql" + _ "github.com/cs3org/reva/pkg/cbox/storage/eoshomewrapper" + _ "github.com/cs3org/reva/pkg/cbox/storage/eoswrapper" _ "github.com/cs3org/reva/pkg/cbox/user/rest" ) diff --git a/pkg/cbox/publicshare/sql/sql.go b/pkg/cbox/publicshare/sql/sql.go index 152d3c42b2..cfc0ba6796 100644 --- a/pkg/cbox/publicshare/sql/sql.go +++ b/pkg/cbox/publicshare/sql/sql.go @@ -437,7 +437,7 @@ func (m *manager) cleanupExpiredShares() error { return nil } - query := "delete from oc_share where expiration IS NOT NULL AND expiration < ?" + query := "update oc_share set orphan = 1 where expiration IS NOT NULL AND expiration < ?" params := []interface{}{time.Now().Format("2006-01-02 03:04:05")} stmt, err := m.db.Prepare(query) diff --git a/pkg/cbox/storage/eoshomewrapper/eoshomewrapper.go b/pkg/cbox/storage/eoshomewrapper/eoshomewrapper.go new file mode 100644 index 0000000000..eda1f55ab5 --- /dev/null +++ b/pkg/cbox/storage/eoshomewrapper/eoshomewrapper.go @@ -0,0 +1,123 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package eoshome + +import ( + "bytes" + "context" + "text/template" + + "github.com/Masterminds/sprig" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/cs3org/reva/pkg/storage" + "github.com/cs3org/reva/pkg/storage/fs/registry" + "github.com/cs3org/reva/pkg/storage/utils/eosfs" + "github.com/mitchellh/mapstructure" + "github.com/pkg/errors" +) + +func init() { + registry.Register("eoshomewrapper", New) +} + +type wrapper struct { + storage.FS + mountIDTemplate *template.Template +} + +func parseConfig(m map[string]interface{}) (*eosfs.Config, string, error) { + c := &eosfs.Config{} + if err := mapstructure.Decode(m, c); err != nil { + err = errors.Wrap(err, "error decoding conf") + return nil, "", err + } + + // default to version invariance if not configured + if _, ok := m["version_invariant"]; !ok { + c.VersionInvariant = true + } + + t, ok := m["mount_id_template"].(string) + if !ok || t == "" { + t = "eoshome-{{ trimAll \"/\" .Path | substr 0 1 }}" + } + + return c, t, nil +} + +// New returns an implementation of the storage.FS interface that forms a wrapper +// around separate connections to EOS. +func New(m map[string]interface{}) (storage.FS, error) { + c, t, err := parseConfig(m) + if err != nil { + return nil, err + } + c.EnableHome = true + + eos, err := eosfs.NewEOSFS(c) + if err != nil { + return nil, err + } + + mountIDTemplate, err := template.New("mountID").Funcs(sprig.TxtFuncMap()).Parse(t) + if err != nil { + return nil, err + } + + return &wrapper{FS: eos, mountIDTemplate: mountIDTemplate}, nil +} + +// We need to override the two methods, GetMD and ListFolder to fill the +// StorageId in the ResourceInfo objects. + +func (w *wrapper) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) { + res, err := w.FS.GetMD(ctx, ref, mdKeys) + if err != nil { + return nil, err + } + + // We need to extract the mount ID based on the mapping template. + // + // Take the first letter of the resource path after the namespace has been removed. + // If it's empty, leave it empty to be filled by storageprovider. + res.Id.StorageId = w.getMountID(ctx, res) + return res, nil +} + +func (w *wrapper) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) { + res, err := w.FS.ListFolder(ctx, ref, mdKeys) + if err != nil { + return nil, err + } + for _, r := range res { + r.Id.StorageId = w.getMountID(ctx, r) + } + return res, nil +} + +func (w *wrapper) getMountID(ctx context.Context, r *provider.ResourceInfo) string { + if r == nil { + return "" + } + b := bytes.Buffer{} + if err := w.mountIDTemplate.Execute(&b, r); err != nil { + return "" + } + return b.String() +} diff --git a/pkg/cbox/storage/eoswrapper/eoswrapper.go b/pkg/cbox/storage/eoswrapper/eoswrapper.go new file mode 100644 index 0000000000..2f27c42230 --- /dev/null +++ b/pkg/cbox/storage/eoswrapper/eoswrapper.go @@ -0,0 +1,123 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package eoshome + +import ( + "bytes" + "context" + "text/template" + + "github.com/Masterminds/sprig" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/cs3org/reva/pkg/storage" + "github.com/cs3org/reva/pkg/storage/fs/registry" + "github.com/cs3org/reva/pkg/storage/utils/eosfs" + "github.com/mitchellh/mapstructure" + "github.com/pkg/errors" +) + +func init() { + registry.Register("eoswrapper", New) +} + +type wrapper struct { + storage.FS + mountIDTemplate *template.Template +} + +func parseConfig(m map[string]interface{}) (*eosfs.Config, string, error) { + c := &eosfs.Config{} + if err := mapstructure.Decode(m, c); err != nil { + err = errors.Wrap(err, "error decoding conf") + return nil, "", err + } + + // default to version invariance if not configured + if _, ok := m["version_invariant"]; !ok { + c.VersionInvariant = true + } + + t, ok := m["mount_id_template"].(string) + if !ok || t == "" { + t = "eoshome-{{ trimAll \"/\" .Path | substr 0 1 }}" + } + + return c, t, nil +} + +// New returns an implementation of the storage.FS interface that forms a wrapper +// around separate connections to EOS. +func New(m map[string]interface{}) (storage.FS, error) { + c, t, err := parseConfig(m) + if err != nil { + return nil, err + } + + eos, err := eosfs.NewEOSFS(c) + if err != nil { + return nil, err + } + + mountIDTemplate, err := template.New("mountID").Funcs(sprig.TxtFuncMap()).Parse(t) + if err != nil { + return nil, err + } + + return &wrapper{FS: eos, mountIDTemplate: mountIDTemplate}, nil +} + +// We need to override the two methods, GetMD and ListFolder to fill the +// StorageId in the ResourceInfo objects. + +func (w *wrapper) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) { + res, err := w.FS.GetMD(ctx, ref, mdKeys) + if err != nil { + return nil, err + } + + // We need to extract the mount ID based on the mapping template. + // + // Take the first letter of the resource path after the namespace has been removed. + // If it's empty, leave it empty to be filled by storageprovider. + res.Id.StorageId = w.getMountID(ctx, res) + return res, nil + +} + +func (w *wrapper) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) { + res, err := w.FS.ListFolder(ctx, ref, mdKeys) + if err != nil { + return nil, err + } + for _, r := range res { + r.Id.StorageId = w.getMountID(ctx, r) + } + return res, nil +} + +func (w *wrapper) getMountID(ctx context.Context, r *provider.ResourceInfo) string { + if r == nil { + return "" + } + b := bytes.Buffer{} + if err := w.mountIDTemplate.Execute(&b, r); err != nil { + return "" + } + return b.String() +} From 46e3efb1d916787fc3c6d4fdf7c44b1fd5509006 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Fri, 9 Apr 2021 09:11:56 +0200 Subject: [PATCH 08/70] eos: fixes for enabling file sharing (#1619) --- changelog/unreleased/eos-file-sharing.md | 3 + pkg/eosclient/eosbinary/eosbinary.go | 93 ++++++++---------------- 2 files changed, 33 insertions(+), 63 deletions(-) create mode 100644 changelog/unreleased/eos-file-sharing.md diff --git a/changelog/unreleased/eos-file-sharing.md b/changelog/unreleased/eos-file-sharing.md new file mode 100644 index 0000000000..759d8400db --- /dev/null +++ b/changelog/unreleased/eos-file-sharing.md @@ -0,0 +1,3 @@ +Bugfix: Fixes for enabling file sharing in EOS + +https://github.com/cs3org/reva/pull/1619 diff --git a/pkg/eosclient/eosbinary/eosbinary.go b/pkg/eosclient/eosbinary/eosbinary.go index 17679a21f9..bb22ce5bcf 100644 --- a/pkg/eosclient/eosbinary/eosbinary.go +++ b/pkg/eosclient/eosbinary/eosbinary.go @@ -27,6 +27,7 @@ import ( "os" "os/exec" "path" + "path/filepath" "strconv" "strings" "syscall" @@ -40,13 +41,8 @@ import ( "go.opencensus.io/trace" ) -type eosVersion string - const ( versionPrefix = ".sys.v#." - - versionAquamarine = eosVersion("aquamarine") - versionCitrine = eosVersion("citrine") ) const ( @@ -262,59 +258,31 @@ func (c *Client) executeEOS(ctx context.Context, cmd *exec.Cmd) (string, string, return outBuf.String(), errBuf.String(), err } -func (c *Client) getVersion(ctx context.Context, rootUID, rootGID string) (eosVersion, error) { - cmd := exec.CommandContext(ctx, c.opt.EosBinary, "-r", rootUID, rootGID, "version") - stdout, _, err := c.executeEOS(ctx, cmd) - if err != nil { - return "", err - } - return c.parseVersion(ctx, stdout), nil -} - -func (c *Client) parseVersion(ctx context.Context, raw string) eosVersion { - var serverVersion string - rawLines := strings.Split(raw, "\n") - for _, rl := range rawLines { - if rl == "" { - continue - } - if strings.HasPrefix(rl, "EOS_SERVER_VERSION") { - serverVersion = strings.Split(strings.Split(rl, " ")[0], "=")[1] - break - } - } - - if strings.HasPrefix(serverVersion, "4.") { - return versionCitrine - } - return versionAquamarine -} - // AddACL adds an new acl to EOS with the given aclType. func (c *Client) AddACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, a *acl.Entry) error { - version, err := c.getVersion(ctx, rootUID, rootGID) + finfo, err := c.GetFileInfoByPath(ctx, uid, gid, path) if err != nil { return err } + sysACL := a.CitrineSerialize() + args := []string{"-r", rootUID, rootGID, "acl"} - var cmd *exec.Cmd - if version == versionCitrine { - sysACL := a.CitrineSerialize() - cmd = exec.CommandContext(ctx, c.opt.EosBinary, "-r", rootUID, rootGID, "acl", "--sys", "--recursive", sysACL, path) + if finfo.IsDir { + args = append(args, "--sys", "--recursive") } else { - acls, err := c.getACLForPath(ctx, uid, gid, path) - if err != nil { - return err + args = append(args, "--user") + userACLAttr := &eosclient.Attribute{ + Type: SystemAttr, + Key: "eval.useracl", + Val: "1", } - - err = acls.SetEntry(a.Type, a.Qualifier, a.Permissions) - if err != nil { + if err = c.SetAttr(ctx, uid, gid, userACLAttr, false, path); err != nil { return err } - sysACL := acls.Serialize() - cmd = exec.CommandContext(ctx, c.opt.EosBinary, "-r", rootUID, rootGID, "attr", "-r", "set", fmt.Sprintf("sys.acl=%s", sysACL), path) } + args = append(args, sysACL, path) + cmd := exec.CommandContext(ctx, c.opt.EosBinary, args...) _, _, err = c.executeEOS(ctx, cmd) return err @@ -322,29 +290,30 @@ func (c *Client) AddACL(ctx context.Context, uid, gid, rootUID, rootGID, path st // RemoveACL removes the acl from EOS. func (c *Client) RemoveACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, a *acl.Entry) error { - version, err := c.getVersion(ctx, rootUID, rootGID) + finfo, err := c.GetFileInfoByPath(ctx, uid, gid, path) if err != nil { return err } - var cmd *exec.Cmd - if version == versionCitrine { - sysACL := a.CitrineSerialize() - cmd = exec.CommandContext(ctx, c.opt.EosBinary, "-r", rootUID, rootGID, "acl", "--sys", "--recursive", sysACL, path) + sysACL := a.CitrineSerialize() + args := []string{"-r", rootUID, rootGID, "acl"} + if finfo.IsDir { + args = append(args, "--sys", "--recursive") } else { - acls, err := c.getACLForPath(ctx, uid, gid, path) - if err != nil { + args = append(args, "--user") + userACLAttr := &eosclient.Attribute{ + Type: SystemAttr, + Key: "eval.useracl", + } + if err = c.UnsetAttr(ctx, uid, gid, userACLAttr, path); err != nil { return err } - - acls.DeleteEntry(a.Type, a.Qualifier) - sysACL := acls.Serialize() - cmd = exec.CommandContext(ctx, c.opt.EosBinary, "-r", rootUID, rootGID, "attr", "-r", "set", fmt.Sprintf("sys.acl=%s", sysACL), path) } + args = append(args, sysACL, path) + cmd := exec.CommandContext(ctx, c.opt.EosBinary, args...) _, _, err = c.executeEOS(ctx, cmd) return err - } // UpdateACL updates the EOS acl. @@ -437,11 +406,9 @@ func (c *Client) GetFileInfoByPath(ctx context.Context, uid, gid, path string) ( } if c.opt.VersionInvariant && !isVersionFolder(path) && !info.IsDir { - inode, err := c.getVersionFolderInode(ctx, uid, gid, path) - if err != nil { - return nil, err + if inode, err := c.getVersionFolderInode(ctx, uid, gid, path); err == nil { + info.Inode = inode } - info.Inode = inode } return info, nil @@ -791,7 +758,7 @@ func (c *Client) parseQuota(path, raw string) (*eosclient.QuotaInfo, error) { // map[maxbytes:2000000000000 maxlogicalbytes:1000000000000 percentageusedbytes:0.49 quota:node uid:gonzalhu space:/eos/scratch/user/ usedbytes:9829986500 usedlogicalbytes:4914993250 statusfiles:ok usedfiles:334 maxfiles:1000000 statusbytes:ok] space := m["space"] - if strings.HasPrefix(path, space) { + if strings.HasPrefix(path, filepath.Clean(space)) { maxBytesString := m["maxlogicalbytes"] usedBytesString := m["usedlogicalbytes"] maxBytes, _ := strconv.ParseUint(maxBytesString, 10, 64) From 1765ae8db4d0d5e615fc3b55275e563dd5a1c687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=BCller?= Date: Fri, 9 Apr 2021 09:12:34 +0200 Subject: [PATCH 09/70] Make local file connector more error tolerant (#1625) --- changelog/unreleased/fix-mentix-local-file.md | 5 +++++ pkg/mentix/connectors/localfile.go | 19 +++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) create mode 100644 changelog/unreleased/fix-mentix-local-file.md diff --git a/changelog/unreleased/fix-mentix-local-file.md b/changelog/unreleased/fix-mentix-local-file.md new file mode 100644 index 0000000000..1c37953958 --- /dev/null +++ b/changelog/unreleased/fix-mentix-local-file.md @@ -0,0 +1,5 @@ +Bugfix: Make local file connector more error tolerant + +The local file connector caused Reva to throw an exception if the local file for storing site data couldn't be loaded. This PR changes this behavior so that only a warning is logged. + +https://github.com/cs3org/reva/pull/1625 diff --git a/pkg/mentix/connectors/localfile.go b/pkg/mentix/connectors/localfile.go index 6b83aab568..ed521353fc 100755 --- a/pkg/mentix/connectors/localfile.go +++ b/pkg/mentix/connectors/localfile.go @@ -64,22 +64,21 @@ func (connector *LocalFileConnector) Activate(conf *config.Configuration, log *z // RetrieveMeshData fetches new mesh data. func (connector *LocalFileConnector) RetrieveMeshData() (*meshdata.MeshData, error) { - meshData := &meshdata.MeshData{} - jsonData, err := ioutil.ReadFile(connector.filePath) if err != nil { - return nil, fmt.Errorf("unable to read file '%v': %v", connector.filePath, err) + connector.log.Warn().Err(err).Msgf("unable to read file '%v'", connector.filePath) + return &meshdata.MeshData{}, nil } - if err := json.Unmarshal(jsonData, &meshData.Sites); err != nil { - return nil, fmt.Errorf("invalid file '%v': %v", connector.filePath, err) + meshData := &meshdata.MeshData{} + if err := json.Unmarshal(jsonData, &meshData.Sites); err == nil { + // Enforce site types + connector.setSiteTypes(meshData) + meshData.InferMissingData() + } else { + connector.log.Warn().Err(err).Msgf("invalid file '%v'", connector.filePath) } - // Enforce site types - connector.setSiteTypes(meshData) - - meshData.InferMissingData() - return meshData, nil } From 7e733a531c8a7b1eea4d76a7771069df6aaf34fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Apr 2021 10:34:37 +0200 Subject: [PATCH 10/70] [Build-deps]: Bump github.com/ReneKroon/ttlcache/v2 from 2.3.0 to 2.4.0 (#1633) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 70cd635d26..a6743199a1 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Masterminds/goutils v1.1.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible - github.com/ReneKroon/ttlcache/v2 v2.3.0 + github.com/ReneKroon/ttlcache/v2 v2.4.0 github.com/aws/aws-sdk-go v1.38.13 github.com/c-bata/go-prompt v0.2.5 github.com/cheggaaa/pb v1.0.29 diff --git a/go.sum b/go.sum index fc9a5d7f84..7314679735 100644 --- a/go.sum +++ b/go.sum @@ -49,8 +49,8 @@ github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jB github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ReneKroon/ttlcache/v2 v2.3.0 h1:qZnUjRKIrbKHH6vF5T7Y9Izn5ObfTZfyYpGhvz2BKPo= -github.com/ReneKroon/ttlcache/v2 v2.3.0/go.mod h1:zbo6Pv/28e21Z8CzzqgYRArQYGYtjONRxaAKGxzQvG4= +github.com/ReneKroon/ttlcache/v2 v2.4.0 h1:KywGhjik+ZFTDXMNLiPECSzmdx2yNvAlDNKESCRaVEs= +github.com/ReneKroon/ttlcache/v2 v2.4.0/go.mod h1:zbo6Pv/28e21Z8CzzqgYRArQYGYtjONRxaAKGxzQvG4= 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/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= From 42ab66a42e535de9479bbdd9dc59a8d0b6690089 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Apr 2021 10:35:21 +0200 Subject: [PATCH 11/70] [Build-deps]: Bump github.com/onsi/ginkgo from 1.16.0 to 1.16.1 (#1623) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a6743199a1..587a428b85 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/minio/minio-go/v7 v7.0.10 github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/mapstructure v1.4.1 - github.com/onsi/ginkgo v1.16.0 + github.com/onsi/ginkgo v1.16.1 github.com/onsi/gomega v1.11.0 github.com/ory/fosite v0.39.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 7314679735..767f754d0b 100644 --- a/go.sum +++ b/go.sum @@ -798,8 +798,8 @@ github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.0 h1:NBrNLB37exjJLxXtFOktx6CISBdS1aF8+7MwKlTV8U4= -github.com/onsi/ginkgo v1.16.0/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.1 h1:foqVmeWDD6yYpK+Yz3fHyNIxFYNxswxqNFjSKe+vI54= +github.com/onsi/ginkgo v1.16.1/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= 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= From 5657cab3841cb166f5c2141b2406664f1b8352c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Apr 2021 10:35:38 +0200 Subject: [PATCH 12/70] [Build-deps]: Bump google.golang.org/grpc from 1.36.1 to 1.37.0 (#1621) --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 587a428b85..5c33a7b29b 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 - google.golang.org/grpc v1.36.1 + google.golang.org/grpc v1.37.0 google.golang.org/protobuf v1.26.0 ) From a7acbd394346047cac5f15c543abedc60c9373bb Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Tue, 13 Apr 2021 15:52:57 +0200 Subject: [PATCH 13/70] Skip file check for OCM data transfers (#1636) --- changelog/unreleased/ocm-file-downloads.md | 3 + .../grpc/services/gateway/ocmshareprovider.go | 39 +++++---- .../grpc/services/gateway/storageprovider.go | 86 +++++++++---------- 3 files changed, 66 insertions(+), 62 deletions(-) create mode 100644 changelog/unreleased/ocm-file-downloads.md diff --git a/changelog/unreleased/ocm-file-downloads.md b/changelog/unreleased/ocm-file-downloads.md new file mode 100644 index 0000000000..fdacfdf3c2 --- /dev/null +++ b/changelog/unreleased/ocm-file-downloads.md @@ -0,0 +1,3 @@ +Bugfix: Skip file check for OCM data transfers + +https://github.com/cs3org/reva/pull/1636 diff --git a/internal/grpc/services/gateway/ocmshareprovider.go b/internal/grpc/services/gateway/ocmshareprovider.go index 5b91eb9f07..1a8cb6f8c3 100644 --- a/internal/grpc/services/gateway/ocmshareprovider.go +++ b/internal/grpc/services/gateway/ocmshareprovider.go @@ -76,6 +76,27 @@ func (s *svc) RemoveOCMShare(ctx context.Context, req *ocm.RemoveOCMShareRequest }, nil } + // if we need to commit the share, we need the resource it points to. + var share *ocm.Share + if s.c.CommitShareToStorageGrant { + getShareReq := &ocm.GetOCMShareRequest{ + Ref: req.Ref, + } + getShareRes, err := c.GetOCMShare(ctx, getShareReq) + if err != nil { + return nil, errors.Wrap(err, "gateway: error calling GetShare") + } + + if getShareRes.Status.Code != rpc.Code_CODE_OK { + res := &ocm.RemoveOCMShareResponse{ + Status: status.NewInternal(ctx, status.NewErrorFromCode(getShareRes.Status.Code, "gateway"), + "error getting share when committing to the storage"), + } + return res, nil + } + share = getShareRes.Share + } + res, err := c.RemoveOCMShare(ctx, req) if err != nil { return nil, errors.Wrap(err, "gateway: error calling RemoveShare") @@ -86,24 +107,6 @@ func (s *svc) RemoveOCMShare(ctx context.Context, req *ocm.RemoveOCMShareRequest return res, nil } - // if we need to commit the share, we need the resource it points to. - getShareReq := &ocm.GetOCMShareRequest{ - Ref: req.Ref, - } - getShareRes, err := c.GetOCMShare(ctx, getShareReq) - if err != nil { - return nil, errors.Wrap(err, "gateway: error calling GetShare") - } - - if getShareRes.Status.Code != rpc.Code_CODE_OK { - res := &ocm.RemoveOCMShareResponse{ - Status: status.NewInternal(ctx, status.NewErrorFromCode(getShareRes.Status.Code, "gateway"), - "error getting share when committing to the storage"), - } - return res, nil - } - share := getShareRes.Share - // TODO(labkode): if both commits are enabled they could be done concurrently. if s.c.CommitShareToStorageGrant { removeGrantStatus, err := s.removeGrant(ctx, share.ResourceId, share.Grantee, share.Permissions.Permissions) diff --git a/internal/grpc/services/gateway/storageprovider.go b/internal/grpc/services/gateway/storageprovider.go index eba1cd1464..77b4a5adbb 100644 --- a/internal/grpc/services/gateway/storageprovider.go +++ b/internal/grpc/services/gateway/storageprovider.go @@ -258,31 +258,30 @@ func (s *svc) InitiateFileDownload(ctx context.Context, req *provider.InitiateFi }, nil } - // if it is a file allow download - if ri.Type == provider.ResourceType_RESOURCE_TYPE_FILE { - log.Debug().Str("path", p).Interface("ri", ri).Msg("path points to share name file") - - if protocol == "webdav" { - // TODO(ishank011): pass this through the datagateway service - // for now, we just expose the file server to the user - ep, opaque, err := s.webdavRefTransferEndpoint(ctx, statRes.Info.Target) - if err != nil { - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error downloading from webdav host: "+p), - }, nil - } + if protocol == "webdav" { + // TODO(ishank011): pass this through the datagateway service + // for now, we just expose the file server to the user + ep, opaque, err := s.webdavRefTransferEndpoint(ctx, statRes.Info.Target) + if err != nil { return &gateway.InitiateFileDownloadResponse{ - Status: status.NewOK(ctx), - Protocols: []*gateway.FileDownloadProtocol{ - { - Opaque: opaque, - Protocol: "simple", - DownloadEndpoint: ep, - }, - }, + Status: status.NewInternal(ctx, err, "gateway: error downloading from webdav host: "+p), }, nil } + return &gateway.InitiateFileDownloadResponse{ + Status: status.NewOK(ctx), + Protocols: []*gateway.FileDownloadProtocol{ + { + Opaque: opaque, + Protocol: "simple", + DownloadEndpoint: ep, + }, + }, + }, nil + } + // if it is a file allow download + if ri.Type == provider.ResourceType_RESOURCE_TYPE_FILE { + log.Debug().Str("path", p).Interface("ri", ri).Msg("path points to share name file") req.Ref = &provider.Reference{ Spec: &provider.Reference_Path{ Path: ri.Path, @@ -290,8 +289,8 @@ func (s *svc) InitiateFileDownload(ctx context.Context, req *provider.InitiateFi } log.Debug().Msg("download path: " + ri.Path) return s.initiateFileDownload(ctx, req) - } + log.Debug().Str("path", p).Interface("statRes", statRes).Msg("path:%s points to share name") err = errtypes.PermissionDenied("gateway: cannot download share name: path=" + p) log.Err(err).Str("path", p).Msg("gateway: error downloading") @@ -471,31 +470,30 @@ func (s *svc) InitiateFileUpload(ctx context.Context, req *provider.InitiateFile }, nil } - // if it is a file allow upload - if ri.Type == provider.ResourceType_RESOURCE_TYPE_FILE { - log.Debug().Str("path", p).Interface("ri", ri).Msg("path points to share name file") - - if protocol == "webdav" { - // TODO(ishank011): pass this through the datagateway service - // for now, we just expose the file server to the user - ep, opaque, err := s.webdavRefTransferEndpoint(ctx, statRes.Info.Target) - if err != nil { - return &gateway.InitiateFileUploadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error downloading from webdav host: "+p), - }, nil - } + if protocol == "webdav" { + // TODO(ishank011): pass this through the datagateway service + // for now, we just expose the file server to the user + ep, opaque, err := s.webdavRefTransferEndpoint(ctx, statRes.Info.Target) + if err != nil { return &gateway.InitiateFileUploadResponse{ - Status: status.NewOK(ctx), - Protocols: []*gateway.FileUploadProtocol{ - { - Opaque: opaque, - Protocol: "simple", - UploadEndpoint: ep, - }, - }, + Status: status.NewInternal(ctx, err, "gateway: error downloading from webdav host: "+p), }, nil } + return &gateway.InitiateFileUploadResponse{ + Status: status.NewOK(ctx), + Protocols: []*gateway.FileUploadProtocol{ + { + Opaque: opaque, + Protocol: "simple", + UploadEndpoint: ep, + }, + }, + }, nil + } + // if it is a file allow upload + if ri.Type == provider.ResourceType_RESOURCE_TYPE_FILE { + log.Debug().Str("path", p).Interface("ri", ri).Msg("path points to share name file") req.Ref = &provider.Reference{ Spec: &provider.Reference_Path{ Path: ri.Path, @@ -503,8 +501,8 @@ func (s *svc) InitiateFileUpload(ctx context.Context, req *provider.InitiateFile } log.Debug().Msg("upload path: " + ri.Path) return s.initiateFileUpload(ctx, req) - } + err = errtypes.PermissionDenied("gateway: cannot upload to share name: path=" + p) log.Err(err).Msg("gateway: error uploading") return &gateway.InitiateFileUploadResponse{ From a4b5148cbfb20770209b748509b005bbf9aa3def Mon Sep 17 00:00:00 2001 From: David Christofas Date: Wed, 14 Apr 2021 13:13:18 +0200 Subject: [PATCH 14/70] implement checksums in the owncloud storage driver (#1629) --- .../unreleased/owncloud-storage-checksums.md | 5 + pkg/storage/fs/owncloud/owncloud.go | 67 +++++++++++- pkg/storage/fs/owncloud/upload.go | 100 ++++++++++++++++-- .../expected-failures-on-OWNCLOUD-storage.md | 41 ------- 4 files changed, 159 insertions(+), 54 deletions(-) create mode 100644 changelog/unreleased/owncloud-storage-checksums.md diff --git a/changelog/unreleased/owncloud-storage-checksums.md b/changelog/unreleased/owncloud-storage-checksums.md new file mode 100644 index 0000000000..350abf540c --- /dev/null +++ b/changelog/unreleased/owncloud-storage-checksums.md @@ -0,0 +1,5 @@ +Enhancement: Implement checksums in the owncloud storage + +Implemented checksums in the owncloud storage driver. + +https://github.com/cs3org/reva/pull/1629 diff --git a/pkg/storage/fs/owncloud/owncloud.go b/pkg/storage/fs/owncloud/owncloud.go index 20231b19da..4a194d8b4f 100644 --- a/pkg/storage/fs/owncloud/owncloud.go +++ b/pkg/storage/fs/owncloud/owncloud.go @@ -20,6 +20,7 @@ package owncloud import ( "context" + "encoding/hex" "fmt" "io" "io/ioutil" @@ -35,6 +36,7 @@ import ( rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + "github.com/cs3org/reva/internal/grpc/services/storageprovider" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/logger" @@ -72,8 +74,9 @@ const ( mdPrefix string = ocPrefix + "md." // arbitrary metadata favPrefix string = ocPrefix + "fav." // favorite flag, per user etagPrefix string = ocPrefix + "etag." // allow overriding a calculated etag with one from the extended attributes - // checksumPrefix string = ocPrefix + "cs." // TODO add checksum support - + checksumPrefix string = ocPrefix + "cs." + checksumsKey string = "http://owncloud.org/ns/checksums" + favoriteKey string = "http://owncloud.org/ns/favorite" ) var defaultPermissions *provider.ResourcePermissions = &provider.ResourcePermissions{ @@ -612,7 +615,6 @@ func (fs *ocfs) convertToResourceInfo(ctx context.Context, fi os.FileInfo, ip st metadata := map[string]string{} - favoriteKey := "http://owncloud.org/ns/favorite" if _, ok := mdKeysMap[favoriteKey]; returnAllKeys || ok { favorite := "" if u, ok := user.ContextGetUser(ctx); ok { @@ -682,6 +684,16 @@ func (fs *ocfs) convertToResourceInfo(ctx context.Context, fi os.FileInfo, ip st ri.PermissionSet = fs.permissionSet(ctx, ri.Owner) + // checksums + if !fi.IsDir() { + if _, checksumRequested := mdKeysMap[checksumsKey]; returnAllKeys || checksumRequested { + // TODO which checksum was requested? sha1 adler32 or md5? for now hardcode sha1? + readChecksumIntoResourceChecksum(ctx, ip, storageprovider.XSSHA1, ri) + readChecksumIntoOpaque(ctx, ip, storageprovider.XSMD5, ri) + readChecksumIntoOpaque(ctx, ip, storageprovider.XSAdler32, ri) + } + } + return ri } func getResourceType(isDir bool) provider.ResourceType { @@ -2228,5 +2240,54 @@ func (fs *ocfs) propagate(ctx context.Context, leafPath string) error { return nil } +func readChecksumIntoResourceChecksum(ctx context.Context, nodePath, algo string, ri *provider.ResourceInfo) { + v, err := xattr.Get(nodePath, checksumPrefix+algo) + log := appctx.GetLogger(ctx). + Debug(). + Err(err). + Str("nodepath", nodePath). + Str("algorithm", algo) + switch { + case err == nil: + ri.Checksum = &provider.ResourceChecksum{ + Type: storageprovider.PKG2GRPCXS(algo), + Sum: hex.EncodeToString(v), + } + case isNoData(err): + log.Msg("checksum not set") + case isNotFound(err): + log.Msg("file not found") + default: + log.Msg("could not read checksum") + } +} + +func readChecksumIntoOpaque(ctx context.Context, nodePath, algo string, ri *provider.ResourceInfo) { + v, err := xattr.Get(nodePath, checksumPrefix+algo) + log := appctx.GetLogger(ctx). + Debug(). + Err(err). + Str("nodepath", nodePath). + Str("algorithm", algo) + switch { + case err == nil: + if ri.Opaque == nil { + ri.Opaque = &types.Opaque{ + Map: map[string]*types.OpaqueEntry{}, + } + } + ri.Opaque.Map[algo] = &types.OpaqueEntry{ + Decoder: "plain", + Value: []byte(hex.EncodeToString(v)), + } + case isNoData(err): + log.Msg("checksum not set") + case isNotFound(err): + log.Msg("file not found") + default: + log.Msg("could not read checksum") + } +} + // TODO propagate etag and mtime or append event to history? propagate on disk ... // - but propagation is a separate task. only if upload was successful ... diff --git a/pkg/storage/fs/owncloud/upload.go b/pkg/storage/fs/owncloud/upload.go index 0ebbdb5ab9..e48f1c7494 100644 --- a/pkg/storage/fs/owncloud/upload.go +++ b/pkg/storage/fs/owncloud/upload.go @@ -20,11 +20,17 @@ package owncloud import ( "context" + "crypto/md5" + "crypto/sha1" + "encoding/hex" "encoding/json" + "fmt" + "hash/adler32" "io" "io/ioutil" "os" "path/filepath" + "strings" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" @@ -36,6 +42,8 @@ import ( "github.com/cs3org/reva/pkg/user" "github.com/google/uuid" "github.com/pkg/errors" + "github.com/pkg/xattr" + "github.com/rs/zerolog" tusd "github.com/tus/tusd/pkg/handler" ) @@ -363,18 +371,54 @@ func (upload *fileUpload) writeInfo() error { // FinishUpload finishes an upload and moves the file to the internal destination func (upload *fileUpload) FinishUpload(ctx context.Context) error { + log := appctx.GetLogger(upload.ctx) - /* - checksum := upload.info.MetaData["checksum"] - if checksum != "" { - // TODO check checksum - s := strings.SplitN(checksum, " ", 2) - if len(s) == 2 { - alg, hash := s[0], s[1] + sha1Sum := make([]byte, 0, 32) + md5Sum := make([]byte, 0, 32) + adler32Sum := make([]byte, 0, 32) + { + sha1h := sha1.New() + md5h := md5.New() + adler32h := adler32.New() + f, err := os.Open(upload.binPath) + if err != nil { + log.Err(err).Msg("Decomposedfs: could not open file for checksumming") + // we can continue if no oc checksum header is set + } + defer f.Close() - } + r1 := io.TeeReader(f, sha1h) + r2 := io.TeeReader(r1, md5h) + + if _, err := io.Copy(adler32h, r2); err != nil { + log.Err(err).Msg("Decomposedfs: could not copy bytes for checksumming") } - */ + + sha1Sum = sha1h.Sum(sha1Sum) + md5Sum = md5h.Sum(md5Sum) + adler32Sum = adler32h.Sum(adler32Sum) + } + + if upload.info.MetaData["checksum"] != "" { + parts := strings.SplitN(upload.info.MetaData["checksum"], " ", 2) + if len(parts) != 2 { + return errtypes.BadRequest("invalid checksum format. must be '[algorithm] [checksum]'") + } + var err error + switch parts[0] { + case "sha1": + err = upload.checkHash(parts[1], sha1Sum) + case "md5": + err = upload.checkHash(parts[1], md5Sum) + case "adler32": + err = upload.checkHash(parts[1], adler32Sum) + default: + err = errtypes.BadRequest("unsupported checksum algorithm: " + parts[0]) + } + if err != nil { + return err + } + } ip := upload.info.Storage["InternalDestination"] @@ -391,7 +435,6 @@ func (upload *fileUpload) FinishUpload(ctx context.Context) error { } } - log := appctx.GetLogger(upload.ctx) err := os.Rename(upload.binPath, ip) if err != nil { log.Err(err).Interface("info", upload.info). @@ -417,6 +460,11 @@ func (upload *fileUpload) FinishUpload(ctx context.Context) error { } } + // now try write all checksums + tryWritingChecksum(log, ip, "sha1", sha1Sum) + tryWritingChecksum(log, ip, "md5", md5Sum) + tryWritingChecksum(log, ip, "adler32", adler32Sum) + return upload.fs.propagate(upload.ctx, ip) } @@ -492,3 +540,35 @@ func (upload *fileUpload) ConcatUploads(ctx context.Context, uploads []tusd.Uplo return } + +func (upload *fileUpload) checkHash(expected string, h []byte) error { + if expected != hex.EncodeToString(h) { + upload.discardChunk() + return errtypes.ChecksumMismatch(fmt.Sprintf("invalid checksum: expected %s got %x", upload.info.MetaData["checksum"], h)) + } + return nil +} + +func (upload *fileUpload) discardChunk() { + if err := os.Remove(upload.binPath); err != nil { + if !os.IsNotExist(err) { + appctx.GetLogger(upload.ctx).Err(err).Interface("info", upload.info).Str("binPath", upload.binPath).Interface("info", upload.info).Msg("Decomposedfs: could not discard chunk") + return + } + } + if err := os.Remove(upload.infoPath); err != nil { + if !os.IsNotExist(err) { + appctx.GetLogger(upload.ctx).Err(err).Interface("info", upload.info).Str("infoPath", upload.infoPath).Interface("info", upload.info).Msg("Decomposedfs: could not discard chunk info") + return + } + } +} + +func tryWritingChecksum(log *zerolog.Logger, path, algo string, h []byte) { + if err := xattr.Set(path, checksumPrefix+algo, h); err != nil { + log.Err(err). + Str("csType", algo). + Bytes("hash", h). + Msg("ocfs: could not write checksum") + } +} diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index c0543a5250..9e30dc95a1 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -578,25 +578,8 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: The following scenarios fail on OWNCLOUD storage but not on OCIS storage: -- [apiMain/checksums.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L24) Scenario Outline: Uploading a file with checksum should return the checksum in the propfind -- [apiMain/checksums.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L25) Scenario Outline: Uploading a file with checksum should return the checksum in the propfind -- [apiMain/checksums.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L35) Scenario Outline: Uploading a file with checksum should return the checksum in the download header -- [apiMain/checksums.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L36) Scenario Outline: Uploading a file with checksum should return the checksum in the download header -- [apiMain/checksums.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L46) Scenario Outline: Moving a file with checksum should return the checksum in the propfind -- [apiMain/checksums.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L47) Scenario Outline: Moving a file with checksum should return the checksum in the propfind -- [apiMain/checksums.feature:50](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L50) Scenario: Downloading a file with checksum should return the checksum in the download header -- [apiMain/checksums.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L99) Scenario Outline: Moving file with checksum should return the checksum in the download header -- [apiMain/checksums.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L100) Scenario Outline: Moving file with checksum should return the checksum in the download header -- [apiMain/checksums.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L103) Scenario: Copying a file with checksum should return the checksum in the propfind using new DAV path -- [apiMain/checksums.feature:110](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L110) Scenario: Copying file with checksum should return the checksum in the download header using new DAV path - [apiMain/checksums.feature:217](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L217) Scenario Outline: Upload a file where checksum does not match - [apiMain/checksums.feature:218](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L218) Scenario Outline: Upload a file where checksum does not match -- [apiMain/checksums.feature:239](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L239) Scenario Outline: Uploaded file should have the same checksum when downloaded -- [apiMain/checksums.feature:240](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L240) Scenario Outline: Uploaded file should have the same checksum when downloaded -- [apiMain/checksums.feature:280](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L280) Scenario Outline: Uploading a file with MD5 checksum overwriting an existing file -- [apiMain/checksums.feature:281](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L281) Scenario Outline: Uploading a file with MD5 checksum overwriting an existing file -- [apiMain/checksums.feature:297](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L297) Scenario Outline: Uploading a file with SHA1 checksum overwriting an existing file -- [apiMain/checksums.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L298) Scenario Outline: Uploading a file with SHA1 checksum overwriting an existing file - [apiMain/checksums.feature:310](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L310) Scenario Outline: Uploading a file with invalid SHA1 checksum overwriting an existing file - [apiMain/checksums.feature:311](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L311) Scenario Outline: Uploading a file with invalid SHA1 checksum overwriting an existing file @@ -2212,32 +2195,16 @@ _ocdav: return checksum in upload response for chunked upload_ - [apiMain/checksums.feature:192](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L192) Scenario: Upload new dav chunked file using async MOVE where checksum does not match - retry with correct checksum #### [PATCH request for TUS upload with wrong checksum gives incorrect response](https://github.com/owncloud/ocis/issues/1755) -- [apiWebdavUploadTUS/checksums.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L35) -- [apiWebdavUploadTUS/checksums.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L36) -- [apiWebdavUploadTUS/checksums.feature:50](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L50) -- [apiWebdavUploadTUS/checksums.feature:51](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L51) - [apiWebdavUploadTUS/checksums.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L65) - [apiWebdavUploadTUS/checksums.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L66) - [apiWebdavUploadTUS/checksums.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L67) - [apiWebdavUploadTUS/checksums.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L68) -- [apiWebdavUploadTUS/checksums.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L99) -- [apiWebdavUploadTUS/checksums.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L100) -- [apiWebdavUploadTUS/checksums.feature:115](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L115) -- [apiWebdavUploadTUS/checksums.feature:116](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L116) - [apiWebdavUploadTUS/checksums.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L131) - [apiWebdavUploadTUS/checksums.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L132) -- [apiWebdavUploadTUS/checksums.feature:151](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L151) -- [apiWebdavUploadTUS/checksums.feature:152](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L152) -- [apiWebdavUploadTUS/checksums.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L153) -- [apiWebdavUploadTUS/checksums.feature:154](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L154) - [apiWebdavUploadTUS/checksums.feature:172](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L172) - [apiWebdavUploadTUS/checksums.feature:173](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L173) - [apiWebdavUploadTUS/checksums.feature:174](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L174) - [apiWebdavUploadTUS/checksums.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L175) -- [apiWebdavUploadTUS/checksums.feature:194](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L194) -- [apiWebdavUploadTUS/checksums.feature:195](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L195) -- [apiWebdavUploadTUS/checksums.feature:196](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L196) -- [apiWebdavUploadTUS/checksums.feature:197](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L197) - [apiWebdavUploadTUS/checksums.feature:215](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L215) - [apiWebdavUploadTUS/checksums.feature:216](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L216) - [apiWebdavUploadTUS/checksums.feature:217](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L217) @@ -2246,14 +2213,6 @@ _ocdav: return checksum in upload response for chunked upload_ - [apiWebdavUploadTUS/optionsRequest.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/optionsRequest.feature#L20) - [apiWebdavUploadTUS/optionsRequest.feature:33](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/optionsRequest.feature#L33) - [apiWebdavUploadTUS/optionsRequest.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/optionsRequest.feature#L46) -- [apiWebdavUploadTUS/uploadToShare.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L101) -- [apiWebdavUploadTUS/uploadToShare.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L102) -- [apiWebdavUploadTUS/uploadToShare.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L119) -- [apiWebdavUploadTUS/uploadToShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L120) -- [apiWebdavUploadTUS/uploadToShare.feature:136](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L136) -- [apiWebdavUploadTUS/uploadToShare.feature:137](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L137) -- [apiWebdavUploadTUS/uploadToShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L153) -- [apiWebdavUploadTUS/uploadToShare.feature:154](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L154) - [apiWebdavUploadTUS/uploadToShare.feature:172](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L172) - [apiWebdavUploadTUS/uploadToShare.feature:173](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L173) - [apiWebdavUploadTUS/uploadToShare.feature:191](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L191) From 10ef4001b07abc5f220c6164daad6097436f7a8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=BCller?= Date: Wed, 14 Apr 2021 14:46:54 +0200 Subject: [PATCH 15/70] Mentix site authorization status fix (#1634) --- changelog/unreleased/fix-mentix-auth-status.md | 5 +++++ pkg/mentix/connectors/localfile.go | 15 +++++++-------- pkg/mentix/exchangers/exchanger.go | 2 +- pkg/mentix/mentix.go | 10 +++++----- pkg/mentix/meshdata/site.go | 10 ++++++---- 5 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 changelog/unreleased/fix-mentix-auth-status.md diff --git a/changelog/unreleased/fix-mentix-auth-status.md b/changelog/unreleased/fix-mentix-auth-status.md new file mode 100644 index 0000000000..84918adda3 --- /dev/null +++ b/changelog/unreleased/fix-mentix-auth-status.md @@ -0,0 +1,5 @@ +Bugfix: Mentix site authorization status changes + +If a site changes its authorization status, Mentix did not update its internal data to reflect this change. This PR fixes this issue. + +https://github.com/cs3org/reva/pull/1634 diff --git a/pkg/mentix/connectors/localfile.go b/pkg/mentix/connectors/localfile.go index ed521353fc..8ed918ec31 100755 --- a/pkg/mentix/connectors/localfile.go +++ b/pkg/mentix/connectors/localfile.go @@ -25,6 +25,7 @@ import ( "os" "path/filepath" + "github.com/pkg/errors" "github.com/rs/zerolog" "github.com/cs3org/reva/pkg/mentix/config" @@ -66,19 +67,17 @@ func (connector *LocalFileConnector) Activate(conf *config.Configuration, log *z func (connector *LocalFileConnector) RetrieveMeshData() (*meshdata.MeshData, error) { jsonData, err := ioutil.ReadFile(connector.filePath) if err != nil { - connector.log.Warn().Err(err).Msgf("unable to read file '%v'", connector.filePath) - return &meshdata.MeshData{}, nil + return nil, errors.Wrapf(err, "unable to read file '%v'", connector.filePath) } meshData := &meshdata.MeshData{} - if err := json.Unmarshal(jsonData, &meshData.Sites); err == nil { - // Enforce site types - connector.setSiteTypes(meshData) - meshData.InferMissingData() - } else { - connector.log.Warn().Err(err).Msgf("invalid file '%v'", connector.filePath) + if err := json.Unmarshal(jsonData, &meshData.Sites); err != nil { + return nil, errors.Wrapf(err, "invalid file '%v'", connector.filePath) } + connector.setSiteTypes(meshData) + meshData.InferMissingData() + return meshData, nil } diff --git a/pkg/mentix/exchangers/exchanger.go b/pkg/mentix/exchangers/exchanger.go index 908b2ba27d..341442b979 100644 --- a/pkg/mentix/exchangers/exchanger.go +++ b/pkg/mentix/exchangers/exchanger.go @@ -134,7 +134,7 @@ func (exchanger *BaseExchanger) cloneMeshData(clean bool) *meshdata.MeshData { cleanedSites := make([]*meshdata.Site, 0, len(meshDataClone.Sites)) for _, site := range meshDataClone.Sites { // Only keep authorized sites - if site.IsAuthorized() { + if site.IsAuthorized { cleanedSites = append(cleanedSites, site) } } diff --git a/pkg/mentix/mentix.go b/pkg/mentix/mentix.go index cb499ae870..856d857af2 100644 --- a/pkg/mentix/mentix.go +++ b/pkg/mentix/mentix.go @@ -208,8 +208,7 @@ func (mntx *Mentix) tick(updateTimestamp *time.Time) { if meshDataUpdated || time.Since(*updateTimestamp) >= mntx.updateInterval { // Retrieve and update the mesh data; if the importers modified any data, these changes will // be reflected automatically here - meshDataSet, err := mntx.retrieveMeshDataSet() - if err == nil { + if meshDataSet, err := mntx.retrieveMeshDataSet(); err == nil { if err := mntx.applyMeshDataSet(meshDataSet); err != nil { mntx.log.Err(err).Msg("failed to apply mesh data") } @@ -244,10 +243,11 @@ func (mntx *Mentix) retrieveMeshDataSet() (meshdata.Map, error) { for _, connector := range mntx.connectors.Connectors { meshData, err := connector.RetrieveMeshData() - if err != nil { - return nil, fmt.Errorf("retrieving mesh data from connector '%v' failed: %v", connector.GetName(), err) + if err == nil { + meshDataSet[connector.GetID()] = meshData + } else { + mntx.log.Err(err).Msgf("retrieving mesh data from connector '%v' failed", connector.GetName()) } - meshDataSet[connector.GetID()] = meshData } return meshDataSet, nil diff --git a/pkg/mentix/meshdata/site.go b/pkg/mentix/meshdata/site.go index e48ab6c363..a6fdae8f42 100644 --- a/pkg/mentix/meshdata/site.go +++ b/pkg/mentix/meshdata/site.go @@ -39,7 +39,9 @@ type SiteType int // Site represents a single site managed by Mentix. type Site struct { - Type SiteType `json:"-"` + // Internal settings + Type SiteType `json:"-"` + IsAuthorized bool `json:"-"` ID string Name string @@ -116,6 +118,8 @@ func (site *Site) Verify() error { // InferMissingData infers missing data from other data where possible. func (site *Site) InferMissingData() { // Infer missing data + site.IsAuthorized = site.getAuthorizationStatus() + if site.Homepage == "" { site.Homepage = fmt.Sprintf("http://www.%v", site.Domain) } else if site.Domain == "" { @@ -130,9 +134,7 @@ func (site *Site) InferMissingData() { } } -// IsAuthorized checks whether the site is authorized. ScienceMesh are always authorized, while for community sites, -// the accounts service is queried. -func (site *Site) IsAuthorized() bool { +func (site *Site) getAuthorizationStatus() bool { // ScienceMesh sites are always authorized if site.Type == SiteTypeScienceMesh { return true From 7c0af17b0ef4262c79f9dcd16d86f84121ae0598 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Mon, 19 Apr 2021 14:36:49 +0200 Subject: [PATCH 16/70] Skip x386 arch for darwin --- tools/create-artifacts/main.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/create-artifacts/main.go b/tools/create-artifacts/main.go index 9b94182961..420207b80e 100644 --- a/tools/create-artifacts/main.go +++ b/tools/create-artifacts/main.go @@ -80,6 +80,9 @@ func main() { for _, bin := range binaries { for _, o := range oses { for _, arch := range archs { + if o == "darwin" && arch == "386" { // https://golang.org/doc/go1.14#darwin + continue + } out := fmt.Sprintf("./dist/%s_%s_%s_%s", bin, *version, o, arch) args := []string{"build", "-o", out, "-ldflags", ldFlags, "./cmd/" + bin} cmd := exec.Command("go", args...) From f08ed457d3d2dac69c38665f7dbd35c0db3ea9d9 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Mon, 19 Apr 2021 14:41:10 +0200 Subject: [PATCH 17/70] v1.7.0 --- CHANGELOG.md | 302 +++++++++++++++ RELEASE_DATE | 2 +- VERSION | 2 +- .../add-grpc-testsuite.md | 0 .../add-s3ng-integration-tests.md | 0 .../clarify-expected-failures.md | 0 .../eos-file-sharing.md | 0 .../eos-wrappers.md | 0 .../fix-etag-changing-only-every-second.md | 0 .../fix-mentix-auth-status.md | 0 .../fix-mentix-local-file.md | 0 .../fix_file_versions.md | 0 .../implement-share_sharetype.md | 0 .../make-insecureskipverify-configurable.md | 0 .../makefile-litmus-test-command.md | 0 .../mentix-clone-fix.md | 0 .../meshdirectory-ux-improvements.md | 0 .../modularize-api-token-management.md | 0 .../new-meshdirectory-ui.md | 0 .../ocis-check-notdir.md | 0 .../ocis-quota.md | 0 .../ocm-file-downloads.md | 0 .../ocm-find-accepted-users.md | 0 .../ocm-invitation-workflow.md | 0 .../owncloud-storage-checksums.md | 0 .../port-pipeline-definition-to-starlark.md | 0 .../public-link-signature.md | 0 .../publicshare-sql-driver.md | 0 .../separate-blobs-from-metadata-in-ocis.md | 0 .../share-add-info-configurable.md | 0 .../siteacc-reg-panel.md | 0 .../siteaccs-svc.md | 0 .../storage-registry-refactor.md | 0 .../storage-space-stubs.md | 0 .../trashbin-fixes.md | 0 .../update-meshdirectory-web.md | 0 changelog/NOTE.md | 343 ++++++++++++------ .../content/en/docs/changelog/1.7.0/_index.md | 311 ++++++++++++++++ 38 files changed, 840 insertions(+), 120 deletions(-) rename changelog/{unreleased => 1.7.0_2021-04-19}/add-grpc-testsuite.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/add-s3ng-integration-tests.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/clarify-expected-failures.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/eos-file-sharing.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/eos-wrappers.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/fix-etag-changing-only-every-second.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/fix-mentix-auth-status.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/fix-mentix-local-file.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/fix_file_versions.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/implement-share_sharetype.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/make-insecureskipverify-configurable.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/makefile-litmus-test-command.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/mentix-clone-fix.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/meshdirectory-ux-improvements.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/modularize-api-token-management.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/new-meshdirectory-ui.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/ocis-check-notdir.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/ocis-quota.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/ocm-file-downloads.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/ocm-find-accepted-users.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/ocm-invitation-workflow.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/owncloud-storage-checksums.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/port-pipeline-definition-to-starlark.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/public-link-signature.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/publicshare-sql-driver.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/separate-blobs-from-metadata-in-ocis.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/share-add-info-configurable.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/siteacc-reg-panel.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/siteaccs-svc.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/storage-registry-refactor.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/storage-space-stubs.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/trashbin-fixes.md (100%) rename changelog/{unreleased => 1.7.0_2021-04-19}/update-meshdirectory-web.md (100%) create mode 100644 docs/content/en/docs/changelog/1.7.0/_index.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 47037c61d0..21c81d5ba1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,305 @@ +Changelog for reva 1.7.0 (2021-04-19) +======================================= + +The following sections list the changes in reva 1.7.0 relevant to +reva users. The changes are ordered by importance. + +Summary +------- + + * Fix #1619: Fixes for enabling file sharing in EOS + * Fix #1576: Fix etag changing only once a second + * Fix #1634: Mentix site authorization status changes + * Fix #1625: Make local file connector more error tolerant + * Fix #1526: Fix webdav file versions endpoint bugs + * Fix #1457: Cloning of internal mesh data lost some values + * Fix #1597: Check for ENOTDIR on readlink error + * Fix #1636: Skip file check for OCM data transfers + * Fix #1552: Fix a bunch of trashbin related issues + * Fix #1: Bump meshdirectory-web to 1.0.2 + * Chg #1562: Modularize api token management in GRAPPA drivers + * Chg #1452: Separate blobs from metadata in the ocis storage driver + * Enh #1514: Add grpc test suite for the storage provider + * Enh #1466: Add integration tests for the s3ng driver + * Enh #1521: Clarify expected failures + * Enh #1624: Add wrappers for EOS and EOS Home storage drivers + * Enh #1563: Implement cs3.sharing.collaboration.v1beta1.Share.ShareType + * Enh #1411: Make InsecureSkipVerify configurable + * Enh #1106: Make command to run litmus tests + * Enh #1502: Bump meshdirectory-web to v1.0.4 + * Enh #1502: New MeshDirectory HTTP service UI frontend with project branding + * Enh #1405: Quota querying and tree accounting + * Enh #1527: Add FindAcceptedUsers method to OCM Invite API + * Enh #1149: Add CLI Commands for OCM invitation workflow + * Enh #1629: Implement checksums in the owncloud storage + * Enh #1528: Port drone pipeline definition to starlark + * Enh #110: Add signature authentication for public links + * Enh #1495: SQL driver for the publicshare service + * Enh #1588: Make the additional info attribute for shares configurable + * Enh #1595: Add site account registration panel + * Enh #1506: Site Accounts service for API keys + * Enh #116: Enhance storage registry with virtual views and regular expressions + * Enh #1513: Add stubs for storage spaces manipulation + +Details +------- + + * Bugfix #1619: Fixes for enabling file sharing in EOS + + https://github.com/cs3org/reva/pull/1619 + + * Bugfix #1576: Fix etag changing only once a second + + We fixed a problem with the owncloud storage driver only considering the mtime with a second + resolution for the etag calculation. + + https://github.com/cs3org/reva/pull/1576 + + * Bugfix #1634: Mentix site authorization status changes + + If a site changes its authorization status, Mentix did not update its internal data to reflect + this change. This PR fixes this issue. + + https://github.com/cs3org/reva/pull/1634 + + * Bugfix #1625: Make local file connector more error tolerant + + The local file connector caused Reva to throw an exception if the local file for storing site + data couldn't be loaded. This PR changes this behavior so that only a warning is logged. + + https://github.com/cs3org/reva/pull/1625 + + * Bugfix #1526: Fix webdav file versions endpoint bugs + + Etag and error code related bugs have been fixed for the webdav file versions endpoint and + removed from the expected failures file. + + https://github.com/cs3org/reva/pull/1526 + + * Bugfix #1457: Cloning of internal mesh data lost some values + + This update fixes a bug in Mentix that caused some (non-critical) values to be lost during data + cloning that happens internally. + + https://github.com/cs3org/reva/pull/1457 + + * Bugfix #1597: Check for ENOTDIR on readlink error + + The deconstructed storage driver now handles ENOTDIR errors when `node.Child()` is called + for a path containing a path segment that is actually a file. + + https://github.com/owncloud/ocis/issues/1239 + https://github.com/cs3org/reva/pull/1597 + + * Bugfix #1636: Skip file check for OCM data transfers + + https://github.com/cs3org/reva/pull/1636 + + * Bugfix #1552: Fix a bunch of trashbin related issues + + Fixed these issues: + + - Complete: Deletion time in trash bin shows a wrong date - Complete: shared trash status code - + Partly: invalid webdav responses for unauthorized requests. - Partly: href in trashbin + PROPFIND response is wrong + + Complete means there are no expected failures left. Partly means there are some scenarios + left. + + https://github.com/cs3org/reva/pull/1552 + + * Bugfix #1: Bump meshdirectory-web to 1.0.2 + + Updated meshdirectory-web mod to version 1.0.2 that contains fixes for OCM invite API links + generation. + + https://github.com/sciencemesh/meshdirectory-web/pull/1 + + * Change #1562: Modularize api token management in GRAPPA drivers + + This PR moves the duplicated api token management methods into a seperate utils package + + https://github.com/cs3org/reva/issues/1562 + + * Change #1452: Separate blobs from metadata in the ocis storage driver + + We changed the ocis storage driver to keep the file content separate from the metadata by + storing the blobs in a separate directory. This allows for using a different (potentially + faster) storage for the metadata. + + **Note** This change makes existing ocis storages incompatible with the new code. + + We also streamlined the ocis and the s3ng drivers so that most of the code is shared between them. + + https://github.com/cs3org/reva/pull/1452 + + * Enhancement #1514: Add grpc test suite for the storage provider + + A new test suite has been added which tests the grpc interface to the storage provider. It + currently runs against the ocis and the owncloud storage drivers. + + https://github.com/cs3org/reva/pull/1514 + + * Enhancement #1466: Add integration tests for the s3ng driver + + We extended the integration test suite to also run all tests against the s3ng driver. + + https://github.com/cs3org/reva/pull/1466 + + * Enhancement #1521: Clarify expected failures + + Some features, while covered by the ownCloud 10 acceptance tests, will not be implmented for + now: - blacklisted / ignored files, because ocis/reva don't need to blacklist `.htaccess` + files - `OC-LazyOps` support was [removed from the + clients](https://github.com/owncloud/client/pull/8398). We are thinking about [a state + machine for uploads to properly solve that scenario and also list the state of files in progress + in the web ui](https://github.com/owncloud/ocis/issues/214). The expected failures + files now have a dedicated _Won't fix_ section for these items. + + https://github.com/owncloud/ocis/issues/214 + https://github.com/cs3org/reva/pull/1521 + https://github.com/owncloud/client/pull/8398 + + * Enhancement #1624: Add wrappers for EOS and EOS Home storage drivers + + For CERNBox, we need the mount ID to be configured according to the owner of a resource. Setting + this in the storageprovider means having different instances of this service to cater to + different users, which does not scale. This driver forms a wrapper around the EOS driver and + sets the mount ID according to a configurable mapping based on the owner of the resource. + + https://github.com/cs3org/reva/pull/1624 + + * Enhancement #1563: Implement cs3.sharing.collaboration.v1beta1.Share.ShareType + + Interface method Share() in pkg/ocm/share/share.go now has a share type parameter. + + https://github.com/cs3org/reva/pull/1563 + + * Enhancement #1411: Make InsecureSkipVerify configurable + + Add `InsecureSkipVerify` field to `metrics.Config` struct and update examples to include + it. + + https://github.com/cs3org/reva/issues/1411 + + * Enhancement #1106: Make command to run litmus tests + + This updates adds an extra make command to run litmus tests via make. `make litmus-test` + executes the tests. + + https://github.com/cs3org/reva/issues/1106 + https://github.com/cs3org/reva/pull/1543 + + * Enhancement #1502: Bump meshdirectory-web to v1.0.4 + + Updated meshdirectory-web version to v.1.0.4 bringing multiple UX improvements in provider + list and map. + + https://github.com/cs3org/reva/issues/1502 + https://github.com/sciencemesh/meshdirectory-web/pull/2 + https://github.com/sciencemesh/meshdirectory-web/pull/3 + + * Enhancement #1502: New MeshDirectory HTTP service UI frontend with project branding + + We replaced the temporary version of web frontend of the mesh directory http service with a new + redesigned & branded one. Because the new version is a more complex Vue SPA that contains image, + css and other assets, it is now served from a binary package distribution that was generated + using the [github.com/rakyll/statik](https://github.com/rakyll/statik) package. The + `http.services.meshdirectory.static` config option was obsoleted by this change. + + https://github.com/cs3org/reva/issues/1502 + + * Enhancement #1405: Quota querying and tree accounting + + The ocs api now returns the user quota for the users home storage. Furthermore, the ocis storage + driver now reads the quota from the extended attributes of the user home or root node and + implements tree size accounting. Finally, ocdav PROPFINDS now handle the + `DAV:quota-used-bytes` and `DAV:quote-available-bytes` properties. + + https://github.com/cs3org/reva/pull/1405 + https://github.com/cs3org/reva/pull/1491 + + * Enhancement #1527: Add FindAcceptedUsers method to OCM Invite API + + https://github.com/cs3org/reva/pull/1527 + + * Enhancement #1149: Add CLI Commands for OCM invitation workflow + + This adds a couple of CLI commands, `ocm-invite-generate` and `ocm-invite-forward` to + generate and forward ocm invitation tokens respectively. + + https://github.com/cs3org/reva/issues/1149 + + * Enhancement #1629: Implement checksums in the owncloud storage + + Implemented checksums in the owncloud storage driver. + + https://github.com/cs3org/reva/pull/1629 + + * Enhancement #1528: Port drone pipeline definition to starlark + + Having the pipeline definition as a starlark script instead of plain yaml greatly improves the + flexibility and allows for removing lots of duplicated definitions. + + https://github.com/cs3org/reva/pull/1528 + + * Enhancement #110: Add signature authentication for public links + + Implemented signature authentication for public links in addition to the existing password + authentication. This allows web clients to efficiently download files from password + protected public shares. + + https://github.com/cs3org/cs3apis/issues/110 + https://github.com/cs3org/reva/pull/1590 + + * Enhancement #1495: SQL driver for the publicshare service + + https://github.com/cs3org/reva/pull/1495 + + * Enhancement #1588: Make the additional info attribute for shares configurable + + AdditionalInfoAttribute can be configured via the `additional_info_attribute` key in the + form of a Go template string. If not explicitly set, the default value is `{{.Mail}}` + + https://github.com/cs3org/reva/pull/1588 + + * Enhancement #1595: Add site account registration panel + + This PR adds a site account registration panel to the site accounts service. It also removes + site registration from the xcloud metrics driver. + + https://github.com/cs3org/reva/pull/1595 + + * Enhancement #1506: Site Accounts service for API keys + + This update adds a new service to Reva that handles site accounts creation and management. + Registered sites can be assigned an API key through a simple web interface which is also part of + this service. This API key can then be used to identify a user and his/her associated (vendor or + partner) site. + + Furthermore, Mentix was extended to make use of this new service. This way, all sites now have a + stable and unique site ID that not only avoids ID collisions but also introduces a new layer of + security (i.e., sites can only be modified or removed using the correct API key). + + https://github.com/cs3org/reva/pull/1506 + + * Enhancement #116: Enhance storage registry with virtual views and regular expressions + + Add the functionality to the storage registry service to handle user requests for references + which can span across multiple storage providers, particularly useful for cases where + directories are sharded across providers or virtual views are expected. + + https://github.com/cs3org/cs3apis/pull/116 + https://github.com/cs3org/reva/pull/1570 + + * Enhancement #1513: Add stubs for storage spaces manipulation + + This PR adds stubs for the storage space CRUD methods in the storageprovider service and makes + the expired shares janitor configureable in the publicshares SQL driver. + + https://github.com/cs3org/reva/pull/1513 + + Changelog for reva 1.6.0 (2021-02-16) ======================================= diff --git a/RELEASE_DATE b/RELEASE_DATE index 33427baa46..f58cd9aef9 100644 --- a/RELEASE_DATE +++ b/RELEASE_DATE @@ -1 +1 @@ -2021-02-16 \ No newline at end of file +2021-04-19 \ No newline at end of file diff --git a/VERSION b/VERSION index ce6a70b9d8..9dbb0c0052 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.0 \ No newline at end of file +1.7.0 \ No newline at end of file diff --git a/changelog/unreleased/add-grpc-testsuite.md b/changelog/1.7.0_2021-04-19/add-grpc-testsuite.md similarity index 100% rename from changelog/unreleased/add-grpc-testsuite.md rename to changelog/1.7.0_2021-04-19/add-grpc-testsuite.md diff --git a/changelog/unreleased/add-s3ng-integration-tests.md b/changelog/1.7.0_2021-04-19/add-s3ng-integration-tests.md similarity index 100% rename from changelog/unreleased/add-s3ng-integration-tests.md rename to changelog/1.7.0_2021-04-19/add-s3ng-integration-tests.md diff --git a/changelog/unreleased/clarify-expected-failures.md b/changelog/1.7.0_2021-04-19/clarify-expected-failures.md similarity index 100% rename from changelog/unreleased/clarify-expected-failures.md rename to changelog/1.7.0_2021-04-19/clarify-expected-failures.md diff --git a/changelog/unreleased/eos-file-sharing.md b/changelog/1.7.0_2021-04-19/eos-file-sharing.md similarity index 100% rename from changelog/unreleased/eos-file-sharing.md rename to changelog/1.7.0_2021-04-19/eos-file-sharing.md diff --git a/changelog/unreleased/eos-wrappers.md b/changelog/1.7.0_2021-04-19/eos-wrappers.md similarity index 100% rename from changelog/unreleased/eos-wrappers.md rename to changelog/1.7.0_2021-04-19/eos-wrappers.md diff --git a/changelog/unreleased/fix-etag-changing-only-every-second.md b/changelog/1.7.0_2021-04-19/fix-etag-changing-only-every-second.md similarity index 100% rename from changelog/unreleased/fix-etag-changing-only-every-second.md rename to changelog/1.7.0_2021-04-19/fix-etag-changing-only-every-second.md diff --git a/changelog/unreleased/fix-mentix-auth-status.md b/changelog/1.7.0_2021-04-19/fix-mentix-auth-status.md similarity index 100% rename from changelog/unreleased/fix-mentix-auth-status.md rename to changelog/1.7.0_2021-04-19/fix-mentix-auth-status.md diff --git a/changelog/unreleased/fix-mentix-local-file.md b/changelog/1.7.0_2021-04-19/fix-mentix-local-file.md similarity index 100% rename from changelog/unreleased/fix-mentix-local-file.md rename to changelog/1.7.0_2021-04-19/fix-mentix-local-file.md diff --git a/changelog/unreleased/fix_file_versions.md b/changelog/1.7.0_2021-04-19/fix_file_versions.md similarity index 100% rename from changelog/unreleased/fix_file_versions.md rename to changelog/1.7.0_2021-04-19/fix_file_versions.md diff --git a/changelog/unreleased/implement-share_sharetype.md b/changelog/1.7.0_2021-04-19/implement-share_sharetype.md similarity index 100% rename from changelog/unreleased/implement-share_sharetype.md rename to changelog/1.7.0_2021-04-19/implement-share_sharetype.md diff --git a/changelog/unreleased/make-insecureskipverify-configurable.md b/changelog/1.7.0_2021-04-19/make-insecureskipverify-configurable.md similarity index 100% rename from changelog/unreleased/make-insecureskipverify-configurable.md rename to changelog/1.7.0_2021-04-19/make-insecureskipverify-configurable.md diff --git a/changelog/unreleased/makefile-litmus-test-command.md b/changelog/1.7.0_2021-04-19/makefile-litmus-test-command.md similarity index 100% rename from changelog/unreleased/makefile-litmus-test-command.md rename to changelog/1.7.0_2021-04-19/makefile-litmus-test-command.md diff --git a/changelog/unreleased/mentix-clone-fix.md b/changelog/1.7.0_2021-04-19/mentix-clone-fix.md similarity index 100% rename from changelog/unreleased/mentix-clone-fix.md rename to changelog/1.7.0_2021-04-19/mentix-clone-fix.md diff --git a/changelog/unreleased/meshdirectory-ux-improvements.md b/changelog/1.7.0_2021-04-19/meshdirectory-ux-improvements.md similarity index 100% rename from changelog/unreleased/meshdirectory-ux-improvements.md rename to changelog/1.7.0_2021-04-19/meshdirectory-ux-improvements.md diff --git a/changelog/unreleased/modularize-api-token-management.md b/changelog/1.7.0_2021-04-19/modularize-api-token-management.md similarity index 100% rename from changelog/unreleased/modularize-api-token-management.md rename to changelog/1.7.0_2021-04-19/modularize-api-token-management.md diff --git a/changelog/unreleased/new-meshdirectory-ui.md b/changelog/1.7.0_2021-04-19/new-meshdirectory-ui.md similarity index 100% rename from changelog/unreleased/new-meshdirectory-ui.md rename to changelog/1.7.0_2021-04-19/new-meshdirectory-ui.md diff --git a/changelog/unreleased/ocis-check-notdir.md b/changelog/1.7.0_2021-04-19/ocis-check-notdir.md similarity index 100% rename from changelog/unreleased/ocis-check-notdir.md rename to changelog/1.7.0_2021-04-19/ocis-check-notdir.md diff --git a/changelog/unreleased/ocis-quota.md b/changelog/1.7.0_2021-04-19/ocis-quota.md similarity index 100% rename from changelog/unreleased/ocis-quota.md rename to changelog/1.7.0_2021-04-19/ocis-quota.md diff --git a/changelog/unreleased/ocm-file-downloads.md b/changelog/1.7.0_2021-04-19/ocm-file-downloads.md similarity index 100% rename from changelog/unreleased/ocm-file-downloads.md rename to changelog/1.7.0_2021-04-19/ocm-file-downloads.md diff --git a/changelog/unreleased/ocm-find-accepted-users.md b/changelog/1.7.0_2021-04-19/ocm-find-accepted-users.md similarity index 100% rename from changelog/unreleased/ocm-find-accepted-users.md rename to changelog/1.7.0_2021-04-19/ocm-find-accepted-users.md diff --git a/changelog/unreleased/ocm-invitation-workflow.md b/changelog/1.7.0_2021-04-19/ocm-invitation-workflow.md similarity index 100% rename from changelog/unreleased/ocm-invitation-workflow.md rename to changelog/1.7.0_2021-04-19/ocm-invitation-workflow.md diff --git a/changelog/unreleased/owncloud-storage-checksums.md b/changelog/1.7.0_2021-04-19/owncloud-storage-checksums.md similarity index 100% rename from changelog/unreleased/owncloud-storage-checksums.md rename to changelog/1.7.0_2021-04-19/owncloud-storage-checksums.md diff --git a/changelog/unreleased/port-pipeline-definition-to-starlark.md b/changelog/1.7.0_2021-04-19/port-pipeline-definition-to-starlark.md similarity index 100% rename from changelog/unreleased/port-pipeline-definition-to-starlark.md rename to changelog/1.7.0_2021-04-19/port-pipeline-definition-to-starlark.md diff --git a/changelog/unreleased/public-link-signature.md b/changelog/1.7.0_2021-04-19/public-link-signature.md similarity index 100% rename from changelog/unreleased/public-link-signature.md rename to changelog/1.7.0_2021-04-19/public-link-signature.md diff --git a/changelog/unreleased/publicshare-sql-driver.md b/changelog/1.7.0_2021-04-19/publicshare-sql-driver.md similarity index 100% rename from changelog/unreleased/publicshare-sql-driver.md rename to changelog/1.7.0_2021-04-19/publicshare-sql-driver.md diff --git a/changelog/unreleased/separate-blobs-from-metadata-in-ocis.md b/changelog/1.7.0_2021-04-19/separate-blobs-from-metadata-in-ocis.md similarity index 100% rename from changelog/unreleased/separate-blobs-from-metadata-in-ocis.md rename to changelog/1.7.0_2021-04-19/separate-blobs-from-metadata-in-ocis.md diff --git a/changelog/unreleased/share-add-info-configurable.md b/changelog/1.7.0_2021-04-19/share-add-info-configurable.md similarity index 100% rename from changelog/unreleased/share-add-info-configurable.md rename to changelog/1.7.0_2021-04-19/share-add-info-configurable.md diff --git a/changelog/unreleased/siteacc-reg-panel.md b/changelog/1.7.0_2021-04-19/siteacc-reg-panel.md similarity index 100% rename from changelog/unreleased/siteacc-reg-panel.md rename to changelog/1.7.0_2021-04-19/siteacc-reg-panel.md diff --git a/changelog/unreleased/siteaccs-svc.md b/changelog/1.7.0_2021-04-19/siteaccs-svc.md similarity index 100% rename from changelog/unreleased/siteaccs-svc.md rename to changelog/1.7.0_2021-04-19/siteaccs-svc.md diff --git a/changelog/unreleased/storage-registry-refactor.md b/changelog/1.7.0_2021-04-19/storage-registry-refactor.md similarity index 100% rename from changelog/unreleased/storage-registry-refactor.md rename to changelog/1.7.0_2021-04-19/storage-registry-refactor.md diff --git a/changelog/unreleased/storage-space-stubs.md b/changelog/1.7.0_2021-04-19/storage-space-stubs.md similarity index 100% rename from changelog/unreleased/storage-space-stubs.md rename to changelog/1.7.0_2021-04-19/storage-space-stubs.md diff --git a/changelog/unreleased/trashbin-fixes.md b/changelog/1.7.0_2021-04-19/trashbin-fixes.md similarity index 100% rename from changelog/unreleased/trashbin-fixes.md rename to changelog/1.7.0_2021-04-19/trashbin-fixes.md diff --git a/changelog/unreleased/update-meshdirectory-web.md b/changelog/1.7.0_2021-04-19/update-meshdirectory-web.md similarity index 100% rename from changelog/unreleased/update-meshdirectory-web.md rename to changelog/1.7.0_2021-04-19/update-meshdirectory-web.md diff --git a/changelog/NOTE.md b/changelog/NOTE.md index 1791628242..caf4169c20 100644 --- a/changelog/NOTE.md +++ b/changelog/NOTE.md @@ -1,55 +1,80 @@ -Changelog for reva 1.6.0 (2021-02-16) +Changelog for reva 1.7.0 (2021-04-19) ======================================= -The following sections list the changes in reva 1.6.0 relevant to +The following sections list the changes in reva 1.7.0 relevant to reva users. The changes are ordered by importance. Summary ------- - * Fix #1425: Align href URL encoding with oc10 - * Fix #1461: Fix public link webdav permissions + * Fix #1619: Fixes for enabling file sharing in EOS + * Fix #1576: Fix etag changing only once a second + * Fix #1634: Mentix site authorization status changes + * Fix #1625: Make local file connector more error tolerant + * Fix #1526: Fix webdav file versions endpoint bugs * Fix #1457: Cloning of internal mesh data lost some values - * Fix #1429: Purge non-empty dirs from trash-bin - * Fix #1408: Get error status from trash-bin response - * Enh #1451: Render additional share with in ocs sharing api - * Enh #1424: We categorized the list of expected failures - * Enh #1434: CERNBox REST driver for groupprovider service - * Enh #1400: Checksum support - * Enh #1431: Update npm packages to fix vulnerabilities - * Enh #1415: Indicate in EOS containers that TUS is not supported - * Enh #1402: Parse EOS sys ACLs to generate CS3 resource permissions - * Enh #1477: Set quota when creating home directory in EOS - * Enh #1416: Use updated etag of home directory even if it is cached - * Enh #1478: Enhance error handling for grappa REST drivers - * Enh #1453: Add functionality to share resources with groups - * Enh #99: Add stubs and manager for groupprovider service - * Enh #1462: Hash public share passwords - * Enh #1464: LDAP driver for the groupprovider service - * Enh #1430: Capture non-deterministic behavior on storages - * Enh #1456: Fetch user groups in OIDC and LDAP backend - * Enh #1429: Add s3ng storage driver, storing blobs in a s3-compatible blobstore - * Enh #1467: Align default location for xrdcopy binary + * Fix #1597: Check for ENOTDIR on readlink error + * Fix #1636: Skip file check for OCM data transfers + * Fix #1552: Fix a bunch of trashbin related issues + * Fix #1: Bump meshdirectory-web to 1.0.2 + * Chg #1562: Modularize api token management in GRAPPA drivers + * Chg #1452: Separate blobs from metadata in the ocis storage driver + * Enh #1514: Add grpc test suite for the storage provider + * Enh #1466: Add integration tests for the s3ng driver + * Enh #1521: Clarify expected failures + * Enh #1624: Add wrappers for EOS and EOS Home storage drivers + * Enh #1563: Implement cs3.sharing.collaboration.v1beta1.Share.ShareType + * Enh #1411: Make InsecureSkipVerify configurable + * Enh #1106: Make command to run litmus tests + * Enh #1502: Bump meshdirectory-web to v1.0.4 + * Enh #1502: New MeshDirectory HTTP service UI frontend with project branding + * Enh #1405: Quota querying and tree accounting + * Enh #1527: Add FindAcceptedUsers method to OCM Invite API + * Enh #1149: Add CLI Commands for OCM invitation workflow + * Enh #1629: Implement checksums in the owncloud storage + * Enh #1528: Port drone pipeline definition to starlark + * Enh #110: Add signature authentication for public links + * Enh #1495: SQL driver for the publicshare service + * Enh #1588: Make the additional info attribute for shares configurable + * Enh #1595: Add site account registration panel + * Enh #1506: Site Accounts service for API keys + * Enh #116: Enhance storage registry with virtual views and regular expressions + * Enh #1513: Add stubs for storage spaces manipulation Details ------- - * Bugfix #1425: Align href URL encoding with oc10 + * Bugfix #1619: Fixes for enabling file sharing in EOS - We now use the same percent encoding for URLs in WebDAV href properties as ownCloud 10. + https://github.com/cs3org/reva/pull/1619 - https://github.com/owncloud/ocis/issues/1120 - https://github.com/owncloud/ocis/issues/1296 - https://github.com/owncloud/ocis/issues/1307 - https://github.com/cs3org/reva/pull/1425 - https://github.com/cs3org/reva/pull/1472 + * Bugfix #1576: Fix etag changing only once a second - * Bugfix #1461: Fix public link webdav permissions + We fixed a problem with the owncloud storage driver only considering the mtime with a second + resolution for the etag calculation. - We now correctly render `oc:permissions` on the root collection of a publicly shared folder - when it has more than read permissions. + https://github.com/cs3org/reva/pull/1576 - https://github.com/cs3org/reva/pull/1461 + * Bugfix #1634: Mentix site authorization status changes + + If a site changes its authorization status, Mentix did not update its internal data to reflect + this change. This PR fixes this issue. + + https://github.com/cs3org/reva/pull/1634 + + * Bugfix #1625: Make local file connector more error tolerant + + The local file connector caused Reva to throw an exception if the local file for storing site + data couldn't be loaded. This PR changes this behavior so that only a warning is logged. + + https://github.com/cs3org/reva/pull/1625 + + * Bugfix #1526: Fix webdav file versions endpoint bugs + + Etag and error code related bugs have been fixed for the webdav file versions endpoint and + removed from the expected failures file. + + https://github.com/cs3org/reva/pull/1526 * Bugfix #1457: Cloning of internal mesh data lost some values @@ -58,138 +83,220 @@ Details https://github.com/cs3org/reva/pull/1457 - * Bugfix #1429: Purge non-empty dirs from trash-bin + * Bugfix #1597: Check for ENOTDIR on readlink error + + The deconstructed storage driver now handles ENOTDIR errors when `node.Child()` is called + for a path containing a path segment that is actually a file. + + https://github.com/owncloud/ocis/issues/1239 + https://github.com/cs3org/reva/pull/1597 + + * Bugfix #1636: Skip file check for OCM data transfers + + https://github.com/cs3org/reva/pull/1636 + + * Bugfix #1552: Fix a bunch of trashbin related issues + + Fixed these issues: + + - Complete: Deletion time in trash bin shows a wrong date - Complete: shared trash status code - + Partly: invalid webdav responses for unauthorized requests. - Partly: href in trashbin + PROPFIND response is wrong + + Complete means there are no expected failures left. Partly means there are some scenarios + left. + + https://github.com/cs3org/reva/pull/1552 + + * Bugfix #1: Bump meshdirectory-web to 1.0.2 + + Updated meshdirectory-web mod to version 1.0.2 that contains fixes for OCM invite API links + generation. + + https://github.com/sciencemesh/meshdirectory-web/pull/1 + + * Change #1562: Modularize api token management in GRAPPA drivers + + This PR moves the duplicated api token management methods into a seperate utils package + + https://github.com/cs3org/reva/issues/1562 + + * Change #1452: Separate blobs from metadata in the ocis storage driver + + We changed the ocis storage driver to keep the file content separate from the metadata by + storing the blobs in a separate directory. This allows for using a different (potentially + faster) storage for the metadata. + + **Note** This change makes existing ocis storages incompatible with the new code. + + We also streamlined the ocis and the s3ng drivers so that most of the code is shared between them. + + https://github.com/cs3org/reva/pull/1452 + + * Enhancement #1514: Add grpc test suite for the storage provider + + A new test suite has been added which tests the grpc interface to the storage provider. It + currently runs against the ocis and the owncloud storage drivers. + + https://github.com/cs3org/reva/pull/1514 + + * Enhancement #1466: Add integration tests for the s3ng driver + + We extended the integration test suite to also run all tests against the s3ng driver. + + https://github.com/cs3org/reva/pull/1466 + + * Enhancement #1521: Clarify expected failures + + Some features, while covered by the ownCloud 10 acceptance tests, will not be implmented for + now: - blacklisted / ignored files, because ocis/reva don't need to blacklist `.htaccess` + files - `OC-LazyOps` support was [removed from the + clients](https://github.com/owncloud/client/pull/8398). We are thinking about [a state + machine for uploads to properly solve that scenario and also list the state of files in progress + in the web ui](https://github.com/owncloud/ocis/issues/214). The expected failures + files now have a dedicated _Won't fix_ section for these items. + + https://github.com/owncloud/ocis/issues/214 + https://github.com/cs3org/reva/pull/1521 + https://github.com/owncloud/client/pull/8398 + + * Enhancement #1624: Add wrappers for EOS and EOS Home storage drivers + + For CERNBox, we need the mount ID to be configured according to the owner of a resource. Setting + this in the storageprovider means having different instances of this service to cater to + different users, which does not scale. This driver forms a wrapper around the EOS driver and + sets the mount ID according to a configurable mapping based on the owner of the resource. + + https://github.com/cs3org/reva/pull/1624 - This wasn't possible before if the directory was not empty + * Enhancement #1563: Implement cs3.sharing.collaboration.v1beta1.Share.ShareType - https://github.com/cs3org/reva/pull/1429 + Interface method Share() in pkg/ocm/share/share.go now has a share type parameter. - * Bugfix #1408: Get error status from trash-bin response + https://github.com/cs3org/reva/pull/1563 - Previously the status code was gathered from the wrong response. + * Enhancement #1411: Make InsecureSkipVerify configurable - https://github.com/cs3org/reva/pull/1408 + Add `InsecureSkipVerify` field to `metrics.Config` struct and update examples to include + it. - * Enhancement #1451: Render additional share with in ocs sharing api + https://github.com/cs3org/reva/issues/1411 - Recipients can now be distinguished by their email, which is rendered as additional info in the - ocs api for share and file owners as well as share recipients. + * Enhancement #1106: Make command to run litmus tests - https://github.com/owncloud/ocis/issues/1190 - https://github.com/cs3org/reva/pull/1451 + This updates adds an extra make command to run litmus tests via make. `make litmus-test` + executes the tests. - * Enhancement #1424: We categorized the list of expected failures + https://github.com/cs3org/reva/issues/1106 + https://github.com/cs3org/reva/pull/1543 - We categorized all expected failures into _File_ (Basic file management like up and download, - move, copy, properties, trash, versions and chunking), _Sync_ (Synchronization features - like etag propagation, setting mtime and locking files), _Share_ (File and sync features in a - shared scenario), _User management_ (User and group management features) and _Other_ (API, - search, favorites, config, capabilities, not existing endpoints, CORS and others). The - [Review and fix the tests that have sharing step to work with - ocis](https://github.com/owncloud/core/issues/38006) reference has been removed, as we - now have the sharing category + * Enhancement #1502: Bump meshdirectory-web to v1.0.4 - https://github.com/owncloud/core/issues/38006 - https://github.com/cs3org/reva/pull/1424 + Updated meshdirectory-web version to v.1.0.4 bringing multiple UX improvements in provider + list and map. - * Enhancement #1434: CERNBox REST driver for groupprovider service + https://github.com/cs3org/reva/issues/1502 + https://github.com/sciencemesh/meshdirectory-web/pull/2 + https://github.com/sciencemesh/meshdirectory-web/pull/3 - https://github.com/cs3org/reva/pull/1434 + * Enhancement #1502: New MeshDirectory HTTP service UI frontend with project branding - * Enhancement #1400: Checksum support + We replaced the temporary version of web frontend of the mesh directory http service with a new + redesigned & branded one. Because the new version is a more complex Vue SPA that contains image, + css and other assets, it is now served from a binary package distribution that was generated + using the [github.com/rakyll/statik](https://github.com/rakyll/statik) package. The + `http.services.meshdirectory.static` config option was obsoleted by this change. - We now support checksums on file uploads and PROPFIND results. On uploads, the ocdav service - now forwards the `OC-Checksum` (and the similar TUS `Upload-Checksum`) header to the storage - provider. We added an internal http status code that allows storage drivers to return checksum - errors. On PROPFINDs, ocdav now renders the `` header in a bug compatible way for - oc10 backward compatibility with existing clients. Finally, GET and HEAD requests now return - the `OC-Checksum` header. + https://github.com/cs3org/reva/issues/1502 - https://github.com/owncloud/ocis/issues/1291 - https://github.com/owncloud/ocis/issues/1316 - https://github.com/cs3org/reva/pull/1400 - https://github.com/owncloud/core/pull/38304 + * Enhancement #1405: Quota querying and tree accounting - * Enhancement #1431: Update npm packages to fix vulnerabilities + The ocs api now returns the user quota for the users home storage. Furthermore, the ocis storage + driver now reads the quota from the extended attributes of the user home or root node and + implements tree size accounting. Finally, ocdav PROPFINDS now handle the + `DAV:quota-used-bytes` and `DAV:quote-available-bytes` properties. - https://github.com/cs3org/reva/pull/1431 + https://github.com/cs3org/reva/pull/1405 + https://github.com/cs3org/reva/pull/1491 - * Enhancement #1415: Indicate in EOS containers that TUS is not supported + * Enhancement #1527: Add FindAcceptedUsers method to OCM Invite API - The OCDAV propfind response previously hardcoded the TUS headers due to which clients such as - phoenix used the TUS protocol for uploads, which EOS doesn't support. Now we pass this property - as an opaque entry in the containers metadata. + https://github.com/cs3org/reva/pull/1527 - https://github.com/cs3org/reva/pull/1415 + * Enhancement #1149: Add CLI Commands for OCM invitation workflow - * Enhancement #1402: Parse EOS sys ACLs to generate CS3 resource permissions + This adds a couple of CLI commands, `ocm-invite-generate` and `ocm-invite-forward` to + generate and forward ocm invitation tokens respectively. - https://github.com/cs3org/reva/pull/1402 + https://github.com/cs3org/reva/issues/1149 - * Enhancement #1477: Set quota when creating home directory in EOS + * Enhancement #1629: Implement checksums in the owncloud storage - https://github.com/cs3org/reva/pull/1477 + Implemented checksums in the owncloud storage driver. - * Enhancement #1416: Use updated etag of home directory even if it is cached + https://github.com/cs3org/reva/pull/1629 - We cache the home directory and shares folder etags as calculating these is an expensive - process. But if these directories were updated after the previously calculated etag was - cached, we can ignore this calculation and directly return the new one. + * Enhancement #1528: Port drone pipeline definition to starlark - https://github.com/cs3org/reva/pull/1416 + Having the pipeline definition as a starlark script instead of plain yaml greatly improves the + flexibility and allows for removing lots of duplicated definitions. - * Enhancement #1478: Enhance error handling for grappa REST drivers + https://github.com/cs3org/reva/pull/1528 - https://github.com/cs3org/reva/pull/1478 + * Enhancement #110: Add signature authentication for public links - * Enhancement #1453: Add functionality to share resources with groups + Implemented signature authentication for public links in addition to the existing password + authentication. This allows web clients to efficiently download files from password + protected public shares. - https://github.com/cs3org/reva/pull/1453 + https://github.com/cs3org/cs3apis/issues/110 + https://github.com/cs3org/reva/pull/1590 - * Enhancement #99: Add stubs and manager for groupprovider service + * Enhancement #1495: SQL driver for the publicshare service - Recently, there was a separation of concerns with regard to users and groups in CS3APIs. This PR - adds the required stubs and drivers for the group manager. + https://github.com/cs3org/reva/pull/1495 - https://github.com/cs3org/cs3apis/pull/99 - https://github.com/cs3org/cs3apis/pull/102 - https://github.com/cs3org/reva/pull/1358 + * Enhancement #1588: Make the additional info attribute for shares configurable - * Enhancement #1462: Hash public share passwords + AdditionalInfoAttribute can be configured via the `additional_info_attribute` key in the + form of a Go template string. If not explicitly set, the default value is `{{.Mail}}` - The share passwords were only base64 encoded. Added hashing using bcrypt with configurable - hash cost. + https://github.com/cs3org/reva/pull/1588 - https://github.com/cs3org/reva/pull/1462 + * Enhancement #1595: Add site account registration panel - * Enhancement #1464: LDAP driver for the groupprovider service + This PR adds a site account registration panel to the site accounts service. It also removes + site registration from the xcloud metrics driver. - https://github.com/cs3org/reva/pull/1464 + https://github.com/cs3org/reva/pull/1595 - * Enhancement #1430: Capture non-deterministic behavior on storages + * Enhancement #1506: Site Accounts service for API keys - As a developer creating/maintaining a storage driver I want to be able to validate the - atomicity of all my storage driver operations. * Test for: Start 2 uploads, pause the first one, - let the second one finish first, resume the first one at some point in time. Both uploads should - finish. Needs to result in 2 versions, last finished is the most recent version. * Test for: - Start 2 MKCOL requests with the same path, one needs to fail. + This update adds a new service to Reva that handles site accounts creation and management. + Registered sites can be assigned an API key through a simple web interface which is also part of + this service. This API key can then be used to identify a user and his/her associated (vendor or + partner) site. - https://github.com/cs3org/reva/pull/1430 + Furthermore, Mentix was extended to make use of this new service. This way, all sites now have a + stable and unique site ID that not only avoids ID collisions but also introduces a new layer of + security (i.e., sites can only be modified or removed using the correct API key). - * Enhancement #1456: Fetch user groups in OIDC and LDAP backend + https://github.com/cs3org/reva/pull/1506 - https://github.com/cs3org/reva/pull/1456 + * Enhancement #116: Enhance storage registry with virtual views and regular expressions - * Enhancement #1429: Add s3ng storage driver, storing blobs in a s3-compatible blobstore + Add the functionality to the storage registry service to handle user requests for references + which can span across multiple storage providers, particularly useful for cases where + directories are sharded across providers or virtual views are expected. - We added a new storage driver (s3ng) which stores the file metadata on a local filesystem - (reusing the decomposed filesystem of the ocis driver) and the actual content as blobs in any - s3-compatible blobstore. + https://github.com/cs3org/cs3apis/pull/116 + https://github.com/cs3org/reva/pull/1570 - https://github.com/cs3org/reva/pull/1429 + * Enhancement #1513: Add stubs for storage spaces manipulation - * Enhancement #1467: Align default location for xrdcopy binary + This PR adds stubs for the storage space CRUD methods in the storageprovider service and makes + the expired shares janitor configureable in the publicshares SQL driver. - https://github.com/cs3org/reva/pull/1467 + https://github.com/cs3org/reva/pull/1513 diff --git a/docs/content/en/docs/changelog/1.7.0/_index.md b/docs/content/en/docs/changelog/1.7.0/_index.md new file mode 100644 index 0000000000..89a3510b8f --- /dev/null +++ b/docs/content/en/docs/changelog/1.7.0/_index.md @@ -0,0 +1,311 @@ + +--- +title: "v1.7.0" +linkTitle: "v1.7.0" +weight: 40 +description: > + Changelog for Reva v1.7.0 (2021-04-19) +--- + +Changelog for reva 1.7.0 (2021-04-19) +======================================= + +The following sections list the changes in reva 1.7.0 relevant to +reva users. The changes are ordered by importance. + +Summary +------- + + * Fix #1619: Fixes for enabling file sharing in EOS + * Fix #1576: Fix etag changing only once a second + * Fix #1634: Mentix site authorization status changes + * Fix #1625: Make local file connector more error tolerant + * Fix #1526: Fix webdav file versions endpoint bugs + * Fix #1457: Cloning of internal mesh data lost some values + * Fix #1597: Check for ENOTDIR on readlink error + * Fix #1636: Skip file check for OCM data transfers + * Fix #1552: Fix a bunch of trashbin related issues + * Fix #1: Bump meshdirectory-web to 1.0.2 + * Chg #1562: Modularize api token management in GRAPPA drivers + * Chg #1452: Separate blobs from metadata in the ocis storage driver + * Enh #1514: Add grpc test suite for the storage provider + * Enh #1466: Add integration tests for the s3ng driver + * Enh #1521: Clarify expected failures + * Enh #1624: Add wrappers for EOS and EOS Home storage drivers + * Enh #1563: Implement cs3.sharing.collaboration.v1beta1.Share.ShareType + * Enh #1411: Make InsecureSkipVerify configurable + * Enh #1106: Make command to run litmus tests + * Enh #1502: Bump meshdirectory-web to v1.0.4 + * Enh #1502: New MeshDirectory HTTP service UI frontend with project branding + * Enh #1405: Quota querying and tree accounting + * Enh #1527: Add FindAcceptedUsers method to OCM Invite API + * Enh #1149: Add CLI Commands for OCM invitation workflow + * Enh #1629: Implement checksums in the owncloud storage + * Enh #1528: Port drone pipeline definition to starlark + * Enh #110: Add signature authentication for public links + * Enh #1495: SQL driver for the publicshare service + * Enh #1588: Make the additional info attribute for shares configurable + * Enh #1595: Add site account registration panel + * Enh #1506: Site Accounts service for API keys + * Enh #116: Enhance storage registry with virtual views and regular expressions + * Enh #1513: Add stubs for storage spaces manipulation + +Details +------- + + * Bugfix #1619: Fixes for enabling file sharing in EOS + + https://github.com/cs3org/reva/pull/1619 + + * Bugfix #1576: Fix etag changing only once a second + + We fixed a problem with the owncloud storage driver only considering the mtime with a second + resolution for the etag calculation. + + https://github.com/cs3org/reva/pull/1576 + + * Bugfix #1634: Mentix site authorization status changes + + If a site changes its authorization status, Mentix did not update its internal data to reflect + this change. This PR fixes this issue. + + https://github.com/cs3org/reva/pull/1634 + + * Bugfix #1625: Make local file connector more error tolerant + + The local file connector caused Reva to throw an exception if the local file for storing site + data couldn't be loaded. This PR changes this behavior so that only a warning is logged. + + https://github.com/cs3org/reva/pull/1625 + + * Bugfix #1526: Fix webdav file versions endpoint bugs + + Etag and error code related bugs have been fixed for the webdav file versions endpoint and + removed from the expected failures file. + + https://github.com/cs3org/reva/pull/1526 + + * Bugfix #1457: Cloning of internal mesh data lost some values + + This update fixes a bug in Mentix that caused some (non-critical) values to be lost during data + cloning that happens internally. + + https://github.com/cs3org/reva/pull/1457 + + * Bugfix #1597: Check for ENOTDIR on readlink error + + The deconstructed storage driver now handles ENOTDIR errors when `node.Child()` is called + for a path containing a path segment that is actually a file. + + https://github.com/owncloud/ocis/issues/1239 + https://github.com/cs3org/reva/pull/1597 + + * Bugfix #1636: Skip file check for OCM data transfers + + https://github.com/cs3org/reva/pull/1636 + + * Bugfix #1552: Fix a bunch of trashbin related issues + + Fixed these issues: + + - Complete: Deletion time in trash bin shows a wrong date - Complete: shared trash status code - + Partly: invalid webdav responses for unauthorized requests. - Partly: href in trashbin + PROPFIND response is wrong + + Complete means there are no expected failures left. Partly means there are some scenarios + left. + + https://github.com/cs3org/reva/pull/1552 + + * Bugfix #1: Bump meshdirectory-web to 1.0.2 + + Updated meshdirectory-web mod to version 1.0.2 that contains fixes for OCM invite API links + generation. + + https://github.com/sciencemesh/meshdirectory-web/pull/1 + + * Change #1562: Modularize api token management in GRAPPA drivers + + This PR moves the duplicated api token management methods into a seperate utils package + + https://github.com/cs3org/reva/issues/1562 + + * Change #1452: Separate blobs from metadata in the ocis storage driver + + We changed the ocis storage driver to keep the file content separate from the metadata by + storing the blobs in a separate directory. This allows for using a different (potentially + faster) storage for the metadata. + + **Note** This change makes existing ocis storages incompatible with the new code. + + We also streamlined the ocis and the s3ng drivers so that most of the code is shared between them. + + https://github.com/cs3org/reva/pull/1452 + + * Enhancement #1514: Add grpc test suite for the storage provider + + A new test suite has been added which tests the grpc interface to the storage provider. It + currently runs against the ocis and the owncloud storage drivers. + + https://github.com/cs3org/reva/pull/1514 + + * Enhancement #1466: Add integration tests for the s3ng driver + + We extended the integration test suite to also run all tests against the s3ng driver. + + https://github.com/cs3org/reva/pull/1466 + + * Enhancement #1521: Clarify expected failures + + Some features, while covered by the ownCloud 10 acceptance tests, will not be implmented for + now: - blacklisted / ignored files, because ocis/reva don't need to blacklist `.htaccess` + files - `OC-LazyOps` support was [removed from the + clients](https://github.com/owncloud/client/pull/8398). We are thinking about [a state + machine for uploads to properly solve that scenario and also list the state of files in progress + in the web ui](https://github.com/owncloud/ocis/issues/214). The expected failures + files now have a dedicated _Won't fix_ section for these items. + + https://github.com/owncloud/ocis/issues/214 + https://github.com/cs3org/reva/pull/1521 + https://github.com/owncloud/client/pull/8398 + + * Enhancement #1624: Add wrappers for EOS and EOS Home storage drivers + + For CERNBox, we need the mount ID to be configured according to the owner of a resource. Setting + this in the storageprovider means having different instances of this service to cater to + different users, which does not scale. This driver forms a wrapper around the EOS driver and + sets the mount ID according to a configurable mapping based on the owner of the resource. + + https://github.com/cs3org/reva/pull/1624 + + * Enhancement #1563: Implement cs3.sharing.collaboration.v1beta1.Share.ShareType + + Interface method Share() in pkg/ocm/share/share.go now has a share type parameter. + + https://github.com/cs3org/reva/pull/1563 + + * Enhancement #1411: Make InsecureSkipVerify configurable + + Add `InsecureSkipVerify` field to `metrics.Config` struct and update examples to include + it. + + https://github.com/cs3org/reva/issues/1411 + + * Enhancement #1106: Make command to run litmus tests + + This updates adds an extra make command to run litmus tests via make. `make litmus-test` + executes the tests. + + https://github.com/cs3org/reva/issues/1106 + https://github.com/cs3org/reva/pull/1543 + + * Enhancement #1502: Bump meshdirectory-web to v1.0.4 + + Updated meshdirectory-web version to v.1.0.4 bringing multiple UX improvements in provider + list and map. + + https://github.com/cs3org/reva/issues/1502 + https://github.com/sciencemesh/meshdirectory-web/pull/2 + https://github.com/sciencemesh/meshdirectory-web/pull/3 + + * Enhancement #1502: New MeshDirectory HTTP service UI frontend with project branding + + We replaced the temporary version of web frontend of the mesh directory http service with a new + redesigned & branded one. Because the new version is a more complex Vue SPA that contains image, + css and other assets, it is now served from a binary package distribution that was generated + using the [github.com/rakyll/statik](https://github.com/rakyll/statik) package. The + `http.services.meshdirectory.static` config option was obsoleted by this change. + + https://github.com/cs3org/reva/issues/1502 + + * Enhancement #1405: Quota querying and tree accounting + + The ocs api now returns the user quota for the users home storage. Furthermore, the ocis storage + driver now reads the quota from the extended attributes of the user home or root node and + implements tree size accounting. Finally, ocdav PROPFINDS now handle the + `DAV:quota-used-bytes` and `DAV:quote-available-bytes` properties. + + https://github.com/cs3org/reva/pull/1405 + https://github.com/cs3org/reva/pull/1491 + + * Enhancement #1527: Add FindAcceptedUsers method to OCM Invite API + + https://github.com/cs3org/reva/pull/1527 + + * Enhancement #1149: Add CLI Commands for OCM invitation workflow + + This adds a couple of CLI commands, `ocm-invite-generate` and `ocm-invite-forward` to + generate and forward ocm invitation tokens respectively. + + https://github.com/cs3org/reva/issues/1149 + + * Enhancement #1629: Implement checksums in the owncloud storage + + Implemented checksums in the owncloud storage driver. + + https://github.com/cs3org/reva/pull/1629 + + * Enhancement #1528: Port drone pipeline definition to starlark + + Having the pipeline definition as a starlark script instead of plain yaml greatly improves the + flexibility and allows for removing lots of duplicated definitions. + + https://github.com/cs3org/reva/pull/1528 + + * Enhancement #110: Add signature authentication for public links + + Implemented signature authentication for public links in addition to the existing password + authentication. This allows web clients to efficiently download files from password + protected public shares. + + https://github.com/cs3org/cs3apis/issues/110 + https://github.com/cs3org/reva/pull/1590 + + * Enhancement #1495: SQL driver for the publicshare service + + https://github.com/cs3org/reva/pull/1495 + + * Enhancement #1588: Make the additional info attribute for shares configurable + + AdditionalInfoAttribute can be configured via the `additional_info_attribute` key in the + form of a Go template string. If not explicitly set, the default value is `{{.Mail}}` + + https://github.com/cs3org/reva/pull/1588 + + * Enhancement #1595: Add site account registration panel + + This PR adds a site account registration panel to the site accounts service. It also removes + site registration from the xcloud metrics driver. + + https://github.com/cs3org/reva/pull/1595 + + * Enhancement #1506: Site Accounts service for API keys + + This update adds a new service to Reva that handles site accounts creation and management. + Registered sites can be assigned an API key through a simple web interface which is also part of + this service. This API key can then be used to identify a user and his/her associated (vendor or + partner) site. + + Furthermore, Mentix was extended to make use of this new service. This way, all sites now have a + stable and unique site ID that not only avoids ID collisions but also introduces a new layer of + security (i.e., sites can only be modified or removed using the correct API key). + + https://github.com/cs3org/reva/pull/1506 + + * Enhancement #116: Enhance storage registry with virtual views and regular expressions + + Add the functionality to the storage registry service to handle user requests for references + which can span across multiple storage providers, particularly useful for cases where + directories are sharded across providers or virtual views are expected. + + https://github.com/cs3org/cs3apis/pull/116 + https://github.com/cs3org/reva/pull/1570 + + * Enhancement #1513: Add stubs for storage spaces manipulation + + This PR adds stubs for the storage space CRUD methods in the storageprovider service and makes + the expired shares janitor configureable in the publicshares SQL driver. + + https://github.com/cs3org/reva/pull/1513 + + From 65208c23267966daf3a473d056542140428ac6d0 Mon Sep 17 00:00:00 2001 From: Andre Duffeck Date: Mon, 19 Apr 2021 16:19:52 +0200 Subject: [PATCH 18/70] Fix recycle to different location (#1541) --- .../fix-restore-to-different-location.md | 8 ++++ .../storageprovider/storageprovider.go | 2 +- pkg/storage/fs/owncloud/owncloud.go | 17 +++++---- pkg/storage/fs/s3/s3.go | 2 +- pkg/storage/storage.go | 2 +- .../utils/decomposedfs/decomposedfs.go | 2 +- pkg/storage/utils/decomposedfs/recycle.go | 4 +- pkg/storage/utils/decomposedfs/tree/tree.go | 8 +++- .../utils/decomposedfs/tree/tree_test.go | 36 +++++++++++++++--- pkg/storage/utils/eosfs/eosfs.go | 2 +- pkg/storage/utils/localfs/localfs.go | 21 +++++----- .../expected-failures-on-OCIS-storage.md | 7 ---- .../expected-failures-on-OWNCLOUD-storage.md | 6 --- .../expected-failures-on-S3NG-storage.md | 7 ---- .../integration/grpc/storageprovider_test.go | 38 +++++++++++++++++++ 15 files changed, 110 insertions(+), 52 deletions(-) create mode 100644 changelog/unreleased/fix-restore-to-different-location.md diff --git a/changelog/unreleased/fix-restore-to-different-location.md b/changelog/unreleased/fix-restore-to-different-location.md new file mode 100644 index 0000000000..310e0a41b4 --- /dev/null +++ b/changelog/unreleased/fix-restore-to-different-location.md @@ -0,0 +1,8 @@ +Bugfix: Allow for restoring recycle items to different locations + +The CS3 APIs specify a way to restore a recycle item to a different location +than the original by setting the `restore_path` field in the +`RestoreRecycleItemRequest`. This field had not been considered until now. + +https://github.com/cs3org/reva/pull/1541 +https://cs3org.github.io/cs3apis/ \ No newline at end of file diff --git a/internal/grpc/services/storageprovider/storageprovider.go b/internal/grpc/services/storageprovider/storageprovider.go index 729e660eee..44d64416c2 100644 --- a/internal/grpc/services/storageprovider/storageprovider.go +++ b/internal/grpc/services/storageprovider/storageprovider.go @@ -816,7 +816,7 @@ func (s *service) ListRecycle(ctx context.Context, req *provider.ListRecycleRequ func (s *service) RestoreRecycleItem(ctx context.Context, req *provider.RestoreRecycleItemRequest) (*provider.RestoreRecycleItemResponse, error) { // TODO(labkode): CRITICAL: fill recycle info with storage provider. - if err := s.storage.RestoreRecycleItem(ctx, req.Key); err != nil { + if err := s.storage.RestoreRecycleItem(ctx, req.Key, req.RestorePath); err != nil { var st *rpc.Status switch err.(type) { case errtypes.IsNotFound: diff --git a/pkg/storage/fs/owncloud/owncloud.go b/pkg/storage/fs/owncloud/owncloud.go index 4a194d8b4f..f3f16fa5dc 100644 --- a/pkg/storage/fs/owncloud/owncloud.go +++ b/pkg/storage/fs/owncloud/owncloud.go @@ -2152,7 +2152,7 @@ func (fs *ocfs) ListRecycle(ctx context.Context) ([]*provider.RecycleItem, error return items, nil } -func (fs *ocfs) RestoreRecycleItem(ctx context.Context, key string) error { +func (fs *ocfs) RestoreRecycleItem(ctx context.Context, key, restorePath string) error { // TODO check permission? on what? user must be the owner? log := appctx.GetLogger(ctx) rp, err := fs.getRecyclePath(ctx) @@ -2167,16 +2167,17 @@ func (fs *ocfs) RestoreRecycleItem(ctx context.Context, key string) error { return nil } - origin := "/" - if v, err := xattr.Get(src, trashOriginPrefix); err != nil { - log.Error().Err(err).Str("key", key).Str("path", src).Msg("could not read origin") - } else { - origin = filepath.Clean(string(v)) + if restorePath == "" { + v, err := xattr.Get(src, trashOriginPrefix) + if err != nil { + log.Error().Err(err).Str("key", key).Str("path", src).Msg("could not read origin") + } + restorePath = filepath.Join("/", filepath.Clean(string(v)), strings.TrimSuffix(filepath.Base(src), suffix)) } - tgt := fs.toInternalPath(ctx, filepath.Join("/", origin, strings.TrimSuffix(filepath.Base(src), suffix))) + tgt := fs.toInternalPath(ctx, restorePath) // move back to original location if err := os.Rename(src, tgt); err != nil { - log.Error().Err(err).Str("key", key).Str("origin", origin).Str("src", src).Str("tgt", tgt).Msg("could not restore item") + log.Error().Err(err).Str("key", key).Str("restorePath", restorePath).Str("src", src).Str("tgt", tgt).Msg("could not restore item") return errors.Wrap(err, "ocfs: could not restore item") } // unset trash origin location in metadata diff --git a/pkg/storage/fs/s3/s3.go b/pkg/storage/fs/s3/s3.go index 841d78a398..d7cfc4a493 100644 --- a/pkg/storage/fs/s3/s3.go +++ b/pkg/storage/fs/s3/s3.go @@ -656,6 +656,6 @@ func (fs *s3FS) ListRecycle(ctx context.Context) ([]*provider.RecycleItem, error return nil, errtypes.NotSupported("list recycle") } -func (fs *s3FS) RestoreRecycleItem(ctx context.Context, restoreKey string) error { +func (fs *s3FS) RestoreRecycleItem(ctx context.Context, restoreKey, restorePath string) error { return errtypes.NotSupported("restore recycle") } diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index d80d5fdb8e..53e718886c 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -43,7 +43,7 @@ type FS interface { DownloadRevision(ctx context.Context, ref *provider.Reference, key string) (io.ReadCloser, error) RestoreRevision(ctx context.Context, ref *provider.Reference, key string) error ListRecycle(ctx context.Context) ([]*provider.RecycleItem, error) - RestoreRecycleItem(ctx context.Context, key string) error + RestoreRecycleItem(ctx context.Context, key, restorePath string) error PurgeRecycleItem(ctx context.Context, key string) error EmptyRecycle(ctx context.Context) error GetPathByID(ctx context.Context, id *provider.ResourceId) (string, error) diff --git a/pkg/storage/utils/decomposedfs/decomposedfs.go b/pkg/storage/utils/decomposedfs/decomposedfs.go index 791447a9d4..cfef24de56 100644 --- a/pkg/storage/utils/decomposedfs/decomposedfs.go +++ b/pkg/storage/utils/decomposedfs/decomposedfs.go @@ -63,7 +63,7 @@ type Tree interface { // CreateReference(ctx context.Context, node *node.Node, targetURI *url.URL) error Move(ctx context.Context, oldNode *node.Node, newNode *node.Node) (err error) Delete(ctx context.Context, node *node.Node) (err error) - RestoreRecycleItemFunc(ctx context.Context, key string) (*node.Node, func() error, error) + RestoreRecycleItemFunc(ctx context.Context, key, restorePath string) (*node.Node, func() error, error) PurgeRecycleItemFunc(ctx context.Context, key string) (*node.Node, func() error, error) WriteBlob(key string, reader io.Reader) error diff --git a/pkg/storage/utils/decomposedfs/recycle.go b/pkg/storage/utils/decomposedfs/recycle.go index b75d568b6e..1282f9a0f6 100644 --- a/pkg/storage/utils/decomposedfs/recycle.go +++ b/pkg/storage/utils/decomposedfs/recycle.go @@ -146,8 +146,8 @@ func (fs *Decomposedfs) ListRecycle(ctx context.Context) (items []*provider.Recy } // RestoreRecycleItem restores the specified item -func (fs *Decomposedfs) RestoreRecycleItem(ctx context.Context, key string) error { - rn, restoreFunc, err := fs.tp.RestoreRecycleItemFunc(ctx, key) +func (fs *Decomposedfs) RestoreRecycleItem(ctx context.Context, key, restorePath string) error { + rn, restoreFunc, err := fs.tp.RestoreRecycleItemFunc(ctx, key, restorePath) if err != nil { return err } diff --git a/pkg/storage/utils/decomposedfs/tree/tree.go b/pkg/storage/utils/decomposedfs/tree/tree.go index e5e136d5e0..a6f0700871 100644 --- a/pkg/storage/utils/decomposedfs/tree/tree.go +++ b/pkg/storage/utils/decomposedfs/tree/tree.go @@ -345,16 +345,20 @@ func (t *Tree) Delete(ctx context.Context, n *node.Node) (err error) { } // RestoreRecycleItemFunc returns a node and a function to restore it from the trash -func (t *Tree) RestoreRecycleItemFunc(ctx context.Context, key string) (*node.Node, func() error, error) { +func (t *Tree) RestoreRecycleItemFunc(ctx context.Context, key, restorePath string) (*node.Node, func() error, error) { rn, trashItem, deletedNodePath, origin, err := t.readRecycleItem(ctx, key) if err != nil { return nil, nil, err } + if restorePath == "" { + restorePath = origin + } + fn := func() error { // link to origin var n *node.Node - n, err = t.lookup.NodeFromPath(ctx, origin) + n, err = t.lookup.NodeFromPath(ctx, restorePath) if err != nil { return err } diff --git a/pkg/storage/utils/decomposedfs/tree/tree_test.go b/pkg/storage/utils/decomposedfs/tree/tree_test.go index af4f810eac..fdbe19f2d8 100644 --- a/pkg/storage/utils/decomposedfs/tree/tree_test.go +++ b/pkg/storage/utils/decomposedfs/tree/tree_test.go @@ -55,12 +55,13 @@ var _ = Describe("Tree", func() { Context("with an existingfile", func() { var ( - n *node.Node + n *node.Node + originalPath = "dir1/file1" ) JustBeforeEach(func() { var err error - n, err = env.Lookup.NodeFromPath(env.Ctx, "/dir1/file1") + n, err = env.Lookup.NodeFromPath(env.Ctx, originalPath) Expect(err).ToNot(HaveOccurred()) }) @@ -135,18 +136,41 @@ var _ = Describe("Tree", func() { Expect(err).ToNot(HaveOccurred()) _, err = os.Stat(n.InternalPath()) Expect(err).To(HaveOccurred()) + }) - _, restoreFunc, err := t.RestoreRecycleItemFunc(env.Ctx, env.Owner.Id.OpaqueId+":"+n.ID) + It("restores the file to its original location if the targetPath is empty", func() { + _, restoreFunc, err := t.RestoreRecycleItemFunc(env.Ctx, env.Owner.Id.OpaqueId+":"+n.ID, "") Expect(err).ToNot(HaveOccurred()) + Expect(restoreFunc()).To(Succeed()) + + originalNode, err := env.Lookup.NodeFromPath(env.Ctx, originalPath) + Expect(err).ToNot(HaveOccurred()) + Expect(originalNode.Exists).To(BeTrue()) }) - It("restores the file to its original location", func() { - _, err := os.Stat(n.InternalPath()) + It("restores files to different locations", func() { + _, restoreFunc, err := t.RestoreRecycleItemFunc(env.Ctx, env.Owner.Id.OpaqueId+":"+n.ID, "dir1/newLocation") + Expect(err).ToNot(HaveOccurred()) + + Expect(restoreFunc()).To(Succeed()) + + newNode, err := env.Lookup.NodeFromPath(env.Ctx, "dir1/newLocation") Expect(err).ToNot(HaveOccurred()) + Expect(newNode.Exists).To(BeTrue()) + + originalNode, err := env.Lookup.NodeFromPath(env.Ctx, originalPath) + Expect(err).ToNot(HaveOccurred()) + Expect(originalNode.Exists).To(BeFalse()) }) + It("removes the file from the trash", func() { - _, err := os.Stat(trashPath) + _, restoreFunc, err := t.RestoreRecycleItemFunc(env.Ctx, env.Owner.Id.OpaqueId+":"+n.ID, "") + Expect(err).ToNot(HaveOccurred()) + + Expect(restoreFunc()).To(Succeed()) + + _, err = os.Stat(trashPath) Expect(err).To(HaveOccurred()) }) }) diff --git a/pkg/storage/utils/eosfs/eosfs.go b/pkg/storage/utils/eosfs/eosfs.go index c6956ea065..da32a77d22 100644 --- a/pkg/storage/utils/eosfs/eosfs.go +++ b/pkg/storage/utils/eosfs/eosfs.go @@ -1284,7 +1284,7 @@ func (fs *eosfs) ListRecycle(ctx context.Context) ([]*provider.RecycleItem, erro return recycleEntries, nil } -func (fs *eosfs) RestoreRecycleItem(ctx context.Context, key string) error { +func (fs *eosfs) RestoreRecycleItem(ctx context.Context, key, restorePath string) error { u, err := getUser(ctx) if err != nil { return errors.Wrap(err, "eos: no user in ctx") diff --git a/pkg/storage/utils/localfs/localfs.go b/pkg/storage/utils/localfs/localfs.go index 99c7b7c947..d27b4bb91e 100644 --- a/pkg/storage/utils/localfs/localfs.go +++ b/pkg/storage/utils/localfs/localfs.go @@ -1179,7 +1179,7 @@ func (fs *localfs) ListRecycle(ctx context.Context) ([]*provider.RecycleItem, er return items, nil } -func (fs *localfs) RestoreRecycleItem(ctx context.Context, restoreKey string) error { +func (fs *localfs) RestoreRecycleItem(ctx context.Context, restoreKey, restorePath string) error { suffix := path.Ext(restoreKey) if len(suffix) == 0 || !strings.HasPrefix(suffix, ".d") { @@ -1191,14 +1191,17 @@ func (fs *localfs) RestoreRecycleItem(ctx context.Context, restoreKey string) er return errors.Wrap(err, "localfs: invalid key") } - var originalPath string - if fs.isShareFolder(ctx, filePath) { - originalPath = fs.wrapReferences(ctx, filePath) - } else { - originalPath = fs.wrap(ctx, filePath) + var localRestorePath string + switch { + case restorePath != "": + localRestorePath = fs.wrap(ctx, restorePath) + case fs.isShareFolder(ctx, filePath): + localRestorePath = fs.wrapReferences(ctx, filePath) + default: + localRestorePath = fs.wrap(ctx, filePath) } - if _, err = os.Stat(originalPath); err == nil { + if _, err = os.Stat(localRestorePath); err == nil { return errors.New("localfs: can't restore - file already exists at original path") } @@ -1210,7 +1213,7 @@ func (fs *localfs) RestoreRecycleItem(ctx context.Context, restoreKey string) er return errors.Wrap(err, "localfs: error stating "+rp) } - if err := os.Rename(rp, originalPath); err != nil { + if err := os.Rename(rp, localRestorePath); err != nil { return errors.Wrap(err, "ocfs: could not restore item") } @@ -1219,7 +1222,7 @@ func (fs *localfs) RestoreRecycleItem(ctx context.Context, restoreKey string) er return errors.Wrap(err, "localfs: error adding entry to DB") } - return fs.propagate(ctx, originalPath) + return fs.propagate(ctx, localRestorePath) } func (fs *localfs) propagate(ctx context.Context, leafPath string) error { diff --git a/tests/acceptance/expected-failures-on-OCIS-storage.md b/tests/acceptance/expected-failures-on-OCIS-storage.md index ae29e5034c..ebe7b16dcc 100644 --- a/tests/acceptance/expected-failures-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-on-OCIS-storage.md @@ -3,13 +3,6 @@ ### File Basic file management like up and download, move, copy, properties, quota, trash, versions and chunking. -#### [Implement Trashbin Feature for ocis storage](https://github.com/owncloud/product/issues/209) - -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L48) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L49) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L90) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L91) - #### [QA trashcan cannot delete a deep tree](https://github.com/owncloud/ocis/issues/1077) - [apiTrashbin/trashbinDelete.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinDelete.feature#L107) - [apiTrashbin/trashbinDelete.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinDelete.feature#L123) diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index 9e30dc95a1..0d0181f246 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -3,12 +3,6 @@ ### File Basic file management like up and download, move, copy, properties, quota, trash, versions and chunking. -#### [Implement Trashbin Feature for ocis storage](https://github.com/owncloud/product/issues/209) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L48) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L49) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L90) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L91) - #### [QA trashcan cannot delete a deep tree](https://github.com/owncloud/ocis/issues/1077) - [apiTrashbin/trashbinDelete.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinDelete.feature#L107) - [apiTrashbin/trashbinDelete.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinDelete.feature#L123) diff --git a/tests/acceptance/expected-failures-on-S3NG-storage.md b/tests/acceptance/expected-failures-on-S3NG-storage.md index da7745c750..da0d21710e 100644 --- a/tests/acceptance/expected-failures-on-S3NG-storage.md +++ b/tests/acceptance/expected-failures-on-S3NG-storage.md @@ -3,13 +3,6 @@ ### File Basic file management like up and download, move, copy, properties, quota, trash, versions and chunking. -#### [Implement Trashbin Feature for ocis storage](https://github.com/owncloud/product/issues/209) - -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L48) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L49) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L90) -- [apiWebdavEtagPropagation2/restoreFromTrash.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation2/restoreFromTrash.feature#L91) - #### [QA trashcan cannot delete a deep tree](https://github.com/owncloud/ocis/issues/1077) - [apiTrashbin/trashbinDelete.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinDelete.feature#L107) - [apiTrashbin/trashbinDelete.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinDelete.feature#L123) diff --git a/tests/integration/grpc/storageprovider_test.go b/tests/integration/grpc/storageprovider_test.go index cce656b3af..e06f32327e 100644 --- a/tests/integration/grpc/storageprovider_test.go +++ b/tests/integration/grpc/storageprovider_test.go @@ -360,6 +360,44 @@ var _ = Describe("storage providers", func() { Expect(statRes.Status.Code).To(Equal(rpcv1beta1.Code_CODE_OK)) }) + It("restores resources to a different location", func() { + restoreRef := &storagep.Reference{ + Spec: &storagep.Reference_Path{Path: "/subdirRestored"}, + } + By("deleting an item") + res, err := serviceClient.Delete(ctx, &storagep.DeleteRequest{Ref: subdirRef}) + Expect(err).ToNot(HaveOccurred()) + Expect(res.Status.Code).To(Equal(rpcv1beta1.Code_CODE_OK)) + + By("listing the recycle items") + listRes, err := serviceClient.ListRecycle(ctx, &storagep.ListRecycleRequest{}) + Expect(err).ToNot(HaveOccurred()) + Expect(listRes.Status.Code).To(Equal(rpcv1beta1.Code_CODE_OK)) + + Expect(len(listRes.RecycleItems)).To(Equal(1)) + item := listRes.RecycleItems[0] + Expect(item.Path).To(Equal(subdirPath)) + + By("restoring the item to a different location") + statRes, err := serviceClient.Stat(ctx, &storagep.StatRequest{Ref: restoreRef}) + Expect(err).ToNot(HaveOccurred()) + Expect(statRes.Status.Code).To(Equal(rpcv1beta1.Code_CODE_NOT_FOUND)) + + restoreRes, err := serviceClient.RestoreRecycleItem(ctx, + &storagep.RestoreRecycleItemRequest{ + Ref: subdirRef, + Key: item.Key, + RestorePath: "/subdirRestored", + }, + ) + Expect(err).ToNot(HaveOccurred()) + Expect(restoreRes.Status.Code).To(Equal(rpcv1beta1.Code_CODE_OK)) + + statRes, err = serviceClient.Stat(ctx, &storagep.StatRequest{Ref: restoreRef}) + Expect(err).ToNot(HaveOccurred()) + Expect(statRes.Status.Code).To(Equal(rpcv1beta1.Code_CODE_OK)) + }) + It("purges recycle items resources", func() { By("deleting an item") res, err := serviceClient.Delete(ctx, &storagep.DeleteRequest{Ref: subdirRef}) From d1042c3f2b1baa09542270eb4c2cdc8524134138 Mon Sep 17 00:00:00 2001 From: marpapdtu <67952833+marpapdtu@users.noreply.github.com> Date: Mon, 19 Apr 2021 16:28:50 +0200 Subject: [PATCH 19/70] Added partner (#1646) --- examples/ocm-partners/providers.demo.json | 39 +++++++++++++++++++- examples/ocm-partners/users-dtu.json | 43 +++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 examples/ocm-partners/users-dtu.json diff --git a/examples/ocm-partners/providers.demo.json b/examples/ocm-partners/providers.demo.json index 85824aca15..66d0880587 100644 --- a/examples/ocm-partners/providers.demo.json +++ b/examples/ocm-partners/providers.demo.json @@ -250,5 +250,42 @@ "host": "https://sciencemesh-test.switch.ch/api/" } ] - } + }, + { + "name": "sciencedata", + "full_name": "ScienceData", + "organization": "DTU", + "domain": "dtu.dk", + "homepage": "https://sciencedata.dk", + "description": "ScienceData provides cloud storage for scientists", + "services": [ + { + "endpoint": { + "type": { + "name": "OCM", + "description": "DTU Open Cloud Mesh API" + }, + "name": "DTU - OCM API", + "path": "https://sciencemesh.sciencedata.dk/iop/ocm/", + "is_monitored": true + }, + "api_version": "0.0.1", + "host": "https://sciencemesh.sciencedata.dk/iop/" + }, + { + "endpoint": { + "type": { + "name": "Webdav", + "description": "DTU Webdav API" + }, + "name": "DTU - Webdav API", + "path": "https://sciencemesh.sciencedata.dk/iop/remote.php/webdav/", + "is_monitored": true + }, + "api_version": "0.0.1", + "host": "https://sciencemesh.sciencedata.dk/iop" + } + + ] + ] diff --git a/examples/ocm-partners/users-dtu.json b/examples/ocm-partners/users-dtu.json new file mode 100644 index 0000000000..c70f9f69d9 --- /dev/null +++ b/examples/ocm-partners/users-dtu.json @@ -0,0 +1,43 @@ +[ + + { + + + "id": { + "opaque_id": "marina1234", + "idp": "dtu.dk" + + }, + "username": "marina", + "secret": "marinapass", + "mail": "marpap@dtu.dk", + "display_name": "Marina Papathanasiou", + "groups": ["sailing-lovers", "violin-haters", "physics-lovers"] + }, + { + "id": { + "opaque_id": "frederik7899", + "idp": "dtu.dk" + + }, + "username": "frederik", + "secret": "frederikpass", + "mail": "frederik.orellana@deic.dk", + "display_name": "Frederik Orellana", + "groups": ["radium-lovers", "polonium-lovers", "physics-lovers"] + + + }, + { + "id": { + "opaque_id": "test3456", + "idp": "dtu.dk" + }, + "username": "test", + "secret": "testpass", + "mail": "test7@dtu.dk", + "display_name": "User_test", + "groups": ["test-lovers", "bug-haters", "ai-lovers"] + } + +] From 3de7ce4898a2c508dc151243f3a2853bba13ff34 Mon Sep 17 00:00:00 2001 From: Phil Davis Date: Tue, 20 Apr 2021 12:43:12 +0545 Subject: [PATCH 20/70] [tests-only] Bump core commit id (#1639) --- .drone.env | 2 +- .../expected-failures-on-OCIS-storage.md | 26 ++++++++++++------- .../expected-failures-on-OWNCLOUD-storage.md | 26 ++++++++++++------- .../expected-failures-on-S3NG-storage.md | 26 ++++++++++++------- 4 files changed, 52 insertions(+), 28 deletions(-) diff --git a/.drone.env b/.drone.env index 905719775a..086b3c3b82 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=03130a083c1422dc0e2bd3cd888ac69f01483716 +CORE_COMMITID=d95992fe45aab8b05d8c7911697608913ea8fb07 CORE_BRANCH=master diff --git a/tests/acceptance/expected-failures-on-OCIS-storage.md b/tests/acceptance/expected-failures-on-OCIS-storage.md index ebe7b16dcc..48d09a1a52 100644 --- a/tests/acceptance/expected-failures-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-on-OCIS-storage.md @@ -1199,6 +1199,14 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiMain/quota.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L70) Scenario: Overwriting a file in received folder having insufficient quota - [apiMain/quota.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L84) Scenario: Overwriting a received file having enough quota - [apiMain/quota.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L94) Scenario: Overwriting a received file having insufficient quota +- [apiMain/quota.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#105) Scenario: User with zero quota cannot upload a file +- [apiMain/quota.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#112) Scenario: User with zero quota can create a folder +- [apiMain/quota.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#119) Scenario: user cannot create file on shared folder by a user with zero quota +- [apiMain/quota.feature:134](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#134) Scenario: share receiver with 0 quota should not be able to move file from shared folder to home folder +- [apiMain/quota.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#148) Scenario: sharer should be able to upload to a folder shared with user having zero quota +- [apiMain/quota.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#164) Scenario: share receiver with 0 quota should be able to upload on shared folder +- [apiMain/quota.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#178) Scenario: User should retain their old files even if their quota is set to 0 +- [apiMain/quota.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#184) Scenario: User should be able to restore their deleted file when their quota is set to zero Scenario Outline: Retrieving folder quota of shared folder with quota when no quota is set for recipient - [apiWebdavProperties1/getQuota.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L48) - [apiWebdavProperties1/getQuota.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L49) @@ -1737,14 +1745,16 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L37) - [apiAuth/cors.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L38) - [apiAuth/cors.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L39) -- [apiAuth/cors.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L43) -- [apiAuth/cors.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L44) +- [apiAuth/cors.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L40) +- [apiAuth/cors.feature:41](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L41) +- [apiAuth/cors.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L60) +- [apiAuth/cors.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L61) - [apiAuth/cors.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L62) - [apiAuth/cors.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L63) - [apiAuth/cors.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L64) - [apiAuth/cors.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L65) -- [apiAuth/cors.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L66) -- [apiAuth/cors.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L67) +- [apiAuth/cors.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L84) +- [apiAuth/cors.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L85) - [apiAuth/cors.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L86) - [apiAuth/cors.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L87) - [apiAuth/cors.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L88) @@ -1761,14 +1771,13 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L99) - [apiAuth/cors.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L100) - [apiAuth/cors.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L101) -- [apiAuth/cors.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L102) -- [apiAuth/cors.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L103) +- [apiAuth/cors.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L120) - [apiAuth/cors.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L121) - [apiAuth/cors.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L122) - [apiAuth/cors.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L123) - [apiAuth/cors.feature:124](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L124) - [apiAuth/cors.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L125) -- [apiAuth/cors.feature:126](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L126) +- [apiAuth/cors.feature:144](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L144) - [apiAuth/cors.feature:145](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L145) - [apiAuth/cors.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L146) - [apiAuth/cors.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L147) @@ -1784,13 +1793,12 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L157) - [apiAuth/cors.feature:158](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L158) - [apiAuth/cors.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L159) -- [apiAuth/cors.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L160) +- [apiAuth/cors.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L180) - [apiAuth/cors.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L181) - [apiAuth/cors.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L182) - [apiAuth/cors.feature:183](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L183) - [apiAuth/cors.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L184) - [apiAuth/cors.feature:185](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L185) -- [apiAuth/cors.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L186) #### [HTTP 401 Unauthorized responses don't contain a body](https://github.com/owncloud/ocis/issues/1337) #### [app passwords are not possible](https://github.com/owncloud/ocis/issues/1320) diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index 0d0181f246..09792c1fc7 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -1313,6 +1313,14 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiMain/quota.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L70) Scenario: Overwriting a file in received folder having insufficient quota - [apiMain/quota.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L84) Scenario: Overwriting a received file having enough quota - [apiMain/quota.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#94) Scenario: Overwriting a received file having insufficient quota +- [apiMain/quota.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#105) Scenario: User with zero quota cannot upload a file +- [apiMain/quota.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#112) Scenario: User with zero quota can create a folder +- [apiMain/quota.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#119) Scenario: user cannot create file on shared folder by a user with zero quota +- [apiMain/quota.feature:134](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#134) Scenario: share receiver with 0 quota should not be able to move file from shared folder to home folder +- [apiMain/quota.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#148) Scenario: sharer should be able to upload to a folder shared with user having zero quota +- [apiMain/quota.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#164) Scenario: share receiver with 0 quota should be able to upload on shared folder +- [apiMain/quota.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#178) Scenario: User should retain their old files even if their quota is set to 0 +- [apiMain/quota.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#184) Scenario: User should be able to restore their deleted file when their quota is set to zero Scenario Outline: Retrieving folder quota of shared folder with quota when no quota is set for recipient - [apiWebdavProperties1/getQuota.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L48) - [apiWebdavProperties1/getQuota.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L49) @@ -1869,14 +1877,16 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L37) - [apiAuth/cors.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L38) - [apiAuth/cors.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L39) -- [apiAuth/cors.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L43) -- [apiAuth/cors.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L44) +- [apiAuth/cors.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L40) +- [apiAuth/cors.feature:41](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L41) +- [apiAuth/cors.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L60) +- [apiAuth/cors.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L61) - [apiAuth/cors.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L62) - [apiAuth/cors.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L63) - [apiAuth/cors.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L64) - [apiAuth/cors.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L65) -- [apiAuth/cors.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L66) -- [apiAuth/cors.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L67) +- [apiAuth/cors.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L84) +- [apiAuth/cors.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L85) - [apiAuth/cors.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L86) - [apiAuth/cors.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L87) - [apiAuth/cors.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L88) @@ -1893,14 +1903,13 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L99) - [apiAuth/cors.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L100) - [apiAuth/cors.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L101) -- [apiAuth/cors.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L102) -- [apiAuth/cors.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L103) +- [apiAuth/cors.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L120) - [apiAuth/cors.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L121) - [apiAuth/cors.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L122) - [apiAuth/cors.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L123) - [apiAuth/cors.feature:124](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L124) - [apiAuth/cors.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L125) -- [apiAuth/cors.feature:126](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L126) +- [apiAuth/cors.feature:144](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L144) - [apiAuth/cors.feature:145](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L145) - [apiAuth/cors.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L146) - [apiAuth/cors.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L147) @@ -1916,13 +1925,12 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L157) - [apiAuth/cors.feature:158](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L158) - [apiAuth/cors.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L159) -- [apiAuth/cors.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L160) +- [apiAuth/cors.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L180) - [apiAuth/cors.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L181) - [apiAuth/cors.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L182) - [apiAuth/cors.feature:183](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L183) - [apiAuth/cors.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L184) - [apiAuth/cors.feature:185](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L185) -- [apiAuth/cors.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L186) #### [HTTP 401 Unauthorized responses don't contain a body](https://github.com/owncloud/ocis/issues/1337) #### [app passwords are not possible](https://github.com/owncloud/ocis/issues/1320) diff --git a/tests/acceptance/expected-failures-on-S3NG-storage.md b/tests/acceptance/expected-failures-on-S3NG-storage.md index da0d21710e..e9178e7de8 100644 --- a/tests/acceptance/expected-failures-on-S3NG-storage.md +++ b/tests/acceptance/expected-failures-on-S3NG-storage.md @@ -1198,6 +1198,14 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiMain/quota.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L70) Scenario: Overwriting a file in received folder having enough quota - [apiMain/quota.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L84) Scenario: Overwriting a file in received folder having insufficient quota - [apiMain/quota.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L94) Scenario: Overwriting a received file having enough quota +- [apiMain/quota.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#105) Scenario: User with zero quota cannot upload a file +- [apiMain/quota.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#112) Scenario: User with zero quota can create a folder +- [apiMain/quota.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#119) Scenario: user cannot create file on shared folder by a user with zero quota +- [apiMain/quota.feature:134](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#134) Scenario: share receiver with 0 quota should not be able to move file from shared folder to home folder +- [apiMain/quota.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#148) Scenario: sharer should be able to upload to a folder shared with user having zero quota +- [apiMain/quota.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#164) Scenario: share receiver with 0 quota should be able to upload on shared folder +- [apiMain/quota.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#178) Scenario: User should retain their old files even if their quota is set to 0 +- [apiMain/quota.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#184) Scenario: User should be able to restore their deleted file when their quota is set to zero Scenario Outline: Retrieving folder quota of shared folder with quota when no quota is set for recipient - [apiWebdavProperties1/getQuota.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L48) - [apiWebdavProperties1/getQuota.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L49) @@ -1742,14 +1750,16 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L37) - [apiAuth/cors.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L38) - [apiAuth/cors.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L39) -- [apiAuth/cors.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L43) -- [apiAuth/cors.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L44) +- [apiAuth/cors.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L40) +- [apiAuth/cors.feature:41](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L41) +- [apiAuth/cors.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L60) +- [apiAuth/cors.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L61) - [apiAuth/cors.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L62) - [apiAuth/cors.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L63) - [apiAuth/cors.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L64) - [apiAuth/cors.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L65) -- [apiAuth/cors.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L66) -- [apiAuth/cors.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L67) +- [apiAuth/cors.feature:84](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L84) +- [apiAuth/cors.feature:85](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L85) - [apiAuth/cors.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L86) - [apiAuth/cors.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L87) - [apiAuth/cors.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L88) @@ -1766,14 +1776,13 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L99) - [apiAuth/cors.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L100) - [apiAuth/cors.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L101) -- [apiAuth/cors.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L102) -- [apiAuth/cors.feature:103](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L103) +- [apiAuth/cors.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L121) - [apiAuth/cors.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L121) - [apiAuth/cors.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L122) - [apiAuth/cors.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L123) - [apiAuth/cors.feature:124](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L124) - [apiAuth/cors.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L125) -- [apiAuth/cors.feature:126](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L126) +- [apiAuth/cors.feature:144](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L144) - [apiAuth/cors.feature:145](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L145) - [apiAuth/cors.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L146) - [apiAuth/cors.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L147) @@ -1789,13 +1798,12 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L157) - [apiAuth/cors.feature:158](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L158) - [apiAuth/cors.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L159) -- [apiAuth/cors.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L160) +- [apiAuth/cors.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L180) - [apiAuth/cors.feature:181](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L181) - [apiAuth/cors.feature:182](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L182) - [apiAuth/cors.feature:183](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L183) - [apiAuth/cors.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L184) - [apiAuth/cors.feature:185](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L185) -- [apiAuth/cors.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L186) #### [HTTP 401 Unauthorized responses don't contain a body](https://github.com/owncloud/ocis/issues/1337) #### [app passwords are not possible](https://github.com/owncloud/ocis/issues/1320) From 0cb297c0482ebdbcb8bf0597e034ac6326aad298 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Tue, 20 Apr 2021 15:18:42 +0200 Subject: [PATCH 21/70] Make storage-registry rules in toml more readable (#1648) --- examples/oc-phoenix/gateway.toml | 11 +++++------ examples/ocmd/ocmd-server-1.toml | 7 +++---- examples/ocmd/ocmd-server-2.toml | 7 +++---- examples/storage-references/gateway.toml | 10 ++++------ tests/oc-integration-tests/drone/gateway.toml | 14 ++++++-------- tests/oc-integration-tests/local/gateway.toml | 14 ++++++-------- 6 files changed, 27 insertions(+), 36 deletions(-) diff --git a/examples/oc-phoenix/gateway.toml b/examples/oc-phoenix/gateway.toml index 3ce3462226..32899f4d09 100644 --- a/examples/oc-phoenix/gateway.toml +++ b/examples/oc-phoenix/gateway.toml @@ -48,16 +48,15 @@ driver = "static" [grpc.services.storageregistry.drivers.static] home_provider = "/home" +[grpc.services.storageregistry.drivers.static.rules] + # mount a home storage provider that uses a context based path wrapper # to jail users into their home dir -[grpc.services.storageregistry.drivers.static.rules."/home"] -address = "localhost:12000" +"/home" = {"address" = "localhost:12000"} # mount a storage provider without a path wrapper for direct access to users. -[grpc.services.storageregistry.drivers.static.rules."/oc"] -address = "localhost:11000" -[grpc.services.storageregistry.drivers.static.rules."123e4567-e89b-12d3-a456-426655440000"] -address = "localhost:11000" +"/oc" = {"address" = "localhost:11000"} +"123e4567-e89b-12d3-a456-426655440000" = {"address" = "localhost:11000"} # another mount point might be "/projects/" [http] diff --git a/examples/ocmd/ocmd-server-1.toml b/examples/ocmd/ocmd-server-1.toml index 9d0335ced0..df369bc627 100644 --- a/examples/ocmd/ocmd-server-1.toml +++ b/examples/ocmd/ocmd-server-1.toml @@ -33,10 +33,9 @@ driver = "static" [grpc.services.storageregistry.drivers.static] home_provider = "/home" -[grpc.services.storageregistry.drivers.static.rules."/home"] -address = "localhost:19000" -[grpc.services.storageregistry.drivers.static.rules."123e4567-e89b-12d3-a456-426655440000"] -address = "localhost:19000" +[grpc.services.storageregistry.drivers.static.rules] +"/home" = {"address" = "localhost:19000"} +"123e4567-e89b-12d3-a456-426655440000" = {"address" = "localhost:19000"} [grpc.services.usershareprovider] driver = "memory" diff --git a/examples/ocmd/ocmd-server-2.toml b/examples/ocmd/ocmd-server-2.toml index 321cdcd1ce..61b1cc54f0 100644 --- a/examples/ocmd/ocmd-server-2.toml +++ b/examples/ocmd/ocmd-server-2.toml @@ -31,10 +31,9 @@ driver = "static" [grpc.services.storageregistry.drivers.static] home_provider = "/home" -[grpc.services.storageregistry.drivers.static.rules."/home"] -address = "localhost:17000" -[grpc.services.storageregistry.drivers.static.rules."123e4567-e89b-12d3-a456-426655440000"] -address = "localhost:17000" +[grpc.services.storageregistry.drivers.static.rules] +"/home" = {"address" = "localhost:17000"} +"123e4567-e89b-12d3-a456-426655440000" = {"address" = "localhost:17000"} [grpc.services.usershareprovider] driver = "memory" diff --git a/examples/storage-references/gateway.toml b/examples/storage-references/gateway.toml index 342d8fa17d..bb486363fe 100644 --- a/examples/storage-references/gateway.toml +++ b/examples/storage-references/gateway.toml @@ -6,12 +6,10 @@ commit_share_to_storage_ref = true [grpc.services.storageregistry] [grpc.services.storageregistry.drivers.static] home_provider = "/home" -[grpc.services.storageregistry.drivers.static.rules."/home"] -address = "localhost:17000" -[grpc.services.storageregistry.drivers.static.rules."/reva"] -address = "localhost:18000" -[grpc.services.storageregistry.drivers.static.rules."123e4567-e89b-12d3-a456-426655440000"] -address = "localhost:18000" +[grpc.services.storageregistry.drivers.static.rules] +"/home" = {"address" = "localhost:17000"} +"/reva" = {"address" = "localhost:18000"} +"123e4567-e89b-12d3-a456-426655440000" = {"address" = "localhost:18000"} [grpc.services.authprovider] [grpc.services.authregistry] diff --git a/tests/oc-integration-tests/drone/gateway.toml b/tests/oc-integration-tests/drone/gateway.toml index a535422b3e..b0636ed372 100644 --- a/tests/oc-integration-tests/drone/gateway.toml +++ b/tests/oc-integration-tests/drone/gateway.toml @@ -53,20 +53,18 @@ driver = "static" [grpc.services.storageregistry.drivers.static] home_provider = "/home" +[grpc.services.storageregistry.drivers.static.rules] + # mount a home storage provider that uses a context based path wrapper # to jail users into their home dir -[grpc.services.storageregistry.drivers.static.rules."/home"] -address = "localhost:12000" +"/home" = {"address" = "localhost:12000"} # mount a storage provider without a path wrapper for direct access to users. -[grpc.services.storageregistry.drivers.static.rules."/oc"] -address = "localhost:11000" -[grpc.services.storageregistry.drivers.static.rules."123e4567-e89b-12d3-a456-426655440000"] -address = "localhost:11000" +"/oc" = {"address" = "localhost:11000"} +"123e4567-e89b-12d3-a456-426655440000" = {"address" = "localhost:11000"} # another mount point might be "/projects/" -[grpc.services.storageregistry.drivers.static.rules."/public"] -address = "localhost:13000" +"/public" = {"address" = "localhost:13000"} [http] address = "0.0.0.0:19001" diff --git a/tests/oc-integration-tests/local/gateway.toml b/tests/oc-integration-tests/local/gateway.toml index cfe0c34182..ca66f9b744 100644 --- a/tests/oc-integration-tests/local/gateway.toml +++ b/tests/oc-integration-tests/local/gateway.toml @@ -53,20 +53,18 @@ driver = "static" [grpc.services.storageregistry.drivers.static] home_provider = "/home" +[grpc.services.storageregistry.drivers.static.rules] + # mount a home storage provider that uses a context based path wrapper # to jail users into their home dir -[grpc.services.storageregistry.drivers.static.rules."/home"] -address = "localhost:12000" +"/home" = {"address" = "localhost:12000"} # mount a storage provider without a path wrapper for direct access to users. -[grpc.services.storageregistry.drivers.static.rules."/oc"] -address = "localhost:11000" -[grpc.services.storageregistry.drivers.static.rules."123e4567-e89b-12d3-a456-426655440000"] -address = "localhost:11000" +"/oc" = {"address" = "localhost:11000"} +"123e4567-e89b-12d3-a456-426655440000" = {"address" = "localhost:11000"} # another mount point might be "/projects/" -[grpc.services.storageregistry.drivers.static.rules."/public"] -address = "localhost:13000" +"/public" = {"address" = "localhost:13000"} [http] address = "0.0.0.0:19001" From d2ee39b99c1e04f7f52b7c3d1cb30da2142df90d Mon Sep 17 00:00:00 2001 From: PKiran <39373750+kiranparajuli589@users.noreply.github.com> Date: Wed, 21 Apr 2021 17:54:54 +0545 Subject: [PATCH 22/70] updated core commit to the latest upto 2021/04/15 (#1642) --- .drone.env | 2 +- tests/acceptance/expected-failures-on-OCIS-storage.md | 9 +++++++++ .../expected-failures-on-OWNCLOUD-storage.md | 9 +++++++++ tests/acceptance/expected-failures-on-S3NG-storage.md | 11 ++++++++++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/.drone.env b/.drone.env index 086b3c3b82..18d40c481c 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=d95992fe45aab8b05d8c7911697608913ea8fb07 +CORE_COMMITID=560dbc90675a0215a3815608867dfbcf9f4a99ae CORE_BRANCH=master diff --git a/tests/acceptance/expected-failures-on-OCIS-storage.md b/tests/acceptance/expected-failures-on-OCIS-storage.md index 48d09a1a52..91ad71817b 100644 --- a/tests/acceptance/expected-failures-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-on-OCIS-storage.md @@ -1217,6 +1217,15 @@ Scenario Outline: Retrieving folder quota when quota is set and a file was recei - [apiWebdavProperties1/getQuota.feature:77](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L77) - [apiWebdavProperties1/getQuota.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L78) +- [apiMain/quota.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:105) +- [apiMain/quota.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:112) +- [apiMain/quota.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:119) +- [apiMain/quota.feature:134](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:134) +- [apiMain/quota.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:148) +- [apiMain/quota.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:164) +- [apiMain/quota.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:178) +- [apiMain/quota.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:184) + #### [cannot get share-types webdav property](https://github.com/owncloud/ocis/issues/567) - [apiWebdavProperties2/getFileProperties.feature:174](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties2/getFileProperties.feature#L174) - [apiWebdavProperties2/getFileProperties.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties2/getFileProperties.feature#L175) diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index 09792c1fc7..2e7aa5ab2a 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -1706,6 +1706,15 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiWebdavProperties1/getQuota.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L27) - [apiWebdavProperties1/getQuota.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L28) +- [apiMain/quota.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:105) +- [apiMain/quota.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:112) +- [apiMain/quota.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:119) +- [apiMain/quota.feature:134](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:134) +- [apiMain/quota.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:148) +- [apiMain/quota.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:164) +- [apiMain/quota.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:178) +- [apiMain/quota.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:184) + #### [user-sync endpoint does not exist](https://github.com/owncloud/ocis/issues/1241) - [apiMain/userSync.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/userSync.feature#L18) - [apiMain/userSync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/userSync.feature#L19) diff --git a/tests/acceptance/expected-failures-on-S3NG-storage.md b/tests/acceptance/expected-failures-on-S3NG-storage.md index e9178e7de8..2c3071381a 100644 --- a/tests/acceptance/expected-failures-on-S3NG-storage.md +++ b/tests/acceptance/expected-failures-on-S3NG-storage.md @@ -1583,6 +1583,15 @@ Scenario Outline: Retrieving folder quota when quota is set - [apiWebdavProperties1/getQuota.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L27) - [apiWebdavProperties1/getQuota.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/getQuota.feature#L28) +- [apiMain/quota.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:105) +- [apiMain/quota.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:112) +- [apiMain/quota.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:119) +- [apiMain/quota.feature:134](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:134) +- [apiMain/quota.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:148) +- [apiMain/quota.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:164) +- [apiMain/quota.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:178) +- [apiMain/quota.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:184) + #### [user-sync endpoint does not exist](https://github.com/owncloud/ocis/issues/1241) - [apiMain/userSync.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/userSync.feature#L18) - [apiMain/userSync.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/userSync.feature#L19) @@ -1776,7 +1785,7 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiAuth/cors.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L99) - [apiAuth/cors.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L100) - [apiAuth/cors.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L101) -- [apiAuth/cors.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L121) +- [apiAuth/cors.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L120) - [apiAuth/cors.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L121) - [apiAuth/cors.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L122) - [apiAuth/cors.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiAuth/cors.feature#L123) From 9f6ab8e434372528e71addb54df2760d666e4ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Wed, 21 Apr 2021 14:11:44 +0200 Subject: [PATCH 23/70] Fix get user share as grantee in json backend (#1650) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- changelog/unreleased/fix-get-user-share-as-grantee.md | 5 +++++ pkg/share/manager/json/json.go | 11 +++++++++++ 2 files changed, 16 insertions(+) create mode 100644 changelog/unreleased/fix-get-user-share-as-grantee.md diff --git a/changelog/unreleased/fix-get-user-share-as-grantee.md b/changelog/unreleased/fix-get-user-share-as-grantee.md new file mode 100644 index 0000000000..423968bb33 --- /dev/null +++ b/changelog/unreleased/fix-get-user-share-as-grantee.md @@ -0,0 +1,5 @@ +Bugfix: Allow fetching shares as the grantee + +The json backend now allows a grantee to fetch a share by id. + +https://github.com/cs3org/reva/pull/1650 \ No newline at end of file diff --git a/pkg/share/manager/json/json.go b/pkg/share/manager/json/json.go index 48f52d6c14..12e96c661a 100644 --- a/pkg/share/manager/json/json.go +++ b/pkg/share/manager/json/json.go @@ -278,6 +278,17 @@ func (m *mgr) get(ctx context.Context, ref *collaboration.ShareReference) (s *co return s, nil } + // or the grantee + if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER && utils.UserEqual(user.Id, s.Grantee.GetUserId()) { + return s, nil + } else if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_GROUP { + // check if all user groups match this share; TODO(labkode): filter shares created by us. + for _, g := range user.Groups { + if g == s.Grantee.GetGroupId().OpaqueId { + return s, nil + } + } + } // we return not found to not disclose information return nil, errtypes.NotFound(ref.String()) } From 8171b41053562a833ab33b09006b449231b600db Mon Sep 17 00:00:00 2001 From: Alex Unger <6905948+refs@users.noreply.github.com> Date: Wed, 21 Apr 2021 15:07:46 +0200 Subject: [PATCH 24/70] Introduce Named Services (#1509) --- changelog/unreleased/named-services.md | 5 + cmd/revad/runtime/option.go | 13 +- cmd/revad/runtime/runtime.go | 20 +++ examples/ocmd/ocmd-server-1.toml | 11 ++ go.mod | 1 + go.sum | 1 + internal/grpc/services/gateway/gateway.go | 3 + pkg/registry/config.go | 53 +++++++ pkg/registry/config_test.go | 112 +++++++++++++++ pkg/registry/memory/memory.go | 81 +++++++++++ pkg/registry/memory/memory_test.go | 135 ++++++++++++++++++ pkg/registry/memory/node.go | 44 ++++++ pkg/registry/memory/service.go | 70 +++++++++ pkg/registry/registry.go | 49 +++++++ pkg/rgrpc/todo/pool/pool.go | 20 ++- pkg/utils/utils.go | 5 + tests/oc-integration-tests/drone/gateway.toml | 7 + .../drone/storage-home-ocis.toml | 7 + 18 files changed, 634 insertions(+), 3 deletions(-) create mode 100644 changelog/unreleased/named-services.md create mode 100644 pkg/registry/config.go create mode 100644 pkg/registry/config_test.go create mode 100644 pkg/registry/memory/memory.go create mode 100644 pkg/registry/memory/memory_test.go create mode 100644 pkg/registry/memory/node.go create mode 100644 pkg/registry/memory/service.go create mode 100644 pkg/registry/registry.go diff --git a/changelog/unreleased/named-services.md b/changelog/unreleased/named-services.md new file mode 100644 index 0000000000..057f22cdb0 --- /dev/null +++ b/changelog/unreleased/named-services.md @@ -0,0 +1,5 @@ +Enhancement: Named Service Registration + +move away from hardcoding service IP addresses and rely upon name resolution instead. It delegates the address lookup to a static in-memory service registry, which can be re-implemented in multiple forms. + +https://github.com/cs3org/reva/pull/1509 \ No newline at end of file diff --git a/cmd/revad/runtime/option.go b/cmd/revad/runtime/option.go index 3e1dee98f8..1b4084cb7b 100644 --- a/cmd/revad/runtime/option.go +++ b/cmd/revad/runtime/option.go @@ -19,6 +19,7 @@ package runtime import ( + "github.com/cs3org/reva/pkg/registry" "github.com/rs/zerolog" ) @@ -27,10 +28,11 @@ type Option func(o *Options) // Options defines the available options for this package. type Options struct { - Logger *zerolog.Logger + Logger *zerolog.Logger + Registry registry.Registry } -// newOptions intializes the available default options. +// newOptions initializes the available default options. func newOptions(opts ...Option) Options { opt := Options{} @@ -47,3 +49,10 @@ func WithLogger(logger *zerolog.Logger) Option { o.Logger = logger } } + +// WithRegistry provides a function to set the registry. +func WithRegistry(r registry.Registry) Option { + return func(o *Options) { + o.Registry = r + } +} diff --git a/cmd/revad/runtime/runtime.go b/cmd/revad/runtime/runtime.go index 7c7e6a6e23..b1e918b102 100644 --- a/cmd/revad/runtime/runtime.go +++ b/cmd/revad/runtime/runtime.go @@ -28,6 +28,10 @@ import ( "strconv" "strings" + "github.com/cs3org/reva/pkg/registry/memory" + + "github.com/cs3org/reva/pkg/utils" + "contrib.go.opencensus.io/exporter/jaeger" "github.com/cs3org/reva/cmd/revad/internal/grace" "github.com/cs3org/reva/pkg/logger" @@ -56,6 +60,21 @@ func RunWithOptions(mainConf map[string]interface{}, pidFile string, opts ...Opt parseSharedConfOrDie(mainConf["shared"]) coreConf := parseCoreConfOrDie(mainConf["core"]) + // TODO: one can pass the options from the config file to registry.New() and initialize a registry based upon config files. + if options.Registry != nil { + utils.GlobalRegistry = options.Registry + } else if _, ok := mainConf["registry"]; ok { + for _, services := range mainConf["registry"].(map[string]interface{}) { + for sName, nodes := range services.(map[string]interface{}) { + for _, instance := range nodes.([]interface{}) { + if err := utils.GlobalRegistry.Add(memory.NewService(sName, instance.(map[string]interface{})["nodes"].([]interface{}))); err != nil { + panic(err) + } + } + } + } + } + run(mainConf, coreConf, options.Logger, pidFile) } @@ -71,6 +90,7 @@ func run(mainConf map[string]interface{}, coreConf *coreConf, logger *zerolog.Lo host, _ := os.Hostname() logger.Info().Msgf("host info: %s", host) + // initRegistry() initTracing(coreConf, logger) initCPUCount(coreConf, logger) diff --git a/examples/ocmd/ocmd-server-1.toml b/examples/ocmd/ocmd-server-1.toml index df369bc627..04741e742c 100644 --- a/examples/ocmd/ocmd-server-1.toml +++ b/examples/ocmd/ocmd-server-1.toml @@ -1,6 +1,17 @@ [shared] gatewaysvc = "localhost:19000" +[registry] +driver = "static" + +[registry.static] +services = ["authprovider","userprovider"] + +[registry.static.authprovider] +bearer = ["localhost:0123"] +basic = ["localhost:1234"] +publiclink = ["localhost:9876"] + [grpc] address = "0.0.0.0:19000" diff --git a/go.mod b/go.mod index 5c33a7b29b..47b14873ec 100644 --- a/go.mod +++ b/go.mod @@ -53,6 +53,7 @@ require ( golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 google.golang.org/grpc v1.37.0 google.golang.org/protobuf v1.26.0 + gotest.tools v2.2.0+incompatible ) go 1.16 diff --git a/go.sum b/go.sum index 767f754d0b..96d744c4a8 100644 --- a/go.sum +++ b/go.sum @@ -1529,6 +1529,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 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 h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= 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= diff --git a/internal/grpc/services/gateway/gateway.go b/internal/grpc/services/gateway/gateway.go index 0388c441d1..560de2a6e2 100644 --- a/internal/grpc/services/gateway/gateway.go +++ b/internal/grpc/services/gateway/gateway.go @@ -82,6 +82,9 @@ func (c *config) init() { // if services address are not specified we used the shared conf // for the gatewaysvc to have dev setups very quickly. + + // we're commenting this line to showcase the fact that now we don't want to point to an ip address but rather + // resolve an ip address from a name. c.AuthRegistryEndpoint = sharedconf.GetGatewaySVC(c.AuthRegistryEndpoint) c.StorageRegistryEndpoint = sharedconf.GetGatewaySVC(c.StorageRegistryEndpoint) c.AppRegistryEndpoint = sharedconf.GetGatewaySVC(c.AppRegistryEndpoint) diff --git a/pkg/registry/config.go b/pkg/registry/config.go new file mode 100644 index 0000000000..f798b65b9c --- /dev/null +++ b/pkg/registry/config.go @@ -0,0 +1,53 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package registry + +import ( + "github.com/mitchellh/mapstructure" +) + +// Config configures a registry +type Config struct { + Services map[string]map[string]*service `mapstructure:"services"` +} + +// service implements the Service interface. Attributes are exported so that mapstructure can unmarshal values onto them. +type service struct { + Name string `mapstructure:"name"` + Nodes []node `mapstructure:"nodes"` +} + +type node struct { + Address string `mapstructure:"address"` + Metadata map[string]string `mapstructure:"metadata"` +} + +// ParseConfig translates Config file values into a Config struct for consumers. +func ParseConfig(m map[string]interface{}) (*Config, error) { + c := &Config{} + if err := mapstructure.Decode(m, c); err != nil { + return nil, err + } + + if len(c.Services) == 0 { + c.Services = make(map[string]map[string]*service) + } + + return c, nil +} diff --git a/pkg/registry/config_test.go b/pkg/registry/config_test.go new file mode 100644 index 0000000000..82bc49a49b --- /dev/null +++ b/pkg/registry/config_test.go @@ -0,0 +1,112 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package registry + +import ( + "reflect" + "testing" +) + +/* +config example: + +--- +services: + authprovider: + basic: + name: auth-basic + nodes: + - address: 0.0.0.0:1234 + metadata: + version: v0.1.0 + bearer: + name: auth-bearer + nodes: + - address: 0.0.0.0:5678 + metadata: + version: v0.1.0 + +*/ +func TestParseConfig(t *testing.T) { + type args struct { + m map[string]interface{} + } + tests := []struct { + name string + args args + want *Config + wantErr bool + }{ + {name: "parse config", args: args{map[string]interface{}{ + "services": map[string]map[string]interface{}{ + "authprovider": map[string]interface{}{ + "basic": map[string]interface{}{ + "name": "auth-basic", + "nodes": []map[string]interface{}{ + { + "address": "0.0.0.0:1234", + "metadata": map[string]string{"version": "v0.1.0"}, + }, + }, + }, + "bearer": map[string]interface{}{ + "name": "auth-bearer", + "nodes": []map[string]interface{}{ + { + "address": "0.0.0.0:5678", + "metadata": map[string]string{"version": "v0.1.0"}, + }, + }, + }, + }, + }, + }}, want: &Config{ + Services: map[string]map[string]*service{ + "authprovider": map[string]*service{ + "basic": &service{ + Name: "auth-basic", + Nodes: []node{{ + Address: "0.0.0.0:1234", + Metadata: map[string]string{"version": "v0.1.0"}, + }}, + }, + "bearer": &service{ + Name: "auth-bearer", + Nodes: []node{{ + Address: "0.0.0.0:5678", + Metadata: map[string]string{"version": "v0.1.0"}, + }}, + }, + }, + }, + }, wantErr: false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ParseConfig(tt.args.m) + if (err != nil) != tt.wantErr { + t.Errorf("ParseConfig() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("ParseConfig() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/pkg/registry/memory/memory.go b/pkg/registry/memory/memory.go new file mode 100644 index 0000000000..6d828ec6c1 --- /dev/null +++ b/pkg/registry/memory/memory.go @@ -0,0 +1,81 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package memory + +import ( + "fmt" + "sync" + + "github.com/cs3org/reva/pkg/registry" +) + +// Registry implements the Registry interface. +type Registry struct { + // m protects async access to the services map. + sync.Mutex + // services map a service name with a set of nodes. + services map[string]registry.Service +} + +// Add implements the Registry interface. If the service is already known in this registry it will only update the nodes. +func (r *Registry) Add(svc registry.Service) error { + r.Lock() + defer r.Unlock() + + // append the nodes if the service is already registered. + if _, ok := r.services[svc.Name()]; ok { + s := service{ + name: svc.Name(), + nodes: make([]node, 0), + } + + s.mergeNodes(svc.Nodes(), r.services[svc.Name()].Nodes()) + + r.services[svc.Name()] = s + return nil + } + + r.services[svc.Name()] = svc + return nil +} + +// GetService implements the Registry interface. There is currently no load balance being done, but it should not be +// hard to add. +func (r *Registry) GetService(name string) (registry.Service, error) { + r.Lock() + defer r.Unlock() + + if service, ok := r.services[name]; ok { + return service, nil + } + + return nil, fmt.Errorf("service %v not found", name) +} + +// New returns an implementation of the Registry interface. +func New(m map[string]interface{}) registry.Registry { + // c, err := registry.ParseConfig(m) + // if err != nil { + // return nil + // } + + return &Registry{ + services: map[string]registry.Service{}, + } +} diff --git a/pkg/registry/memory/memory_test.go b/pkg/registry/memory/memory_test.go new file mode 100644 index 0000000000..d7c3422564 --- /dev/null +++ b/pkg/registry/memory/memory_test.go @@ -0,0 +1,135 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package memory + +import ( + "fmt" + "os" + "testing" + + "github.com/google/uuid" + "gotest.tools/assert" +) + +var ( + in = make(map[string]interface{}) + reg = New(in) + node1 = node{ + id: uuid.New().String(), + address: "0.0.0.0:42069", + metadata: map[string]string{ + "type": "auth-bearer", + }, + } + + node2 = node{ + id: uuid.New().String(), + address: "0.0.0.0:7777", + metadata: map[string]string{ + "type": "auth-basic", + }, + } + + node3 = node{id: uuid.NewString(), address: "0.0.0.0:8888"} + node4 = node{id: uuid.NewString(), address: "0.0.0.0:9999"} +) + +var scenarios = []struct { + name string // scenario name + in string // used to query the Registry by service name + services []service + expectedNodes []node // expected set of nodes +}{ + { + name: "single service with 2 nodes", + in: "auth-provider", + services: []service{ + {name: "auth-provider", nodes: []node{node1, node2}}, + }, + expectedNodes: []node{node1, node2}, + }, + { + name: "single service with 2 nodes scaled x2", + in: "auth-provider", + services: []service{ + {name: "auth-provider", nodes: []node{node1, node2}}, + {name: "auth-provider", nodes: []node{node3, node4}}, + }, + expectedNodes: []node{node1, node2, node3, node4}, + }, +} + +func TestAdd(t *testing.T) { + reg = New(in) + s1 := scenarios[1].services[0] + s2 := scenarios[1].services[1] + _ = reg.Add(s1) + _ = reg.Add(s2) + + _ = reg.Add(service{ + name: "test", + nodes: []node{ + { + id: "1234", + address: "localhost:8899", + metadata: nil, + }, + }, + }) + + expectedNumberOfNodes := len(s1.nodes) + len(s2.nodes) + if s, err := reg.GetService(s1.name); err != nil { + t.Error(err) + collectedNumberOfNodes := len(s.Nodes()) + + if expectedNumberOfNodes == collectedNumberOfNodes { + t.Error(fmt.Errorf("expected %v nodes, got: %v", expectedNumberOfNodes, collectedNumberOfNodes)) + } + } +} + +func TestGetService(t *testing.T) { + for _, scenario := range scenarios { + reg = New(in) + for _, service := range scenario.services { + if err := reg.Add(&service); err != nil { + os.Exit(1) + } + } + + t.Run(scenario.name, func(t *testing.T) { + svc, err := reg.GetService(scenario.in) + if err != nil { + t.Error(err) + } + + totalNodes := len(svc.Nodes()) + assert.Equal(t, len(scenario.expectedNodes), totalNodes) + }) + } +} + +// func contains(a []registry.Node, b registry.Node) bool { +// for i := range a { +// if a[i].Address() == b.Address() { +// return true +// } +// } +// return false +// } diff --git a/pkg/registry/memory/node.go b/pkg/registry/memory/node.go new file mode 100644 index 0000000000..22042306dd --- /dev/null +++ b/pkg/registry/memory/node.go @@ -0,0 +1,44 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package memory + +import "fmt" + +// node implements the registry.Node interface. +type node struct { + id string + address string + metadata map[string]string +} + +func (n node) Address() string { + return n.address +} + +func (n node) Metadata() map[string]string { + return n.metadata +} + +func (n node) String() string { + return fmt.Sprintf("%v-%v", n.id, n.address) +} + +func (n node) ID() string { + return n.id +} diff --git a/pkg/registry/memory/service.go b/pkg/registry/memory/service.go new file mode 100644 index 0000000000..0213b2761d --- /dev/null +++ b/pkg/registry/memory/service.go @@ -0,0 +1,70 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package memory + +import "github.com/cs3org/reva/pkg/registry" + +// NewService creates a new memory registry.Service. +func NewService(name string, nodes []interface{}) registry.Service { + n := make([]node, 0) + for i := 0; i < len(nodes); i++ { + n = append(n, node{ + // explicit type conversions because types are not exported to prevent from circular dependencies until released. + id: nodes[i].(map[string]interface{})["id"].(string), + address: nodes[i].(map[string]interface{})["address"].(string), + //metadata: nodes[i].(map[string]interface{})["metadata"].(map[string]string), + }) + } + + return service{ + name: name, + nodes: n, + } +} + +// service implements the Service interface +type service struct { + name string + nodes []node +} + +// Name implements the service interface. +func (s service) Name() string { + return s.name +} + +// Nodes implements the service interface. +func (s service) Nodes() []registry.Node { + ret := make([]registry.Node, 0) + for i := range s.nodes { + ret = append(ret, s.nodes[i]) + } + return ret +} + +func (s *service) mergeNodes(n1, n2 []registry.Node) { + n1 = append(n1, n2...) + for _, n := range n1 { + s.nodes = append(s.nodes, node{ + id: n.ID(), + address: n.Address(), + metadata: n.Metadata(), + }) + } +} diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go new file mode 100644 index 0000000000..8b705a0937 --- /dev/null +++ b/pkg/registry/registry.go @@ -0,0 +1,49 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package registry + +// Registry provides with means for dynamically registering services. +type Registry interface { + // Add registers a Service on the memoryRegistry. Repeated names is allowed, services are distinguished by their metadata. + Add(Service) error + + // GetService retrieves a Service and all of its nodes by Service name. It returns []*Service because we can have + // multiple versions of the same Service running alongside each others. + GetService(string) (Service, error) +} + +// Service defines a service. +type Service interface { + Name() string + Nodes() []Node +} + +// Node defines nodes on a service. +type Node interface { + // Address where the given node is running. + Address() string + + // metadata is used in order to differentiate services implementations. For instance an AuthProvider Service could + // have multiple implementations, basic, bearer ..., metadata would be used to select the Service type depending on + // its implementation. + Metadata() map[string]string + + // ID returns the node ID. + ID() string +} diff --git a/pkg/rgrpc/todo/pool/pool.go b/pkg/rgrpc/todo/pool/pool.go index 956847bf16..4c0efb4471 100644 --- a/pkg/rgrpc/todo/pool/pool.go +++ b/pkg/rgrpc/todo/pool/pool.go @@ -38,7 +38,6 @@ import ( storageprovider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" storageregistry "github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1" datatx "github.com/cs3org/go-cs3apis/cs3/tx/v1beta1" - "go.opencensus.io/plugin/ocgrpc" "google.golang.org/grpc" ) @@ -171,15 +170,18 @@ func GetAuthRegistryServiceClient(endpoint string) (authregistry.RegistryAPIClie authRegistries.m.Lock() defer authRegistries.m.Unlock() + // if there is already a connection to this node, use it. if c, ok := authRegistries.conn[endpoint]; ok { return c.(authregistry.RegistryAPIClient), nil } + // if not, create a new connection conn, err := NewConn(endpoint) if err != nil { return nil, err } + // and memoize it v := authregistry.NewRegistryAPIClient(conn) authRegistries.conn[endpoint] = v return v, nil @@ -412,3 +414,19 @@ func GetDataTxClient(endpoint string) (datatx.TxAPIClient, error) { dataTxs.conn[endpoint] = v return v, nil } + +// getEndpointByName resolve service names to ip addresses present on the registry. +// func getEndpointByName(name string) (string, error) { +// if services, err := utils.GlobalRegistry.GetService(name); err == nil { +// if len(services) > 0 { +// for i := range services { +// for j := range services[i].Nodes() { +// // return the first one. This MUST be improved upon with selectors. +// return services[i].Nodes()[j].Address(), nil +// } +// } +// } +// } +// +// return "", fmt.Errorf("could not get service by name: %v", name) +// } diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 88b50aa785..deeaa0720a 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -32,6 +32,8 @@ import ( userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + "github.com/cs3org/reva/pkg/registry" + "github.com/cs3org/reva/pkg/registry/memory" "github.com/golang/protobuf/proto" "google.golang.org/protobuf/encoding/protojson" ) @@ -40,6 +42,9 @@ var ( matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)") matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])") matchEmail = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") + // GlobalRegistry configures a service registry globally accessible. It defaults to a memory registry. The usage of + // globals is not encouraged, and this is a workaround until the PR is out of a draft state. + GlobalRegistry registry.Registry = memory.New(map[string]interface{}{}) ) // Skip evaluates whether a source endpoint contains any of the prefixes. diff --git a/tests/oc-integration-tests/drone/gateway.toml b/tests/oc-integration-tests/drone/gateway.toml index b0636ed372..03b2514ba6 100644 --- a/tests/oc-integration-tests/drone/gateway.toml +++ b/tests/oc-integration-tests/drone/gateway.toml @@ -2,6 +2,13 @@ jwt_secret = "Pive-Fumkiu4" gatewaysvc = "localhost:19000" +#[[registry.services.storagehome]] +#name = 'authregistry' +# +#[[registry.services.storagehome.nodes]] +#id = '65ad3270-9e87-11eb-a1aa-0fcc1edaa55e' +#address = '0.0.0.0:9142' + # This gateway.toml config file will start a reva service that: # - serves as a gateway for all requests # - looks up the storageprovider using a storageregistry diff --git a/tests/oc-integration-tests/drone/storage-home-ocis.toml b/tests/oc-integration-tests/drone/storage-home-ocis.toml index cabc334327..d51c509af7 100644 --- a/tests/oc-integration-tests/drone/storage-home-ocis.toml +++ b/tests/oc-integration-tests/drone/storage-home-ocis.toml @@ -3,6 +3,13 @@ jwt_secret = "Pive-Fumkiu4" gatewaysvc = "localhost:19000" +#[[registry.services.storagehome]] +#name = 'storage-home' +# +#[[registry.services.storagehome.nodes]] +#id = '130e0018-9e86-11eb-8634-336624ad2203' +#address = '0.0.0.0:9154' + # - authenticates grpc storage provider requests using the internal jwt token # - authenticates http upload and download requests requests using basic auth # - serves the home storage provider on grpc port 12000 From aabac66448ebbd8f6c86b94508ce1480e3f13d10 Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Wed, 21 Apr 2021 15:27:59 +0200 Subject: [PATCH 25/70] the facto -> a de facto (#1653) Ref https://en.wikipedia.org/wiki/De_facto_standard --- docs/content/en/docs/overview/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/en/docs/overview/_index.md b/docs/content/en/docs/overview/_index.md index 78b5de23d0..88cc906bfd 100644 --- a/docs/content/en/docs/overview/_index.md +++ b/docs/content/en/docs/overview/_index.md @@ -25,7 +25,7 @@ anywhere else. #### The goal Our ultimate goal is that any open source project and software vendor that provides either storage or applications to an EFSS platform -will adopt the CS3APIS as the facto standard way to collaborate. Having all the partners using the same APIs will enable all of us for a new dimension +will adopt the CS3APIS as a de facto standard way to collaborate. Having all the partners using the same APIs will enable all of us for a new dimension of portability of applications across vendors. {{< imgproc "final.png" Fit "800x600">}} From f8230dfd4786c136cf63027e639082f9e9cf02bb Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Wed, 21 Apr 2021 15:28:23 +0200 Subject: [PATCH 26/70] Update link to OCM (#1651) --- docs/content/en/docs/overview/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/en/docs/overview/_index.md b/docs/content/en/docs/overview/_index.md index 88cc906bfd..df6f6443ef 100644 --- a/docs/content/en/docs/overview/_index.md +++ b/docs/content/en/docs/overview/_index.md @@ -58,7 +58,7 @@ and runs alongside your infrastructure. * **What is it *not yet* good for?**: Reva is still very young to be used in production. We are working hard to reach a stable version soon with decent integrations to storage and applications. We don't want to re-invent the wheel so we have in mind that Reva will provide integrations with [rclone](https://rclone.org/) for multiple-storage support and with other protocols out there like [WOPI](https://wopi.readthedocs.io/en/latest/) , [Learning Tools Interoperability](https://www.imsglobal.org/activity/learning-tools-interoperability) and -[OpenCloudMesh](https://rawgit.com/GEANT/OCM-API/v1/docs.html) to enable seamless collaboration. +[OpenCloudMesh](https://cs3org.github.io/OCM-API/docs.html) to enable seamless collaboration. ## Where should I go next? From 6fc0227f7e56026b7901a2e467367ad12e380d18 Mon Sep 17 00:00:00 2001 From: Andre Duffeck Date: Wed, 21 Apr 2021 15:34:57 +0200 Subject: [PATCH 27/70] [docs-only] Add atomicity docs for decomposedfs operations (#1645) --- .../config/packages/storage/utils/_index.md | 7 + .../storage/utils/decomposedfs/_index.md | 7 + .../storage/utils/decomposedfs/atomicity.md | 233 ++++++++++++++++++ 3 files changed, 247 insertions(+) create mode 100644 docs/content/en/docs/config/packages/storage/utils/_index.md create mode 100644 docs/content/en/docs/config/packages/storage/utils/decomposedfs/_index.md create mode 100644 docs/content/en/docs/config/packages/storage/utils/decomposedfs/atomicity.md diff --git a/docs/content/en/docs/config/packages/storage/utils/_index.md b/docs/content/en/docs/config/packages/storage/utils/_index.md new file mode 100644 index 0000000000..dae92d9f1d --- /dev/null +++ b/docs/content/en/docs/config/packages/storage/utils/_index.md @@ -0,0 +1,7 @@ +--- +title: "utilities" +linkTitle: "utilities" +weight: 10 +description: > + Storage related utility packages +--- diff --git a/docs/content/en/docs/config/packages/storage/utils/decomposedfs/_index.md b/docs/content/en/docs/config/packages/storage/utils/decomposedfs/_index.md new file mode 100644 index 0000000000..9558300868 --- /dev/null +++ b/docs/content/en/docs/config/packages/storage/utils/decomposedfs/_index.md @@ -0,0 +1,7 @@ +--- +title: "decomposedfs" +linkTitle: "decomposedfs" +weight: 10 +description: > + The decomposed filesystem library +--- \ No newline at end of file diff --git a/docs/content/en/docs/config/packages/storage/utils/decomposedfs/atomicity.md b/docs/content/en/docs/config/packages/storage/utils/decomposedfs/atomicity.md new file mode 100644 index 0000000000..72118863f6 --- /dev/null +++ b/docs/content/en/docs/config/packages/storage/utils/decomposedfs/atomicity.md @@ -0,0 +1,233 @@ +--- +title: "atomicity" +linkTitle: "atomicity" +weight: 10 +description: > + Atomicity of DecomposedFS Operations (ocis, s3ng) +--- + +{{% pageinfo %}} +This document describes the atomicity of (writing) decomposedfs operations by listing the relevant steps that happen +when doing the according operations, highlighting potential problems with concurrent operations and describing the +negative effects. +{{% /pageinfo %}} + +## CreateDir +### Steps + +1. Check if directory already exists. Abort if it does. +2. Assign a new uuid as the ID +3. Create the node on disk +4. Link the new node to the parent + +### Potential Problems + +Several concurrent `CreateDir` calls can get past the exit critera step 1 because the directory does not exist yet. +Each of the calls generates a new ID, creates the according node on disk and tries to link it to the parent. +Only the first one succeeds in that, the later ones fail because the link already exists (See +`Considerations > Creating symlinks`). + +### Negative Effects + +Failing calls will leave an orphaned node behind (See reva issue [#1601](https://github.com/cs3org/reva/issues/1601)). + +No risk of inconsistency. + +## CreateHome + +See `CreateDir`. + +## CreateReference + +See `CreateDir`. + +## Delete +### Steps + +1. Get the original path and set it as an xattr on the node +2. Take the current time (with nanosecond precision) and use it to build filename for the deleted file following a defined scheme +3. Create a symlink in the trash directory to the filename in 2 (which doesn't exist yet) +4. Move the file to the destination from step 2 +5. Remove the link to the node in the parent + +### Potential Problems + +There is no exit critera step so all concurrent calls try to create a symlink in step 3 with only one of them +succeeding (See `Considerations > Creating symlinks`). + +### Negative Effects + +No risk of inconsistency. + + +## Move + +### Steps + +1. Get source node. Abort if it doesn't exist. +2. Get target node. Abort if it exists. +3. Move file. + +### Potential Problems + +Several concurrent calls can get past the exit criteria steps 1 and 2. But the first writing operation is always the +actual move of the node on the filesystem which is an atomic filesystem operation. That means that with concurrent +calls only one can ever succeed. + +### Negative Effects + +None. + +## Upload +### Steps + +1. Prepare and store internal representation of the upload. This includes storing the current node id if there already is a node for this path. +2. Retrieve and store data in a temporary file +3. Finish upload by uploading the data to the blobstore and writing the node +4. Remove child link in the parent if it exists. Then link the new node to the parent. + +### Potential Problems + +Retrieving the existing node id happens when the upload is started in step 1. If no node is found at that point in +time a new uuid will be assigned later on in step 3. Making the node visible to other uploads only happens when linking +the node to its parent in step 4 though. + +That means that when an upload starts while another one is still running for the same target path they will create +and write different nodes for the same path and both upload the data to the blobstore. + +### Negative Effects + +With concurrent uploads the last one "wins" by deleting the link from the previous upload and then linking its node in +the owner directory. The others leave orphaned nodes and blobs behind. These uploads seem to have succeeded but their +data is essentially lost, they are *NOT* made available as old versions +(See reva issue [#1626](https://github.com/cs3org/reva/issues/1626)). + +## RestoreRevision + +### Steps + +1. Check if "real" node still exists +2. Move current version to a version file +3. Copy revision file to the "real" node +4. Copy extended attributes (one by one) + +### Potential Problems + +Moving the file away in step 2 can interfere with concurrent operations. +Another problem exists with step 4 happening concurrently as the different operations overwrite existing +attributes one by one instead of writing the whole set of attributes atomically. + +### Negative Effects + +Concurrent operations compete with a chance of the others failing ungracefully. +It can even happen that the extended attributes of two revisions are mixed in the resulting node +(See reva issue [#1627](https://github.com/cs3org/reva/issues/1627)). + +## RestoreRecycleItem + +### Steps + +1. Create a link from the restore location to the parent +2. Move the trash item to the restore location +3. Remove the link to the trash item in the trash + +### Potential Problems + +Only one of the concurrent operations can succeed with step 1 (See `Considerations > Creating symlinks`). +### Negative Effects + +None. + +## PurgeRecycleItem + +### Steps + +1. Purge deleted node +2. Delete blob from the blobstore +3. Remove link to deleted node from the trash + +### Potential Problems + +None. +### Negative Effects + +None. + +## Considerations + +### Creating symlinks + +Symlinks are created using the `os.Symlink` function. This function fails if the link already exists. Subsequent +operations are thus guaranteed not to replace a link that has alrady been created. + +Example code showing showing this behavior: + +```go +package main + +import ( + "fmt" + "io/ioutil" + "os" +) + +func main() { + err := ioutil.WriteFile("file1", []byte(""), 0600) + if err != nil { + os.Exit(1) + } + err = ioutil.WriteFile("file2", []byte(""), 0600) + if err != nil { + os.Exit(1) + } + + // Create first symlink + err = os.Symlink("file1", "link") + if err != nil { + os.Exit(1) + } + + // Try to create symlink, expect EEXISTS + err = os.Symlink("file2", "link") + if err == nil { + os.Exit(1) + } else { + fmt.Println(err.Error()) + fmt.Println("Success") + } +} +``` + +### Renaming files + +Files are renamed using the `os.Rename` function. This function does not fail if it's a file being renamed and the +target already exists. Instead the target is being replaced. Example code: + +```go +package main + +import ( + "fmt" + "io/ioutil" + "os" +) + +func main() { + err := ioutil.WriteFile("file1", []byte(""), 0600) + if err != nil { + os.Exit(1) + } + err = ioutil.WriteFile("file2", []byte(""), 0600) + if err != nil { + os.Exit(1) + } + + // Overwrite file1 by renaming file2 file, expect no error + err = os.Rename("file2", "file1") + if err != nil { + os.Exit(1) + } else { + fmt.Println("Success") + } +} +``` From 105e51de49415e26fde592a7339fee46f02f6092 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Thu, 22 Apr 2021 17:31:51 +0200 Subject: [PATCH 28/70] Improve json marshalling of share protobuf messages (#1655) --- .github/config.yml | 3 ++ .../unreleased/improve-share-json-marshal.md | 9 ++++ examples/ocmd/ocmd-server-1.toml | 20 +++---- internal/grpc/services/gateway/gateway.go | 3 -- pkg/cbox/user/rest/rest.go | 3 +- pkg/share/manager/json/json.go | 54 +++++++++---------- tools/check-changelog/main.go | 2 +- 7 files changed, 48 insertions(+), 46 deletions(-) create mode 100644 changelog/unreleased/improve-share-json-marshal.md diff --git a/.github/config.yml b/.github/config.yml index 06682f674f..7b0a1d51f9 100644 --- a/.github/config.yml +++ b/.github/config.yml @@ -9,6 +9,9 @@ updateDocsWhiteList: - tests-only - Tests-Only - Build-deps + - docs-only + - Docs-only + - Docs-Only updateDocsTargetFiles: - changelog/unreleased/ diff --git a/changelog/unreleased/improve-share-json-marshal.md b/changelog/unreleased/improve-share-json-marshal.md new file mode 100644 index 0000000000..0086129996 --- /dev/null +++ b/changelog/unreleased/improve-share-json-marshal.md @@ -0,0 +1,9 @@ +Enhancement: Improve json marshalling of share protobuf messages + +Protobuf oneof fields cannot be properly handled by the native json marshaller, +and the protojson package can only handle proto messages. Previously, we were +using a workaround of storing these oneof fields separately, which made the code +inelegant. Now we marshal these messages as strings before marshalling them via +the native json package. + +https://github.com/cs3org/reva/pull/1655 diff --git a/examples/ocmd/ocmd-server-1.toml b/examples/ocmd/ocmd-server-1.toml index 04741e742c..62b13d83a0 100644 --- a/examples/ocmd/ocmd-server-1.toml +++ b/examples/ocmd/ocmd-server-1.toml @@ -1,16 +1,16 @@ [shared] gatewaysvc = "localhost:19000" -[registry] -driver = "static" - -[registry.static] -services = ["authprovider","userprovider"] - -[registry.static.authprovider] -bearer = ["localhost:0123"] -basic = ["localhost:1234"] -publiclink = ["localhost:9876"] +# [registry] +# driver = "static" +# +# [registry.static] +# services = ["authprovider","userprovider"] +# +# [registry.static.authprovider] +# bearer = ["localhost:0123"] +# basic = ["localhost:1234"] +# publiclink = ["localhost:9876"] [grpc] address = "0.0.0.0:19000" diff --git a/internal/grpc/services/gateway/gateway.go b/internal/grpc/services/gateway/gateway.go index 560de2a6e2..0388c441d1 100644 --- a/internal/grpc/services/gateway/gateway.go +++ b/internal/grpc/services/gateway/gateway.go @@ -82,9 +82,6 @@ func (c *config) init() { // if services address are not specified we used the shared conf // for the gatewaysvc to have dev setups very quickly. - - // we're commenting this line to showcase the fact that now we don't want to point to an ip address but rather - // resolve an ip address from a name. c.AuthRegistryEndpoint = sharedconf.GetGatewaySVC(c.AuthRegistryEndpoint) c.StorageRegistryEndpoint = sharedconf.GetGatewaySVC(c.StorageRegistryEndpoint) c.AppRegistryEndpoint = sharedconf.GetGatewaySVC(c.AppRegistryEndpoint) diff --git a/pkg/cbox/user/rest/rest.go b/pkg/cbox/user/rest/rest.go index 3df057450a..a0a878c6a2 100644 --- a/pkg/cbox/user/rest/rest.go +++ b/pkg/cbox/user/rest/rest.go @@ -123,7 +123,7 @@ func New(m map[string]interface{}) (user.Manager, error) { func (m *manager) getUserByParam(ctx context.Context, param, val string) (map[string]interface{}, error) { url := fmt.Sprintf("%s/Identity?filter=%s:%s&field=upn&field=primaryAccountEmail&field=displayName&field=uid&field=gid&field=type", - m.conf.APIBaseURL, param, val) + m.conf.APIBaseURL, param, url.QueryEscape(val)) responseData, err := m.apiTokenManager.SendAPIGetRequest(ctx, url, false) if err != nil { return nil, err @@ -225,7 +225,6 @@ func (m *manager) GetUser(ctx context.Context, uid *userpb.UserId) (*userpb.User } func (m *manager) GetUserByClaim(ctx context.Context, claim, value string) (*userpb.User, error) { - value = url.QueryEscape(value) opaqueID, err := m.fetchCachedParam(claim, value) if err == nil { return m.GetUser(ctx, &userpb.UserId{OpaqueId: opaqueID}) diff --git a/pkg/share/manager/json/json.go b/pkg/share/manager/json/json.go index 12e96c661a..586978933b 100644 --- a/pkg/share/manager/json/json.go +++ b/pkg/share/manager/json/json.go @@ -26,8 +26,6 @@ import ( "sync" "time" - grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" - userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" typespb "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" @@ -91,23 +89,20 @@ func loadOrCreate(file string) (*shareModel, error) { return nil, err } - m := &shareModel{} - if err := json.Unmarshal(data, m); err != nil { - err = errors.Wrap(err, "error decoding data to json") + j := &jsonEncoding{} + if err := json.Unmarshal(data, j); err != nil { + err = errors.Wrap(err, "error decoding data from json") return nil, err } - // There are discrepancies in the marshalling of oneof fields, so these need - // to be stored separately - for i := range m.Grantees { - id := m.Grantees[i].(map[string]interface{}) - if m.Shares[i].Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER { - m.Shares[i].Grantee.Id = &provider.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: id["opaque_id"].(string), Idp: id["idp"].(string)}} - } else if m.Shares[i].Grantee.Type == provider.GranteeType_GRANTEE_TYPE_GROUP { - m.Shares[i].Grantee.Id = &provider.Grantee_GroupId{GroupId: &grouppb.GroupId{OpaqueId: id["opaque_id"].(string), Idp: id["idp"].(string)}} + m := &shareModel{State: j.State} + for _, s := range j.Shares { + var decShare collaboration.Share + if err = utils.UnmarshalJSONToProtoV1([]byte(s), &decShare); err != nil { + return nil, errors.Wrap(err, "error decoding share from json") } + m.Shares = append(m.Shares, &decShare) } - m.Grantees = nil if m.State == nil { m.State = map[string]map[string]collaboration.ShareState{} @@ -118,28 +113,27 @@ func loadOrCreate(file string) (*shareModel, error) { } type shareModel struct { - file string - State map[string]map[string]collaboration.ShareState `json:"state"` // map[username]map[share_id]ShareState - Shares []*collaboration.Share `json:"shares"` - Grantees []interface{} `json:"grantees"` + file string + State map[string]map[string]collaboration.ShareState `json:"state"` // map[username]map[share_id]ShareState + Shares []*collaboration.Share `json:"shares"` +} + +type jsonEncoding struct { + State map[string]map[string]collaboration.ShareState `json:"state"` // map[username]map[share_id]ShareState + Shares []string `json:"shares"` } func (m *shareModel) Save() error { - temp := *m - temp.Grantees = []interface{}{} - temp.Shares = []*collaboration.Share{} - for i := range m.Shares { - s := *m.Shares[i] - if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER { - temp.Grantees = append(temp.Grantees, s.Grantee.GetUserId()) - } else if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_GROUP { - temp.Grantees = append(temp.Grantees, s.Grantee.GetGroupId()) + j := &jsonEncoding{State: m.State} + for _, s := range m.Shares { + encShare, err := utils.MarshalProtoV1ToJSON(s) + if err != nil { + return errors.Wrap(err, "error encoding to json") } - s.Grantee = &provider.Grantee{Type: s.Grantee.Type} - temp.Shares = append(temp.Shares, &s) + j.Shares = append(j.Shares, string(encShare)) } - data, err := json.Marshal(temp) + data, err := json.Marshal(j) if err != nil { err = errors.Wrap(err, "error encoding to json") return err diff --git a/tools/check-changelog/main.go b/tools/check-changelog/main.go index d242e433eb..edf64ee198 100644 --- a/tools/check-changelog/main.go +++ b/tools/check-changelog/main.go @@ -32,7 +32,7 @@ import ( ) // Case-insensitive list of PRs for which changelog enforcement needs to be skipped -var skipTags = []string{"[tests-only]", "[build-deps]"} +var skipTags = []string{"[tests-only]", "[build-deps]", "[docs-only]"} func skipPR(prID int) bool { ctx := context.Background() From a2cfffc6a9f8c5edf681abbd742604e6eaa563a5 Mon Sep 17 00:00:00 2001 From: Talank Date: Fri, 23 Apr 2021 12:51:30 +0545 Subject: [PATCH 29/70] updated core commit to the latest upto 2021/04/22 (#1660) --- .drone.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.env b/.drone.env index 18d40c481c..e9ef2d524e 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=560dbc90675a0215a3815608867dfbcf9f4a99ae +CORE_COMMITID=6b06806ae2876cf78e9de9ede68042068be2414f CORE_BRANCH=master From 98b5863a73c878b782b1d825a37f18d13a916bc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Apr 2021 09:08:27 +0200 Subject: [PATCH 30/70] [Build-deps]: Bump github.com/grpc-ecosystem/go-grpc-middleware (#1661) --- go.mod | 2 +- go.sum | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 47b14873ec..415674b8e4 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.0.0 // indirect github.com/google/uuid v1.2.0 - github.com/grpc-ecosystem/go-grpc-middleware v1.2.2 + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/huandu/xstrings v1.3.0 // indirect github.com/imdario/mergo v0.3.8 // indirect github.com/jedib0t/go-pretty v4.3.0+incompatible diff --git a/go.sum b/go.sum index 96d744c4a8..ac9d7d08c3 100644 --- a/go.sum +++ b/go.sum @@ -447,6 +447,7 @@ github.com/gofrs/uuid/v3 v3.1.2/go.mod h1:xPwMqoocQ1L5G6pXX5BcE7N5jlzn2o19oqAKxw 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/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= 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= @@ -535,8 +536,8 @@ github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/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.2 h1:FlFbCRLd5Jr4iYXZufAvgWN6Ao0JrI5chLINnUXDDr0= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -645,6 +646,7 @@ github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0L github.com/karrick/godirwalk v1.15.5/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= @@ -1160,7 +1162,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 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-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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= @@ -1221,7 +1222,6 @@ golang.org/x/net v0.0.0-20200219183655-46282727080f/go.mod h1:z5CRVTTTmAJ677TzLL 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/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -1403,8 +1403,10 @@ golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200721223218-6123e77877b2/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= From d1d113e9ed3dac89d54a7b03020b8ff932270e58 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Mon, 26 Apr 2021 12:23:31 +0200 Subject: [PATCH 31/70] Cache resources from share getter methods in OCS (#1643) --- changelog/unreleased/ocs-resource-cache.md | 8 + go.mod | 1 + go.sum | 2 + .../services/gateway/usershareprovider.go | 3 + .../services/owncloud/ocs/config/config.go | 6 + .../handlers/apps/sharing/shares/public.go | 41 ++-- .../handlers/apps/sharing/shares/shares.go | 191 +++++++++++------- .../ocs/handlers/apps/sharing/shares/user.go | 41 ++-- pkg/cbox/share/sql/sql.go | 35 ++-- pkg/cbox/utils/conversions.go | 9 +- pkg/storage/utils/eosfs/eosfs.go | 36 ++-- 11 files changed, 240 insertions(+), 133 deletions(-) create mode 100644 changelog/unreleased/ocs-resource-cache.md diff --git a/changelog/unreleased/ocs-resource-cache.md b/changelog/unreleased/ocs-resource-cache.md new file mode 100644 index 0000000000..0372fd2599 --- /dev/null +++ b/changelog/unreleased/ocs-resource-cache.md @@ -0,0 +1,8 @@ +Enhancement: Cache resources from share getter methods in OCS + +In OCS, once we retrieve the shares from the shareprovider service, we stat each +of those separately to obtain the required info, which introduces a lot of +latency. This PR introduces a resoource info cache in OCS, which would prevent +this latency. + +https://github.com/cs3org/reva/pull/1643 diff --git a/go.mod b/go.mod index 415674b8e4..70ed8d2b46 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible github.com/ReneKroon/ttlcache/v2 v2.4.0 github.com/aws/aws-sdk-go v1.38.13 + github.com/bluele/gcache v0.0.2 // indirect github.com/c-bata/go-prompt v0.2.5 github.com/cheggaaa/pb v1.0.29 github.com/coreos/go-oidc v2.2.1+incompatible diff --git a/go.sum b/go.sum index ac9d7d08c3..2b34b53633 100644 --- a/go.sum +++ b/go.sum @@ -92,6 +92,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw= +github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0= github.com/bmatcuk/doublestar/v2 v2.0.3/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw= 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= diff --git a/internal/grpc/services/gateway/usershareprovider.go b/internal/grpc/services/gateway/usershareprovider.go index 1efe048526..f1541e267c 100644 --- a/internal/grpc/services/gateway/usershareprovider.go +++ b/internal/grpc/services/gateway/usershareprovider.go @@ -337,6 +337,9 @@ func (s *svc) UpdateReceivedShare(ctx context.Context, req *collaboration.Update return &collaboration.UpdateReceivedShareResponse{ Status: createRefStatus, }, err + } else if req.Field.GetState() == collaboration.ShareState_SHARE_STATE_REJECTED { + // Nothing more to do, return the original result + return res, nil } } diff --git a/internal/http/services/owncloud/ocs/config/config.go b/internal/http/services/owncloud/ocs/config/config.go index e62ba20c60..3d8f73b0b3 100644 --- a/internal/http/services/owncloud/ocs/config/config.go +++ b/internal/http/services/owncloud/ocs/config/config.go @@ -34,6 +34,8 @@ type Config struct { SharePrefix string `mapstructure:"share_prefix"` HomeNamespace string `mapstructure:"home_namespace"` AdditionalInfoAttribute string `mapstructure:"additional_info_attribute"` + ResourceInfoCacheSize int `mapstructure:"resource_info_cache_size"` + ResourceInfoCacheTTL int `mapstructure:"resource_info_cache_ttl"` } // Init sets sane defaults @@ -58,5 +60,9 @@ func (c *Config) Init() { c.AdditionalInfoAttribute = "{{.Mail}}" } + if c.ResourceInfoCacheSize == 0 { + c.ResourceInfoCacheSize = 1000000 + } + c.GatewaySvc = sharedconf.GetGatewaySVC(c.GatewaySvc) } diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go index 88ce48bf4f..e574551d4e 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go @@ -23,6 +23,7 @@ import ( "fmt" "net/http" "strconv" + "time" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" @@ -159,33 +160,43 @@ func (h *Handler) listPublicShares(r *http.Request, filters []*link.ListPublicSh return ocsDataPayload, res.Status, nil } + var info *provider.ResourceInfo for _, share := range res.GetShare() { - - statRequest := &provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Id{ - Id: share.ResourceId, + key := wrapResourceID(share.ResourceId) + if infoIf, err := h.resourceInfoCache.Get(key); h.resourceInfoCacheTTL > 0 && err == nil { + log.Debug().Msgf("cache hit for resource %+v", share.ResourceId) + info = infoIf.(*provider.ResourceInfo) + } else { + statRequest := &provider.StatRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Id{ + Id: share.ResourceId, + }, }, - }, - } - - statResponse, err := c.Stat(ctx, statRequest) - if err != nil || res.Status.Code != rpc.Code_CODE_OK { - log.Debug().Interface("share", share).Interface("response", statResponse).Err(err).Msg("could not stat share, skipping") - continue + } + + statResponse, err := c.Stat(ctx, statRequest) + if err != nil || res.Status.Code != rpc.Code_CODE_OK { + log.Debug().Interface("share", share).Interface("response", statResponse).Err(err).Msg("could not stat share, skipping") + continue + } + info = statResponse.Info + if h.resourceInfoCacheTTL > 0 { + _ = h.resourceInfoCache.SetWithExpire(key, info, time.Second*h.resourceInfoCacheTTL) + } } sData := conversions.PublicShare2ShareData(share, r, h.publicURL) sData.Name = share.DisplayName - if err := h.addFileInfo(ctx, sData, statResponse.Info); err != nil { - log.Debug().Interface("share", share).Interface("info", statResponse.Info).Err(err).Msg("could not add file info, skipping") + if err := h.addFileInfo(ctx, sData, info); err != nil { + log.Debug().Interface("share", share).Interface("info", info).Err(err).Msg("could not add file info, skipping") continue } h.mapUserIds(ctx, c, sData) - log.Debug().Interface("share", share).Interface("info", statResponse.Info).Interface("shareData", share).Msg("mapped") + log.Debug().Interface("share", share).Interface("info", info).Interface("shareData", share).Msg("mapped") ocsDataPayload = append(ocsDataPayload, sData) diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index c62a3409df..1e25a9e0a5 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -42,6 +42,7 @@ import ( "github.com/rs/zerolog/log" "github.com/ReneKroon/ttlcache/v2" + "github.com/bluele/gcache" "github.com/cs3org/reva/internal/http/services/owncloud/ocdav" "github.com/cs3org/reva/internal/http/services/owncloud/ocs/config" "github.com/cs3org/reva/internal/http/services/owncloud/ocs/conversions" @@ -58,8 +59,10 @@ type Handler struct { publicURL string sharePrefix string homeNamespace string + resourceInfoCacheTTL time.Duration additionalInfoTemplate *template.Template userIdentifierCache *ttlcache.Cache + resourceInfoCache gcache.Cache } // we only cache the minimal set of data instead of the full user metadata @@ -75,12 +78,15 @@ func (h *Handler) Init(c *config.Config) error { h.publicURL = c.Config.Host h.sharePrefix = c.SharePrefix h.homeNamespace = c.HomeNamespace + h.resourceInfoCacheTTL = time.Duration(c.ResourceInfoCacheTTL) h.additionalInfoTemplate, _ = template.New("additionalInfo").Parse(c.AdditionalInfoAttribute) h.userIdentifierCache = ttlcache.NewCache() _ = h.userIdentifierCache.SetTTL(60 * time.Second) + h.resourceInfoCache = gcache.New(c.ResourceInfoCacheSize).LFU().Build() + return nil } @@ -391,31 +397,42 @@ func (h *Handler) getShare(w http.ResponseWriter, r *http.Request, shareID strin return } - // prepare the stat request - statReq := &provider.StatRequest{ - // prepare the reference - Ref: &provider.Reference{ - // using ResourceId from the share - Spec: &provider.Reference_Id{Id: resourceID}, - }, - } + var info *provider.ResourceInfo + key := wrapResourceID(resourceID) + if infoIf, err := h.resourceInfoCache.Get(key); h.resourceInfoCacheTTL > 0 && err == nil { + logger.Debug().Msgf("cache hit for resource %+v", resourceID) + info = infoIf.(*provider.ResourceInfo) + } else { + // prepare the stat request + statReq := &provider.StatRequest{ + // prepare the reference + Ref: &provider.Reference{ + // using ResourceId from the share + Spec: &provider.Reference_Id{Id: resourceID}, + }, + } - statResponse, err := client.Stat(ctx, statReq) - if err != nil { - log.Error().Err(err).Msg("error mapping share data") - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) - return - } + statResponse, err := client.Stat(ctx, statReq) + if err != nil { + log.Error().Err(err).Msg("error mapping share data") + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) + return + } - if statResponse.Status.Code != rpc.Code_CODE_OK { - log.Error().Err(err).Str("status", statResponse.Status.Code.String()).Msg("error mapping share data") - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) - return + if statResponse.Status.Code != rpc.Code_CODE_OK { + log.Error().Err(err).Str("status", statResponse.Status.Code.String()).Msg("error mapping share data") + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) + return + } + info = statResponse.Info + if h.resourceInfoCacheTTL > 0 { + _ = h.resourceInfoCache.SetWithExpire(key, info, time.Second*h.resourceInfoCacheTTL) + } } - err = h.addFileInfo(ctx, share, statResponse.Info) + err = h.addFileInfo(ctx, share, info) if err != nil { - log.Error().Err(err).Str("status", statResponse.Status.Code.String()).Msg("error mapping share data") + log.Error().Err(err).Msg("error mapping share data") response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) } h.mapUserIds(ctx, client, share) @@ -585,6 +602,7 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { } ctx := r.Context() + logger := appctx.GetLogger(ctx) var pinfo *provider.ResourceInfo p := r.URL.Query().Get("path") @@ -593,33 +611,41 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { // prefix the path with the owners home, because ocs share requests are relative to the home dir target := path.Join(h.homeNamespace, r.FormValue("path")) - statReq := &provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Path{ - Path: target, + if infoIf, err := h.resourceInfoCache.Get(target); h.resourceInfoCacheTTL > 0 && err == nil { + logger.Debug().Msgf("cache hit for resource %+v", target) + pinfo = infoIf.(*provider.ResourceInfo) + } else { + statReq := &provider.StatRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Path{ + Path: target, + }, }, - }, - } + } - statRes, err := gwc.Stat(ctx, statReq) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc stat request", err) - return - } + statRes, err := gwc.Stat(ctx, statReq) + if err != nil { + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc stat request", err) + return + } - if statRes.Status.Code != rpc.Code_CODE_OK { - switch statRes.Status.Code { - case rpc.Code_CODE_NOT_FOUND: - response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "path not found", nil) - case rpc.Code_CODE_PERMISSION_DENIED: - response.WriteOCSError(w, r, response.MetaUnauthorized.StatusCode, "permission denied", nil) - default: - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc stat request failed", nil) + if statRes.Status.Code != rpc.Code_CODE_OK { + switch statRes.Status.Code { + case rpc.Code_CODE_NOT_FOUND: + response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "path not found", nil) + case rpc.Code_CODE_PERMISSION_DENIED: + response.WriteOCSError(w, r, response.MetaUnauthorized.StatusCode, "permission denied", nil) + default: + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc stat request failed", nil) + } + return } - return - } - pinfo = statRes.GetInfo() + pinfo = statRes.GetInfo() + if h.resourceInfoCacheTTL > 0 { + _ = h.resourceInfoCache.SetWithExpire(target, pinfo, time.Second*h.resourceInfoCacheTTL) + } + } } lrsReq := collaboration.ListReceivedSharesRequest{} @@ -659,22 +685,31 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { // we can reuse the stat info info = pinfo } else { - // we need to do a stat call - statRequest := provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Id{ - Id: rs.Share.ResourceId, + key := wrapResourceID(rs.Share.ResourceId) + if infoIf, err := h.resourceInfoCache.Get(key); h.resourceInfoCacheTTL > 0 && err == nil { + logger.Debug().Msgf("cache hit for resource %+v", rs.Share.ResourceId) + info = infoIf.(*provider.ResourceInfo) + } else { + // we need to do a stat call + statRequest := provider.StatRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Id{ + Id: rs.Share.ResourceId, + }, }, - }, - } + } - statRes, err := gwc.Stat(r.Context(), &statRequest) - if err != nil || statRes.Status.Code != rpc.Code_CODE_OK { - h.logProblems(statRes.GetStatus(), err, "could not stat, skipping") - continue - } + statRes, err := gwc.Stat(r.Context(), &statRequest) + if err != nil || statRes.Status.Code != rpc.Code_CODE_OK { + h.logProblems(statRes.GetStatus(), err, "could not stat, skipping") + continue + } - info = statRes.GetInfo() + info = statRes.GetInfo() + if h.resourceInfoCacheTTL > 0 { + _ = h.resourceInfoCache.SetWithExpire(key, info, time.Second*h.resourceInfoCacheTTL) + } + } } data, err := conversions.CS3Share2ShareData(r.Context(), rs.Share) @@ -773,32 +808,38 @@ func (h *Handler) addFilters(w http.ResponseWriter, r *http.Request, prefix stri } target := path.Join(prefix, r.FormValue("path")) - - statReq := &provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Path{ - Path: target, + if infoIf, err := h.resourceInfoCache.Get(target); h.resourceInfoCacheTTL > 0 && err == nil { + info = infoIf.(*provider.ResourceInfo) + } else { + statReq := &provider.StatRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Path{ + Path: target, + }, }, - }, - } + } - res, err := gwClient.Stat(ctx, statReq) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc stat request", err) - return nil, nil, err - } + res, err := gwClient.Stat(ctx, statReq) + if err != nil { + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc stat request", err) + return nil, nil, err + } - if res.Status.Code != rpc.Code_CODE_OK { - err = errors.New(res.Status.Message) - if res.Status.Code == rpc.Code_CODE_NOT_FOUND { - response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "not found", err) + if res.Status.Code != rpc.Code_CODE_OK { + err = errors.New(res.Status.Message) + if res.Status.Code == rpc.Code_CODE_NOT_FOUND { + response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "not found", err) + return nil, nil, err + } + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc stat request failed", err) return nil, nil, err } - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc stat request failed", err) - return nil, nil, err - } - info = res.Info + info = res.Info + if h.resourceInfoCacheTTL > 0 { + _ = h.resourceInfoCache.SetWithExpire(target, info, time.Second*h.resourceInfoCacheTTL) + } + } collaborationFilters = append(collaborationFilters, &collaboration.ListSharesRequest_Filter{ Type: collaboration.ListSharesRequest_Filter_TYPE_RESOURCE_ID, diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go index 5f615ba92e..cac4cf61f8 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go @@ -20,6 +20,7 @@ package shares import ( "net/http" + "time" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" @@ -146,7 +147,6 @@ func (h *Handler) removeUserShare(w http.ResponseWriter, r *http.Request, shareI } func (h *Handler) listUserShares(r *http.Request, filters []*collaboration.ListSharesRequest_Filter) ([]*conversions.ShareData, *rpc.Status, error) { - var rInfo *provider.ResourceInfo ctx := r.Context() log := appctx.GetLogger(ctx) @@ -179,26 +179,37 @@ func (h *Handler) listUserShares(r *http.Request, filters []*collaboration.ListS continue } - // prepare the stat request - statReq := &provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Id{Id: s.ResourceId}, - }, - } - - statResponse, err := c.Stat(ctx, statReq) - if err != nil || statResponse.Status.Code != rpc.Code_CODE_OK { - log.Debug().Interface("share", s).Interface("response", statResponse).Interface("shareData", data).Err(err).Msg("could not stat share, skipping") - continue + var info *provider.ResourceInfo + key := wrapResourceID(s.ResourceId) + if infoIf, err := h.resourceInfoCache.Get(key); h.resourceInfoCacheTTL > 0 && err == nil { + log.Debug().Msgf("cache hit for resource %+v", s.ResourceId) + info = infoIf.(*provider.ResourceInfo) + } else { + // prepare the stat request + statReq := &provider.StatRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Id{Id: s.ResourceId}, + }, + } + + statResponse, err := c.Stat(ctx, statReq) + if err != nil || statResponse.Status.Code != rpc.Code_CODE_OK { + log.Debug().Interface("share", s).Interface("response", statResponse).Interface("shareData", data).Err(err).Msg("could not stat share, skipping") + continue + } + info = statResponse.Info + if h.resourceInfoCacheTTL > 0 { + _ = h.resourceInfoCache.SetWithExpire(key, info, time.Second*h.resourceInfoCacheTTL) + } } - if err := h.addFileInfo(ctx, data, statResponse.Info); err != nil { - log.Debug().Interface("share", s).Interface("info", statResponse.Info).Interface("shareData", data).Err(err).Msg("could not add file info, skipping") + if err := h.addFileInfo(ctx, data, info); err != nil { + log.Debug().Interface("share", s).Interface("info", info).Interface("shareData", data).Err(err).Msg("could not add file info, skipping") continue } h.mapUserIds(ctx, c, data) - log.Debug().Interface("share", s).Interface("info", rInfo).Interface("shareData", data).Msg("mapped") + log.Debug().Interface("share", s).Interface("info", info).Interface("shareData", data).Msg("mapped") ocsDataPayload = append(ocsDataPayload, data) } } diff --git a/pkg/cbox/share/sql/sql.go b/pkg/cbox/share/sql/sql.go index fac64aab4b..f9b0e5eb18 100644 --- a/pkg/cbox/share/sql/sql.go +++ b/pkg/cbox/share/sql/sql.go @@ -323,7 +323,7 @@ func (m *mgr) ListReceivedShares(ctx context.Context) ([]*collaboration.Received params = append(params, v) } - query := "select coalesce(uid_owner, '') as uid_owner, coalesce(uid_initiator, '') as uid_initiator, coalesce(share_with, '') as share_with, coalesce(fileid_prefix, '') as fileid_prefix, coalesce(item_source, '') as item_source, id, stime, permissions, share_type, accepted FROM oc_share WHERE (orphan = 0 or orphan IS NULL) AND (uid_owner != ? AND uid_initiator != ?) AND id not in (SELECT distinct(id) FROM oc_share_acl WHERE rejected_by=?)" + query := "select coalesce(uid_owner, '') as uid_owner, coalesce(uid_initiator, '') as uid_initiator, coalesce(share_with, '') as share_with, coalesce(fileid_prefix, '') as fileid_prefix, coalesce(item_source, '') as item_source, ts.id, stime, permissions, share_type, accepted, coalesce(tr.rejected_by, '') as rejected_by FROM oc_share ts LEFT JOIN oc_share_acl tr ON (ts.id = tr.id AND tr.rejected_by = ?) WHERE (orphan = 0 or orphan IS NULL) AND (uid_owner != ? AND uid_initiator != ?) " if len(user.Groups) > 0 { query += "AND (share_with=? OR share_with in (?" + strings.Repeat(",?", len(user.Groups)-1) + "))" } else { @@ -339,7 +339,7 @@ func (m *mgr) ListReceivedShares(ctx context.Context) ([]*collaboration.Received var s conversions.DBShare shares := []*collaboration.ReceivedShare{} for rows.Next() { - if err := rows.Scan(&s.UIDOwner, &s.UIDInitiator, &s.ShareWith, &s.Prefix, &s.ItemSource, &s.ID, &s.STime, &s.Permissions, &s.ShareType, &s.State); err != nil { + if err := rows.Scan(&s.UIDOwner, &s.UIDInitiator, &s.ShareWith, &s.Prefix, &s.ItemSource, &s.ID, &s.STime, &s.Permissions, &s.ShareType, &s.State, &s.RejectedBy); err != nil { continue } shares = append(shares, conversions.ConvertToCS3ReceivedShare(s)) @@ -355,19 +355,19 @@ func (m *mgr) getReceivedByID(ctx context.Context, id *collaboration.ShareId) (* user := user.ContextMustGetUser(ctx) uid := conversions.FormatUserID(user.Id) - params := []interface{}{id.OpaqueId, uid, uid} + params := []interface{}{uid, id.OpaqueId, uid} for _, v := range user.Groups { params = append(params, v) } s := conversions.DBShare{ID: id.OpaqueId} - query := "select coalesce(uid_owner, '') as uid_owner, coalesce(uid_initiator, '') as uid_initiator, coalesce(share_with, '') as share_with, coalesce(fileid_prefix, '') as fileid_prefix, coalesce(item_source, '') as item_source, stime, permissions, share_type, accepted FROM oc_share WHERE (orphan = 0 or orphan IS NULL) AND id=? AND id not in (SELECT distinct(id) FROM oc_share_acl WHERE rejected_by=?)" + query := "select coalesce(uid_owner, '') as uid_owner, coalesce(uid_initiator, '') as uid_initiator, coalesce(share_with, '') as share_with, coalesce(fileid_prefix, '') as fileid_prefix, coalesce(item_source, '') as item_source, stime, permissions, share_type, accepted, coalesce(tr.rejected_by, '') as rejected_by FROM oc_share ts LEFT JOIN oc_share_acl tr ON (ts.id = tr.id AND tr.rejected_by = ?) WHERE (orphan = 0 or orphan IS NULL) AND ts.id=? " if len(user.Groups) > 0 { query += "AND (share_with=? OR share_with in (?" + strings.Repeat(",?", len(user.Groups)-1) + "))" } else { query += "AND (share_with=?)" } - if err := m.db.QueryRow(query, params...).Scan(&s.UIDOwner, &s.UIDInitiator, &s.ShareWith, &s.Prefix, &s.ItemSource, &s.STime, &s.Permissions, &s.ShareType, &s.State); err != nil { + if err := m.db.QueryRow(query, params...).Scan(&s.UIDOwner, &s.UIDInitiator, &s.ShareWith, &s.Prefix, &s.ItemSource, &s.STime, &s.Permissions, &s.ShareType, &s.State, &s.RejectedBy); err != nil { if err == sql.ErrNoRows { return nil, errtypes.NotFound(id.OpaqueId) } @@ -381,20 +381,20 @@ func (m *mgr) getReceivedByKey(ctx context.Context, key *collaboration.ShareKey) uid := conversions.FormatUserID(user.Id) shareType, shareWith := conversions.FormatGrantee(key.Grantee) - params := []interface{}{conversions.FormatUserID(key.Owner), key.ResourceId.StorageId, key.ResourceId.OpaqueId, shareType, shareWith, shareWith, uid} + params := []interface{}{uid, conversions.FormatUserID(key.Owner), key.ResourceId.StorageId, key.ResourceId.OpaqueId, shareType, shareWith, shareWith} for _, v := range user.Groups { params = append(params, v) } s := conversions.DBShare{} - query := "select coalesce(uid_owner, '') as uid_owner, coalesce(uid_initiator, '') as uid_initiator, coalesce(share_with, '') as share_with, coalesce(fileid_prefix, '') as fileid_prefix, coalesce(item_source, '') as item_source, id, stime, permissions, share_type, accepted FROM oc_share WHERE (orphan = 0 or orphan IS NULL) AND uid_owner=? AND fileid_prefix=? AND item_source=? AND share_type=? AND share_with=? AND id not in (SELECT distinct(id) FROM oc_share_acl WHERE rejected_by=?)" + query := "select coalesce(uid_owner, '') as uid_owner, coalesce(uid_initiator, '') as uid_initiator, coalesce(share_with, '') as share_with, coalesce(fileid_prefix, '') as fileid_prefix, coalesce(item_source, '') as item_source, ts.id, stime, permissions, share_type, accepted, coalesce(tr.rejected_by, '') as rejected_by FROM oc_share ts LEFT JOIN oc_share_acl tr ON (ts.id = tr.id AND tr.rejected_by = ?) WHERE (orphan = 0 or orphan IS NULL) AND uid_owner=? AND fileid_prefix=? AND item_source=? AND share_type=? AND share_with=? " if len(user.Groups) > 0 { query += "AND (share_with=? OR share_with in (?" + strings.Repeat(",?", len(user.Groups)-1) + "))" } else { query += "AND (share_with=?)" } - if err := m.db.QueryRow(query, params...).Scan(&s.UIDOwner, &s.UIDInitiator, &s.ShareWith, &s.Prefix, &s.ItemSource, &s.ID, &s.STime, &s.Permissions, &s.ShareType, &s.State); err != nil { + if err := m.db.QueryRow(query, params...).Scan(&s.UIDOwner, &s.UIDInitiator, &s.ShareWith, &s.Prefix, &s.ItemSource, &s.ID, &s.STime, &s.Permissions, &s.ShareType, &s.State, &s.RejectedBy); err != nil { if err == sql.ErrNoRows { return nil, errtypes.NotFound(key.String()) } @@ -431,14 +431,14 @@ func (m *mgr) UpdateReceivedShare(ctx context.Context, ref *collaboration.ShareR return nil, err } - var query string - params := []interface{}{rs.Share.Id.OpaqueId} + var query, queryAccept string + params := []interface{}{rs.Share.Id.OpaqueId, conversions.FormatUserID(user.Id)} switch f.GetState() { case collaboration.ShareState_SHARE_STATE_REJECTED: query = "insert into oc_share_acl(id, rejected_by) values(?, ?)" - params = append(params, conversions.FormatUserID(user.Id)) case collaboration.ShareState_SHARE_STATE_ACCEPTED: - query = "update oc_share set accepted=1 where id=?" + query = "delete from oc_share_acl where id=? AND rejected_by=?" + queryAccept = "update oc_share set accepted=1 where id=?" } stmt, err := m.db.Prepare(query) @@ -450,6 +450,17 @@ func (m *mgr) UpdateReceivedShare(ctx context.Context, ref *collaboration.ShareR return nil, err } + if queryAccept != "" { + stmt, err = m.db.Prepare(queryAccept) + if err != nil { + return nil, err + } + _, err = stmt.Exec(rs.Share.Id.OpaqueId) + if err != nil { + return nil, err + } + } + rs.State = f.GetState() return rs, nil } diff --git a/pkg/cbox/utils/conversions.go b/pkg/cbox/utils/conversions.go index 784debffbf..2117282224 100644 --- a/pkg/cbox/utils/conversions.go +++ b/pkg/cbox/utils/conversions.go @@ -44,6 +44,7 @@ type DBShare struct { ShareName string STime int FileTarget string + RejectedBy string State int } @@ -199,9 +200,15 @@ func ConvertToCS3Share(s DBShare) *collaboration.Share { // ConvertToCS3ReceivedShare converts a DBShare to a CS3API collaboration received share func ConvertToCS3ReceivedShare(s DBShare) *collaboration.ReceivedShare { share := ConvertToCS3Share(s) + var state collaboration.ShareState + if s.RejectedBy != "" { + state = collaboration.ShareState_SHARE_STATE_REJECTED + } else { + state = IntToShareState(s.State) + } return &collaboration.ReceivedShare{ Share: share, - State: IntToShareState(s.State), + State: state, } } diff --git a/pkg/storage/utils/eosfs/eosfs.go b/pkg/storage/utils/eosfs/eosfs.go index da32a77d22..30854a6dae 100644 --- a/pkg/storage/utils/eosfs/eosfs.go +++ b/pkg/storage/utils/eosfs/eosfs.go @@ -26,6 +26,7 @@ import ( "net/url" "os" "path" + "path/filepath" "regexp" "strconv" "strings" @@ -578,7 +579,7 @@ func (fs *eosfs) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []st return nil, err } - return fs.convertToResourceInfo(ctx, eosFileInfo) + return fs.convertToResourceInfo(ctx, eosFileInfo, false) } func (fs *eosfs) getMDShareFolder(ctx context.Context, p string, mdKeys []string) (*provider.ResourceInfo, error) { @@ -601,7 +602,7 @@ func (fs *eosfs) getMDShareFolder(ctx context.Context, p string, mdKeys []string // TODO(labkode): diff between root (dir) and children (ref) if fs.isShareFolderRoot(ctx, p) { - return fs.convertToResourceInfo(ctx, eosFileInfo) + return fs.convertToResourceInfo(ctx, eosFileInfo, false) } return fs.convertToFileReference(ctx, eosFileInfo) } @@ -643,6 +644,10 @@ func (fs *eosfs) listWithNominalHome(ctx context.Context, p string) (finfos []*p } fn := fs.wrap(ctx, p) + virtualView := false + if !fs.conf.EnableHome && filepath.Dir(fn) == filepath.Clean(fs.conf.Namespace) { + virtualView = true + } eosFileInfos, err := fs.c.List(ctx, uid, gid, fn) if err != nil { @@ -660,7 +665,7 @@ func (fs *eosfs) listWithNominalHome(ctx context.Context, p string) (finfos []*p } // Remove the hidden folders in the topmost directory - if finfo, err := fs.convertToResourceInfo(ctx, eosFileInfo); err == nil && finfo.Path != "/" && !strings.HasPrefix(finfo.Path, "/.") { + if finfo, err := fs.convertToResourceInfo(ctx, eosFileInfo, virtualView); err == nil && finfo.Path != "/" && !strings.HasPrefix(finfo.Path, "/.") { finfos = append(finfos, finfo) } } @@ -714,7 +719,7 @@ func (fs *eosfs) listHome(ctx context.Context, home string) ([]*provider.Resourc } } - if finfo, err := fs.convertToResourceInfo(ctx, eosFileInfo); err == nil && finfo.Path != "/" && !strings.HasPrefix(finfo.Path, "/.") { + if finfo, err := fs.convertToResourceInfo(ctx, eosFileInfo, false); err == nil && finfo.Path != "/" && !strings.HasPrefix(finfo.Path, "/.") { finfos = append(finfos, finfo) } } @@ -1319,7 +1324,7 @@ func (fs *eosfs) convertToRecycleItem(ctx context.Context, eosDeletedItem *eoscl } func (fs *eosfs) convertToRevision(ctx context.Context, eosFileInfo *eosclient.FileInfo) (*provider.FileVersion, error) { - md, err := fs.convertToResourceInfo(ctx, eosFileInfo) + md, err := fs.convertToResourceInfo(ctx, eosFileInfo, false) if err != nil { return nil, err } @@ -1332,12 +1337,12 @@ func (fs *eosfs) convertToRevision(ctx context.Context, eosFileInfo *eosclient.F return revision, nil } -func (fs *eosfs) convertToResourceInfo(ctx context.Context, eosFileInfo *eosclient.FileInfo) (*provider.ResourceInfo, error) { - return fs.convert(ctx, eosFileInfo) +func (fs *eosfs) convertToResourceInfo(ctx context.Context, eosFileInfo *eosclient.FileInfo, virtualView bool) (*provider.ResourceInfo, error) { + return fs.convert(ctx, eosFileInfo, virtualView) } func (fs *eosfs) convertToFileReference(ctx context.Context, eosFileInfo *eosclient.FileInfo) (*provider.ResourceInfo, error) { - info, err := fs.convert(ctx, eosFileInfo) + info, err := fs.convert(ctx, eosFileInfo, false) if err != nil { return nil, err } @@ -1400,7 +1405,7 @@ func (fs *eosfs) permissionSet(ctx context.Context, eosFileInfo *eosclient.FileI return grants.GetGrantPermissionSet(perm, eosFileInfo.IsDir) } -func (fs *eosfs) convert(ctx context.Context, eosFileInfo *eosclient.FileInfo) (*provider.ResourceInfo, error) { +func (fs *eosfs) convert(ctx context.Context, eosFileInfo *eosclient.FileInfo, virtualView bool) (*provider.ResourceInfo, error) { path, err := fs.unwrap(ctx, eosFileInfo.File) if err != nil { return nil, err @@ -1411,11 +1416,13 @@ func (fs *eosfs) convert(ctx context.Context, eosFileInfo *eosclient.FileInfo) ( size = eosFileInfo.TreeSize } - owner, err := fs.getUserIDGateway(ctx, strconv.FormatUint(eosFileInfo.UID, 10)) - if err != nil { - sublog := appctx.GetLogger(ctx).With().Logger() - sublog.Warn().Uint64("uid", eosFileInfo.UID).Msg("could not lookup userid, leaving empty") - owner = &userpb.UserId{} + owner := &userpb.UserId{} + if !virtualView { + owner, err = fs.getUserIDGateway(ctx, strconv.FormatUint(eosFileInfo.UID, 10)) + if err != nil { + sublog := appctx.GetLogger(ctx).With().Logger() + sublog.Warn().Uint64("uid", eosFileInfo.UID).Msg("could not lookup userid, leaving empty") + } } info := &provider.ResourceInfo{ @@ -1499,7 +1506,6 @@ func (fs *eosfs) getUserIDGateway(ctx context.Context, uid string) (*userpb.User if userIDInterface, ok := fs.userIDCache.Load(uid); ok { return userIDInterface.(*userpb.UserId), nil } - client, err := pool.GetGatewayServiceClient(fs.conf.GatewaySvc) if err != nil { return nil, errors.Wrap(err, "eos: error getting gateway grpc client") From 4760859b73339deef493321f984e99a1a90703bc Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Mon, 26 Apr 2021 16:50:44 +0200 Subject: [PATCH 32/70] [docs-only] Run `make build` instead of `make` (#1658) --- README.md | 13 ++++++++----- docs/content/en/docs/getting-started/build-reva.md | 2 +- docs/content/en/docs/tutorials/setup-tutorial.md | 3 ++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2732f515ed..18e31a1183 100644 --- a/README.md +++ b/README.md @@ -18,18 +18,21 @@ Read the [getting started guide](https://reva.link/docs/getting-started/) and th ## Build and run it yourself -You need to have [Go](https://golang.org/doc/install), [git](https://git-scm.com/) and [make](https://en.wikipedia.org/wiki/Make_(software)) installed. +You need to have [Go](https://golang.org/doc/install), [git](https://git-scm.com/) and [make](https://en.wikipedia.org/wiki/Make_(software)) installed. Some of these commands may require `sudo`, depending on your system setup. ``` $ git clone https://github.com/cs3org/reva $ cd reva $ make deps -$ make -$ cd examples/storage-references -$ ../../cmd/revad/revad -dev-dir . +$ make build +$ mkdir -p /etc/revad +$ cp examples/storage-references/users.demo.json /etc/revad/users.json +$ cp examples/storage-references/groups.demo.json /etc/revad/groups.json +$ cp examples/storage-references/providers.demo.json /etc/revad/ocm-providers.json +$ cmd/revad/revad -dev-dir examples/storage-references ``` -You can also read the [build from sources guide](https://reva.link/docs/getting-started/build-reva/). +You can also read the [build from sources guide](https://reva.link/docs/getting-started/build-reva/) and the [setup tutorial](https://github.com/cs3org/reva/blob/master/docs/content/en/docs/tutorials/setup-tutorial.md). ## Run tests diff --git a/docs/content/en/docs/getting-started/build-reva.md b/docs/content/en/docs/getting-started/build-reva.md index 15fea62c91..0f61d93d73 100644 --- a/docs/content/en/docs/getting-started/build-reva.md +++ b/docs/content/en/docs/getting-started/build-reva.md @@ -13,5 +13,5 @@ the Go programming language that installs the Go compiler. git clone https://github.com/cs3org/reva cd reva make deps -make +make build ``` diff --git a/docs/content/en/docs/tutorials/setup-tutorial.md b/docs/content/en/docs/tutorials/setup-tutorial.md index 5b09be6064..7d82266bd8 100644 --- a/docs/content/en/docs/tutorials/setup-tutorial.md +++ b/docs/content/en/docs/tutorials/setup-tutorial.md @@ -57,10 +57,11 @@ Reva daemons are spawned using configuration specified in `toml` format. Multipl G: gRPC exposed service ``` -You can start these three daemons using the `-dev-dir` flag which fires up a daemon for each toml file in a directory. The user, group and mesh provider services use JSON files by default as their data store, and expects these to be located at `/etc/revad`. +You can start these three daemons using the `-dev-dir` flag which fires up a daemon for each toml file in a directory. The user, group and mesh provider services use JSON files by default as their data store, and expects these to be located at `/etc/revad`. Some of these commands may require `sudo`, depending on your system setup. ``` > mkdir -p /var/tmp/reva +> mkdir -p /etc/revad > cp examples/storage-references/users.demo.json /etc/revad/users.json > cp examples/storage-references/groups.demo.json /etc/revad/groups.json > cp examples/storage-references/providers.demo.json /etc/revad/ocm-providers.json From 561dc73534e4d2c2396be36a89b570b9193d8444 Mon Sep 17 00:00:00 2001 From: Swikriti Tripathi <41103328+SwikritiT@users.noreply.github.com> Date: Wed, 28 Apr 2021 21:46:02 +0545 Subject: [PATCH 33/70] update core commit id to the latest upto 2021-04-28 (#1667) --- .drone.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.env b/.drone.env index e9ef2d524e..4ec2b58f5d 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=6b06806ae2876cf78e9de9ede68042068be2414f +CORE_COMMITID=1e5070767aabbce4aeecb548d73a43f1a2bd3dd4 CORE_BRANCH=master From f1529230b6dd0dece6246057c0d8d2be67165d93 Mon Sep 17 00:00:00 2001 From: Phil Davis Date: Fri, 30 Apr 2021 13:54:00 +0545 Subject: [PATCH 34/70] Bump core commit id (#1670) --- .drone.env | 2 +- tests/acceptance/expected-failures-on-OCIS-storage.md | 6 +++--- tests/acceptance/expected-failures-on-OWNCLOUD-storage.md | 8 ++++---- tests/acceptance/expected-failures-on-S3NG-storage.md | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.drone.env b/.drone.env index 4ec2b58f5d..d3be8e5fb8 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=1e5070767aabbce4aeecb548d73a43f1a2bd3dd4 +CORE_COMMITID=182ac89d0ba4feecea786cf33b2192bd58daa67e CORE_BRANCH=master diff --git a/tests/acceptance/expected-failures-on-OCIS-storage.md b/tests/acceptance/expected-failures-on-OCIS-storage.md index 91ad71817b..557ba83cb8 100644 --- a/tests/acceptance/expected-failures-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-on-OCIS-storage.md @@ -170,9 +170,9 @@ _ocdav: return checksum in upload response for chunked upload_ - [apiMain/checksums.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L67) Scenario: Uploading a chunked file with checksum should return the checksum in the download header - [apiMain/checksums.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L138) Scenario: Upload new dav chunked file where checksum matches - [apiMain/checksums.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L147) Scenario: Upload new dav chunked file where checksum does not match -- [apiMain/checksums.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L258) Scenario: Uploading an old method chunked file with checksum should fail using new DAV path -- [apiMain/checksums.feature:314](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L314) Scenario: Upload overwriting a file with new chunking and correct checksum -- [apiMain/checksums.feature:326](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L326) Scenario: Upload overwriting a file with new chunking and invalid checksum +- [apiMain/checksums.feature:257](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L257) Scenario: Uploading an old method chunked file with checksum should fail using new DAV path +- [apiMain/checksums.feature:313](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L313) Scenario: Upload overwriting a file with new chunking and correct checksum +- [apiMain/checksums.feature:325](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L325) Scenario: Upload overwriting a file with new chunking and invalid checksum #### [Preserve mtime after TUS upload](https://github.com/owncloud/ocis-reva/issues/174) diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index 2e7aa5ab2a..8af46de70a 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -209,9 +209,9 @@ _ocdav: return checksum in upload response for chunked upload_ - [apiMain/checksums.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L67) Scenario: Uploading a chunked file with checksum should return the checksum in the download header - [apiMain/checksums.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L138) Scenario: Upload new dav chunked file where checksum matches - [apiMain/checksums.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L147) Scenario: Upload new dav chunked file where checksum does not match -- [apiMain/checksums.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L258) Scenario: Uploading an old method chunked file with checksum should fail using new DAV path -- [apiMain/checksums.feature:314](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L314) Scenario: Upload overwriting a file with new chunking and correct checksum -- [apiMain/checksums.feature:326](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L326) Scenario: Upload overwriting a file with new chunking and invalid checksum +- [apiMain/checksums.feature:257](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L257) Scenario: Uploading an old method chunked file with checksum should fail using new DAV path +- [apiMain/checksums.feature:313](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L313) Scenario: Upload overwriting a file with new chunking and correct checksum +- [apiMain/checksums.feature:325](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L325) Scenario: Upload overwriting a file with new chunking and invalid checksum #### [Webdav LOCK operations](https://github.com/owncloud/ocis/issues/1284) @@ -574,8 +574,8 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiMain/checksums.feature:217](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L217) Scenario Outline: Upload a file where checksum does not match - [apiMain/checksums.feature:218](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L218) Scenario Outline: Upload a file where checksum does not match +- [apiMain/checksums.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L309) Scenario Outline: Uploading a file with invalid SHA1 checksum overwriting an existing file - [apiMain/checksums.feature:310](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L310) Scenario Outline: Uploading a file with invalid SHA1 checksum overwriting an existing file -- [apiMain/checksums.feature:311](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L311) Scenario Outline: Uploading a file with invalid SHA1 checksum overwriting an existing file #### [Searching sharee with displayname](https://github.com/owncloud/ocis/issues/547) - [apiSharees/sharees.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharees/sharees.feature#L32) diff --git a/tests/acceptance/expected-failures-on-S3NG-storage.md b/tests/acceptance/expected-failures-on-S3NG-storage.md index 2c3071381a..4442904cdc 100644 --- a/tests/acceptance/expected-failures-on-S3NG-storage.md +++ b/tests/acceptance/expected-failures-on-S3NG-storage.md @@ -170,9 +170,9 @@ _ocdav: return checksum in upload response for chunked upload_ - [apiMain/checksums.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L67) Scenario: Uploading a chunked file with checksum should return the checksum in the download header - [apiMain/checksums.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L138) Scenario: Upload new dav chunked file where checksum matches - [apiMain/checksums.feature:147](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L147) Scenario: Upload new dav chunked file where checksum does not match -- [apiMain/checksums.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L258) Scenario: Uploading an old method chunked file with checksum should fail using new DAV path -- [apiMain/checksums.feature:314](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L314) Scenario: Upload overwriting a file with new chunking and correct checksum -- [apiMain/checksums.feature:326](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L326) Scenario: Upload overwriting a file with new chunking and invalid checksum +- [apiMain/checksums.feature:257](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L257) Scenario: Uploading an old method chunked file with checksum should fail using new DAV path +- [apiMain/checksums.feature:313](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L313) Scenario: Upload overwriting a file with new chunking and correct checksum +- [apiMain/checksums.feature:325](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L325) Scenario: Upload overwriting a file with new chunking and invalid checksum #### [Preserve mtime after TUS upload](https://github.com/owncloud/ocis-reva/issues/174) From eb2d638d32e7630024a9e5f72d5a6d2cac312715 Mon Sep 17 00:00:00 2001 From: Phil Davis Date: Fri, 30 Apr 2021 20:13:48 +0545 Subject: [PATCH 35/70] [tests-only] Bump core commit id (#1675) --- .drone.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.env b/.drone.env index d3be8e5fb8..64cb1f8516 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=182ac89d0ba4feecea786cf33b2192bd58daa67e +CORE_COMMITID=e8d1281774bb07d5e5195013ca83ceb515dd7e6d CORE_BRANCH=master From 69bd21f2cc97433365e2285a09a953c7fa62b352 Mon Sep 17 00:00:00 2001 From: David Christofas Date: Fri, 30 Apr 2021 17:44:04 +0200 Subject: [PATCH 36/70] Fix public file shares (#1666) --- .../unreleased/fix-public-file-shares.md | 6 +++ .../publicstorageprovider.go | 40 ++++++++++++++----- .../services/owncloud/ocdav/publicfile.go | 3 -- 3 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 changelog/unreleased/fix-public-file-shares.md diff --git a/changelog/unreleased/fix-public-file-shares.md b/changelog/unreleased/fix-public-file-shares.md new file mode 100644 index 0000000000..8bd7924ead --- /dev/null +++ b/changelog/unreleased/fix-public-file-shares.md @@ -0,0 +1,6 @@ +Bugfix: Fix public file shares + +Fixed stat requests and propfind responses for publicly shared files. + +https://github.com/cs3org/reva/pull/1666 + diff --git a/internal/grpc/services/publicstorageprovider/publicstorageprovider.go b/internal/grpc/services/publicstorageprovider/publicstorageprovider.go index 66c3678027..b2a1e45b02 100644 --- a/internal/grpc/services/publicstorageprovider/publicstorageprovider.go +++ b/internal/grpc/services/publicstorageprovider/publicstorageprovider.go @@ -139,7 +139,7 @@ func (s *service) translatePublicRefToCS3Ref(ctx context.Context, ref *provider. return nil, "", nil, nil, err } - originalPath, ls, st, err := s.resolveToken(ctx, tkn) + originalPath, ls, _, st, err := s.resolveToken(ctx, tkn) switch { case err != nil: return nil, "", nil, nil, err @@ -452,7 +452,7 @@ func (s *service) Stat(ctx context.Context, req *provider.StatRequest) (*provide return nil, err } - originalPath, ls, st, err := s.resolveToken(ctx, tkn) + originalPath, ls, ri, st, err := s.resolveToken(ctx, tkn) switch { case err != nil: return nil, err @@ -466,12 +466,16 @@ func (s *service) Stat(ctx context.Context, req *provider.StatRequest) (*provide }, nil } + p := originalPath + if ri.Type == provider.ResourceType_RESOURCE_TYPE_CONTAINER { + p = path.Join("/", p, relativePath) + } var statResponse *provider.StatResponse // the call has to be made to the gateway instead of the storage. statResponse, err = s.gateway.Stat(ctx, &provider.StatRequest{ Ref: &provider.Reference{ Spec: &provider.Reference_Path{ - Path: path.Join("/", originalPath, relativePath), + Path: p, }, }, }) @@ -518,7 +522,7 @@ func (s *service) ListContainer(ctx context.Context, req *provider.ListContainer return nil, err } - pathFromToken, ls, st, err := s.resolveToken(ctx, tkn) + pathFromToken, ls, _, st, err := s.resolveToken(ctx, tkn) switch { case err != nil: return nil, err @@ -668,10 +672,10 @@ func (s *service) trimMountPrefix(fn string) (string, error) { } // resolveToken returns the path and share for the publicly shared resource. -func (s *service) resolveToken(ctx context.Context, token string) (string, *link.PublicShare, *rpc.Status, error) { +func (s *service) resolveToken(ctx context.Context, token string) (string, *link.PublicShare, *provider.ResourceInfo, *rpc.Status, error) { driver, err := pool.GetGatewayServiceClient(s.conf.GatewayAddr) if err != nil { - return "", nil, nil, err + return "", nil, nil, nil, err } publicShareResponse, err := driver.GetPublicShare( @@ -687,9 +691,9 @@ func (s *service) resolveToken(ctx context.Context, token string) (string, *link ) switch { case err != nil: - return "", nil, nil, err + return "", nil, nil, nil, err case publicShareResponse.Status.Code != rpc.Code_CODE_OK: - return "", nil, publicShareResponse.Status, nil + return "", nil, nil, publicShareResponse.Status, nil } pathRes, err := s.gateway.GetPath(ctx, &provider.GetPathRequest{ @@ -697,9 +701,23 @@ func (s *service) resolveToken(ctx context.Context, token string) (string, *link }) switch { case err != nil: - return "", nil, nil, err + return "", nil, nil, nil, err case pathRes.Status.Code != rpc.Code_CODE_OK: - return "", nil, pathRes.Status, nil + return "", nil, nil, pathRes.Status, nil + } + + sRes, err := s.gateway.Stat(ctx, &provider.StatRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Id{ + Id: publicShareResponse.GetShare().GetResourceId(), + }, + }, + }) + switch { + case err != nil: + return "", nil, nil, nil, err + case sRes.Status.Code != rpc.Code_CODE_OK: + return "", nil, nil, sRes.Status, nil } - return pathRes.Path, publicShareResponse.GetShare(), nil, nil + return pathRes.Path, publicShareResponse.GetShare(), sRes.Info, nil, nil } diff --git a/internal/http/services/owncloud/ocdav/publicfile.go b/internal/http/services/owncloud/ocdav/publicfile.go index a87e84c8da..c5670014f0 100644 --- a/internal/http/services/owncloud/ocdav/publicfile.go +++ b/internal/http/services/owncloud/ocdav/publicfile.go @@ -231,9 +231,6 @@ func (s *svc) getPublicFileInfos(onContainer, onlyRoot bool, i *provider.Resourc } } - // link share only appears on root collection - delete(i.Opaque.Map, "link-share") - // add the file info infos = append(infos, i) From c539cca0c9400fb701fd83a8cb725dd10883a0d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 May 2021 17:09:28 +0200 Subject: [PATCH 37/70] [Build-deps]: Bump github.com/onsi/ginkgo from 1.16.1 to 1.16.2 (#1681) --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 70ed8d2b46..3ba643cf34 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/Masterminds/sprig v2.22.0+incompatible github.com/ReneKroon/ttlcache/v2 v2.4.0 github.com/aws/aws-sdk-go v1.38.13 - github.com/bluele/gcache v0.0.2 // indirect + github.com/bluele/gcache v0.0.2 github.com/c-bata/go-prompt v0.2.5 github.com/cheggaaa/pb v1.0.29 github.com/coreos/go-oidc v2.2.1+incompatible @@ -34,7 +34,7 @@ require ( github.com/minio/minio-go/v7 v7.0.10 github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/mapstructure v1.4.1 - github.com/onsi/ginkgo v1.16.1 + github.com/onsi/ginkgo v1.16.2 github.com/onsi/gomega v1.11.0 github.com/ory/fosite v0.39.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 2b34b53633..990c1e22d5 100644 --- a/go.sum +++ b/go.sum @@ -802,8 +802,8 @@ github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.1 h1:foqVmeWDD6yYpK+Yz3fHyNIxFYNxswxqNFjSKe+vI54= -github.com/onsi/ginkgo v1.16.1/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.2 h1:HFB2fbVIlhIfCfOW81bZFbiC/RvnpXSdhbF2/DJr134= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= 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= From 174e4de62e196595b1f2b406298606e4cecb858f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 16:20:04 +0200 Subject: [PATCH 38/70] [Build-deps]: Bump github.com/onsi/gomega from 1.11.0 to 1.12.0 (#1687) --- go.mod | 8 ++++---- go.sum | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 3ba643cf34..b1ff42f724 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/mapstructure v1.4.1 github.com/onsi/ginkgo v1.16.2 - github.com/onsi/gomega v1.11.0 + github.com/onsi/gomega v1.12.0 github.com/ory/fosite v0.39.0 github.com/pkg/errors v0.9.1 github.com/pkg/xattr v0.4.3 @@ -48,10 +48,10 @@ require ( github.com/tus/tusd v1.1.1-0.20200416115059-9deabf9d80c2 go.opencensus.io v0.23.0 golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c - golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb + golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d - golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b - golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 + golang.org/x/sys v0.0.0-20210423082822-04245dca01da + golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 google.golang.org/grpc v1.37.0 google.golang.org/protobuf v1.26.0 gotest.tools v2.2.0+incompatible diff --git a/go.sum b/go.sum index 990c1e22d5..8992cc049c 100644 --- a/go.sum +++ b/go.sum @@ -812,8 +812,8 @@ github.com/onsi/gomega v1.6.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= +github.com/onsi/gomega v1.12.0 h1:p4oGGk2M2UJc0wWN4lHFvIB71lxsh0T/UiKCCgFADY8= +github.com/onsi/gomega v1.12.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= 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= @@ -1229,8 +1229,8 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= 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= @@ -1318,19 +1318,22 @@ golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b h1:lAZ0/chPUDWwjqosYR0X4M490zQhMsiJ4K3DbA7o+3g= -golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 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/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From f7364ecd5a5d6f55f6da069128d08423e5293275 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 16:20:20 +0200 Subject: [PATCH 39/70] [Build-deps]: Bump github.com/aws/aws-sdk-go from 1.38.13 to 1.38.34 (#1688) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b1ff42f724..412e9fb2ee 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible github.com/ReneKroon/ttlcache/v2 v2.4.0 - github.com/aws/aws-sdk-go v1.38.13 + github.com/aws/aws-sdk-go v1.38.34 github.com/bluele/gcache v0.0.2 github.com/c-bata/go-prompt v0.2.5 github.com/cheggaaa/pb v1.0.29 diff --git a/go.sum b/go.sum index 8992cc049c..aa1e5ecbc3 100644 --- a/go.sum +++ b/go.sum @@ -83,8 +83,8 @@ github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQ github.com/aws/aws-sdk-go v1.20.1/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.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.38.13 h1:ICZ8czsU+nrx6cOXfI/xA4ZZEOekCIZs2+nsaDWxw84= -github.com/aws/aws-sdk-go v1.38.13/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.38.34 h1:JSAyS6hSDLbRmCAz9VAkwDf5oh/olt9mBTrVBWGJcU8= +github.com/aws/aws-sdk-go v1.38.34/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-xray-sdk-go v0.9.4/go.mod h1:XtMKdBQfpVut+tJEwI7+dJFRxxRdxHDyVNp2tHXRq04= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= From 204c41b50f35f6b270b8b2bbb22387374f3c86c2 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Fri, 7 May 2021 08:08:32 +0200 Subject: [PATCH 40/70] Filter shares based on type in OCS (#1683) * Filter shares based on type * Merge permissions in EOS in case of access through multiple shares * Add changelog --- changelog/unreleased/share-type-filter-ocs.md | 3 ++ .../handlers/apps/sharing/shares/shares.go | 32 +++++++++++----- pkg/storage/utils/eosfs/eosfs.go | 37 ++++++++++++++++--- 3 files changed, 57 insertions(+), 15 deletions(-) create mode 100644 changelog/unreleased/share-type-filter-ocs.md diff --git a/changelog/unreleased/share-type-filter-ocs.md b/changelog/unreleased/share-type-filter-ocs.md new file mode 100644 index 0000000000..0583a6095a --- /dev/null +++ b/changelog/unreleased/share-type-filter-ocs.md @@ -0,0 +1,3 @@ +Enhancement: Filter created shares based on type in OCS + +https://github.com/cs3org/reva/pull/1683 diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index 1e25a9e0a5..8cc1dd79fe 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -749,28 +749,40 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { func (h *Handler) listSharesWithOthers(w http.ResponseWriter, r *http.Request) { shares := make([]*conversions.ShareData, 0) + filters := []*collaboration.ListSharesRequest_Filter{} linkFilters := []*link.ListPublicSharesRequest_Filter{} - var err error + var e error // shared with others p := r.URL.Query().Get("path") if p != "" { // prefix the path with the owners home, because ocs share requests are relative to the home dir - filters, linkFilters, err = h.addFilters(w, r, h.homeNamespace) - if err != nil { + filters, linkFilters, e = h.addFilters(w, r, h.homeNamespace) + if e != nil { // result has been written as part of addFilters return } } - userShares, status, err := h.listUserShares(r, filters) - h.logProblems(status, err, "could not listUserShares") - - publicShares, status, err := h.listPublicShares(r, linkFilters) - h.logProblems(status, err, "could not listPublicShares") - - shares = append(shares, append(userShares, publicShares...)...) + shareTypes := strings.Split(r.URL.Query().Get("share_types"), ",") + for _, s := range shareTypes { + shareType, err := strconv.Atoi(strings.TrimSpace(s)) + if err != nil && s != "" { + response.WriteOCSError(w, r, response.MetaBadRequest.StatusCode, "invalid share type", err) + return + } + if s == "" || shareType == int(conversions.ShareTypeUser) || shareType == int(conversions.ShareTypeGroup) { + userShares, status, err := h.listUserShares(r, filters) + h.logProblems(status, err, "could not listUserShares") + shares = append(shares, userShares...) + } + if s == "" || shareType == int(conversions.ShareTypePublicLink) { + publicShares, status, err := h.listPublicShares(r, linkFilters) + h.logProblems(status, err, "could not listPublicShares") + shares = append(shares, publicShares...) + } + } response.WriteOCSSuccess(w, r, shares) } diff --git a/pkg/storage/utils/eosfs/eosfs.go b/pkg/storage/utils/eosfs/eosfs.go index 30854a6dae..ba6c8de598 100644 --- a/pkg/storage/utils/eosfs/eosfs.go +++ b/pkg/storage/utils/eosfs/eosfs.go @@ -1388,21 +1388,48 @@ func (fs *eosfs) permissionSet(ctx context.Context, eosFileInfo *eosclient.FileI } } - uid, gid, err := fs.getUserUIDAndGID(ctx, u) + uid, _, err := fs.getUserUIDAndGID(ctx, u) if err != nil { return &provider.ResourcePermissions{ // no permissions } } - var perm string + var perm provider.ResourcePermissions for _, e := range eosFileInfo.SysACL.Entries { - if e.Qualifier == uid || e.Qualifier == gid { - perm = e.Permissions + var userInGroup bool + for _, g := range u.Groups { + if e.Qualifier == g { + userInGroup = true + } + } + if e.Qualifier == uid || userInGroup { + mergePermissions(&perm, grants.GetGrantPermissionSet(e.Permissions, eosFileInfo.IsDir)) } } - return grants.GetGrantPermissionSet(perm, eosFileInfo.IsDir) + return &perm +} + +func mergePermissions(l *provider.ResourcePermissions, r *provider.ResourcePermissions) { + l.AddGrant = l.AddGrant || r.AddGrant + l.CreateContainer = l.CreateContainer || r.CreateContainer + l.Delete = l.Delete || r.Delete + l.GetPath = l.GetPath || r.GetPath + l.GetQuota = l.GetQuota || r.GetQuota + l.InitiateFileDownload = l.InitiateFileDownload || r.InitiateFileDownload + l.InitiateFileUpload = l.InitiateFileUpload || r.InitiateFileUpload + l.ListContainer = l.ListContainer || r.ListContainer + l.ListFileVersions = l.ListFileVersions || r.ListFileVersions + l.ListGrants = l.ListGrants || r.ListGrants + l.ListRecycle = l.ListRecycle || r.ListRecycle + l.Move = l.Move || r.Move + l.PurgeRecycle = l.PurgeRecycle || r.PurgeRecycle + l.RemoveGrant = l.RemoveGrant || r.RemoveGrant + l.RestoreFileVersion = l.RestoreFileVersion || r.RestoreFileVersion + l.RestoreRecycleItem = l.RestoreRecycleItem || r.RestoreRecycleItem + l.Stat = l.Stat || r.Stat + l.UpdateGrant = l.UpdateGrant || r.UpdateGrant } func (fs *eosfs) convert(ctx context.Context, eosFileInfo *eosclient.FileInfo, virtualView bool) (*provider.ResourceInfo, error) { From a34018aa2f8f5810540b0eb91dc95e1b5e4d0202 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte <39946305+gmgigi96@users.noreply.github.com> Date: Fri, 7 May 2021 08:59:37 +0200 Subject: [PATCH 41/70] Deprecate using errors.New and fmt.Errorf (#1673) (#1680) --- .../fdeprecate-errors-new-fmt-errorf.md | 6 +++++ internal/grpc/interceptors/auth/auth.go | 8 +++---- .../grpc/services/appprovider/appprovider.go | 7 +++--- .../grpc/services/appregistry/appregistry.go | 4 ++-- .../services/appregistry/appregistry_test.go | 4 ++-- .../services/authprovider/authprovider.go | 4 ++-- .../services/authregistry/authregistry.go | 4 ++-- internal/grpc/services/datatx/datatx.go | 7 +++--- internal/grpc/services/gateway/appprovider.go | 4 ++-- .../grpc/services/gateway/authprovider.go | 8 +++---- internal/grpc/services/gateway/gateway.go | 3 ++- .../grpc/services/gateway/ocmshareprovider.go | 4 ++-- .../services/gateway/publicshareprovider.go | 3 ++- .../grpc/services/gateway/storageprovider.go | 16 ++++++------- .../services/gateway/usershareprovider.go | 4 ++-- .../services/gateway/webdavstorageprovider.go | 2 +- .../services/groupprovider/groupprovider.go | 3 ++- internal/grpc/services/ocmcore/ocmcore.go | 13 +++++----- .../ocminvitemanager/ocminvitemanager.go | 4 ++-- .../ocmproviderauthorizer.go | 4 ++-- .../ocmshareprovider/ocmshareprovider.go | 14 +++++------ .../publicshareprovider.go | 3 +-- .../publicstorageprovider.go | 5 ++-- .../storageprovider/storageprovider.go | 24 +++++++++---------- .../storageregistry/storageregistry.go | 3 +-- .../services/userprovider/userprovider.go | 3 ++- .../usershareprovider/usershareprovider.go | 4 ++-- 27 files changed, 90 insertions(+), 78 deletions(-) create mode 100644 changelog/unreleased/fdeprecate-errors-new-fmt-errorf.md diff --git a/changelog/unreleased/fdeprecate-errors-new-fmt-errorf.md b/changelog/unreleased/fdeprecate-errors-new-fmt-errorf.md new file mode 100644 index 0000000000..232e498a33 --- /dev/null +++ b/changelog/unreleased/fdeprecate-errors-new-fmt-errorf.md @@ -0,0 +1,6 @@ +Enhancement: Deprecate using errors.New and fmt.Errorf + +Previously we were using errors.New and fmt.Errorf to create errors. +Now we use the errors defined in the errtypes package. + +https://github.com/cs3org/reva/issues/1673 \ No newline at end of file diff --git a/internal/grpc/interceptors/auth/auth.go b/internal/grpc/interceptors/auth/auth.go index 9b3599871a..849b458e83 100644 --- a/internal/grpc/interceptors/auth/auth.go +++ b/internal/grpc/interceptors/auth/auth.go @@ -20,10 +20,10 @@ package auth import ( "context" - "fmt" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/appctx" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/token" tokenmgr "github.com/cs3org/reva/pkg/token/manager/registry" "github.com/cs3org/reva/pkg/user" @@ -67,7 +67,7 @@ func NewUnary(m map[string]interface{}, unprotected []string) (grpc.UnaryServerI h, ok := tokenmgr.NewFuncs[conf.TokenManager] if !ok { - return nil, errors.New("auth: token manager does not exist: " + conf.TokenManager) + return nil, errtypes.NotFound("auth: token manager does not exist: " + conf.TokenManager) } tokenManager, err := h(conf.TokenManagers[conf.TokenManager]) @@ -140,12 +140,12 @@ func NewStream(m map[string]interface{}, unprotected []string) (grpc.StreamServe h, ok := tokenmgr.NewFuncs[conf.TokenManager] if !ok { - return nil, fmt.Errorf("auth: token manager not found: %s", conf.TokenManager) + return nil, errtypes.NotFound("auth: token manager not found: " + conf.TokenManager) } tokenManager, err := h(conf.TokenManagers[conf.TokenManager]) if err != nil { - return nil, errors.New("auth: token manager not found: " + conf.TokenManager) + return nil, errtypes.NotFound("auth: token manager not found: " + conf.TokenManager) } interceptor := func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { diff --git a/internal/grpc/services/appprovider/appprovider.go b/internal/grpc/services/appprovider/appprovider.go index 90dd2c4a91..2fbe2426cc 100644 --- a/internal/grpc/services/appprovider/appprovider.go +++ b/internal/grpc/services/appprovider/appprovider.go @@ -35,6 +35,7 @@ import ( "github.com/cs3org/reva/pkg/app" "github.com/cs3org/reva/pkg/app/provider/demo" "github.com/cs3org/reva/pkg/appctx" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc" "github.com/cs3org/reva/pkg/rgrpc/status" "github.com/cs3org/reva/pkg/rhttp" @@ -109,7 +110,7 @@ func getProvider(c *config) (app.Provider, error) { case "demo": return demo.New(c.Demo) default: - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound("driver not found: " + c.Driver) } } @@ -131,7 +132,7 @@ func (s *service) getWopiAppEndpoints(ctx context.Context) (map[string]interface } defer appsRes.Body.Close() if appsRes.StatusCode != http.StatusOK { - return nil, fmt.Errorf("Request to WOPI server returned %d", appsRes.StatusCode) + return nil, errtypes.InternalError(fmt.Sprintf("Request to WOPI server returned %d", appsRes.StatusCode)) } appsBody, err := ioutil.ReadAll(appsRes.Body) if err != nil { @@ -263,7 +264,7 @@ func (s *service) OpenFileInAppProvider(ctx context.Context, req *providerpb.Ope } defer bridgeRes.Body.Close() if bridgeRes.StatusCode != http.StatusFound { - return nil, fmt.Errorf("Request to WOPI bridge returned %d", bridgeRes.StatusCode) + return nil, errtypes.InternalError(fmt.Sprintf("Request to WOPI bridge returned %d", bridgeRes.StatusCode)) } appProviderURL = bridgeRes.Header.Get("Location") } diff --git a/internal/grpc/services/appregistry/appregistry.go b/internal/grpc/services/appregistry/appregistry.go index 13806e2490..3f2f99db6c 100644 --- a/internal/grpc/services/appregistry/appregistry.go +++ b/internal/grpc/services/appregistry/appregistry.go @@ -20,13 +20,13 @@ package appregistry import ( "context" - "fmt" "google.golang.org/grpc" registrypb "github.com/cs3org/go-cs3apis/cs3/app/registry/v1beta1" "github.com/cs3org/reva/pkg/app" "github.com/cs3org/reva/pkg/app/registry/static" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc" "github.com/cs3org/reva/pkg/rgrpc/status" "github.com/mitchellh/mapstructure" @@ -90,7 +90,7 @@ func getRegistry(c *config) (app.Registry, error) { case "static": return static.New(c.Static) default: - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound("driver not found: " + c.Driver) } } diff --git a/internal/grpc/services/appregistry/appregistry_test.go b/internal/grpc/services/appregistry/appregistry_test.go index 3fd817247f..b2c7cb4e9c 100644 --- a/internal/grpc/services/appregistry/appregistry_test.go +++ b/internal/grpc/services/appregistry/appregistry_test.go @@ -274,12 +274,12 @@ func TestNew(t *testing.T) { { name: "not existing driver", m: map[string]interface{}{"Driver": "doesnotexist"}, - wantErr: "driver not found: doesnotexist", + wantErr: "error: not found: driver not found: doesnotexist", }, { name: "empty", m: map[string]interface{}{}, - wantErr: "driver not found: ", + wantErr: "error: not found: driver not found: ", }, { name: "extra not existing field in setting", diff --git a/internal/grpc/services/authprovider/authprovider.go b/internal/grpc/services/authprovider/authprovider.go index abf88f43be..7dcf75f915 100644 --- a/internal/grpc/services/authprovider/authprovider.go +++ b/internal/grpc/services/authprovider/authprovider.go @@ -66,12 +66,12 @@ func parseConfig(m map[string]interface{}) (*config, error) { func getAuthManager(manager string, m map[string]map[string]interface{}) (auth.Manager, error) { if manager == "" { - return nil, errors.New("authsvc: driver not configured for auth manager") + return nil, errtypes.InternalError("authsvc: driver not configured for auth manager") } if f, ok := registry.NewFuncs[manager]; ok { return f(m[manager]) } - return nil, fmt.Errorf("authsvc: driver %s not found for auth manager", manager) + return nil, errtypes.NotFound(fmt.Sprintf("authsvc: driver %s not found for auth manager", manager)) } // New returns a new AuthProviderServiceServer. diff --git a/internal/grpc/services/authregistry/authregistry.go b/internal/grpc/services/authregistry/authregistry.go index ca1071b437..f3b3ab2262 100644 --- a/internal/grpc/services/authregistry/authregistry.go +++ b/internal/grpc/services/authregistry/authregistry.go @@ -20,11 +20,11 @@ package authregistry import ( "context" - "fmt" registrypb "github.com/cs3org/go-cs3apis/cs3/auth/registry/v1beta1" "github.com/cs3org/reva/pkg/auth" "github.com/cs3org/reva/pkg/auth/registry/registry" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc" "github.com/cs3org/reva/pkg/rgrpc/status" "github.com/mitchellh/mapstructure" @@ -98,7 +98,7 @@ func getRegistry(c *config) (auth.Registry, error) { if f, ok := registry.NewFuncs[c.Driver]; ok { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("authregistrysvc: driver not found: %s", c.Driver) + return nil, errtypes.NotFound("authregistrysvc: driver not found: " + c.Driver) } func (s *service) ListAuthProviders(ctx context.Context, req *registrypb.ListAuthProvidersRequest) (*registrypb.ListAuthProvidersResponse, error) { diff --git a/internal/grpc/services/datatx/datatx.go b/internal/grpc/services/datatx/datatx.go index dbda7518f3..33e9f73d56 100644 --- a/internal/grpc/services/datatx/datatx.go +++ b/internal/grpc/services/datatx/datatx.go @@ -22,6 +22,7 @@ import ( "context" datatx "github.com/cs3org/go-cs3apis/cs3/tx/v1beta1" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc" "github.com/cs3org/reva/pkg/rgrpc/status" "github.com/mitchellh/mapstructure" @@ -82,18 +83,18 @@ func (s *service) UnprotectedEndpoints() []string { func (s *service) CreateTransfer(ctx context.Context, req *datatx.CreateTransferRequest) (*datatx.CreateTransferResponse, error) { return &datatx.CreateTransferResponse{ - Status: status.NewUnimplemented(ctx, errors.New("CreateTransfer not implemented"), "CreateTransfer not implemented"), + Status: status.NewUnimplemented(ctx, errtypes.NotSupported("CreateTransfer not implemented"), "CreateTransfer not implemented"), }, nil } func (s *service) GetTransferStatus(ctx context.Context, in *datatx.GetTransferStatusRequest) (*datatx.GetTransferStatusResponse, error) { return &datatx.GetTransferStatusResponse{ - Status: status.NewUnimplemented(ctx, errors.New("GetTransferStatus not implemented"), "GetTransferStatus not implemented"), + Status: status.NewUnimplemented(ctx, errtypes.NotSupported("GetTransferStatus not implemented"), "GetTransferStatus not implemented"), }, nil } func (s *service) CancelTransfer(ctx context.Context, in *datatx.CancelTransferRequest) (*datatx.CancelTransferResponse, error) { return &datatx.CancelTransferResponse{ - Status: status.NewUnimplemented(ctx, errors.New("CancelTransfer not implemented"), "CancelTransfer not implemented"), + Status: status.NewUnimplemented(ctx, errtypes.NotSupported("CancelTransfer not implemented"), "CancelTransfer not implemented"), }, nil } diff --git a/internal/grpc/services/gateway/appprovider.go b/internal/grpc/services/gateway/appprovider.go index 8e3c3872a6..b66c42dfe2 100644 --- a/internal/grpc/services/gateway/appprovider.go +++ b/internal/grpc/services/gateway/appprovider.go @@ -181,7 +181,7 @@ func (s *svc) openLocalResources(ctx context.Context, ri *storageprovider.Resour accessToken, ok := token.ContextGetToken(ctx) if !ok || accessToken == "" { return &providerpb.OpenFileInAppProviderResponse{ - Status: status.NewUnauthenticated(ctx, errors.New("Access token is invalid or empty"), ""), + Status: status.NewUnauthenticated(ctx, errtypes.InvalidCredentials("Access token is invalid or empty"), ""), }, nil } @@ -246,7 +246,7 @@ func (s *svc) findAppProvider(ctx context.Context, ri *storageprovider.ResourceI return nil, errtypes.NotFound("gateway: app provider not found for resource: " + ri.String()) } - return nil, errors.New("gateway: error finding a storage provider") + return nil, errtypes.InternalError("gateway: error finding a storage provider") } func getGRPCConfig(opaque *typespb.Opaque) (bool, bool) { diff --git a/internal/grpc/services/gateway/authprovider.go b/internal/grpc/services/gateway/authprovider.go index 487094fa6a..45db876824 100644 --- a/internal/grpc/services/gateway/authprovider.go +++ b/internal/grpc/services/gateway/authprovider.go @@ -43,7 +43,7 @@ func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest // find auth provider c, err := s.findAuthProvider(ctx, req.Type) if err != nil { - err = errors.New("gateway: error finding auth provider for type: " + req.Type) + err = errtypes.NotFound("gateway: error finding auth provider for type: " + req.Type) return &gateway.AuthenticateResponse{ Status: status.NewInternal(ctx, err, "error getting auth provider client"), }, nil @@ -77,7 +77,7 @@ func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest // validate valid userId if res.User == nil { - err := errors.New("gateway: user after Authenticate is nil") + err := errtypes.NotFound("gateway: user after Authenticate is nil") log.Err(err).Msg("user is nil") return &gateway.AuthenticateResponse{ Status: status.NewInternal(ctx, err, "user is nil"), @@ -86,7 +86,7 @@ func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest uid := res.User.Id if uid == nil { - err := errors.New("gateway: uid after Authenticate is nil") + err := errtypes.NotFound("gateway: uid after Authenticate is nil") log.Err(err).Msg("user id is nil") return &gateway.AuthenticateResponse{ Status: status.NewInternal(ctx, err, "user id is nil"), @@ -191,5 +191,5 @@ func (s *svc) findAuthProvider(ctx context.Context, authType string) (provider.P return nil, errtypes.NotFound("gateway: auth provider not found for type:" + authType) } - return nil, errors.New("gateway: error finding an auth provider for type: " + authType) + return nil, errtypes.InternalError("gateway: error finding an auth provider for type: " + authType) } diff --git a/internal/grpc/services/gateway/gateway.go b/internal/grpc/services/gateway/gateway.go index 0388c441d1..f91678f6bd 100644 --- a/internal/grpc/services/gateway/gateway.go +++ b/internal/grpc/services/gateway/gateway.go @@ -27,6 +27,7 @@ import ( gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" "github.com/ReneKroon/ttlcache/v2" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc" "github.com/cs3org/reva/pkg/sharedconf" "github.com/cs3org/reva/pkg/token" @@ -177,5 +178,5 @@ func getTokenManager(manager string, m map[string]map[string]interface{}) (token return f(m[manager]) } - return nil, fmt.Errorf("driver %s not found for token manager", manager) + return nil, errtypes.NotFound(fmt.Sprintf("driver %s not found for token manager", manager)) } diff --git a/internal/grpc/services/gateway/ocmshareprovider.go b/internal/grpc/services/gateway/ocmshareprovider.go index 1a8cb6f8c3..8ee4935f3b 100644 --- a/internal/grpc/services/gateway/ocmshareprovider.go +++ b/internal/grpc/services/gateway/ocmshareprovider.go @@ -268,7 +268,7 @@ func (s *svc) UpdateReceivedOCMShare(ctx context.Context, req *ocm.UpdateReceive } // TODO(labkode): implementing updating display name - err = errors.New("gateway: update of display name is not yet implemented") + err = errtypes.NotSupported("gateway: update of display name is not yet implemented") return &ocm.UpdateReceivedOCMShareResponse{ Status: status.NewUnimplemented(ctx, err, "error updating received share"), }, nil @@ -304,7 +304,7 @@ func (s *svc) createWebdavReference(ctx context.Context, share *ocm.Share) (*rpc case "plain": token = string(tokenOpaque.Value) default: - err := errors.New("opaque entry decoder not recognized: " + tokenOpaque.Decoder) + err := errtypes.NotSupported("opaque entry decoder not recognized: " + tokenOpaque.Decoder) return status.NewInternal(ctx, err, "invalid opaque entry decoder"), nil } diff --git a/internal/grpc/services/gateway/publicshareprovider.go b/internal/grpc/services/gateway/publicshareprovider.go index 203ef19df9..88bb41b1c9 100644 --- a/internal/grpc/services/gateway/publicshareprovider.go +++ b/internal/grpc/services/gateway/publicshareprovider.go @@ -24,13 +24,14 @@ import ( rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1" "github.com/cs3org/reva/pkg/appctx" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" "github.com/pkg/errors" ) func (s *svc) CreatePublicShare(ctx context.Context, req *link.CreatePublicShareRequest) (*link.CreatePublicShareResponse, error) { if s.isSharedFolder(ctx, req.ResourceInfo.GetPath()) { - return nil, errors.New("gateway: can't create a public share of the share folder itself") + return nil, errtypes.AlreadyExists("gateway: can't create a public share of the share folder itself") } log := appctx.GetLogger(ctx) diff --git a/internal/grpc/services/gateway/storageprovider.go b/internal/grpc/services/gateway/storageprovider.go index 77b4a5adbb..90a5a04272 100644 --- a/internal/grpc/services/gateway/storageprovider.go +++ b/internal/grpc/services/gateway/storageprovider.go @@ -244,7 +244,7 @@ func (s *svc) InitiateFileDownload(ctx context.Context, req *provider.InitiateFi } if statRes.Info.Type != provider.ResourceType_RESOURCE_TYPE_REFERENCE { - err := errors.New(fmt.Sprintf("gateway: expected reference: got:%+v", statRes.Info)) + err := errtypes.BadRequest(fmt.Sprintf("gateway: expected reference: got:%+v", statRes.Info)) log.Err(err).Msg("gateway: error stating share name") return &gateway.InitiateFileDownloadResponse{ Status: status.NewInternal(ctx, err, "gateway: error initiating download"), @@ -456,7 +456,7 @@ func (s *svc) InitiateFileUpload(ctx context.Context, req *provider.InitiateFile } if statRes.Info.Type != provider.ResourceType_RESOURCE_TYPE_REFERENCE { - err := errors.New(fmt.Sprintf("gateway: expected reference: got:%+v", statRes.Info)) + err := errtypes.BadRequest(fmt.Sprintf("gateway: expected reference: got:%+v", statRes.Info)) log.Err(err).Msg("gateway: error stating share name") return &gateway.InitiateFileUploadResponse{ Status: status.NewInternal(ctx, err, "gateway: error initiating upload"), @@ -1387,7 +1387,7 @@ func (s *svc) checkRef(ctx context.Context, ri *provider.ResourceInfo) (*provide case "webdav": return nil, "webdav", nil default: - err := errors.New("gateway: no reference handler for scheme: " + uri.Scheme) + err := errtypes.BadRequest("gateway: no reference handler for scheme: " + uri.Scheme) return nil, "", err } } @@ -1429,12 +1429,12 @@ func (s *svc) handleCS3Ref(ctx context.Context, opaque string) (*provider.Resour case rpc.Code_CODE_UNIMPLEMENTED: return nil, errtypes.NotSupported(req.Ref.String()) default: - return nil, errors.New("gateway: error stating target reference") + return nil, errtypes.InternalError("gateway: error stating target reference") } } if res.Info.Type == provider.ResourceType_RESOURCE_TYPE_REFERENCE { - err := errors.New("gateway: error the target of a reference cannot be another reference") + err := errtypes.BadRequest("gateway: error the target of a reference cannot be another reference") return nil, err } @@ -1903,7 +1903,7 @@ func (s *svc) getSharedFolder(ctx context.Context) string { func (s *svc) CreateSymlink(ctx context.Context, req *provider.CreateSymlinkRequest) (*provider.CreateSymlinkResponse, error) { return &provider.CreateSymlinkResponse{ - Status: status.NewUnimplemented(ctx, errors.New("CreateSymlink not implemented"), "CreateSymlink not implemented"), + Status: status.NewUnimplemented(ctx, errtypes.NotSupported("CreateSymlink not implemented"), "CreateSymlink not implemented"), }, nil } @@ -1940,7 +1940,7 @@ func (s *svc) RestoreFileVersion(ctx context.Context, req *provider.RestoreFileV } func (s *svc) ListRecycleStream(_ *gateway.ListRecycleStreamRequest, _ gateway.GatewayAPI_ListRecycleStreamServer) error { - return errors.New("Unimplemented") + return errtypes.NotSupported("ListRecycleStream unimplemented") } // TODO use the ListRecycleRequest.Ref to only list the trash of a specific storage @@ -2083,7 +2083,7 @@ func (s *svc) findProviders(ctx context.Context, ref *provider.Reference) ([]*re } if res.Providers == nil { - return nil, errors.New("gateway: provider is nil") + return nil, errtypes.NotFound("gateway: provider is nil") } return res.Providers, nil diff --git a/internal/grpc/services/gateway/usershareprovider.go b/internal/grpc/services/gateway/usershareprovider.go index f1541e267c..12cfe3df55 100644 --- a/internal/grpc/services/gateway/usershareprovider.go +++ b/internal/grpc/services/gateway/usershareprovider.go @@ -37,7 +37,7 @@ import ( func (s *svc) CreateShare(ctx context.Context, req *collaboration.CreateShareRequest) (*collaboration.CreateShareResponse, error) { if s.isSharedFolder(ctx, req.ResourceInfo.GetPath()) { - return nil, errors.New("gateway: can't share the share folder itself") + return nil, errtypes.AlreadyExists("gateway: can't share the share folder itself") } c, err := pool.GetUserShareProviderClient(s.c.UserShareProviderEndpoint) @@ -344,7 +344,7 @@ func (s *svc) UpdateReceivedShare(ctx context.Context, req *collaboration.Update } // TODO(labkode): implementing updating display name - err = errors.New("gateway: update of display name is not yet implemented") + err = errtypes.NotSupported("gateway: update of display name is not yet implemented") return &collaboration.UpdateReceivedShareResponse{ Status: status.NewUnimplemented(ctx, err, "error updating received share"), }, nil diff --git a/internal/grpc/services/gateway/webdavstorageprovider.go b/internal/grpc/services/gateway/webdavstorageprovider.go index 34b49a7461..b49fd91b8a 100644 --- a/internal/grpc/services/gateway/webdavstorageprovider.go +++ b/internal/grpc/services/gateway/webdavstorageprovider.go @@ -214,7 +214,7 @@ func (s *svc) webdavRefTransferEndpoint(ctx context.Context, targetURL string, n func (s *svc) extractEndpointInfo(ctx context.Context, targetURL string) (*webdavEndpoint, error) { if targetURL == "" { - return nil, errors.New("gateway: ref target is an empty uri") + return nil, errtypes.BadRequest("gateway: ref target is an empty uri") } uri, err := url.Parse(targetURL) diff --git a/internal/grpc/services/groupprovider/groupprovider.go b/internal/grpc/services/groupprovider/groupprovider.go index 20e6f386fd..951395825a 100644 --- a/internal/grpc/services/groupprovider/groupprovider.go +++ b/internal/grpc/services/groupprovider/groupprovider.go @@ -23,6 +23,7 @@ import ( "fmt" grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/group" "github.com/cs3org/reva/pkg/group/manager/registry" "github.com/cs3org/reva/pkg/rgrpc" @@ -62,7 +63,7 @@ func getDriver(c *config) (group.Manager, error) { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver %s not found for group manager", c.Driver) + return nil, errtypes.NotFound(fmt.Sprintf("driver %s not found for group manager", c.Driver)) } // New returns a new GroupProviderServiceServer. diff --git a/internal/grpc/services/ocmcore/ocmcore.go b/internal/grpc/services/ocmcore/ocmcore.go index c6b814b8f0..f6bbbf6725 100644 --- a/internal/grpc/services/ocmcore/ocmcore.go +++ b/internal/grpc/services/ocmcore/ocmcore.go @@ -27,6 +27,7 @@ import ( ocmcore "github.com/cs3org/go-cs3apis/cs3/ocm/core/v1beta1" ocm "github.com/cs3org/go-cs3apis/cs3/sharing/ocm/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/ocm/share" "github.com/cs3org/reva/pkg/ocm/share/manager/registry" "github.com/cs3org/reva/pkg/rgrpc" @@ -64,7 +65,7 @@ func getShareManager(c *config) (share.Manager, error) { if f, ok := registry.NewFuncs[c.Driver]; ok { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound(fmt.Sprintf("driver not found: %s", c.Driver)) } func parseConfig(m map[string]interface{}) (*config, error) { @@ -109,7 +110,7 @@ func (s *service) UnprotectedEndpoints() []string { func (s *service) CreateOCMCoreShare(ctx context.Context, req *ocmcore.CreateOCMCoreShareRequest) (*ocmcore.CreateOCMCoreShareResponse, error) { parts := strings.Split(req.ProviderId, ":") if len(parts) < 2 { - err := errors.New("resource ID does not follow the layout storageid:opaqueid " + req.ProviderId) + err := errtypes.BadRequest("resource ID does not follow the layout storageid:opaqueid " + req.ProviderId) return &ocmcore.CreateOCMCoreShareResponse{ Status: status.NewInternal(ctx, err, "error decoding resource ID"), }, nil @@ -124,7 +125,7 @@ func (s *service) CreateOCMCoreShare(ctx context.Context, req *ocmcore.CreateOCM permOpaque, ok := req.Protocol.Opaque.Map["permissions"] if !ok { return &ocmcore.CreateOCMCoreShareResponse{ - Status: status.NewInternal(ctx, errors.New("resource permissions not set"), ""), + Status: status.NewInternal(ctx, errtypes.BadRequest("resource permissions not set"), ""), }, nil } switch permOpaque.Decoder { @@ -136,7 +137,7 @@ func (s *service) CreateOCMCoreShare(ctx context.Context, req *ocmcore.CreateOCM }, nil } default: - err := errors.New("opaque entry decoder not recognized") + err := errtypes.NotSupported("opaque entry decoder not recognized") return &ocmcore.CreateOCMCoreShareResponse{ Status: status.NewInternal(ctx, err, "invalid opaque entry decoder"), }, nil @@ -146,14 +147,14 @@ func (s *service) CreateOCMCoreShare(ctx context.Context, req *ocmcore.CreateOCM tokenOpaque, ok := req.Protocol.Opaque.Map["token"] if !ok { return &ocmcore.CreateOCMCoreShareResponse{ - Status: status.NewInternal(ctx, errors.New("token not set"), ""), + Status: status.NewInternal(ctx, errtypes.PermissionDenied("token not set"), ""), }, nil } switch tokenOpaque.Decoder { case "plain": token = string(tokenOpaque.Value) default: - err := errors.New("opaque entry decoder not recognized: " + tokenOpaque.Decoder) + err := errtypes.NotSupported("opaque entry decoder not recognized: " + tokenOpaque.Decoder) return &ocmcore.CreateOCMCoreShareResponse{ Status: status.NewInternal(ctx, err, "invalid opaque entry decoder"), }, nil diff --git a/internal/grpc/services/ocminvitemanager/ocminvitemanager.go b/internal/grpc/services/ocminvitemanager/ocminvitemanager.go index d4ed5acd60..6821f7d29e 100644 --- a/internal/grpc/services/ocminvitemanager/ocminvitemanager.go +++ b/internal/grpc/services/ocminvitemanager/ocminvitemanager.go @@ -20,9 +20,9 @@ package ocminvitemanager import ( "context" - "fmt" invitepb "github.com/cs3org/go-cs3apis/cs3/ocm/invite/v1beta1" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/ocm/invite" "github.com/cs3org/reva/pkg/ocm/invite/manager/registry" "github.com/cs3org/reva/pkg/rgrpc" @@ -60,7 +60,7 @@ func getInviteManager(c *config) (invite.Manager, error) { if f, ok := registry.NewFuncs[c.Driver]; ok { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound("driver not found: " + c.Driver) } func parseConfig(m map[string]interface{}) (*config, error) { diff --git a/internal/grpc/services/ocmproviderauthorizer/ocmproviderauthorizer.go b/internal/grpc/services/ocmproviderauthorizer/ocmproviderauthorizer.go index b11c347d5a..8d89fccdd1 100644 --- a/internal/grpc/services/ocmproviderauthorizer/ocmproviderauthorizer.go +++ b/internal/grpc/services/ocmproviderauthorizer/ocmproviderauthorizer.go @@ -20,9 +20,9 @@ package ocmproviderauthorizer import ( "context" - "fmt" ocmprovider "github.com/cs3org/go-cs3apis/cs3/ocm/provider/v1beta1" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/ocm/provider" "github.com/cs3org/reva/pkg/ocm/provider/authorizer/registry" "github.com/cs3org/reva/pkg/rgrpc" @@ -60,7 +60,7 @@ func getProviderAuthorizer(c *config) (provider.Authorizer, error) { if f, ok := registry.NewFuncs[c.Driver]; ok { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound("driver not found: " + c.Driver) } func parseConfig(m map[string]interface{}) (*config, error) { diff --git a/internal/grpc/services/ocmshareprovider/ocmshareprovider.go b/internal/grpc/services/ocmshareprovider/ocmshareprovider.go index 6512c4acd1..676da090cc 100644 --- a/internal/grpc/services/ocmshareprovider/ocmshareprovider.go +++ b/internal/grpc/services/ocmshareprovider/ocmshareprovider.go @@ -20,9 +20,9 @@ package ocmshareprovider import ( "context" - "fmt" ocm "github.com/cs3org/go-cs3apis/cs3/sharing/ocm/v1beta1" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/ocm/share" "github.com/cs3org/reva/pkg/ocm/share/manager/registry" "github.com/cs3org/reva/pkg/rgrpc" @@ -60,7 +60,7 @@ func getShareManager(c *config) (share.Manager, error) { if f, ok := registry.NewFuncs[c.Driver]; ok { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound("driver not found: " + c.Driver) } func parseConfig(m map[string]interface{}) (*config, error) { @@ -106,7 +106,7 @@ func (s *service) CreateOCMShare(ctx context.Context, req *ocm.CreateOCMShareReq if req.Opaque == nil { return &ocm.CreateOCMShareResponse{ - Status: status.NewInternal(ctx, errors.New("can't find resource permissions"), ""), + Status: status.NewInternal(ctx, errtypes.BadRequest("can't find resource permissions"), ""), }, nil } @@ -114,14 +114,14 @@ func (s *service) CreateOCMShare(ctx context.Context, req *ocm.CreateOCMShareReq permOpaque, ok := req.Opaque.Map["permissions"] if !ok { return &ocm.CreateOCMShareResponse{ - Status: status.NewInternal(ctx, errors.New("resource permissions not set"), ""), + Status: status.NewInternal(ctx, errtypes.BadRequest("resource permissions not set"), ""), }, nil } switch permOpaque.Decoder { case "plain": permissions = string(permOpaque.Value) default: - err := errors.New("opaque entry decoder not recognized: " + permOpaque.Decoder) + err := errtypes.NotSupported("opaque entry decoder not recognized: " + permOpaque.Decoder) return &ocm.CreateOCMShareResponse{ Status: status.NewInternal(ctx, err, "invalid opaque entry decoder"), }, nil @@ -131,14 +131,14 @@ func (s *service) CreateOCMShare(ctx context.Context, req *ocm.CreateOCMShareReq nameOpaque, ok := req.Opaque.Map["name"] if !ok { return &ocm.CreateOCMShareResponse{ - Status: status.NewInternal(ctx, errors.New("resource name not set"), ""), + Status: status.NewInternal(ctx, errtypes.BadRequest("resource name not set"), ""), }, nil } switch nameOpaque.Decoder { case "plain": name = string(nameOpaque.Value) default: - err := errors.New("opaque entry decoder not recognized: " + nameOpaque.Decoder) + err := errtypes.NotSupported("opaque entry decoder not recognized: " + nameOpaque.Decoder) return &ocm.CreateOCMShareResponse{ Status: status.NewInternal(ctx, err, "invalid opaque entry decoder"), }, nil diff --git a/internal/grpc/services/publicshareprovider/publicshareprovider.go b/internal/grpc/services/publicshareprovider/publicshareprovider.go index 65709e82a1..f1d0ee9bb9 100644 --- a/internal/grpc/services/publicshareprovider/publicshareprovider.go +++ b/internal/grpc/services/publicshareprovider/publicshareprovider.go @@ -20,7 +20,6 @@ package publicshareprovider import ( "context" - "fmt" link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" @@ -60,7 +59,7 @@ func getShareManager(c *config) (publicshare.Manager, error) { if f, ok := registry.NewFuncs[c.Driver]; ok { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound("driver not found: " + c.Driver) } // TODO(labkode): add ctx to Close. diff --git a/internal/grpc/services/publicstorageprovider/publicstorageprovider.go b/internal/grpc/services/publicstorageprovider/publicstorageprovider.go index b2a1e45b02..b941b9b110 100644 --- a/internal/grpc/services/publicstorageprovider/publicstorageprovider.go +++ b/internal/grpc/services/publicstorageprovider/publicstorageprovider.go @@ -30,6 +30,7 @@ import ( provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" typesv1beta1 "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" "github.com/cs3org/reva/pkg/appctx" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc" "github.com/cs3org/reva/pkg/rgrpc/status" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" @@ -587,12 +588,12 @@ func filterPermissions(l *provider.ResourcePermissions, r *provider.ResourcePerm func (s *service) unwrap(ctx context.Context, ref *provider.Reference) (token string, relativePath string, err error) { if ref.GetId() != nil { - return "", "", errors.New("need path based ref: got " + ref.String()) + return "", "", errtypes.BadRequest("need path based ref: got " + ref.String()) } if ref.GetPath() == "" { // abort, no valid id nor path - return "", "", errors.New("invalid ref: " + ref.String()) + return "", "", errtypes.BadRequest("invalid ref: " + ref.String()) } // i.e path: /public/{token}/path/to/subfolders diff --git a/internal/grpc/services/storageprovider/storageprovider.go b/internal/grpc/services/storageprovider/storageprovider.go index 44d64416c2..bede723ced 100644 --- a/internal/grpc/services/storageprovider/storageprovider.go +++ b/internal/grpc/services/storageprovider/storageprovider.go @@ -116,7 +116,7 @@ func parseXSTypes(xsTypes map[string]uint32) ([]*provider.ResourceChecksumPriori for xs, prio := range xsTypes { t := PKG2GRPCXS(xs) if t == provider.ResourceChecksumType_RESOURCE_CHECKSUM_TYPE_INVALID { - return nil, fmt.Errorf("checksum type is invalid: %s", xs) + return nil, errtypes.BadRequest("checksum type is invalid: " + xs) } xsPrio := &provider.ResourceChecksumPriority{ Priority: prio, @@ -171,7 +171,7 @@ func New(m map[string]interface{}, ss *grpc.Server) (rgrpc.Service, error) { } if len(xsTypes) == 0 { - return nil, fmt.Errorf("no available checksum, please set in config") + return nil, errtypes.NotFound("no available checksum, please set in config") } registerMimeTypes(c.MimeTypes) @@ -299,7 +299,7 @@ func (s *service) InitiateFileUpload(ctx context.Context, req *provider.Initiate } if newRef.GetPath() == "/" { return &provider.InitiateFileUploadResponse{ - Status: status.NewInternal(ctx, errors.New("can't upload to mount path"), "can't upload to mount path"), + Status: status.NewInternal(ctx, errtypes.BadRequest("can't upload to mount path"), "can't upload to mount path"), }, nil } @@ -424,25 +424,25 @@ func (s *service) CreateHome(ctx context.Context, req *provider.CreateHomeReques func (s *service) CreateStorageSpace(ctx context.Context, req *provider.CreateStorageSpaceRequest) (*provider.CreateStorageSpaceResponse, error) { return &provider.CreateStorageSpaceResponse{ - Status: status.NewUnimplemented(ctx, errors.New("CreateStorageSpace not implemented"), "CreateStorageSpace not implemented"), + Status: status.NewUnimplemented(ctx, errtypes.NotSupported("CreateStorageSpace not implemented"), "CreateStorageSpace not implemented"), }, nil } func (s *service) ListStorageSpaces(ctx context.Context, req *provider.ListStorageSpacesRequest) (*provider.ListStorageSpacesResponse, error) { return &provider.ListStorageSpacesResponse{ - Status: status.NewUnimplemented(ctx, errors.New("ListStorageSpaces not implemented"), "ListStorageSpaces not implemented"), + Status: status.NewUnimplemented(ctx, errtypes.NotSupported("ListStorageSpaces not implemented"), "ListStorageSpaces not implemented"), }, nil } func (s *service) UpdateStorageSpace(ctx context.Context, req *provider.UpdateStorageSpaceRequest) (*provider.UpdateStorageSpaceResponse, error) { return &provider.UpdateStorageSpaceResponse{ - Status: status.NewUnimplemented(ctx, errors.New("UpdateStorageSpace not implemented"), "UpdateStorageSpace not implemented"), + Status: status.NewUnimplemented(ctx, errtypes.NotSupported("UpdateStorageSpace not implemented"), "UpdateStorageSpace not implemented"), }, nil } func (s *service) DeleteStorageSpace(ctx context.Context, req *provider.DeleteStorageSpaceRequest) (*provider.DeleteStorageSpaceResponse, error) { return &provider.DeleteStorageSpaceResponse{ - Status: status.NewUnimplemented(ctx, errors.New("DeleteStorageSpace not implemented"), "DeleteStorageSpace not implemented"), + Status: status.NewUnimplemented(ctx, errtypes.NotSupported("DeleteStorageSpace not implemented"), "DeleteStorageSpace not implemented"), }, nil } @@ -486,7 +486,7 @@ func (s *service) Delete(ctx context.Context, req *provider.DeleteRequest) (*pro } if newRef.GetPath() == "/" { return &provider.DeleteResponse{ - Status: status.NewInternal(ctx, errors.New("can't delete mount path"), "can't delete mount path"), + Status: status.NewInternal(ctx, errtypes.BadRequest("can't delete mount path"), "can't delete mount path"), }, nil } @@ -1064,7 +1064,7 @@ func (s *service) CreateReference(ctx context.Context, req *provider.CreateRefer func (s *service) CreateSymlink(ctx context.Context, req *provider.CreateSymlinkRequest) (*provider.CreateSymlinkResponse, error) { return &provider.CreateSymlinkResponse{ - Status: status.NewUnimplemented(ctx, errors.New("CreateSymlink not implemented"), "CreateSymlink not implemented"), + Status: status.NewUnimplemented(ctx, errtypes.NotSupported("CreateSymlink not implemented"), "CreateSymlink not implemented"), }, nil } @@ -1097,7 +1097,7 @@ func getFS(c *config) (storage.FS, error) { if f, ok := registry.NewFuncs[c.Driver]; ok { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound("driver not found: " + c.Driver) } func (s *service) unwrap(ctx context.Context, ref *provider.Reference) (*provider.Reference, error) { @@ -1116,7 +1116,7 @@ func (s *service) unwrap(ctx context.Context, ref *provider.Reference) (*provide if ref.GetPath() == "" { // abort, no valid id nor path - return nil, errors.New("ref is invalid: " + ref.String()) + return nil, errtypes.BadRequest("ref is invalid: " + ref.String()) } fn := ref.GetPath() @@ -1138,7 +1138,7 @@ func (s *service) trimMountPrefix(fn string) (string, error) { if strings.HasPrefix(fn, s.mountPath) { return path.Join("/", strings.TrimPrefix(fn, s.mountPath)), nil } - return "", errors.New(fmt.Sprintf("path=%q does not belong to this storage provider mount path=%q"+fn, s.mountPath)) + return "", errtypes.BadRequest(fmt.Sprintf("path=%q does not belong to this storage provider mount path=%q", fn, s.mountPath)) } func (s *service) wrap(ctx context.Context, ri *provider.ResourceInfo) error { diff --git a/internal/grpc/services/storageregistry/storageregistry.go b/internal/grpc/services/storageregistry/storageregistry.go index 02b6dbb5d8..4f59ae5649 100644 --- a/internal/grpc/services/storageregistry/storageregistry.go +++ b/internal/grpc/services/storageregistry/storageregistry.go @@ -20,7 +20,6 @@ package storageregistry import ( "context" - "fmt" registrypb "github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1" "github.com/cs3org/reva/pkg/appctx" @@ -97,7 +96,7 @@ func getRegistry(c *config) (storage.Registry, error) { if f, ok := registry.NewFuncs[c.Driver]; ok { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound("driver not found: " + c.Driver) } func (s *service) ListStorageProviders(ctx context.Context, req *registrypb.ListStorageProvidersRequest) (*registrypb.ListStorageProvidersResponse, error) { diff --git a/internal/grpc/services/userprovider/userprovider.go b/internal/grpc/services/userprovider/userprovider.go index 7d78fba697..fb244990de 100644 --- a/internal/grpc/services/userprovider/userprovider.go +++ b/internal/grpc/services/userprovider/userprovider.go @@ -23,6 +23,7 @@ import ( "fmt" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc" "github.com/cs3org/reva/pkg/rgrpc/status" "github.com/cs3org/reva/pkg/user" @@ -62,7 +63,7 @@ func getDriver(c *config) (user.Manager, error) { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver %s not found for user manager", c.Driver) + return nil, errtypes.NotFound(fmt.Sprintf("driver %s not found for user manager", c.Driver)) } // New returns a new UserProviderServiceServer. diff --git a/internal/grpc/services/usershareprovider/usershareprovider.go b/internal/grpc/services/usershareprovider/usershareprovider.go index 58e9782c9d..0e8521d900 100644 --- a/internal/grpc/services/usershareprovider/usershareprovider.go +++ b/internal/grpc/services/usershareprovider/usershareprovider.go @@ -20,12 +20,12 @@ package usershareprovider import ( "context" - "fmt" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/cs3org/reva/pkg/appctx" + "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc" "github.com/cs3org/reva/pkg/rgrpc/status" "github.com/cs3org/reva/pkg/share" @@ -60,7 +60,7 @@ func getShareManager(c *config) (share.Manager, error) { if f, ok := registry.NewFuncs[c.Driver]; ok { return f(c.Drivers[c.Driver]) } - return nil, fmt.Errorf("driver not found: %s", c.Driver) + return nil, errtypes.NotFound("driver not found: " + c.Driver) } // TODO(labkode): add ctx to Close. From dfd523dce12c8663f22673515f12e535a49e9f94 Mon Sep 17 00:00:00 2001 From: Talank Date: Fri, 7 May 2021 13:09:08 +0545 Subject: [PATCH 42/70] Bump commit IDs 2021-05-06 (#1686) --- .drone.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.env b/.drone.env index 64cb1f8516..55ba3d8001 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=e8d1281774bb07d5e5195013ca83ceb515dd7e6d +CORE_COMMITID=dc475a581eddd5b44a5f862f8508761b8ef9a914 CORE_BRANCH=master From 71ce0a9a6a5d776e83ada417d9b0cc98789bdfe4 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Fri, 7 May 2021 10:25:18 +0200 Subject: [PATCH 43/70] Add cache warmup strategy for OCS resource infos (#1664) --- .../unreleased/ocs-share-cache-warmup.md | 8 + .../services/owncloud/ocs/config/config.go | 24 +-- .../handlers/apps/sharing/shares/shares.go | 27 ++++ pkg/share/cache/cache.go | 28 ++++ pkg/share/cache/cbox/cbox.go | 149 ++++++++++++++++++ pkg/share/cache/registry/registry.go | 34 ++++ pkg/storage/fs/registry/registry.go | 2 +- 7 files changed, 260 insertions(+), 12 deletions(-) create mode 100644 changelog/unreleased/ocs-share-cache-warmup.md create mode 100644 pkg/share/cache/cache.go create mode 100644 pkg/share/cache/cbox/cbox.go create mode 100644 pkg/share/cache/registry/registry.go diff --git a/changelog/unreleased/ocs-share-cache-warmup.md b/changelog/unreleased/ocs-share-cache-warmup.md new file mode 100644 index 0000000000..7aa6dda160 --- /dev/null +++ b/changelog/unreleased/ocs-share-cache-warmup.md @@ -0,0 +1,8 @@ +Enhancement: Add cache warmup strategy for OCS resource infos + +Recently, a TTL cache was added to OCS to store statted resource infos. This PR +adds an interface to define warmup strategies and also adds a cbox specific +strategy which starts a goroutine to initialize the cache with all the valid +shares present in the system. + +https://github.com/cs3org/reva/pull/1664 diff --git a/internal/http/services/owncloud/ocs/config/config.go b/internal/http/services/owncloud/ocs/config/config.go index 3d8f73b0b3..20d785c011 100644 --- a/internal/http/services/owncloud/ocs/config/config.go +++ b/internal/http/services/owncloud/ocs/config/config.go @@ -25,17 +25,19 @@ import ( // Config holds the config options that need to be passed down to all ocs handlers type Config struct { - Prefix string `mapstructure:"prefix"` - Config data.ConfigData `mapstructure:"config"` - Capabilities data.CapabilitiesData `mapstructure:"capabilities"` - GatewaySvc string `mapstructure:"gatewaysvc"` - DefaultUploadProtocol string `mapstructure:"default_upload_protocol"` - UserAgentChunkingMap map[string]string `mapstructure:"user_agent_chunking_map"` - SharePrefix string `mapstructure:"share_prefix"` - HomeNamespace string `mapstructure:"home_namespace"` - AdditionalInfoAttribute string `mapstructure:"additional_info_attribute"` - ResourceInfoCacheSize int `mapstructure:"resource_info_cache_size"` - ResourceInfoCacheTTL int `mapstructure:"resource_info_cache_ttl"` + Prefix string `mapstructure:"prefix"` + Config data.ConfigData `mapstructure:"config"` + Capabilities data.CapabilitiesData `mapstructure:"capabilities"` + GatewaySvc string `mapstructure:"gatewaysvc"` + DefaultUploadProtocol string `mapstructure:"default_upload_protocol"` + UserAgentChunkingMap map[string]string `mapstructure:"user_agent_chunking_map"` + SharePrefix string `mapstructure:"share_prefix"` + HomeNamespace string `mapstructure:"home_namespace"` + AdditionalInfoAttribute string `mapstructure:"additional_info_attribute"` + CacheWarmupDriver string `mapstructure:"cache_warmup_driver"` + CacheWarmupDrivers map[string]map[string]interface{} `mapstructure:"cache_warmup_drivers"` + ResourceInfoCacheSize int `mapstructure:"resource_info_cache_size"` + ResourceInfoCacheTTL int `mapstructure:"resource_info_cache_ttl"` } // Init sets sane defaults diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index 8cc1dd79fe..10e13afbc2 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -50,6 +50,8 @@ import ( "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" "github.com/cs3org/reva/pkg/rhttp/router" + "github.com/cs3org/reva/pkg/share/cache" + "github.com/cs3org/reva/pkg/share/cache/registry" "github.com/pkg/errors" ) @@ -72,6 +74,13 @@ type userIdentifiers struct { Mail string } +func getCacheWarmupManager(c *config.Config) (cache.Warmup, error) { + if f, ok := registry.NewFuncs[c.CacheWarmupDriver]; ok { + return f(c.CacheWarmupDrivers[c.CacheWarmupDriver]) + } + return nil, fmt.Errorf("driver not found: %s", c.CacheWarmupDriver) +} + // Init initializes this and any contained handlers func (h *Handler) Init(c *config.Config) error { h.gatewayAddr = c.GatewaySvc @@ -87,9 +96,27 @@ func (h *Handler) Init(c *config.Config) error { h.resourceInfoCache = gcache.New(c.ResourceInfoCacheSize).LFU().Build() + if h.resourceInfoCacheTTL > 0 { + cwm, err := getCacheWarmupManager(c) + if err == nil { + go h.startCacheWarmup(cwm) + } + } + return nil } +func (h *Handler) startCacheWarmup(c cache.Warmup) { + infos, err := c.GetResourceInfos() + if err != nil { + return + } + for _, r := range infos { + key := wrapResourceID(r.Id) + _ = h.resourceInfoCache.SetWithExpire(key, r, time.Second*h.resourceInfoCacheTTL) + } +} + func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { log := appctx.GetLogger(r.Context()) diff --git a/pkg/share/cache/cache.go b/pkg/share/cache/cache.go new file mode 100644 index 0000000000..8e2023873b --- /dev/null +++ b/pkg/share/cache/cache.go @@ -0,0 +1,28 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package cache + +import ( + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" +) + +// Warmup is the interface to implement cache warmup strategies. +type Warmup interface { + GetResourceInfos() ([]*provider.ResourceInfo, error) +} diff --git a/pkg/share/cache/cbox/cbox.go b/pkg/share/cache/cbox/cbox.go new file mode 100644 index 0000000000..925a553c2d --- /dev/null +++ b/pkg/share/cache/cbox/cbox.go @@ -0,0 +1,149 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package eos + +import ( + "context" + "database/sql" + "fmt" + + userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + "github.com/cs3org/reva/pkg/share/cache" + "github.com/cs3org/reva/pkg/share/cache/registry" + "github.com/cs3org/reva/pkg/storage/fs/eos" + "github.com/cs3org/reva/pkg/user" + "github.com/mitchellh/mapstructure" + "github.com/pkg/errors" + + // Provides mysql drivers + _ "github.com/go-sql-driver/mysql" +) + +func init() { + registry.Register("cbox", New) +} + +type config struct { + DbUsername string `mapstructure:"db_username"` + DbPassword string `mapstructure:"db_password"` + DbHost string `mapstructure:"db_host"` + DbPort int `mapstructure:"db_port"` + DbName string `mapstructure:"db_name"` + EOSNamespace string `mapstructure:"namespace"` + GatewaySvc string `mapstructure:"gatewaysvc"` +} + +type manager struct { + conf *config + db *sql.DB +} + +func parseConfig(m map[string]interface{}) (*config, error) { + c := &config{} + if err := mapstructure.Decode(m, c); err != nil { + err = errors.Wrap(err, "error decoding conf") + return nil, err + } + return c, nil +} + +// New returns a new implementation of the storage.FS interface that connects to EOS. +func New(m map[string]interface{}) (cache.Warmup, error) { + c, err := parseConfig(m) + if err != nil { + return nil, err + } + db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", c.DbUsername, c.DbPassword, c.DbHost, c.DbPort, c.DbName)) + if err != nil { + return nil, err + } + + return &manager{ + conf: c, + db: db, + }, nil +} + +func (m *manager) GetResourceInfos() ([]*provider.ResourceInfo, error) { + query := "select coalesce(fileid_prefix, '') as fileid_prefix, coalesce(item_source, '') as item_source FROM oc_share WHERE (orphan = 0 or orphan IS NULL)" + rows, err := m.db.Query(query) + if err != nil { + return nil, err + } + defer rows.Close() + + infos := []*provider.ResourceInfo{} + for rows.Next() { + var storageID, opaqueID string + if err := rows.Scan(&storageID, &opaqueID); err != nil { + continue + } + + eosOpts := map[string]interface{}{ + "namespace": m.conf.EOSNamespace, + "master_url": fmt.Sprintf("root://%s.cern.ch", storageID), + "version_invariant": true, + "gatewaysvc": m.conf.GatewaySvc, + } + eos, err := eos.New(eosOpts) + if err != nil { + return nil, err + } + + ctx := user.ContextSetUser(context.Background(), &userpb.User{ + Id: &userpb.UserId{ + OpaqueId: "root", + }, + Opaque: &types.Opaque{ + Map: map[string]*types.OpaqueEntry{ + "uid": &types.OpaqueEntry{ + Decoder: "plain", + Value: []byte("0"), + }, + "gid": &types.OpaqueEntry{ + Decoder: "plain", + Value: []byte("0"), + }, + }, + }, + }) + + inf, err := eos.GetMD(ctx, &provider.Reference{ + Spec: &provider.Reference_Id{ + Id: &provider.ResourceId{ + StorageId: storageID, + OpaqueId: opaqueID, + }, + }, + }, []string{}) + if err != nil { + return nil, err + } + infos = append(infos, inf) + } + + if err = rows.Err(); err != nil { + return nil, err + } + + return infos, nil + +} diff --git a/pkg/share/cache/registry/registry.go b/pkg/share/cache/registry/registry.go new file mode 100644 index 0000000000..ce9dff08b5 --- /dev/null +++ b/pkg/share/cache/registry/registry.go @@ -0,0 +1,34 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package registry + +import "github.com/cs3org/reva/pkg/share/cache" + +// NewFunc is the function that cache warmup implementations +// should register at init time. +type NewFunc func(map[string]interface{}) (cache.Warmup, error) + +// NewFuncs is a map containing all the registered cache warmup implementations. +var NewFuncs = map[string]NewFunc{} + +// Register registers a new cache warmup function. +// Not safe for concurrent use. Safe for use from package init. +func Register(name string, f NewFunc) { + NewFuncs[name] = f +} diff --git a/pkg/storage/fs/registry/registry.go b/pkg/storage/fs/registry/registry.go index b6eab9d52c..e9aa41100b 100644 --- a/pkg/storage/fs/registry/registry.go +++ b/pkg/storage/fs/registry/registry.go @@ -27,7 +27,7 @@ type NewFunc func(map[string]interface{}) (storage.FS, error) // NewFuncs is a map containing all the registered storage backends. var NewFuncs = map[string]NewFunc{} -// Register registers a new storage backend new function. +// Register registers a new storage backend function. // Not safe for concurrent use. Safe for use from package init. func Register(name string, f NewFunc) { NewFuncs[name] = f From 28500a8e0bb49f52f176c18b26f59d598c7cf0ab Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Fri, 7 May 2021 11:13:42 +0200 Subject: [PATCH 44/70] Mint scope-based access tokens for RBAC (#1669) --- changelog/unreleased/scope-based-tokens.md | 16 +++ examples/storage-references/gateway.toml | 6 + .../storage-references/storage-public.toml | 15 +++ go.mod | 2 +- go.sum | 4 +- internal/grpc/interceptors/auth/auth.go | 116 +++++++++++++++--- .../grpc/services/appprovider/appprovider.go | 4 + .../services/authprovider/authprovider.go | 7 +- .../grpc/services/gateway/authprovider.go | 14 +-- internal/http/interceptors/auth/auth.go | 16 ++- pkg/auth/auth.go | 3 +- pkg/auth/manager/demo/demo.go | 13 +- pkg/auth/manager/demo/demo_test.go | 4 +- pkg/auth/manager/impersonator/impersonator.go | 12 +- .../manager/impersonator/impersonator_test.go | 4 +- pkg/auth/manager/json/json.go | 13 +- pkg/auth/manager/json/json_test.go | 2 +- pkg/auth/manager/ldap/ldap.go | 28 +++-- pkg/auth/manager/oidc/oidc.go | 31 +++-- pkg/auth/manager/publicshares/publicshares.go | 48 ++++++-- pkg/auth/scope/publicshare.go | 100 +++++++++++++++ pkg/auth/scope/scope.go | 72 +++++++++++ pkg/auth/scope/user.go | 27 ++++ pkg/token/manager/demo/demo.go | 30 +++-- pkg/token/manager/demo/demo_test.go | 31 ++++- pkg/token/manager/jwt/jwt.go | 42 +++---- pkg/token/token.go | 8 +- pkg/utils/utils.go | 1 + .../integration/grpc/storageprovider_test.go | 5 +- tests/integration/grpc/userprovider_test.go | 8 +- 30 files changed, 556 insertions(+), 126 deletions(-) create mode 100644 changelog/unreleased/scope-based-tokens.md create mode 100644 examples/storage-references/storage-public.toml create mode 100644 pkg/auth/scope/publicshare.go create mode 100644 pkg/auth/scope/scope.go create mode 100644 pkg/auth/scope/user.go diff --git a/changelog/unreleased/scope-based-tokens.md b/changelog/unreleased/scope-based-tokens.md new file mode 100644 index 0000000000..16b46e469a --- /dev/null +++ b/changelog/unreleased/scope-based-tokens.md @@ -0,0 +1,16 @@ +Enhancement: Mint scope-based access tokens for RBAC + +Primarily, this PR is meant to introduce the concept of scopes into our tokens. +At the moment, it addresses those cases where we impersonate other users without +allowing the full scope of what the actual user has access to. + +A short explanation for how it works for public shares: +- We get the public share using the token provided by the client. +- In the public share, we know the resource ID, so we can add this to the +allowed scope, but not the path. +- However, later OCDav tries to access by path as well. Now this is not allowed +at the moment. However, from the allowed scope, we have the resource ID and +we're allowed to stat that. We stat the resource ID, get the path and if the +path matches the one passed by OCDav, we allow the request to go through. + +https://github.com/cs3org/reva/pull/1669 diff --git a/examples/storage-references/gateway.toml b/examples/storage-references/gateway.toml index bb486363fe..402935c9ee 100644 --- a/examples/storage-references/gateway.toml +++ b/examples/storage-references/gateway.toml @@ -9,10 +9,16 @@ home_provider = "/home" [grpc.services.storageregistry.drivers.static.rules] "/home" = {"address" = "localhost:17000"} "/reva" = {"address" = "localhost:18000"} +"/public" = {"address" = "localhost:16000"} "123e4567-e89b-12d3-a456-426655440000" = {"address" = "localhost:18000"} [grpc.services.authprovider] [grpc.services.authregistry] + +[grpc.services.authregistry.drivers.static.rules] +basic = "localhost:19000" +publicshares = "localhost:16000" + [grpc.services.userprovider] [grpc.services.usershareprovider] [grpc.services.groupprovider] diff --git a/examples/storage-references/storage-public.toml b/examples/storage-references/storage-public.toml new file mode 100644 index 0000000000..8d409908c5 --- /dev/null +++ b/examples/storage-references/storage-public.toml @@ -0,0 +1,15 @@ +[grpc] +address = "0.0.0.0:16000" + +[grpc.services.publicstorageprovider] +driver = "localhome" +mount_path = "/public" +mount_id = "123e4567-e89b-12d3-a456-426655440000" +data_server_url = "http://localhost:16001/data" +gateway_addr = "localhost:19000" + +[grpc.services.authprovider] +auth_manager = "publicshares" + +[grpc.services.authprovider.auth_managers.publicshares] +gateway_addr = "localhost:19000" diff --git a/go.mod b/go.mod index 412e9fb2ee..9165681f00 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/cheggaaa/pb v1.0.29 github.com/coreos/go-oidc v2.2.1+incompatible github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e - github.com/cs3org/go-cs3apis v0.0.0-20210325133324-32b03d75a535 + github.com/cs3org/go-cs3apis v0.0.0-20210507060801-f176760d55f4 github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/eventials/go-tus v0.0.0-20200718001131-45c7ec8f5d59 github.com/go-ldap/ldap/v3 v3.3.0 diff --git a/go.sum b/go.sum index aa1e5ecbc3..cdf48d25a6 100644 --- a/go.sum +++ b/go.sum @@ -144,8 +144,8 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e h1:tqSPWQeueWTKnJVMJffz4pz0o1WuQxJ28+5x5JgaHD8= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= -github.com/cs3org/go-cs3apis v0.0.0-20210325133324-32b03d75a535 h1:555D8A3ddKqb4OyK9v5mdphw2zDLWKGXOkcnf1RQwTA= -github.com/cs3org/go-cs3apis v0.0.0-20210325133324-32b03d75a535/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= +github.com/cs3org/go-cs3apis v0.0.0-20210507060801-f176760d55f4 h1:lihiUwqal+sO+57VTHGRvHbI9baN+D85fPZG2N1Sk6s= +github.com/cs3org/go-cs3apis v0.0.0-20210507060801-f176760d55f4/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAElF6hxnA= 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= diff --git a/internal/grpc/interceptors/auth/auth.go b/internal/grpc/interceptors/auth/auth.go index 849b458e83..9a2cda1bb7 100644 --- a/internal/grpc/interceptors/auth/auth.go +++ b/internal/grpc/interceptors/auth/auth.go @@ -20,10 +20,18 @@ package auth import ( "context" + "strings" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" + link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + registry "github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1" "github.com/cs3org/reva/pkg/appctx" + "github.com/cs3org/reva/pkg/auth/scope" "github.com/cs3org/reva/pkg/errtypes" + "github.com/cs3org/reva/pkg/rgrpc/todo/pool" + "github.com/cs3org/reva/pkg/sharedconf" "github.com/cs3org/reva/pkg/token" tokenmgr "github.com/cs3org/reva/pkg/token/manager/registry" "github.com/cs3org/reva/pkg/user" @@ -41,6 +49,7 @@ type config struct { // for SkipMethods. TokenManager string `mapstructure:"token_manager"` TokenManagers map[string]map[string]interface{} `mapstructure:"token_managers"` + GatewayAddr string `mapstructure:"gateway_addr"` } func parseConfig(m map[string]interface{}) (*config, error) { @@ -64,6 +73,7 @@ func NewUnary(m map[string]interface{}, unprotected []string) (grpc.UnaryServerI if conf.TokenManager == "" { conf.TokenManager = "jwt" } + conf.GatewayAddr = sharedconf.GetGatewaySVC(conf.GatewayAddr) h, ok := tokenmgr.NewFuncs[conf.TokenManager] if !ok { @@ -88,7 +98,7 @@ func NewUnary(m map[string]interface{}, unprotected []string) (grpc.UnaryServerI // to decide the storage provider. tkn, ok := token.ContextGetToken(ctx) if ok { - u, err := tokenManager.DismantleToken(ctx, tkn) + u, err := dismantleToken(ctx, tkn, req, tokenManager, conf.GatewayAddr) if err == nil { ctx = user.ContextSetUser(ctx, u) } @@ -105,10 +115,10 @@ func NewUnary(m map[string]interface{}, unprotected []string) (grpc.UnaryServerI return nil, status.Errorf(codes.Unauthenticated, "auth: core access token not found") } - // validate the token - u, err := tokenManager.DismantleToken(ctx, tkn) + // validate the token and ensure access to the resource is allowed + u, err := dismantleToken(ctx, tkn, req, tokenManager, conf.GatewayAddr) if err != nil { - log.Warn().Msg("access token is invalid") + log.Warn().Err(err).Msg("access token is invalid") return nil, status.Errorf(codes.Unauthenticated, "auth: core access token is invalid") } @@ -159,7 +169,7 @@ func NewStream(m map[string]interface{}, unprotected []string) (grpc.StreamServe // to decide the storage provider. tkn, ok := token.ContextGetToken(ctx) if ok { - u, err := tokenManager.DismantleToken(ctx, tkn) + u, err := dismantleToken(ctx, tkn, ss, tokenManager, conf.GatewayAddr) if err == nil { ctx = user.ContextSetUser(ctx, u) ss = newWrappedServerStream(ctx, ss) @@ -176,19 +186,13 @@ func NewStream(m map[string]interface{}, unprotected []string) (grpc.StreamServe return status.Errorf(codes.Unauthenticated, "auth: core access token not found") } - // validate the token - claims, err := tokenManager.DismantleToken(ctx, tkn) + // validate the token and ensure access to the resource is allowed + u, err := dismantleToken(ctx, tkn, ss, tokenManager, conf.GatewayAddr) if err != nil { - log.Warn().Msg("access token invalid") + log.Warn().Err(err).Msg("access token is invalid") return status.Errorf(codes.Unauthenticated, "auth: core access token is invalid") } - u := &userpb.User{} - if err := mapstructure.Decode(claims, u); err != nil { - log.Warn().Msg("user claims invalid") - return status.Errorf(codes.Unauthenticated, "auth: claims are invalid") - } - // store user and core access token in context. ctx = user.ContextSetUser(ctx, u) wrapped := newWrappedServerStream(ctx, ss) @@ -209,3 +213,87 @@ type wrappedServerStream struct { func (ss *wrappedServerStream) Context() context.Context { return ss.newCtx } + +func dismantleToken(ctx context.Context, tkn string, req interface{}, mgr token.Manager, gatewayAddr string) (*userpb.User, error) { + log := appctx.GetLogger(ctx) + u, tokenScope, err := mgr.DismantleToken(ctx, tkn) + if err != nil { + return nil, err + } + + // Check if access to the resource is in the scope of the token + ok, err := scope.VerifyScope(tokenScope, req) + if err != nil { + return nil, errtypes.InternalError("error verifying scope of access token") + } + if ok { + return u, nil + } + + // Check if req is of type *provider.Reference_Path + // If yes, the request might be coming from a share where the accessor is + // trying to impersonate the owner, since the share manager doesn't know the + // share path. + if ref, ok := extractRef(req); ok { + if ref.GetPath() != "" { + + // Try to extract the resource ID from the scope resource. + // Currently, we only check for public shares, but this will be extended + // for OCM shares, guest accounts, etc. + log.Info().Msgf("resolving path reference to ID to check token scope %+v", ref.GetPath()) + var share link.PublicShare + err = utils.UnmarshalJSONToProtoV1(tokenScope["publicshare"].Resource.Value, &share) + if err != nil { + return nil, err + } + + client, err := pool.GetGatewayServiceClient(gatewayAddr) + if err != nil { + return nil, err + } + + // Since the public share is obtained from the scope, the current token + // has access to it. + statReq := &provider.StatRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Id{Id: share.ResourceId}, + }, + } + + statResponse, err := client.Stat(ctx, statReq) + if err != nil || statResponse.Status.Code != rpc.Code_CODE_OK { + return nil, err + } + + if strings.HasPrefix(ref.GetPath(), statResponse.Info.Path) { + // The path corresponds to the resource to which the token has access. + // We allow access to it. + return u, nil + } + } + } + + return nil, err +} + +func extractRef(req interface{}) (*provider.Reference, bool) { + switch v := req.(type) { + case *registry.GetStorageProvidersRequest: + return v.GetRef(), true + case *provider.StatRequest: + return v.GetRef(), true + case *provider.ListContainerRequest: + return v.GetRef(), true + case *provider.CreateContainerRequest: + return v.GetRef(), true + case *provider.DeleteRequest: + return v.GetRef(), true + case *provider.MoveRequest: + return v.GetSource(), true + case *provider.InitiateFileDownloadRequest: + return v.GetRef(), true + case *provider.InitiateFileUploadRequest: + return v.GetRef(), true + } + return nil, false +} diff --git a/internal/grpc/services/appprovider/appprovider.go b/internal/grpc/services/appprovider/appprovider.go index 2fbe2426cc..b4b4867499 100644 --- a/internal/grpc/services/appprovider/appprovider.go +++ b/internal/grpc/services/appprovider/appprovider.go @@ -275,3 +275,7 @@ func (s *service) OpenFileInAppProvider(ctx context.Context, req *providerpb.Ope AppProviderUrl: appProviderURL, }, nil } + +func (s *service) OpenInApp(ctx context.Context, req *providerpb.OpenInAppRequest) (*providerpb.OpenInAppResponse, error) { + return nil, errtypes.NotSupported("Unimplemented") +} diff --git a/internal/grpc/services/authprovider/authprovider.go b/internal/grpc/services/authprovider/authprovider.go index 7dcf75f915..535e388a93 100644 --- a/internal/grpc/services/authprovider/authprovider.go +++ b/internal/grpc/services/authprovider/authprovider.go @@ -108,13 +108,14 @@ func (s *service) Authenticate(ctx context.Context, req *provider.AuthenticateRe username := req.ClientId password := req.ClientSecret - u, err := s.authmgr.Authenticate(ctx, username, password) + u, scope, err := s.authmgr.Authenticate(ctx, username, password) switch v := err.(type) { case nil: log.Info().Msgf("user %s authenticated", u.String()) return &provider.AuthenticateResponse{ - Status: status.NewOK(ctx), - User: u, + Status: status.NewOK(ctx), + User: u, + TokenScope: scope, }, nil case errtypes.InvalidCredentials: return &provider.AuthenticateResponse{ diff --git a/internal/grpc/services/gateway/authprovider.go b/internal/grpc/services/gateway/authprovider.go index 45db876824..847d0761e1 100644 --- a/internal/grpc/services/gateway/authprovider.go +++ b/internal/grpc/services/gateway/authprovider.go @@ -22,6 +22,7 @@ import ( "context" "fmt" + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" registry "github.com/cs3org/go-cs3apis/cs3/auth/registry/v1beta1" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" @@ -84,8 +85,7 @@ func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest }, nil } - uid := res.User.Id - if uid == nil { + if res.User.Id == nil { err := errtypes.NotFound("gateway: uid after Authenticate is nil") log.Err(err).Msg("user id is nil") return &gateway.AuthenticateResponse{ @@ -93,9 +93,7 @@ func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest }, nil } - user := res.User - - token, err := s.tokenmgr.MintToken(ctx, user) + token, err := s.tokenmgr.MintToken(ctx, res.User, res.TokenScope) if err != nil { err = errors.Wrap(err, "authsvc: error in MintToken") res := &gateway.AuthenticateResponse{ @@ -104,7 +102,7 @@ func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest return res, nil } - if s.c.DisableHomeCreationOnLogin { + if scope, ok := res.TokenScope["user"]; s.c.DisableHomeCreationOnLogin || !ok || scope.Role != authpb.Role_ROLE_OWNER { gwRes := &gateway.AuthenticateResponse{ Status: status.NewOK(ctx), User: res.User, @@ -116,7 +114,7 @@ func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest // we need to pass the token to authenticate the CreateHome request. // TODO(labkode): appending to existing context will not pass the token. ctx = tokenpkg.ContextSetToken(ctx, token) - ctx = userpkg.ContextSetUser(ctx, user) + ctx = userpkg.ContextSetUser(ctx, res.User) ctx = metadata.AppendToOutgoingContext(ctx, tokenpkg.TokenHeader, token) // TODO(jfd): hardcoded metadata key. use PerRPCCredentials? // create home directory @@ -145,7 +143,7 @@ func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest } func (s *svc) WhoAmI(ctx context.Context, req *gateway.WhoAmIRequest) (*gateway.WhoAmIResponse, error) { - u, err := s.tokenmgr.DismantleToken(ctx, req.Token) + u, _, err := s.tokenmgr.DismantleToken(ctx, req.Token) if err != nil { err = errors.Wrap(err, "gateway: error getting user from token") return &gateway.WhoAmIResponse{ diff --git a/internal/http/interceptors/auth/auth.go b/internal/http/interceptors/auth/auth.go index 37bd8ae0d9..a8e8d90e2b 100644 --- a/internal/http/interceptors/auth/auth.go +++ b/internal/http/interceptors/auth/auth.go @@ -23,13 +23,13 @@ import ( "net/http" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" - userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" "github.com/cs3org/reva/internal/http/interceptors/auth/credential/registry" tokenregistry "github.com/cs3org/reva/internal/http/interceptors/auth/token/registry" tokenwriterregistry "github.com/cs3org/reva/internal/http/interceptors/auth/tokenwriter/registry" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/auth" + "github.com/cs3org/reva/pkg/auth/scope" "github.com/cs3org/reva/pkg/rgrpc/status" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" "github.com/cs3org/reva/pkg/rhttp/global" @@ -234,16 +234,20 @@ func New(m map[string]interface{}, unprotected []string) (global.Middleware, err } // validate token - claims, err := tokenManager.DismantleToken(r.Context(), tkn) + u, tokenScope, err := tokenManager.DismantleToken(r.Context(), tkn) if err != nil { log.Error().Err(err).Msg("error dismantling token") w.WriteHeader(http.StatusUnauthorized) return } - - u := &userpb.User{} - if err := mapstructure.Decode(claims, u); err != nil { - log.Error().Err(err).Msg("error decoding user claims") + // ensure access to the resource is allowed + ok, err := scope.VerifyScope(tokenScope, r.URL.Path) + if err != nil { + log.Error().Err(err).Msg("error verifying scope of access token") + w.WriteHeader(http.StatusInternalServerError) + } + if !ok { + log.Error().Err(err).Msg("access to resource not allowed") w.WriteHeader(http.StatusUnauthorized) return } diff --git a/pkg/auth/auth.go b/pkg/auth/auth.go index 01ecbd4b93..8714099683 100644 --- a/pkg/auth/auth.go +++ b/pkg/auth/auth.go @@ -22,13 +22,14 @@ import ( "context" "net/http" + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" registry "github.com/cs3org/go-cs3apis/cs3/auth/registry/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" ) // Manager is the interface to implement to authenticate users type Manager interface { - Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, error) + Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, map[string]*authpb.Scope, error) } // Credentials contains the auth type, client id and secret. diff --git a/pkg/auth/manager/demo/demo.go b/pkg/auth/manager/demo/demo.go index 987ac2437e..d6807d0286 100644 --- a/pkg/auth/manager/demo/demo.go +++ b/pkg/auth/manager/demo/demo.go @@ -21,9 +21,11 @@ package demo import ( "context" + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/auth" "github.com/cs3org/reva/pkg/auth/manager/registry" + "github.com/cs3org/reva/pkg/auth/scope" "github.com/cs3org/reva/pkg/errtypes" ) @@ -48,13 +50,18 @@ func New(m map[string]interface{}) (auth.Manager, error) { return &manager{credentials: creds}, nil } -func (m *manager) Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, error) { +func (m *manager) Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, map[string]*authpb.Scope, error) { + scope, err := scope.GetOwnerScope() + if err != nil { + return nil, nil, err + } + if c, ok := m.credentials[clientID]; ok { if c.Secret == clientSecret { - return c.User, nil + return c.User, scope, nil } } - return nil, errtypes.InvalidCredentials(clientID) + return nil, nil, errtypes.InvalidCredentials(clientID) } func getCredentials() map[string]Credentials { diff --git a/pkg/auth/manager/demo/demo_test.go b/pkg/auth/manager/demo/demo_test.go index 5b5c5e0f31..2b73d153c9 100644 --- a/pkg/auth/manager/demo/demo_test.go +++ b/pkg/auth/manager/demo/demo_test.go @@ -30,13 +30,13 @@ func TestUserManager(t *testing.T) { manager, _ := New(nil) // Authenticate - positive test - _, err := manager.Authenticate(ctx, "einstein", "relativity") + _, _, err := manager.Authenticate(ctx, "einstein", "relativity") if err != nil { t.Fatalf("error while authenticate with correct credentials") } // Authenticate - negative test - _, err = manager.Authenticate(ctx, "einstein", "NotARealPassword") + _, _, err = manager.Authenticate(ctx, "einstein", "NotARealPassword") if err == nil { t.Fatalf("no error (but we expected one) while authenticate with bad credentials") } diff --git a/pkg/auth/manager/impersonator/impersonator.go b/pkg/auth/manager/impersonator/impersonator.go index 7478851c5b..68bab32836 100644 --- a/pkg/auth/manager/impersonator/impersonator.go +++ b/pkg/auth/manager/impersonator/impersonator.go @@ -22,9 +22,11 @@ import ( "context" "strings" + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/auth" "github.com/cs3org/reva/pkg/auth/manager/registry" + "github.com/cs3org/reva/pkg/auth/scope" ) func init() { @@ -38,7 +40,7 @@ func New(c map[string]interface{}) (auth.Manager, error) { return &mgr{}, nil } -func (m *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, error) { +func (m *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, map[string]*authpb.Scope, error) { // allow passing in uid as @ at := strings.LastIndex(clientID, "@") uid := &user.UserId{} @@ -48,8 +50,14 @@ func (m *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) ( uid.OpaqueId = clientID[:at] uid.Idp = clientID[at+1:] } + + scope, err := scope.GetOwnerScope() + if err != nil { + return nil, nil, err + } + return &user.User{ Id: uid, // not much else to provide - }, nil + }, scope, nil } diff --git a/pkg/auth/manager/impersonator/impersonator_test.go b/pkg/auth/manager/impersonator/impersonator_test.go index 41713cd4e4..31fabefab1 100644 --- a/pkg/auth/manager/impersonator/impersonator_test.go +++ b/pkg/auth/manager/impersonator/impersonator_test.go @@ -26,7 +26,7 @@ import ( func TestImpersonator(t *testing.T) { ctx := context.Background() i, _ := New(nil) - u, err := i.Authenticate(ctx, "admin", "pwd") + u, _, err := i.Authenticate(ctx, "admin", "pwd") if err != nil { t.Fatal(err) } @@ -39,7 +39,7 @@ func TestImpersonator(t *testing.T) { } ctx = context.Background() - u, err = i.Authenticate(ctx, "opaqueid@idp", "pwd") + u, _, err = i.Authenticate(ctx, "opaqueid@idp", "pwd") if err != nil { t.Fatal(err) } diff --git a/pkg/auth/manager/json/json.go b/pkg/auth/manager/json/json.go index b88f39432e..6d8607ca98 100644 --- a/pkg/auth/manager/json/json.go +++ b/pkg/auth/manager/json/json.go @@ -23,10 +23,12 @@ import ( "encoding/json" "io/ioutil" + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" typespb "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" "github.com/cs3org/reva/pkg/auth" "github.com/cs3org/reva/pkg/auth/manager/registry" + "github.com/cs3org/reva/pkg/auth/scope" "github.com/cs3org/reva/pkg/errtypes" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" @@ -101,7 +103,12 @@ func New(m map[string]interface{}) (auth.Manager, error) { return manager, nil } -func (m *manager) Authenticate(ctx context.Context, username string, secret string) (*user.User, error) { +func (m *manager) Authenticate(ctx context.Context, username string, secret string) (*user.User, map[string]*authpb.Scope, error) { + scope, err := scope.GetOwnerScope() + if err != nil { + return nil, nil, err + } + if c, ok := m.credentials[username]; ok { if c.Secret == secret { return &user.User{ @@ -113,8 +120,8 @@ func (m *manager) Authenticate(ctx context.Context, username string, secret stri Groups: c.Groups, Opaque: c.Opaque, // TODO add arbitrary keys as opaque data - }, nil + }, scope, nil } } - return nil, errtypes.InvalidCredentials(username) + return nil, nil, errtypes.InvalidCredentials(username) } diff --git a/pkg/auth/manager/json/json_test.go b/pkg/auth/manager/json/json_test.go index 4e9ee1e50f..fa867dfaec 100644 --- a/pkg/auth/manager/json/json_test.go +++ b/pkg/auth/manager/json/json_test.go @@ -190,7 +190,7 @@ func TestGetAuthenticatedManager(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - authenticated, err := manager.Authenticate(ctx, tt.username, tt.secret) + authenticated, _, err := manager.Authenticate(ctx, tt.username, tt.secret) if !tt.expectAuthenticated { assert.Empty(t, authenticated) assert.EqualError(t, err, tt.expectedError.message) diff --git a/pkg/auth/manager/ldap/ldap.go b/pkg/auth/manager/ldap/ldap.go index 4a490937c3..bc2ef623b8 100644 --- a/pkg/auth/manager/ldap/ldap.go +++ b/pkg/auth/manager/ldap/ldap.go @@ -24,12 +24,14 @@ import ( "fmt" "strings" + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/auth" "github.com/cs3org/reva/pkg/auth/manager/registry" + "github.com/cs3org/reva/pkg/auth/scope" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/logger" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" @@ -122,12 +124,12 @@ func New(m map[string]interface{}) (auth.Manager, error) { }, nil } -func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, error) { +func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, map[string]*authpb.Scope, error) { log := appctx.GetLogger(ctx) l, err := ldap.DialTLS("tcp", fmt.Sprintf("%s:%d", am.c.Hostname, am.c.Port), &tls.Config{InsecureSkipVerify: true}) if err != nil { - return nil, err + return nil, nil, err } defer l.Close() @@ -135,7 +137,7 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) err = l.Bind(am.c.BindUsername, am.c.BindPassword) if err != nil { log.Error().Err(err).Msg("bind with system user failed") - return nil, err + return nil, nil, err } // Search for the given clientID @@ -149,11 +151,11 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) sr, err := l.Search(searchRequest) if err != nil { - return nil, err + return nil, nil, err } if len(sr.Entries) != 1 { - return nil, errtypes.NotFound(clientID) + return nil, nil, errtypes.NotFound(clientID) } userdn := sr.Entries[0].DN @@ -162,7 +164,7 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) err = l.Bind(userdn, clientSecret) if err != nil { log.Debug().Err(err).Interface("userdn", userdn).Msg("bind with user credentials failed") - return nil, err + return nil, nil, err } userID := &user.UserId{ @@ -171,16 +173,16 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) } gwc, err := pool.GetGatewayServiceClient(am.c.GatewaySvc) if err != nil { - return nil, errors.Wrap(err, "ldap: error getting gateway grpc client") + return nil, nil, errors.Wrap(err, "ldap: error getting gateway grpc client") } getGroupsResp, err := gwc.GetUserGroups(ctx, &user.GetUserGroupsRequest{ UserId: userID, }) if err != nil { - return nil, errors.Wrap(err, "ldap: error getting user groups") + return nil, nil, errors.Wrap(err, "ldap: error getting user groups") } if getGroupsResp.Status.Code != rpc.Code_CODE_OK { - return nil, errors.Wrap(err, "ldap: grpc getting user groups failed") + return nil, nil, errors.Wrap(err, "ldap: grpc getting user groups failed") } u := &user.User{ @@ -204,9 +206,15 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) }, }, } + + scope, err := scope.GetOwnerScope() + if err != nil { + return nil, nil, err + } + log.Debug().Interface("entry", sr.Entries[0]).Interface("user", u).Msg("authenticated user") - return u, nil + return u, scope, nil } diff --git a/pkg/auth/manager/oidc/oidc.go b/pkg/auth/manager/oidc/oidc.go index 9690c548e0..39c4a690e8 100644 --- a/pkg/auth/manager/oidc/oidc.go +++ b/pkg/auth/manager/oidc/oidc.go @@ -26,11 +26,13 @@ import ( "time" oidc "github.com/coreos/go-oidc" + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" "github.com/cs3org/reva/pkg/auth" "github.com/cs3org/reva/pkg/auth/manager/registry" + "github.com/cs3org/reva/pkg/auth/scope" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" "github.com/cs3org/reva/pkg/rhttp" "github.com/cs3org/reva/pkg/sharedconf" @@ -90,27 +92,27 @@ func New(m map[string]interface{}) (auth.Manager, error) { // the clientID it would be empty as we only need to validate the clientSecret variable // which contains the access token that we can use to contact the UserInfo endpoint // and get the user claims. -func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, error) { +func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) (*user.User, map[string]*authpb.Scope, error) { ctx = am.getOAuthCtx(ctx) - provider, err := am.getOIDCProvider(ctx) + oidcProvider, err := am.getOIDCProvider(ctx) if err != nil { - return nil, fmt.Errorf("error creating oidc provider: +%v", err) + return nil, nil, fmt.Errorf("error creating oidc provider: +%v", err) } oauth2Token := &oauth2.Token{ AccessToken: clientSecret, } - userInfo, err := provider.UserInfo(ctx, oauth2.StaticTokenSource(oauth2Token)) + userInfo, err := oidcProvider.UserInfo(ctx, oauth2.StaticTokenSource(oauth2Token)) if err != nil { - return nil, fmt.Errorf("oidc: error getting userinfo: +%v", err) + return nil, nil, fmt.Errorf("oidc: error getting userinfo: +%v", err) } // claims contains the standard OIDC claims like issuer, iat, aud, ... and any other non-standard one. // TODO(labkode): make claims configuration dynamic from the config file so we can add arbitrary mappings from claims to user struct. var claims map[string]interface{} if err := userInfo.Claims(&claims); err != nil { - return nil, fmt.Errorf("oidc: error unmarshaling userinfo claims: %v", err) + return nil, nil, fmt.Errorf("oidc: error unmarshaling userinfo claims: %v", err) } log.Debug().Interface("claims", claims).Interface("userInfo", userInfo).Msg("unmarshalled userinfo") @@ -122,11 +124,11 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) } if claims["email"] == nil { - return nil, fmt.Errorf("no \"email\" attribute found in userinfo: maybe the client did not request the oidc \"email\"-scope") + return nil, nil, fmt.Errorf("no \"email\" attribute found in userinfo: maybe the client did not request the oidc \"email\"-scope") } if claims["preferred_username"] == nil || claims["name"] == nil { - return nil, fmt.Errorf("no \"preferred_username\" or \"name\" attribute found in userinfo: maybe the client did not request the oidc \"profile\"-scope") + return nil, nil, fmt.Errorf("no \"preferred_username\" or \"name\" attribute found in userinfo: maybe the client did not request the oidc \"profile\"-scope") } opaqueObj := &types.Opaque{ @@ -157,16 +159,16 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) } gwc, err := pool.GetGatewayServiceClient(am.c.GatewaySvc) if err != nil { - return nil, errors.Wrap(err, "oidc: error getting gateway grpc client") + return nil, nil, errors.Wrap(err, "oidc: error getting gateway grpc client") } getGroupsResp, err := gwc.GetUserGroups(ctx, &user.GetUserGroupsRequest{ UserId: userID, }) if err != nil { - return nil, errors.Wrap(err, "oidc: error getting user groups") + return nil, nil, errors.Wrap(err, "oidc: error getting user groups") } if getGroupsResp.Status.Code != rpc.Code_CODE_OK { - return nil, errors.Wrap(err, "oidc: grpc getting user groups failed") + return nil, nil, errors.Wrap(err, "oidc: grpc getting user groups failed") } u := &user.User{ @@ -183,7 +185,12 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) Opaque: opaqueObj, } - return u, nil + scope, err := scope.GetOwnerScope() + if err != nil { + return nil, nil, err + } + + return u, scope, nil } func (am *mgr) getOAuthCtx(ctx context.Context) context.Context { diff --git a/pkg/auth/manager/publicshares/publicshares.go b/pkg/auth/manager/publicshares/publicshares.go index fdffdaf5a1..3dc074f1d3 100644 --- a/pkg/auth/manager/publicshares/publicshares.go +++ b/pkg/auth/manager/publicshares/publicshares.go @@ -23,15 +23,17 @@ import ( "strings" "time" + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" userprovider "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpcv1beta1 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1" - typesv1beta1 "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" "github.com/cs3org/reva/pkg/auth" "github.com/cs3org/reva/pkg/auth/manager/registry" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" + "github.com/cs3org/reva/pkg/utils" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" ) @@ -69,10 +71,10 @@ func New(m map[string]interface{}) (auth.Manager, error) { }, nil } -func (m *manager) Authenticate(ctx context.Context, token, secret string) (*user.User, error) { +func (m *manager) Authenticate(ctx context.Context, token, secret string) (*user.User, map[string]*authpb.Scope, error) { gwConn, err := pool.GetGatewayServiceClient(m.c.GatewayAddr) if err != nil { - return nil, err + return nil, nil, err } var auth *link.PublicShareAuthentication @@ -93,7 +95,7 @@ func (m *manager) Authenticate(ctx context.Context, token, secret string) (*user Spec: &link.PublicShareAuthentication_Signature{ Signature: &link.ShareSignature{ Signature: sig, - SignatureExpiration: &typesv1beta1.Timestamp{ + SignatureExpiration: &types.Timestamp{ Seconds: uint64(exp.UnixNano() / 1000000000), Nanos: uint32(exp.UnixNano() % 1000000000), }, @@ -109,23 +111,49 @@ func (m *manager) Authenticate(ctx context.Context, token, secret string) (*user }) switch { case err != nil: - return nil, err + return nil, nil, err case publicShareResponse.Status.Code == rpcv1beta1.Code_CODE_NOT_FOUND: - return nil, errtypes.NotFound(publicShareResponse.Status.Message) + return nil, nil, errtypes.NotFound(publicShareResponse.Status.Message) case publicShareResponse.Status.Code == rpcv1beta1.Code_CODE_PERMISSION_DENIED: - return nil, errtypes.InvalidCredentials(publicShareResponse.Status.Message) + return nil, nil, errtypes.InvalidCredentials(publicShareResponse.Status.Message) case publicShareResponse.Status.Code != rpcv1beta1.Code_CODE_OK: - return nil, errtypes.InternalError(publicShareResponse.Status.Message) + return nil, nil, errtypes.InternalError(publicShareResponse.Status.Message) } getUserResponse, err := gwConn.GetUser(ctx, &userprovider.GetUserRequest{ UserId: publicShareResponse.GetShare().GetCreator(), }) if err != nil { - return nil, err + return nil, nil, err + } + + scope, err := m.getScope(ctx, publicShareResponse.GetShare()) + if err != nil { + return nil, nil, err } - return getUserResponse.GetUser(), nil + return getUserResponse.GetUser(), scope, nil +} + +func (m *manager) getScope(ctx context.Context, share *link.PublicShare) (map[string]*authpb.Scope, error) { + role := authpb.Role_ROLE_VIEWER + if share.Permissions.Permissions.InitiateFileUpload { + role = authpb.Role_ROLE_EDITOR + } + + val, err := utils.MarshalProtoV1ToJSON(share) + if err != nil { + return nil, err + } + return map[string]*authpb.Scope{ + "publicshare": &authpb.Scope{ + Resource: &types.OpaqueEntry{ + Decoder: "json", + Value: val, + }, + Role: role, + }, + }, nil } // ErrPasswordNotProvided is returned when the public share is password protected, but there was no password on the request diff --git a/pkg/auth/scope/publicshare.go b/pkg/auth/scope/publicshare.go new file mode 100644 index 0000000000..b88f48c78a --- /dev/null +++ b/pkg/auth/scope/publicshare.go @@ -0,0 +1,100 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package scope + +import ( + "fmt" + "strings" + + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" + link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + registry "github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1" + "github.com/cs3org/reva/pkg/errtypes" + "github.com/cs3org/reva/pkg/utils" +) + +func publicshareScope(scope *authpb.Scope, resource interface{}) (bool, error) { + var share link.PublicShare + err := utils.UnmarshalJSONToProtoV1(scope.Resource.Value, &share) + if err != nil { + return false, err + } + + switch v := resource.(type) { + // Viewer role + case *registry.GetStorageProvidersRequest: + return checkStorageRef(&share, v.GetRef()), nil + case *provider.StatRequest: + return checkStorageRef(&share, v.GetRef()), nil + case *provider.ListContainerRequest: + return checkStorageRef(&share, v.GetRef()), nil + case *provider.InitiateFileDownloadRequest: + return checkStorageRef(&share, v.GetRef()), nil + + // Editor role + // TODO(ishank011): Add role checks, + // need to return appropriate status codes in the ocs/ocdav layers. + case *provider.CreateContainerRequest: + return checkStorageRef(&share, v.GetRef()), nil + case *provider.DeleteRequest: + return checkStorageRef(&share, v.GetRef()), nil + case *provider.MoveRequest: + return checkStorageRef(&share, v.GetSource()) && checkStorageRef(&share, v.GetDestination()), nil + case *provider.InitiateFileUploadRequest: + return checkStorageRef(&share, v.GetRef()), nil + + case *link.GetPublicShareRequest: + return checkPublicShareRef(&share, v.GetRef()), nil + case string: + return checkPath(&share, v), nil + } + + return false, errtypes.InternalError(fmt.Sprintf("resource type assertion failed: %+v", resource)) +} + +func checkStorageRef(s *link.PublicShare, r *provider.Reference) bool { + // ref: > + if r.GetId() != nil { + return s.ResourceId.StorageId == r.GetId().StorageId && s.ResourceId.OpaqueId == r.GetId().OpaqueId + } + // ref: + if strings.HasPrefix(r.GetPath(), "/public/"+s.Token) { + return true + } + return false +} + +func checkPublicShareRef(s *link.PublicShare, ref *link.PublicShareReference) bool { + // ref: + return ref.GetToken() == s.Token +} + +func checkPath(s *link.PublicShare, path string) bool { + paths := []string{ + "/dataprovider", + "/data", + } + for _, p := range paths { + if strings.HasPrefix(path, p) { + return true + } + } + return false +} diff --git a/pkg/auth/scope/scope.go b/pkg/auth/scope/scope.go new file mode 100644 index 0000000000..42ba65c11f --- /dev/null +++ b/pkg/auth/scope/scope.go @@ -0,0 +1,72 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package scope + +import ( + authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + "github.com/cs3org/reva/pkg/utils" +) + +// Verifier is the function signature which every scope verifier should implement. +type Verifier func(*authpb.Scope, interface{}) (bool, error) + +var supportedScopes = map[string]Verifier{ + "user": userScope, + "publicshare": publicshareScope, +} + +// VerifyScope is the function to be called when dismantling tokens to check if +// the token has access to a particular resource. +func VerifyScope(scopeMap map[string]*authpb.Scope, resource interface{}) (bool, error) { + for k, scope := range scopeMap { + verifierFunc := supportedScopes[k] + valid, err := verifierFunc(scope, resource) + if err != nil { + continue + } + if valid { + return true, nil + } + } + return false, nil +} + +// GetOwnerScope returns the default owner scope with access to all resources. +func GetOwnerScope() (map[string]*authpb.Scope, error) { + ref := &provider.Reference{ + Spec: &provider.Reference_Path{ + Path: "/", + }, + } + val, err := utils.MarshalProtoV1ToJSON(ref) + if err != nil { + return nil, err + } + return map[string]*authpb.Scope{ + "user": &authpb.Scope{ + Resource: &types.OpaqueEntry{ + Decoder: "json", + Value: val, + }, + Role: authpb.Role_ROLE_OWNER, + }, + }, nil +} diff --git a/pkg/auth/scope/user.go b/pkg/auth/scope/user.go new file mode 100644 index 0000000000..f885a43ba8 --- /dev/null +++ b/pkg/auth/scope/user.go @@ -0,0 +1,27 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package scope + +import authpb "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" + +func userScope(scope *authpb.Scope, resource interface{}) (bool, error) { + // Always return true. Registered users can access all paths. + // TODO(ishank011): Add checks for read/write permissions. + return true, nil +} diff --git a/pkg/token/manager/demo/demo.go b/pkg/token/manager/demo/demo.go index 08ae96312c..a200de0898 100644 --- a/pkg/token/manager/demo/demo.go +++ b/pkg/token/manager/demo/demo.go @@ -24,6 +24,7 @@ import ( "encoding/base64" "encoding/gob" + auth "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/token" "github.com/cs3org/reva/pkg/token/manager/registry" @@ -42,28 +43,33 @@ func New(m map[string]interface{}) (token.Manager, error) { type manager struct{} -func (m *manager) MintToken(ctx context.Context, u *user.User) (string, error) { - token, err := encode(u) +type claims struct { + User *user.User `json:"user"` + Scope map[string]*auth.Scope `json:"scope"` +} + +func (m *manager) MintToken(ctx context.Context, u *user.User, scope map[string]*auth.Scope) (string, error) { + token, err := encode(&claims{u, scope}) if err != nil { return "", errors.Wrap(err, "error encoding user") } return token, nil } -func (m *manager) DismantleToken(ctx context.Context, token string) (*user.User, error) { - u, err := decode(token) +func (m *manager) DismantleToken(ctx context.Context, token string) (*user.User, map[string]*auth.Scope, error) { + c, err := decode(token) if err != nil { - return nil, errors.Wrap(err, "error decoding claims") + return nil, nil, errors.Wrap(err, "error decoding claims") } - return u, nil + return c.User, c.Scope, nil } // from https://stackoverflow.com/questions/28020070/golang-serialize-and-deserialize-back // go binary encoder -func encode(u *user.User) (string, error) { +func encode(c *claims) (string, error) { b := bytes.Buffer{} e := gob.NewEncoder(&b) - err := e.Encode(u) + err := e.Encode(c) if err != nil { return "", err } @@ -72,8 +78,8 @@ func encode(u *user.User) (string, error) { // from https://stackoverflow.com/questions/28020070/golang-serialize-and-deserialize-back // go binary decoder -func decode(token string) (*user.User, error) { - u := &user.User{} +func decode(token string) (*claims, error) { + c := &claims{} by, err := base64.StdEncoding.DecodeString(token) if err != nil { return nil, err @@ -81,9 +87,9 @@ func decode(token string) (*user.User, error) { b := bytes.Buffer{} b.Write(by) d := gob.NewDecoder(&b) - err = d.Decode(&u) + err = d.Decode(&c) if err != nil { return nil, err } - return u, nil + return c, nil } diff --git a/pkg/token/manager/demo/demo_test.go b/pkg/token/manager/demo/demo_test.go index 684be5887b..964b49fe47 100644 --- a/pkg/token/manager/demo/demo_test.go +++ b/pkg/token/manager/demo/demo_test.go @@ -20,9 +20,13 @@ package demo import ( "context" + "encoding/json" "testing" + auth "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" ) var ctx = context.Background() @@ -33,12 +37,31 @@ func TestEncodeDecode(t *testing.T) { Username: "marie", } - encoded, err := m.MintToken(ctx, u) + ref := &provider.Reference{ + Spec: &provider.Reference_Path{ + Path: "/", + }, + } + val, err := json.Marshal(ref) + if err != nil { + t.Fatal(err) + } + scope := map[string]*auth.Scope{ + "user": &auth.Scope{ + Resource: &types.OpaqueEntry{ + Decoder: "json", + Value: val, + }, + Role: auth.Role_ROLE_OWNER, + }, + } + + encoded, err := m.MintToken(ctx, u, scope) if err != nil { t.Fatal(err) } - decodedUser, err := m.DismantleToken(ctx, encoded) + decodedUser, decodedScope, err := m.DismantleToken(ctx, encoded) if err != nil { t.Fatal(err) } @@ -46,4 +69,8 @@ func TestEncodeDecode(t *testing.T) { if u.Username != decodedUser.Username { t.Fatalf("mail claims differ: expected=%s got=%s", u.Username, decodedUser.Username) } + + if s, ok := decodedScope["user"]; !ok || s.Role != auth.Role_ROLE_OWNER { + t.Fatalf("scope claims differ: expected=%s got=%s", scope, decodedScope) + } } diff --git a/pkg/token/manager/jwt/jwt.go b/pkg/token/manager/jwt/jwt.go index 7ff7a72abf..d31cbfafc6 100644 --- a/pkg/token/manager/jwt/jwt.go +++ b/pkg/token/manager/jwt/jwt.go @@ -22,6 +22,7 @@ import ( "context" "time" + auth "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/sharedconf" @@ -43,6 +44,17 @@ type config struct { Expires int64 `mapstructure:"expires"` } +type manager struct { + conf *config +} + +// claims are custom claims for the JWT token. +type claims struct { + jwt.StandardClaims + User *user.User `json:"user"` + Scope map[string]*auth.Scope `json:"scope"` +} + func parseConfig(m map[string]interface{}) (*config, error) { c := &config{} if err := mapstructure.Decode(m, c); err != nil { @@ -73,23 +85,7 @@ func New(value map[string]interface{}) (token.Manager, error) { return m, nil } -type manager struct { - conf *config -} - -// claims are custom claims for the JWT token. -type claims struct { - jwt.StandardClaims - User *user.User `json:"user"` -} - -// TODO(labkode): resulting JSON contains internal protobuf fields: -// "Username": "einstein", -// "XXX_NoUnkeyedLiteral": {}, -// "XXX_sizecache": 0, -// "XXX_unrecognized": null -//} -func (m *manager) MintToken(ctx context.Context, u *user.User) (string, error) { +func (m *manager) MintToken(ctx context.Context, u *user.User, scope map[string]*auth.Scope) (string, error) { ttl := time.Duration(m.conf.Expires) * time.Second claims := claims{ StandardClaims: jwt.StandardClaims{ @@ -98,7 +94,8 @@ func (m *manager) MintToken(ctx context.Context, u *user.User) (string, error) { Audience: "reva", IssuedAt: time.Now().Unix(), }, - User: u, + User: u, + Scope: scope, } t := jwt.NewWithClaims(jwt.GetSigningMethod("HS256"), claims) @@ -111,19 +108,18 @@ func (m *manager) MintToken(ctx context.Context, u *user.User) (string, error) { return tkn, nil } -func (m *manager) DismantleToken(ctx context.Context, tkn string) (*user.User, error) { +func (m *manager) DismantleToken(ctx context.Context, tkn string) (*user.User, map[string]*auth.Scope, error) { token, err := jwt.ParseWithClaims(tkn, &claims{}, func(token *jwt.Token) (interface{}, error) { return []byte(m.conf.Secret), nil }) if err != nil { - return nil, errors.Wrap(err, "error parsing token") + return nil, nil, errors.Wrap(err, "error parsing token") } if claims, ok := token.Claims.(*claims); ok && token.Valid { - return claims.User, nil + return claims.User, claims.Scope, nil } - err = errtypes.InvalidCredentials("token invalid") - return nil, err + return nil, nil, errtypes.InvalidCredentials("invalid token") } diff --git a/pkg/token/token.go b/pkg/token/token.go index 0d1c14f455..61b81533e7 100644 --- a/pkg/token/token.go +++ b/pkg/token/token.go @@ -21,6 +21,7 @@ package token import ( "context" + auth "github.com/cs3org/go-cs3apis/cs3/auth/provider/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" ) @@ -32,13 +33,10 @@ type key int const tokenKey key = iota -// Claims is the map of attributes to encode into a token -type Claims map[string]interface{} - // Manager is the interface to implement to sign and verify tokens type Manager interface { - MintToken(ctx context.Context, u *user.User) (string, error) - DismantleToken(ctx context.Context, token string) (*user.User, error) + MintToken(ctx context.Context, u *user.User, scope map[string]*auth.Scope) (string, error) + DismantleToken(ctx context.Context, token string) (*user.User, map[string]*auth.Scope, error) } // ContextGetToken returns the token if set in the given context. diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index deeaa0720a..fc6d1007e9 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -110,6 +110,7 @@ func ResolvePath(path string) (string, error) { // RandString is a helper to create tokens. func RandString(n int) string { + rand.Seed(time.Now().UTC().UnixNano()) var l = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") b := make([]rune, n) for i := range b { diff --git a/tests/integration/grpc/storageprovider_test.go b/tests/integration/grpc/storageprovider_test.go index e06f32327e..2dba78c7f9 100644 --- a/tests/integration/grpc/storageprovider_test.go +++ b/tests/integration/grpc/storageprovider_test.go @@ -29,6 +29,7 @@ import ( userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpcv1beta1 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" storagep "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/cs3org/reva/pkg/auth/scope" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" "github.com/cs3org/reva/pkg/storage/fs/ocis" "github.com/cs3org/reva/pkg/storage/fs/owncloud" @@ -90,7 +91,9 @@ var _ = Describe("storage providers", func() { // Add auth token tokenManager, err := jwt.New(map[string]interface{}{"secret": "changemeplease"}) Expect(err).ToNot(HaveOccurred()) - t, err := tokenManager.MintToken(ctx, user) + scope, err := scope.GetOwnerScope() + Expect(err).ToNot(HaveOccurred()) + t, err := tokenManager.MintToken(ctx, user, scope) Expect(err).ToNot(HaveOccurred()) ctx = token.ContextSetToken(ctx, t) ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t) diff --git a/tests/integration/grpc/userprovider_test.go b/tests/integration/grpc/userprovider_test.go index e69771a5e9..21f64d44b0 100644 --- a/tests/integration/grpc/userprovider_test.go +++ b/tests/integration/grpc/userprovider_test.go @@ -23,12 +23,12 @@ import ( userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" - "google.golang.org/grpc/metadata" - + "github.com/cs3org/reva/pkg/auth/scope" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" "github.com/cs3org/reva/pkg/token" jwt "github.com/cs3org/reva/pkg/token/manager/jwt" ruser "github.com/cs3org/reva/pkg/user" + "google.golang.org/grpc/metadata" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -58,7 +58,9 @@ var _ = Describe("user providers", func() { } tokenManager, err := jwt.New(map[string]interface{}{"secret": "changemeplease"}) Expect(err).ToNot(HaveOccurred()) - t, err := tokenManager.MintToken(ctx, user) + scope, err := scope.GetOwnerScope() + Expect(err).ToNot(HaveOccurred()) + t, err := tokenManager.MintToken(ctx, user, scope) Expect(err).ToNot(HaveOccurred()) ctx = token.ContextSetToken(ctx, t) ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t) From d0cb49f8fd6637c0ca737bd36f998e730df1b3cd Mon Sep 17 00:00:00 2001 From: Phil Davis Date: Fri, 7 May 2021 20:20:30 +0545 Subject: [PATCH 45/70] Bump core commit id for tests (#1692) --- .drone.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.env b/.drone.env index 55ba3d8001..0032a633b0 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=dc475a581eddd5b44a5f862f8508761b8ef9a914 +CORE_COMMITID=7e939a996f562a4012fc27af36d0074c3ab9941f CORE_BRANCH=master From e2c3841d0dbcf95e299c98f2f46d721d6a059579 Mon Sep 17 00:00:00 2001 From: Pascal Wengerter Date: Fri, 7 May 2021 17:03:27 +0100 Subject: [PATCH 46/70] Add user profile picture to capabilities (#1694) --- .../unreleased/improve-user-profile-picture-capability.md | 7 +++++++ internal/http/services/owncloud/ocs/data/capabilities.go | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 changelog/unreleased/improve-user-profile-picture-capability.md diff --git a/changelog/unreleased/improve-user-profile-picture-capability.md b/changelog/unreleased/improve-user-profile-picture-capability.md new file mode 100644 index 0000000000..97a0138932 --- /dev/null +++ b/changelog/unreleased/improve-user-profile-picture-capability.md @@ -0,0 +1,7 @@ +Enhancement: User profile picture capability + +Based on feedback in the new ownCloud web frontend we want to omit trying to render +user avatars images / profile pictures based on the backend capabilities. Now the +OCS communicates a corresponding value. + +https://github.com/cs3org/reva/pull/1694 diff --git a/internal/http/services/owncloud/ocs/data/capabilities.go b/internal/http/services/owncloud/ocs/data/capabilities.go index 8028030e55..dc9e4b7815 100644 --- a/internal/http/services/owncloud/ocs/data/capabilities.go +++ b/internal/http/services/owncloud/ocs/data/capabilities.go @@ -160,7 +160,8 @@ type CapabilitiesFilesSharingPublicExpireDate struct { // CapabilitiesFilesSharingUser TODO document type CapabilitiesFilesSharingUser struct { - SendMail ocsBool `json:"send_mail" xml:"send_mail" mapstructure:"send_mail"` + SendMail ocsBool `json:"send_mail" xml:"send_mail" mapstructure:"send_mail"` + ProfilePicture ocsBool `json:"profile_picture" xml:"profile_picture" mapstructure:"profile_picture"` } // CapabilitiesFilesSharingUserEnumeration TODO document From b2ac93b523e899d0342386270f91918aa9fef76b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 14:36:17 +0200 Subject: [PATCH 47/70] Bump lodash from 4.17.20 to 4.17.21 in /docs (#1697) --- docs/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 6ca2195c08..d6a4ce9e7d 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -572,9 +572,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "log-symbols": { From 0fc001d1710fa7d23043a5a59d9ca442cbd3186a Mon Sep 17 00:00:00 2001 From: David Christofas Date: Mon, 10 May 2021 16:39:05 +0200 Subject: [PATCH 48/70] fix move in the owncloud storage driver (#1696) Update the filepath in redis when moving a file. Didn't implement it in delete since delete is still a bit more broken. But since we don't actively use the owncloud storage driver except for in CI it's not too important. Fixes https://github.com/cs3org/reva/issues/1693 --- .../unreleased/fix-move-owncloud-driver.md | 7 +++++++ pkg/storage/fs/owncloud/owncloud.go | 21 +++++++++++++++++++ .../expected-failures-on-OWNCLOUD-storage.md | 2 -- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 changelog/unreleased/fix-move-owncloud-driver.md diff --git a/changelog/unreleased/fix-move-owncloud-driver.md b/changelog/unreleased/fix-move-owncloud-driver.md new file mode 100644 index 0000000000..90a1ba6aac --- /dev/null +++ b/changelog/unreleased/fix-move-owncloud-driver.md @@ -0,0 +1,7 @@ +Bugfix: Fix move in owncloud storage driver + +When moving a file or folder (includes renaming) the filepath in the cache didn't get updated which caused subsequent requests to `getpath` to fail. + +https://github.com/cs3org/reva/issues/1693 +https://github.com/cs3org/reva/issues/1696 + diff --git a/pkg/storage/fs/owncloud/owncloud.go b/pkg/storage/fs/owncloud/owncloud.go index f3f16fa5dc..41fdf42d5d 100644 --- a/pkg/storage/fs/owncloud/owncloud.go +++ b/pkg/storage/fs/owncloud/owncloud.go @@ -1589,6 +1589,27 @@ func (fs *ocfs) Move(ctx context.Context, oldRef, newRef *provider.Reference) (e if err = os.Rename(oldIP, newIP); err != nil { return errors.Wrap(err, "ocfs: error moving "+oldIP+" to "+newIP) } + + log := appctx.GetLogger(ctx) + conn := fs.pool.Get() + defer conn.Close() + // Ideally if we encounter an error here we should rollback the Move/Rename. + // But since the owncloud storage driver is not being actively used by anyone other + // than the acceptance tests we should be fine by ignoring the errors. + _ = filepath.Walk(newIP, func(path string, info os.FileInfo, err error) error { + if err != nil { + // TODO(c0rby): rollback the move in case of an error + log.Error().Str("path", path).Err(err).Msg("error caching id") + return nil + } + id := readOrCreateID(context.Background(), path, nil) + _, err = conn.Do("SET", id, path) + if err != nil { + // TODO(c0rby): rollback the move in case of an error + log.Error().Str("path", path).Err(err).Msg("error caching id") + } + return nil + }) if err := fs.propagate(ctx, newIP); err != nil { return err } diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index 8af46de70a..18b9e9bf74 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -1624,8 +1624,6 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: ### [Moving resource loses associated shares](https://github.com/owncloud/ocis/issues/1251) -- [apiSharePublicLink2/multilinkSharing.feature:187](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink2/multilinkSharing.feature#L187) - #### [No way to set default folder for received shares](https://github.com/owncloud/ocis/issues/1327) - [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L22) - [apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L23) From 4e6adea4d70951f76d6421fe46d8584582ee5c76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 09:04:23 +0200 Subject: [PATCH 49/70] [Build-deps]: Bump github.com/rs/zerolog from 1.21.0 to 1.22.0 (#1708) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9165681f00..d8ebfc6f12 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/pkg/xattr v0.4.3 github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect github.com/rs/cors v1.7.0 - github.com/rs/zerolog v1.21.0 + github.com/rs/zerolog v1.22.0 github.com/sciencemesh/meshdirectory-web v1.0.4 github.com/stretchr/testify v1.7.0 github.com/studio-b12/gowebdav v0.0.0-20200303150724-9380631c29a1 diff --git a/go.sum b/go.sum index cdf48d25a6..ac8ed596a7 100644 --- a/go.sum +++ b/go.sum @@ -941,8 +941,8 @@ github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rs/zerolog v1.21.0 h1:Q3vdXlfLNT+OftyBHsU0Y445MD+8m8axjKgf2si0QcM= -github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/rs/zerolog v1.22.0 h1:XrVUjV4K+izZpKXZHlPrYQiDtmdGiCylnT4i43AAWxg= +github.com/rs/zerolog v1.22.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= github.com/rubenv/sql-migrate v0.0.0-20190212093014-1007f53448d7/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= From 531057e8e981ab5c8e42e6918028dff5cf41498c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 09:04:47 +0200 Subject: [PATCH 50/70] [Build-deps]: Bump google.golang.org/grpc from 1.37.0 to 1.37.1 (#1704) --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d8ebfc6f12..91aaa431b8 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,7 @@ require ( golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/sys v0.0.0-20210423082822-04245dca01da golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 - google.golang.org/grpc v1.37.0 + google.golang.org/grpc v1.37.1 google.golang.org/protobuf v1.26.0 gotest.tools v2.2.0+incompatible ) From 56c89e07cf0c68d98424a88d1e14118515f2e515 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 10:13:12 +0200 Subject: [PATCH 51/70] [Build-deps]: Bump github.com/aws/aws-sdk-go from 1.38.34 to 1.38.40 (#1709) Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) from 1.38.34 to 1.38.40. - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Changelog](https://github.com/aws/aws-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.38.34...v1.38.40) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 91aaa431b8..46e50b33f1 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible github.com/ReneKroon/ttlcache/v2 v2.4.0 - github.com/aws/aws-sdk-go v1.38.34 + github.com/aws/aws-sdk-go v1.38.40 github.com/bluele/gcache v0.0.2 github.com/c-bata/go-prompt v0.2.5 github.com/cheggaaa/pb v1.0.29 diff --git a/go.sum b/go.sum index ac8ed596a7..9038a8daf7 100644 --- a/go.sum +++ b/go.sum @@ -83,8 +83,8 @@ github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQ github.com/aws/aws-sdk-go v1.20.1/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.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.38.34 h1:JSAyS6hSDLbRmCAz9VAkwDf5oh/olt9mBTrVBWGJcU8= -github.com/aws/aws-sdk-go v1.38.34/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.38.40 h1:VVqBFV24tGgXR11tFXPjmR+0ItbnUepbuQjdmhgu3U0= +github.com/aws/aws-sdk-go v1.38.40/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-xray-sdk-go v0.9.4/go.mod h1:XtMKdBQfpVut+tJEwI7+dJFRxxRdxHDyVNp2tHXRq04= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= From a28db08cc736cd826da09e6a3c7d52c5cca8a974 Mon Sep 17 00:00:00 2001 From: Samuel Alfageme Date: Mon, 17 May 2021 10:13:48 +0200 Subject: [PATCH 52/70] docker-build: reduce all the reva* image sizes (#1705) - From 1.94GB to 40MB, using golang:alpine as builder and scratch as base for the binary - 'latest-eos' is still bloated due to being based on eos/slim REPOSITORY TAG IMAGE ID CREATED SIZE alfageme/revad latest fee1a27ac5f0 4 minutes ago 40MB alfageme/revad latest-eos 02fd02258069 5 hours ago 2.43GB alfageme/reva latest b830b5559200 5 hours ago 16MB --- Dockerfile.reva | 21 ++++++++++-- Dockerfile.revad | 32 ++++++++++++++++--- Dockerfile.revad-eos | 28 +++++++++++++--- Makefile | 2 +- .../unreleased/reduce-docker-image-size.md | 10 ++++++ 5 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 changelog/unreleased/reduce-docker-image-size.md diff --git a/Dockerfile.reva b/Dockerfile.reva index ec12c4df17..9269c2a33e 100644 --- a/Dockerfile.reva +++ b/Dockerfile.reva @@ -16,9 +16,26 @@ # granted to it by virtue of its status as an Intergovernmental Organization # or submit itself to any jurisdiction. -FROM golang:1.16 +FROM golang:alpine as builder + +RUN apk --no-cache add \ + ca-certificates \ + bash \ + git \ + gcc \ + libc-dev \ + make + +ENV PATH /go/bin:/usr/local/go/bin:$PATH +ENV GOPATH /go WORKDIR /go/src/github/cs3org/reva COPY . . RUN make build-reva-docker && cp /go/src/github/cs3org/reva/cmd/reva/reva /go/bin/reva -ENTRYPOINT ["/go/bin/reva"] + +FROM scratch + +COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ +COPY --from=builder /go/bin/reva /usr/bin/reva + +ENTRYPOINT [ "/usr/bin/reva" ] diff --git a/Dockerfile.revad b/Dockerfile.revad index 82c4db78e3..fec40722bf 100644 --- a/Dockerfile.revad +++ b/Dockerfile.revad @@ -16,11 +16,33 @@ # granted to it by virtue of its status as an Intergovernmental Organization # or submit itself to any jurisdiction. -FROM golang:1.16 +FROM golang:alpine as builder + +RUN apk --no-cache add \ + ca-certificates \ + bash \ + git \ + gcc \ + libc-dev \ + make + +ENV PATH /go/bin:/usr/local/go/bin:$PATH +ENV GOPATH /go WORKDIR /go/src/github/cs3org/reva COPY . . -RUN make build-revad-docker && cp /go/src/github/cs3org/reva/cmd/revad/revad /go/bin/revad && mkdir -p /etc/revad/ && echo "" > /etc/revad/revad.toml -EXPOSE 9999 -EXPOSE 10000 -CMD ["/go/bin/revad", "-c", "/etc/revad/revad.toml", "-p", "/var/run/revad.pid"] +RUN make build-revad-docker && \ + cp /go/src/github/cs3org/reva/cmd/revad/revad /go/bin/revad + +RUN mkdir -p /etc/revad/ && echo "" > /etc/revad/revad.toml + +FROM scratch + +EXPOSE 9999 10000 + +COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ +COPY --from=builder /go/bin/revad /usr/bin/revad +COPY --from=builder /etc/revad /etc/revad + +ENTRYPOINT [ "/usr/bin/revad" ] +CMD [ "-c", "/etc/revad/revad.toml", "-p", "/var/run/revad.pid" ] diff --git a/Dockerfile.revad-eos b/Dockerfile.revad-eos index f87d324bdb..0a214b2992 100644 --- a/Dockerfile.revad-eos +++ b/Dockerfile.revad-eos @@ -16,14 +16,34 @@ # granted to it by virtue of its status as an Intergovernmental Organization # or submit itself to any jurisdiction. -FROM golang:1.16 as builder +FROM golang:alpine as builder + +RUN apk --no-cache add \ + ca-certificates \ + bash \ + git \ + gcc \ + libc-dev \ + make + +ENV PATH /go/bin:/usr/local/go/bin:$PATH +ENV GOPATH /go WORKDIR /go/src/github/cs3org/reva COPY . . RUN make build-revad-docker && \ cp /go/src/github/cs3org/reva/cmd/revad/revad /go/bin/revad -FROM gitlab-registry.cern.ch/dss/eos:c8_4.8.15 +RUN mkdir -p /etc/revad/ && echo "" > /etc/revad/revad.toml + +FROM gitlab-registry.cern.ch/dss/eos/slim:4.8.43 + RUN mkdir -p /usr/local/bin -COPY --from=builder /go/bin/revad /go/bin/ -RUN chmod +x /go/bin/revad + +COPY --from=builder /go/bin/revad /usr/bin/revad +COPY --from=builder /etc/revad /etc/revad + +RUN chmod +x /usr/bin/revad + +ENTRYPOINT [ "/usr/bin/revad" ] +CMD [ "-c", "/etc/revad/revad.toml", "-p", "/var/run/revad.pid" ] diff --git a/Makefile b/Makefile index fa2a59da17..e2656c0bed 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ GIT_BRANCH=`git rev-parse --symbolic-full-name --abbrev-ref HEAD` GIT_DIRTY=`git diff-index --quiet HEAD -- || echo "dirty-"` VERSION=`git describe --always` GO_VERSION=`go version | awk '{print $$3}'` -BUILD_FLAGS="-X main.gitCommit=${GIT_COMMIT} -X main.version=${VERSION} -X main.goVersion=${GO_VERSION} -X main.buildDate=${BUILD_DATE}" +BUILD_FLAGS="-w -extldflags "-static" -X main.gitCommit=${GIT_COMMIT} -X main.version=${VERSION} -X main.goVersion=${GO_VERSION} -X main.buildDate=${BUILD_DATE}" LITMUS_URL_OLD="http://localhost:20080/remote.php/webdav" LITMUS_URL_NEW="http://localhost:20080/remote.php/dav/files/4c510ada-c86b-4815-8820-42cdf82c3d51" LITMUS_USERNAME="einstein" diff --git a/changelog/unreleased/reduce-docker-image-size.md b/changelog/unreleased/reduce-docker-image-size.md new file mode 100644 index 0000000000..d97b234f46 --- /dev/null +++ b/changelog/unreleased/reduce-docker-image-size.md @@ -0,0 +1,10 @@ +Enhancement: Reduce the size of all the container images built on CI + +Previously, all images were based on golang:1.16 which is built from Debian. +Using 'scratch' as base, reduces the size of the artifacts well as the attack +surface for all the images, plus copying the binary from the build step ensures +that only the strictly required software is present on the final image. +For the revad images tagged '-eos', eos-slim is used instead. It is still large +but it updates the environment as well as the EOS version. + +https://github.com/cs3org/reva/pull/1705 From 039f3f4546096cfb0fb526292f3e6c1f022551b7 Mon Sep 17 00:00:00 2001 From: David Christofas Date: Mon, 17 May 2021 10:14:20 +0200 Subject: [PATCH 53/70] add checksum headers to the tus preflight response (#1702) --- changelog/unreleased/tus-preflight-headers.md | 6 ++++++ internal/http/services/owncloud/ocdav/options.go | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 changelog/unreleased/tus-preflight-headers.md diff --git a/changelog/unreleased/tus-preflight-headers.md b/changelog/unreleased/tus-preflight-headers.md new file mode 100644 index 0000000000..465b2d7c63 --- /dev/null +++ b/changelog/unreleased/tus-preflight-headers.md @@ -0,0 +1,6 @@ +Enhancement: Add checksum headers to tus preflight responses + +Added `checksum` to the header `Tus-Extension` and added the `Tus-Checksum-Algorithm` header. + +https://github.com/owncloud/ocis/issues/1747 +https://github.com/cs3org/reva/pull/1702 diff --git a/internal/http/services/owncloud/ocdav/options.go b/internal/http/services/owncloud/ocdav/options.go index 9fa98d5396..d86a5afaa1 100644 --- a/internal/http/services/owncloud/ocdav/options.go +++ b/internal/http/services/owncloud/ocdav/options.go @@ -39,7 +39,8 @@ func (s *svc) handleOptions(w http.ResponseWriter, r *http.Request, ns string) { w.Header().Add("Access-Control-Expose-Headers", "Tus-Resumable, Tus-Version, Tus-Extension") w.Header().Set("Tus-Resumable", "1.0.0") // TODO(jfd): only for dirs? w.Header().Set("Tus-Version", "1.0.0") - w.Header().Set("Tus-Extension", "creation,creation-with-upload") + w.Header().Set("Tus-Extension", "creation,creation-with-upload,checksum") + w.Header().Set("Tus-Checksum-Algorithm", "md5,sha1,crc32") } - w.WriteHeader(http.StatusOK) + w.WriteHeader(http.StatusNoContent) } From 8ea3ae0db1128cf6e4917e1453161043a3535746 Mon Sep 17 00:00:00 2001 From: Saw-jan Gurung Date: Mon, 17 May 2021 14:00:57 +0545 Subject: [PATCH 54/70] [tests-only] Bump core commit id for tests (#1701) --- .drone.env | 2 +- .../expected-failures-on-OCIS-storage.md | 79 ++++++++++--------- .../expected-failures-on-OWNCLOUD-storage.md | 79 ++++++++++--------- .../expected-failures-on-S3NG-storage.md | 79 ++++++++++--------- 4 files changed, 121 insertions(+), 118 deletions(-) diff --git a/.drone.env b/.drone.env index 0032a633b0..581c860a7a 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=7e939a996f562a4012fc27af36d0074c3ab9941f +CORE_COMMITID=1838750cbecf41a37fae5380c1c2763923cd3943 CORE_BRANCH=master diff --git a/tests/acceptance/expected-failures-on-OCIS-storage.md b/tests/acceptance/expected-failures-on-OCIS-storage.md index 557ba83cb8..5edf2e3a3b 100644 --- a/tests/acceptance/expected-failures-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-on-OCIS-storage.md @@ -1828,45 +1828,46 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiCapabilities/capabilities.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L93) - [apiCapabilities/capabilities.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L107) - [apiCapabilities/capabilities.feature:116](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L116) -- [apiCapabilities/capabilities.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L125) -- [apiCapabilities/capabilities.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L132) -- [apiCapabilities/capabilities.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L138) -- [apiCapabilities/capabilities.feature:144](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L144) -- [apiCapabilities/capabilities.feature:151](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L151) -- [apiCapabilities/capabilities.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L157) -- [apiCapabilities/capabilities.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L166) -- [apiCapabilities/capabilities.feature:176](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L176) -- [apiCapabilities/capabilities.feature:187](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L187) -- [apiCapabilities/capabilities.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L198) -- [apiCapabilities/capabilities.feature:208](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L208) -- [apiCapabilities/capabilities.feature:219](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L219) -- [apiCapabilities/capabilities.feature:231](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L231) -- [apiCapabilities/capabilities.feature:238](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L238) -- [apiCapabilities/capabilities.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L245) -- [apiCapabilities/capabilities.feature:252](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L252) -- [apiCapabilities/capabilities.feature:275](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L275) -- [apiCapabilities/capabilities.feature:292](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L292) -- [apiCapabilities/capabilities.feature:313](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L313) -- [apiCapabilities/capabilities.feature:335](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L335) -- [apiCapabilities/capabilities.feature:357](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L357) -- [apiCapabilities/capabilities.feature:379](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L379) -- [apiCapabilities/capabilities.feature:404](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L404) -- [apiCapabilities/capabilities.feature:429](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L429) -- [apiCapabilities/capabilities.feature:454](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L454) -- [apiCapabilities/capabilities.feature:476](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L476) -- [apiCapabilities/capabilities.feature:498](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L498) -- [apiCapabilities/capabilities.feature:521](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L521) -- [apiCapabilities/capabilities.feature:546](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L546) -- [apiCapabilities/capabilities.feature:568](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L568) -- [apiCapabilities/capabilities.feature:590](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L590) -- [apiCapabilities/capabilities.feature:613](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L613) -- [apiCapabilities/capabilities.feature:637](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L637) -- [apiCapabilities/capabilities.feature:658](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L658) -- [apiCapabilities/capabilities.feature:680](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L680) -- [apiCapabilities/capabilities.feature:703](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L703) -- [apiCapabilities/capabilities.feature:729](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L729) -- [apiCapabilities/capabilities.feature:758](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L758) -- [apiCapabilities/capabilities.feature:787](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L787) +- [apiCapabilities/capabilities.feature:126](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L126) +- [apiCapabilities/capabilities.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L133) +- [apiCapabilities/capabilities.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L140) +- [apiCapabilities/capabilities.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L146) +- [apiCapabilities/capabilities.feature:152](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L152) +- [apiCapabilities/capabilities.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L159) +- [apiCapabilities/capabilities.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L165) +- [apiCapabilities/capabilities.feature:174](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L174) +- [apiCapabilities/capabilities.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L184) +- [apiCapabilities/capabilities.feature:195](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L195) +- [apiCapabilities/capabilities.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L206) +- [apiCapabilities/capabilities.feature:216](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L216) +- [apiCapabilities/capabilities.feature:227](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L227) +- [apiCapabilities/capabilities.feature:239](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L239) +- [apiCapabilities/capabilities.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L246) +- [apiCapabilities/capabilities.feature:253](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L253) +- [apiCapabilities/capabilities.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L260) +- [apiCapabilities/capabilities.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L283) +- [apiCapabilities/capabilities.feature:300](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L300) +- [apiCapabilities/capabilities.feature:321](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L321) +- [apiCapabilities/capabilities.feature:343](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L343) +- [apiCapabilities/capabilities.feature:365](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L365) +- [apiCapabilities/capabilities.feature:387](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L387) +- [apiCapabilities/capabilities.feature:412](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L412) +- [apiCapabilities/capabilities.feature:437](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L437) +- [apiCapabilities/capabilities.feature:462](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L462) +- [apiCapabilities/capabilities.feature:484](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L484) +- [apiCapabilities/capabilities.feature:506](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L506) +- [apiCapabilities/capabilities.feature:529](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L529) +- [apiCapabilities/capabilities.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L554) +- [apiCapabilities/capabilities.feature:576](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L576) +- [apiCapabilities/capabilities.feature:598](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L598) +- [apiCapabilities/capabilities.feature:621](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L621) +- [apiCapabilities/capabilities.feature:645](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L645) +- [apiCapabilities/capabilities.feature:666](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L666) +- [apiCapabilities/capabilities.feature:688](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L688) +- [apiCapabilities/capabilities.feature:711](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L711) +- [apiCapabilities/capabilities.feature:737](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L737) +- [apiCapabilities/capabilities.feature:766](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L766) +- [apiCapabilities/capabilities.feature:795](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L795) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L25) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L26) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L44) diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index 18b9e9bf74..d9b0756dba 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -1958,45 +1958,46 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiCapabilities/capabilities.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L93) - [apiCapabilities/capabilities.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L107) - [apiCapabilities/capabilities.feature:116](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L116) -- [apiCapabilities/capabilities.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L125) -- [apiCapabilities/capabilities.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L132) -- [apiCapabilities/capabilities.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L138) -- [apiCapabilities/capabilities.feature:144](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L144) -- [apiCapabilities/capabilities.feature:151](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L151) -- [apiCapabilities/capabilities.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L157) -- [apiCapabilities/capabilities.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L166) -- [apiCapabilities/capabilities.feature:176](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L176) -- [apiCapabilities/capabilities.feature:187](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L187) -- [apiCapabilities/capabilities.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L198) -- [apiCapabilities/capabilities.feature:208](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L208) -- [apiCapabilities/capabilities.feature:219](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L219) -- [apiCapabilities/capabilities.feature:231](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L231) -- [apiCapabilities/capabilities.feature:238](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L238) -- [apiCapabilities/capabilities.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L245) -- [apiCapabilities/capabilities.feature:252](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L252) -- [apiCapabilities/capabilities.feature:275](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L275) -- [apiCapabilities/capabilities.feature:292](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L292) -- [apiCapabilities/capabilities.feature:313](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L313) -- [apiCapabilities/capabilities.feature:335](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L335) -- [apiCapabilities/capabilities.feature:357](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L357) -- [apiCapabilities/capabilities.feature:379](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L379) -- [apiCapabilities/capabilities.feature:404](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L404) -- [apiCapabilities/capabilities.feature:429](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L429) -- [apiCapabilities/capabilities.feature:454](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L454) -- [apiCapabilities/capabilities.feature:476](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L476) -- [apiCapabilities/capabilities.feature:498](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L498) -- [apiCapabilities/capabilities.feature:521](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L521) -- [apiCapabilities/capabilities.feature:546](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L546) -- [apiCapabilities/capabilities.feature:568](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L568) -- [apiCapabilities/capabilities.feature:590](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L590) -- [apiCapabilities/capabilities.feature:613](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L613) -- [apiCapabilities/capabilities.feature:637](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L637) -- [apiCapabilities/capabilities.feature:658](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L658) -- [apiCapabilities/capabilities.feature:680](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L680) -- [apiCapabilities/capabilities.feature:703](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L703) -- [apiCapabilities/capabilities.feature:729](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L729) -- [apiCapabilities/capabilities.feature:758](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L758) -- [apiCapabilities/capabilities.feature:787](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L787) +- [apiCapabilities/capabilities.feature:126](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L126) +- [apiCapabilities/capabilities.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L133) +- [apiCapabilities/capabilities.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L140) +- [apiCapabilities/capabilities.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L146) +- [apiCapabilities/capabilities.feature:152](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L152) +- [apiCapabilities/capabilities.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L159) +- [apiCapabilities/capabilities.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L165) +- [apiCapabilities/capabilities.feature:174](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L174) +- [apiCapabilities/capabilities.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L184) +- [apiCapabilities/capabilities.feature:195](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L195) +- [apiCapabilities/capabilities.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L206) +- [apiCapabilities/capabilities.feature:216](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L216) +- [apiCapabilities/capabilities.feature:227](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L227) +- [apiCapabilities/capabilities.feature:239](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L239) +- [apiCapabilities/capabilities.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L246) +- [apiCapabilities/capabilities.feature:253](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L253) +- [apiCapabilities/capabilities.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L260) +- [apiCapabilities/capabilities.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L283) +- [apiCapabilities/capabilities.feature:300](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L300) +- [apiCapabilities/capabilities.feature:321](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L321) +- [apiCapabilities/capabilities.feature:343](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L343) +- [apiCapabilities/capabilities.feature:365](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L365) +- [apiCapabilities/capabilities.feature:387](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L387) +- [apiCapabilities/capabilities.feature:412](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L412) +- [apiCapabilities/capabilities.feature:437](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L437) +- [apiCapabilities/capabilities.feature:462](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L462) +- [apiCapabilities/capabilities.feature:484](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L484) +- [apiCapabilities/capabilities.feature:506](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L506) +- [apiCapabilities/capabilities.feature:529](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L529) +- [apiCapabilities/capabilities.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L554) +- [apiCapabilities/capabilities.feature:576](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L576) +- [apiCapabilities/capabilities.feature:598](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L598) +- [apiCapabilities/capabilities.feature:621](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L621) +- [apiCapabilities/capabilities.feature:645](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L645) +- [apiCapabilities/capabilities.feature:666](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L666) +- [apiCapabilities/capabilities.feature:688](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L688) +- [apiCapabilities/capabilities.feature:711](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L711) +- [apiCapabilities/capabilities.feature:737](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L737) +- [apiCapabilities/capabilities.feature:766](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L766) +- [apiCapabilities/capabilities.feature:795](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L795) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L25) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L26) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L44) diff --git a/tests/acceptance/expected-failures-on-S3NG-storage.md b/tests/acceptance/expected-failures-on-S3NG-storage.md index 4442904cdc..00e4e4bee6 100644 --- a/tests/acceptance/expected-failures-on-S3NG-storage.md +++ b/tests/acceptance/expected-failures-on-S3NG-storage.md @@ -1833,45 +1833,46 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiCapabilities/capabilities.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L93) - [apiCapabilities/capabilities.feature:107](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L107) - [apiCapabilities/capabilities.feature:116](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L116) -- [apiCapabilities/capabilities.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L125) -- [apiCapabilities/capabilities.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L132) -- [apiCapabilities/capabilities.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L138) -- [apiCapabilities/capabilities.feature:144](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L144) -- [apiCapabilities/capabilities.feature:151](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L151) -- [apiCapabilities/capabilities.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L157) -- [apiCapabilities/capabilities.feature:166](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L166) -- [apiCapabilities/capabilities.feature:176](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L176) -- [apiCapabilities/capabilities.feature:187](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L187) -- [apiCapabilities/capabilities.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L198) -- [apiCapabilities/capabilities.feature:208](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L208) -- [apiCapabilities/capabilities.feature:219](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L219) -- [apiCapabilities/capabilities.feature:231](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L231) -- [apiCapabilities/capabilities.feature:238](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L238) -- [apiCapabilities/capabilities.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L245) -- [apiCapabilities/capabilities.feature:252](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L252) -- [apiCapabilities/capabilities.feature:275](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L275) -- [apiCapabilities/capabilities.feature:292](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L292) -- [apiCapabilities/capabilities.feature:313](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L313) -- [apiCapabilities/capabilities.feature:335](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L335) -- [apiCapabilities/capabilities.feature:357](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L357) -- [apiCapabilities/capabilities.feature:379](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L379) -- [apiCapabilities/capabilities.feature:404](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L404) -- [apiCapabilities/capabilities.feature:429](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L429) -- [apiCapabilities/capabilities.feature:454](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L454) -- [apiCapabilities/capabilities.feature:476](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L476) -- [apiCapabilities/capabilities.feature:498](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L498) -- [apiCapabilities/capabilities.feature:521](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L521) -- [apiCapabilities/capabilities.feature:546](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L546) -- [apiCapabilities/capabilities.feature:568](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L568) -- [apiCapabilities/capabilities.feature:590](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L590) -- [apiCapabilities/capabilities.feature:613](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L613) -- [apiCapabilities/capabilities.feature:637](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L637) -- [apiCapabilities/capabilities.feature:658](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L658) -- [apiCapabilities/capabilities.feature:680](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L680) -- [apiCapabilities/capabilities.feature:703](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L703) -- [apiCapabilities/capabilities.feature:729](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L729) -- [apiCapabilities/capabilities.feature:758](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L758) -- [apiCapabilities/capabilities.feature:787](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L787) +- [apiCapabilities/capabilities.feature:126](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L126) +- [apiCapabilities/capabilities.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L133) +- [apiCapabilities/capabilities.feature:140](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L140) +- [apiCapabilities/capabilities.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L146) +- [apiCapabilities/capabilities.feature:152](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L152) +- [apiCapabilities/capabilities.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L159) +- [apiCapabilities/capabilities.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L165) +- [apiCapabilities/capabilities.feature:174](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L174) +- [apiCapabilities/capabilities.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L184) +- [apiCapabilities/capabilities.feature:195](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L195) +- [apiCapabilities/capabilities.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L206) +- [apiCapabilities/capabilities.feature:216](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L216) +- [apiCapabilities/capabilities.feature:227](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L227) +- [apiCapabilities/capabilities.feature:239](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L239) +- [apiCapabilities/capabilities.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L246) +- [apiCapabilities/capabilities.feature:253](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L253) +- [apiCapabilities/capabilities.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L260) +- [apiCapabilities/capabilities.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L283) +- [apiCapabilities/capabilities.feature:300](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L300) +- [apiCapabilities/capabilities.feature:321](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L321) +- [apiCapabilities/capabilities.feature:343](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L343) +- [apiCapabilities/capabilities.feature:365](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L365) +- [apiCapabilities/capabilities.feature:387](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L387) +- [apiCapabilities/capabilities.feature:412](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L412) +- [apiCapabilities/capabilities.feature:437](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L437) +- [apiCapabilities/capabilities.feature:462](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L462) +- [apiCapabilities/capabilities.feature:484](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L484) +- [apiCapabilities/capabilities.feature:506](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L506) +- [apiCapabilities/capabilities.feature:529](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L529) +- [apiCapabilities/capabilities.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L554) +- [apiCapabilities/capabilities.feature:576](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L576) +- [apiCapabilities/capabilities.feature:598](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L598) +- [apiCapabilities/capabilities.feature:621](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L621) +- [apiCapabilities/capabilities.feature:645](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L645) +- [apiCapabilities/capabilities.feature:666](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L666) +- [apiCapabilities/capabilities.feature:688](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L688) +- [apiCapabilities/capabilities.feature:711](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L711) +- [apiCapabilities/capabilities.feature:737](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L737) +- [apiCapabilities/capabilities.feature:766](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L766) +- [apiCapabilities/capabilities.feature:795](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiCapabilities/capabilities.feature#L795) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:25](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L25) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L26) - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L44) From 3387212d86f4b09401cd5db6200ea1444d13211d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=BCller?= Date: Mon, 17 May 2021 10:16:47 +0200 Subject: [PATCH 55/70] Add reliability calculations support to Mentix (#1649) --- changelog/unreleased/mentix-add-reliab.md | 5 + .../config/http/services/mentix/_index.md | 12 ++ .../http/services/mentix/metrics/_index.md | 19 +++ examples/mentix/mentix.toml | 6 + internal/http/services/mentix/mentix.go | 1 + pkg/mentix/config/config.go | 8 ++ pkg/mentix/config/ids.go | 4 +- pkg/mentix/connectors/gocdb.go | 36 +++++ pkg/mentix/connectors/gocdb/types.go | 24 ++++ pkg/mentix/exchangers/exporters/metrics.go | 84 ++++++++++++ .../exchangers/exporters/metrics/metrics.go | 123 +++++++++++++++++ pkg/mentix/meshdata/downtime.go | 124 ++++++++++++++++++ pkg/mentix/meshdata/site.go | 2 + 13 files changed, 447 insertions(+), 1 deletion(-) create mode 100644 changelog/unreleased/mentix-add-reliab.md create mode 100644 docs/content/en/docs/config/http/services/mentix/metrics/_index.md create mode 100644 pkg/mentix/exchangers/exporters/metrics.go create mode 100644 pkg/mentix/exchangers/exporters/metrics/metrics.go create mode 100644 pkg/mentix/meshdata/downtime.go diff --git a/changelog/unreleased/mentix-add-reliab.md b/changelog/unreleased/mentix-add-reliab.md new file mode 100644 index 0000000000..c57faae135 --- /dev/null +++ b/changelog/unreleased/mentix-add-reliab.md @@ -0,0 +1,5 @@ +Enhancement: Add reliability calculations support to Mentix + +To make reliability calculations possible, a new exporter has been added to Mentix that reads scheduled downtimes from the GOCDB and exposes it through Prometheus metrics. + +https://github.com/cs3org/reva/pull/1649 diff --git a/docs/content/en/docs/config/http/services/mentix/_index.md b/docs/content/en/docs/config/http/services/mentix/_index.md index 62a614e6e3..dd73b4f51a 100644 --- a/docs/content/en/docs/config/http/services/mentix/_index.md +++ b/docs/content/en/docs/config/http/services/mentix/_index.md @@ -27,6 +27,15 @@ update_interval = "15m" {{< /highlight >}} {{% /dir %}} +## Services +{{% dir name="critical_types" type="[]string" default="[]" %}} +The service types that are considered as critical/essential. +{{< highlight toml >}} +[http.services.mentix.services] +critical_types = ["REVAD] +{{< /highlight >}} +{{% /dir %}} + ## Connectors Mentix is decoupled from the actual sources of the mesh data by using so-called _connectors_. A connector is used to gather the data from a certain source, which are then converted into Mentix' own internal format. @@ -63,6 +72,9 @@ Mentix exposes its data via an HTTP endpoint using the `webapi` exporter. Data c - files: - '/usr/share/prom/sciencemesh_services.json' ``` + +- **metrics** +The [Metrics](metrics) exporter exposes various site-specific metrics through Prometheus. ## Site Accounts service Mentix uses the Reva site accounts service to query information about site accounts. The following settings must be configured properly: diff --git a/docs/content/en/docs/config/http/services/mentix/metrics/_index.md b/docs/content/en/docs/config/http/services/mentix/metrics/_index.md new file mode 100644 index 0000000000..5df157a285 --- /dev/null +++ b/docs/content/en/docs/config/http/services/mentix/metrics/_index.md @@ -0,0 +1,19 @@ +--- +title: "metrics" +linkTitle: "metrics" +weight: 10 +description: > + Configuration for the Metrics exporter of the Mentix service +--- + +{{% pageinfo %}} +The Metrics exporter exposes site-specific metrics through Prometheus. +{{% /pageinfo %}} + +{{% dir name="enabled_connectors" type="[]string" default="*" %}} +A list of all enabled connectors for the exporter. +{{< highlight toml >}} +[http.services.mentix.exporters.metrics] +enabled_connectors = ["gocdb"] +{{< /highlight >}} +{{% /dir %}} diff --git a/examples/mentix/mentix.toml b/examples/mentix/mentix.toml index 8cdaa11d38..6e3e149ea6 100644 --- a/examples/mentix/mentix.toml +++ b/examples/mentix/mentix.toml @@ -11,6 +11,10 @@ address = "http://sciencemesh-test.uni-muenster.de" [http.services.mentix.connectors.localfile] file = "/usr/share/revad/sites.json" +# Configure the service types that are considered as critical/essential +[http.services.mentix.services] +critical_types = ["REVAD"] + # Enable the WebAPI exporter [http.services.mentix.exporters.webapi] endpoint = "/" @@ -20,6 +24,8 @@ endpoint = "/" [http.services.mentix.exporters.siteloc] # If this setting is omitted, all connectors will be used as data sources enabled_connectors = ["gocdb"] +# Enable the Metrics exporter +[http.services.mentix.exporters.metrics] # Enable the site registration importer [http.services.mentix.importers.sitereg] diff --git a/internal/http/services/mentix/mentix.go b/internal/http/services/mentix/mentix.go index 2d82bdb88e..c3c5acc92e 100644 --- a/internal/http/services/mentix/mentix.go +++ b/internal/http/services/mentix/mentix.go @@ -164,6 +164,7 @@ func applyDefaultConfig(conf *config.Configuration) { addDefaultConnector(&conf.Exporters.SiteLocations.EnabledConnectors) addDefaultConnector(&conf.Exporters.PrometheusSD.EnabledConnectors) + addDefaultConnector(&conf.Exporters.Metrics.EnabledConnectors) } // New returns a new Mentix service. diff --git a/pkg/mentix/config/config.go b/pkg/mentix/config/config.go index 75d44780b2..6e90c8d8db 100644 --- a/pkg/mentix/config/config.go +++ b/pkg/mentix/config/config.go @@ -35,6 +35,10 @@ type Configuration struct { UpdateInterval string `mapstructure:"update_interval"` + Services struct { + CriticalTypes []string `mapstructure:"critical_types"` + } `mapstructure:"services"` + Importers struct { SiteRegistration struct { Endpoint string `mapstructure:"endpoint"` @@ -68,6 +72,10 @@ type Configuration struct { BlackboxOutputFile string `mapstructure:"blackbox_output_file"` EnabledConnectors []string `mapstructure:"enabled_connectors"` } `mapstructure:"promsd"` + + Metrics struct { + EnabledConnectors []string `mapstructure:"enabled_connectors"` + } `mapstructure:"metrics"` } `mapstructure:"exporters"` AccountsService struct { diff --git a/pkg/mentix/config/ids.go b/pkg/mentix/config/ids.go index 74ccedbe3c..348b22b45e 100644 --- a/pkg/mentix/config/ids.go +++ b/pkg/mentix/config/ids.go @@ -37,6 +37,8 @@ const ( ExporterIDCS3API = "cs3api" // ExporterIDSiteLocations is the identifier for the Site Locations exporter. ExporterIDSiteLocations = "siteloc" - // ExporterIDPrometheusSD is the identifier for the PrometheusSD SD exporter. + // ExporterIDPrometheusSD is the identifier for the PrometheusSD exporter. ExporterIDPrometheusSD = "promsd" + // ExporterIDMetrics is the identifier for the Metrics exporter. + ExporterIDMetrics = "metrics" ) diff --git a/pkg/mentix/connectors/gocdb.go b/pkg/mentix/connectors/gocdb.go index ca24e85e71..81fc73479b 100755 --- a/pkg/mentix/connectors/gocdb.go +++ b/pkg/mentix/connectors/gocdb.go @@ -24,6 +24,7 @@ import ( "net/url" "path" "strings" + "time" "github.com/rs/zerolog" @@ -73,6 +74,11 @@ func (connector *GOCDBConnector) RetrieveMeshData() (*meshdata.MeshData, error) if err := connector.queryServices(meshData, site); err != nil { return nil, fmt.Errorf("could not query services of site '%v': %v", site.Name, err) } + + // Get downtimes scheduled for the current site + if err := connector.queryDowntimes(meshData, site); err != nil { + return nil, fmt.Errorf("could not query downtimes of site '%v': %v", site.Name, err) + } } meshData.InferMissingData() @@ -152,6 +158,7 @@ func (connector *GOCDBConnector) querySites(meshData *meshdata.MeshData) error { Latitude: site.Latitude, Services: nil, Properties: properties, + Downtimes: meshdata.Downtimes{}, } meshData.Sites = append(meshData.Sites, meshsite) } @@ -216,6 +223,35 @@ func (connector *GOCDBConnector) queryServices(meshData *meshdata.MeshData, site return nil } +func (connector *GOCDBConnector) queryDowntimes(meshData *meshdata.MeshData, site *meshdata.Site) error { + var downtimes gocdb.Downtimes + if err := connector.query(&downtimes, "get_downtime_nested_services", false, true, network.URLParams{"topentity": site.Name, "ongoing_only": "yes"}); err != nil { + return err + } + + // Copy retrieved data into the mesh data + site.Downtimes.Clear() + for _, dt := range downtimes.Downtimes { + if !strings.EqualFold(dt.Severity, "outage") { // Only take real outages into account + continue + } + + services := make([]string, 0, len(dt.AffectedServices.Services)) + for _, service := range dt.AffectedServices.Services { + // Only add critical services to the list of affected services + for _, svcType := range connector.conf.Services.CriticalTypes { + if strings.EqualFold(svcType, service.Type) { + services = append(services, service.Type) + } + } + } + + _, _ = site.Downtimes.ScheduleDowntime(time.Unix(dt.StartDate, 0), time.Unix(dt.EndDate, 0), services) + } + + return nil +} + func (connector *GOCDBConnector) findServiceType(meshData *meshdata.MeshData, name string) *meshdata.ServiceType { for _, serviceType := range meshData.ServiceTypes { if strings.EqualFold(serviceType.Name, name) { diff --git a/pkg/mentix/connectors/gocdb/types.go b/pkg/mentix/connectors/gocdb/types.go index 8e5da543ae..d00d98254a 100755 --- a/pkg/mentix/connectors/gocdb/types.go +++ b/pkg/mentix/connectors/gocdb/types.go @@ -88,3 +88,27 @@ type Service struct { type Services struct { Services []*Service `xml:"SERVICE_ENDPOINT"` } + +// DowntimeService represents a service scheduled for downtime. +type DowntimeService struct { + Type string `xml:"SERVICE_TYPE"` +} + +// DowntimeServices represents a list of DowntimeService objects. +type DowntimeServices struct { + Services []*DowntimeService `xml:"SERVICE"` +} + +// Downtime is a scheduled downtime for a site. +type Downtime struct { + Severity string `xml:"SEVERITY"` + StartDate int64 `xml:"START_DATE"` + EndDate int64 `xml:"END_DATE"` + + AffectedServices DowntimeServices `xml:"SERVICES"` +} + +// Downtimes represents a list of Downtime objects. +type Downtimes struct { + Downtimes []*Downtime `xml:"DOWNTIME"` +} diff --git a/pkg/mentix/exchangers/exporters/metrics.go b/pkg/mentix/exchangers/exporters/metrics.go new file mode 100644 index 0000000000..21635b0b6f --- /dev/null +++ b/pkg/mentix/exchangers/exporters/metrics.go @@ -0,0 +1,84 @@ +// Copyright 2018-2020 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package exporters + +import ( + "github.com/cs3org/reva/pkg/mentix/config" + "github.com/cs3org/reva/pkg/mentix/exchangers/exporters/metrics" + "github.com/cs3org/reva/pkg/mentix/meshdata" + "github.com/pkg/errors" + "github.com/rs/zerolog" +) + +// MetricsExporter exposes various Prometheus metrics. +type MetricsExporter struct { + BaseExporter + + metrics *metrics.Metrics +} + +// Activate activates the exporter. +func (exporter *MetricsExporter) Activate(conf *config.Configuration, log *zerolog.Logger) error { + if err := exporter.BaseExporter.Activate(conf, log); err != nil { + return err + } + + // Create the metrics handler + m, err := metrics.New(conf, log) + if err != nil { + return errors.Wrap(err, "unable to create metrics") + } + exporter.metrics = m + + // Store Metrics specifics + exporter.SetEnabledConnectors(conf.Exporters.Metrics.EnabledConnectors) + + return nil +} + +// Update is called whenever the mesh data set has changed to reflect these changes. +func (exporter *MetricsExporter) Update(meshDataSet meshdata.Map) error { + if err := exporter.BaseExporter.Update(meshDataSet); err != nil { + return err + } + + // Data is read, so acquire a read lock + exporter.Locker().RLock() + defer exporter.Locker().RUnlock() + + if err := exporter.metrics.Update(exporter.MeshData()); err != nil { + return errors.Wrap(err, "error while updating the metrics") + } + + return nil +} + +// GetID returns the ID of the exporter. +func (exporter *MetricsExporter) GetID() string { + return config.ExporterIDMetrics +} + +// GetName returns the display name of the exporter. +func (exporter *MetricsExporter) GetName() string { + return "Metrics" +} + +func init() { + registerExporter(&MetricsExporter{}) +} diff --git a/pkg/mentix/exchangers/exporters/metrics/metrics.go b/pkg/mentix/exchangers/exporters/metrics/metrics.go new file mode 100644 index 0000000000..812435b7da --- /dev/null +++ b/pkg/mentix/exchangers/exporters/metrics/metrics.go @@ -0,0 +1,123 @@ +// Copyright 2018-2020 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package metrics + +import ( + "context" + + "github.com/cs3org/reva/pkg/mentix/config" + "github.com/cs3org/reva/pkg/mentix/meshdata" + "github.com/pkg/errors" + "github.com/rs/zerolog" + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" +) + +// Metrics exposes various Mentix related metrics via Prometheus. +type Metrics struct { + conf *config.Configuration + log *zerolog.Logger + + isScheduledStats *stats.Int64Measure +} + +const ( + keySiteID = "site_id" + keySiteName = "site" + keySiteType = "site_type" + keyServiceType = "service_type" +) + +func (m *Metrics) initialize(conf *config.Configuration, log *zerolog.Logger) error { + if conf == nil { + return errors.Errorf("no configuration provided") + } + m.conf = conf + + if log == nil { + return errors.Errorf("no logger provided") + } + m.log = log + + if err := m.registerMetrics(); err != nil { + return errors.Wrap(err, "error while registering metrics") + } + + return nil +} + +func (m *Metrics) registerMetrics() error { + // Create the OpenCensus statistics and a corresponding view + m.isScheduledStats = stats.Int64("site_is_scheduled", "A boolean metric which shows whether the given site is currently scheduled or not", stats.UnitDimensionless) + isScheduledView := &view.View{ + Name: m.isScheduledStats.Name(), + Description: m.isScheduledStats.Description(), + Measure: m.isScheduledStats, + TagKeys: []tag.Key{tag.MustNewKey(keySiteID), tag.MustNewKey(keySiteName), tag.MustNewKey(keySiteType), tag.MustNewKey(keyServiceType)}, + Aggregation: view.LastValue(), + } + + if err := view.Register(isScheduledView); err != nil { + return errors.Wrap(err, "unable to register the site schedule status metrics view") + } + + return nil +} + +// Update is used to update/expose all metrics. +func (m *Metrics) Update(meshData *meshdata.MeshData) error { + for _, site := range meshData.Sites { + if err := m.exportSiteMetrics(site); err != nil { + return errors.Wrapf(err, "error while exporting metrics for site '%v'", site.Name) + } + } + + return nil +} + +func (m *Metrics) exportSiteMetrics(site *meshdata.Site) error { + mutators := make([]tag.Mutator, 0) + mutators = append(mutators, tag.Insert(tag.MustNewKey(keySiteID), site.ID)) + mutators = append(mutators, tag.Insert(tag.MustNewKey(keySiteName), site.Name)) + mutators = append(mutators, tag.Insert(tag.MustNewKey(keySiteType), meshdata.GetSiteTypeName(site.Type))) + mutators = append(mutators, tag.Insert(tag.MustNewKey(keyServiceType), "SCIENCEMESH_HCHECK")) + + // Create a new context to serve the metrics + if ctx, err := tag.New(context.Background(), mutators...); err == nil { + isScheduled := int64(1) + if site.Downtimes.IsAnyActive() { + isScheduled = 0 + } + stats.Record(ctx, m.isScheduledStats.M(isScheduled)) + } else { + return errors.Wrap(err, "unable to create a context for the site schedule status metrics") + } + + return nil +} + +// New creates a new Metrics instance. +func New(conf *config.Configuration, log *zerolog.Logger) (*Metrics, error) { + m := &Metrics{} + if err := m.initialize(conf, log); err != nil { + return nil, errors.Wrap(err, "unable to create new metrics object") + } + return m, nil +} diff --git a/pkg/mentix/meshdata/downtime.go b/pkg/mentix/meshdata/downtime.go new file mode 100644 index 0000000000..ae7051a682 --- /dev/null +++ b/pkg/mentix/meshdata/downtime.go @@ -0,0 +1,124 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package meshdata + +import ( + "time" + + "github.com/pkg/errors" +) + +// Downtimes represents all scheduled downtimes of a site. +type Downtimes struct { + Downtimes []*Downtime +} + +// ScheduleDowntime schedules a new downtime. +func (dts *Downtimes) ScheduleDowntime(start time.Time, end time.Time, affectedServices []string) (*Downtime, error) { + // Create a new downtime and verify it + dt := &Downtime{ + StartDate: start, + EndDate: end, + AffectedServices: affectedServices, + } + dt.InferMissingData() + if err := dt.Verify(); err != nil { + return nil, err + } + + // Only schedule the downtime if it hasn't expired yet + if dt.IsExpired() { + return nil, nil + } + + dts.Downtimes = append(dts.Downtimes, dt) + return dt, nil +} + +// Clear clears all downtimes. +func (dts *Downtimes) Clear() { + dts.Downtimes = make([]*Downtime, 0, 10) +} + +// IsAnyActive returns true if any downtime is currently active. +func (dts *Downtimes) IsAnyActive() bool { + for _, dt := range dts.Downtimes { + if dt.IsActive() { + return true + } + } + return false +} + +// InferMissingData infers missing data from other data where possible. +func (dts *Downtimes) InferMissingData() { + for _, dt := range dts.Downtimes { + dt.InferMissingData() + } +} + +// Verify checks if the downtimes data is valid. +func (dts *Downtimes) Verify() error { + for _, dt := range dts.Downtimes { + if err := dt.Verify(); err != nil { + return err + } + } + + return nil +} + +// Downtime represents a single scheduled downtime. +type Downtime struct { + StartDate time.Time + EndDate time.Time + AffectedServices []string +} + +// IsActive returns true if the downtime is currently active. +func (dt *Downtime) IsActive() bool { + now := time.Now() + return dt.StartDate.Before(now) && dt.EndDate.After(now) +} + +// IsPending returns true if the downtime is yet to come. +func (dt *Downtime) IsPending() bool { + return dt.StartDate.After(time.Now()) +} + +// IsExpired returns true of the downtime has expired (i.e., lies in the past). +func (dt *Downtime) IsExpired() bool { + return dt.EndDate.Before(time.Now()) +} + +// InferMissingData infers missing data from other data where possible. +func (dt *Downtime) InferMissingData() { +} + +// Verify checks if the downtime data is valid. +func (dt *Downtime) Verify() error { + if dt.EndDate.Before(dt.StartDate) { + return errors.Errorf("downtime end is before its start") + } + if len(dt.AffectedServices) == 0 { + return errors.Errorf("no services affected by downtime") + } + + return nil +} diff --git a/pkg/mentix/meshdata/site.go b/pkg/mentix/meshdata/site.go index a6fdae8f42..a6866a15d1 100644 --- a/pkg/mentix/meshdata/site.go +++ b/pkg/mentix/meshdata/site.go @@ -59,6 +59,8 @@ type Site struct { Services []*Service Properties map[string]string + + Downtimes Downtimes `json:"-"` } // AddService adds a new service; if a service with the same name already exists, the existing one is overwritten. From d1f4c0f8f1b3419cf583bb37907fb9cb4fbc3385 Mon Sep 17 00:00:00 2001 From: Saw-jan Gurung Date: Mon, 17 May 2021 15:59:09 +0545 Subject: [PATCH 56/70] add feature to debug suites in ci (#1707) --- .drone.star | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/.drone.star b/.drone.star index c4cdf3185e..50abcfb13b 100644 --- a/.drone.star +++ b/.drone.star @@ -92,6 +92,9 @@ def cephService(): # Pipeline definitions def main(ctx): + # In order to run specific parts only, specify the parts as + # ocisIntegrationTests(6, [1, 4]) - this will only run 1st and 4th parts + # implemented for: ocisIntegrationTests, owncloudIntegrationTests and s3ngIntegrationTests return [ buildAndPublishDocker(), buildOnly(), @@ -636,9 +639,13 @@ def localIntegrationTestsOcis(): ], } -def ocisIntegrationTests(parallelRuns): +def ocisIntegrationTests(parallelRuns, skipExceptParts = []): pipelines = [] + debugPartsEnabled = (len(skipExceptParts) != 0) for runPart in range(1, parallelRuns + 1): + if debugPartsEnabled and runPart not in skipExceptParts: + continue + pipelines.append( { "kind": "pipeline", @@ -705,9 +712,13 @@ def ocisIntegrationTests(parallelRuns): return pipelines -def owncloudIntegrationTests(parallelRuns): +def owncloudIntegrationTests(parallelRuns, skipExceptParts = []): pipelines = [] + debugPartsEnabled = (len(skipExceptParts) != 0) for runPart in range(1, parallelRuns + 1): + if debugPartsEnabled and runPart not in skipExceptParts: + continue + pipelines.append( { "kind": "pipeline", @@ -774,9 +785,13 @@ def owncloudIntegrationTests(parallelRuns): return pipelines -def s3ngIntegrationTests(parallelRuns): +def s3ngIntegrationTests(parallelRuns, skipExceptParts = []): pipelines = [] + debugPartsEnabled = (len(skipExceptParts) != 0) for runPart in range(1, parallelRuns + 1): + if debugPartsEnabled and runPart not in skipExceptParts: + continue + pipelines.append( { "kind": "pipeline", From 72e1c8810d20642be9655d84e85215a2033363b8 Mon Sep 17 00:00:00 2001 From: David Christofas Date: Mon, 17 May 2021 17:46:37 +0200 Subject: [PATCH 57/70] Refactor sharing (#1685) --- changelog/unreleased/update-share-response.md | 5 + .../services/gateway/usershareprovider.go | 76 +--- .../usershareprovider/usershareprovider.go | 6 +- .../ocs/handlers/apps/sharing/shares/group.go | 27 +- .../handlers/apps/sharing/shares/pending.go | 49 ++- .../handlers/apps/sharing/shares/public.go | 34 +- .../handlers/apps/sharing/shares/shares.go | 404 +++++++++--------- .../apps/sharing/shares/shares_test.go | 72 ++++ .../ocs/handlers/apps/sharing/shares/user.go | 60 +-- .../expected-failures-on-OCIS-storage.md | 22 - .../expected-failures-on-OWNCLOUD-storage.md | 31 -- .../expected-failures-on-S3NG-storage.md | 22 - 12 files changed, 356 insertions(+), 452 deletions(-) create mode 100644 changelog/unreleased/update-share-response.md create mode 100644 internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares_test.go diff --git a/changelog/unreleased/update-share-response.md b/changelog/unreleased/update-share-response.md new file mode 100644 index 0000000000..b7645c3c3d --- /dev/null +++ b/changelog/unreleased/update-share-response.md @@ -0,0 +1,5 @@ +Enhancement: Add share to update response + +After accepting or rejecting a share the API includes the updated share in the response. + +https://github.com/cs3org/reva/pull/1685 diff --git a/internal/grpc/services/gateway/usershareprovider.go b/internal/grpc/services/gateway/usershareprovider.go index 12cfe3df55..175258765f 100644 --- a/internal/grpc/services/gateway/usershareprovider.go +++ b/internal/grpc/services/gateway/usershareprovider.go @@ -196,23 +196,9 @@ func (s *svc) UpdateShare(ctx context.Context, req *collaboration.UpdateShareReq // TODO(labkode): if both commits are enabled they could be done concurrently. if s.c.CommitShareToStorageGrant { - getShareReq := &collaboration.GetShareRequest{ - Ref: req.Ref, - } - getShareRes, err := c.GetShare(ctx, getShareReq) - if err != nil { - return nil, errors.Wrap(err, "gateway: error calling GetShare") - } - - if getShareRes.Status.Code != rpc.Code_CODE_OK { - return &collaboration.UpdateShareResponse{ - Status: status.NewInternal(ctx, status.NewErrorFromCode(getShareRes.Status.Code, "gateway"), - "error getting share when committing to the share"), - }, nil - } - updateGrantStatus, err := s.updateGrant(ctx, getShareRes.GetShare().GetResourceId(), - getShareRes.GetShare().GetGrantee(), - getShareRes.GetShare().GetPermissions().GetPermissions()) + updateGrantStatus, err := s.updateGrant(ctx, res.GetShare().GetResourceId(), + res.GetShare().GetGrantee(), + res.GetShare().GetPermissions().GetPermissions()) if err != nil { return nil, errors.Wrap(err, "gateway: error calling updateGrant") @@ -221,6 +207,7 @@ func (s *svc) UpdateShare(ctx context.Context, req *collaboration.UpdateShareReq if updateGrantStatus.Code != rpc.Code_CODE_OK { return &collaboration.UpdateShareResponse{ Status: updateGrantStatus, + Share: res.Share, }, nil } } @@ -309,34 +296,17 @@ func (s *svc) UpdateReceivedShare(ctx context.Context, req *collaboration.Update // share display name and storage filename. if req.Field.GetState() != collaboration.ShareState_SHARE_STATE_INVALID { if req.Field.GetState() == collaboration.ShareState_SHARE_STATE_ACCEPTED { - getShareReq := &collaboration.GetReceivedShareRequest{Ref: req.Ref} - getShareRes, err := s.GetReceivedShare(ctx, getShareReq) - if err != nil { - log.Err(err).Msg("gateway: error calling GetReceivedShare") - return &collaboration.UpdateReceivedShareResponse{ - Status: &rpc.Status{ - Code: rpc.Code_CODE_INTERNAL, - }, - }, nil - } - - if getShareRes.Status.Code != rpc.Code_CODE_OK { - log.Error().Msg("gateway: error calling GetReceivedShare") - return &collaboration.UpdateReceivedShareResponse{ - Status: &rpc.Status{ - Code: rpc.Code_CODE_INTERNAL, - }, - }, nil - } - - share := getShareRes.Share + share := res.Share if share == nil { panic("gateway: error updating a received share: the share is nil") } - createRefStatus, err := s.createReference(ctx, share.Share.ResourceId) - return &collaboration.UpdateReceivedShareResponse{ - Status: createRefStatus, - }, err + createRefStatus := s.createReference(ctx, share.Share.ResourceId) + rsp := &collaboration.UpdateReceivedShareResponse{Status: createRefStatus} + + if createRefStatus.Code == rpc.Code_CODE_OK { + rsp.Share = share + } + return rsp, nil } else if req.Field.GetState() == collaboration.ShareState_SHARE_STATE_REJECTED { // Nothing more to do, return the original result return res, nil @@ -350,7 +320,7 @@ func (s *svc) UpdateReceivedShare(ctx context.Context, req *collaboration.Update }, nil } -func (s *svc) createReference(ctx context.Context, resourceID *provider.ResourceId) (*rpc.Status, error) { +func (s *svc) createReference(ctx context.Context, resourceID *provider.ResourceId) *rpc.Status { log := appctx.GetLogger(ctx) @@ -358,9 +328,9 @@ func (s *svc) createReference(ctx context.Context, resourceID *provider.Resource c, err := s.findByID(ctx, resourceID) if err != nil { if _, ok := err.(errtypes.IsNotFound); ok { - return status.NewNotFound(ctx, "storage provider not found"), nil + return status.NewNotFound(ctx, "storage provider not found") } - return status.NewInternal(ctx, err, "error finding storage provider"), nil + return status.NewInternal(ctx, err, "error finding storage provider") } statReq := &provider.StatRequest{ @@ -373,19 +343,19 @@ func (s *svc) createReference(ctx context.Context, resourceID *provider.Resource statRes, err := c.Stat(ctx, statReq) if err != nil { - return status.NewInternal(ctx, err, "gateway: error calling Stat for the share resource id: "+resourceID.String()), nil + return status.NewInternal(ctx, err, "gateway: error calling Stat for the share resource id: "+resourceID.String()) } if statRes.Status.Code != rpc.Code_CODE_OK { err := status.NewErrorFromCode(statRes.Status.GetCode(), "gateway") log.Err(err).Msg("gateway: Stat failed on the share resource id: " + resourceID.String()) - return status.NewInternal(ctx, err, "error updating received share"), nil + return status.NewInternal(ctx, err, "error updating received share") } homeRes, err := s.GetHome(ctx, &provider.GetHomeRequest{}) if err != nil { err := errors.Wrap(err, "gateway: error calling GetHome") - return status.NewInternal(ctx, err, "error updating received share"), nil + return status.NewInternal(ctx, err, "error updating received share") } // reference path is the home path + some name @@ -410,9 +380,9 @@ func (s *svc) createReference(ctx context.Context, resourceID *provider.Resource c, err = s.findByPath(ctx, refPath) if err != nil { if _, ok := err.(errtypes.IsNotFound); ok { - return status.NewNotFound(ctx, "storage provider not found"), nil + return status.NewNotFound(ctx, "storage provider not found") } - return status.NewInternal(ctx, err, "error finding storage provider"), nil + return status.NewInternal(ctx, err, "error finding storage provider") } createRefRes, err := c.CreateReference(ctx, createRefReq) @@ -420,15 +390,15 @@ func (s *svc) createReference(ctx context.Context, resourceID *provider.Resource log.Err(err).Msg("gateway: error calling GetHome") return &rpc.Status{ Code: rpc.Code_CODE_INTERNAL, - }, nil + } } if createRefRes.Status.Code != rpc.Code_CODE_OK { err := status.NewErrorFromCode(createRefRes.Status.GetCode(), "gateway") - return status.NewInternal(ctx, err, "error updating received share"), nil + return status.NewInternal(ctx, err, "error updating received share") } - return status.NewOK(ctx), nil + return status.NewOK(ctx) } func (s *svc) addGrant(ctx context.Context, id *provider.ResourceId, g *provider.Grantee, p *provider.ResourcePermissions) (*rpc.Status, error) { diff --git a/internal/grpc/services/usershareprovider/usershareprovider.go b/internal/grpc/services/usershareprovider/usershareprovider.go index 0e8521d900..a4997d405b 100644 --- a/internal/grpc/services/usershareprovider/usershareprovider.go +++ b/internal/grpc/services/usershareprovider/usershareprovider.go @@ -172,7 +172,7 @@ func (s *service) ListShares(ctx context.Context, req *collaboration.ListSharesR } func (s *service) UpdateShare(ctx context.Context, req *collaboration.UpdateShareRequest) (*collaboration.UpdateShareResponse, error) { - _, err := s.sm.UpdateShare(ctx, req.Ref, req.Field.GetPermissions()) // TODO(labkode): check what to update + share, err := s.sm.UpdateShare(ctx, req.Ref, req.Field.GetPermissions()) // TODO(labkode): check what to update if err != nil { return &collaboration.UpdateShareResponse{ Status: status.NewInternal(ctx, err, "error updating share"), @@ -181,6 +181,7 @@ func (s *service) UpdateShare(ctx context.Context, req *collaboration.UpdateShar res := &collaboration.UpdateShareResponse{ Status: status.NewOK(ctx), + Share: share, } return res, nil } @@ -219,7 +220,7 @@ func (s *service) GetReceivedShare(ctx context.Context, req *collaboration.GetRe } func (s *service) UpdateReceivedShare(ctx context.Context, req *collaboration.UpdateReceivedShareRequest) (*collaboration.UpdateReceivedShareResponse, error) { - _, err := s.sm.UpdateReceivedShare(ctx, req.Ref, req.Field) // TODO(labkode): check what to update + share, err := s.sm.UpdateReceivedShare(ctx, req.Ref, req.Field) // TODO(labkode): check what to update if err != nil { return &collaboration.UpdateReceivedShareResponse{ Status: status.NewInternal(ctx, err, "error updating received share"), @@ -228,6 +229,7 @@ func (s *service) UpdateReceivedShare(ctx context.Context, req *collaboration.Up res := &collaboration.UpdateReceivedShareResponse{ Status: status.NewOK(ctx), + Share: share, } return res, nil } diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/group.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/group.go index 9e24024c7b..56663aec29 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/group.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/group.go @@ -80,30 +80,5 @@ func (h *Handler) createGroupShare(w http.ResponseWriter, r *http.Request, statI }, } - createShareResponse, err := c.CreateShare(ctx, createShareReq) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc create share request", err) - return - } - if createShareResponse.Status.Code != rpc.Code_CODE_OK { - if createShareResponse.Status.Code == rpc.Code_CODE_NOT_FOUND { - response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "not found", nil) - return - } - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc create share request failed", err) - return - } - s, err := conversions.CS3Share2ShareData(ctx, createShareResponse.Share) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) - return - } - err = h.addFileInfo(ctx, s, statInfo) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error adding fileinfo to share", err) - return - } - h.mapUserIds(ctx, c, s) - - response.WriteOCSSuccess(w, r, s) + h.createCs3Share(ctx, w, r, c, createShareReq, statInfo) } diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/pending.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/pending.go index 45eb94619c..4a7d06684a 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/pending.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/pending.go @@ -20,31 +20,37 @@ package shares import ( "net/http" + "path" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" + "github.com/cs3org/reva/internal/http/services/owncloud/ocs/conversions" "github.com/cs3org/reva/internal/http/services/owncloud/ocs/response" + "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" "github.com/pkg/errors" ) func (h *Handler) updateReceivedShare(w http.ResponseWriter, r *http.Request, shareID string, rejectShare bool) { ctx := r.Context() + logger := appctx.GetLogger(ctx) - uClient, err := pool.GetGatewayServiceClient(h.gatewayAddr) + client, err := pool.GetGatewayServiceClient(h.gatewayAddr) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error getting grpc gateway client", err) return } - shareRequest := &collaboration.UpdateReceivedShareRequest{ - Ref: &collaboration.ShareReference{ - Spec: &collaboration.ShareReference_Id{ - Id: &collaboration.ShareId{ - OpaqueId: shareID, - }, + ref := &collaboration.ShareReference{ + Spec: &collaboration.ShareReference_Id{ + Id: &collaboration.ShareId{ + OpaqueId: shareID, }, }, + } + + shareRequest := &collaboration.UpdateReceivedShareRequest{ + Ref: ref, Field: &collaboration.UpdateReceivedShareRequest_UpdateField{ Field: &collaboration.UpdateReceivedShareRequest_UpdateField_State{ State: collaboration.ShareState_SHARE_STATE_ACCEPTED, @@ -59,7 +65,7 @@ func (h *Handler) updateReceivedShare(w http.ResponseWriter, r *http.Request, sh } } - shareRes, err := uClient.UpdateReceivedShare(ctx, shareRequest) + shareRes, err := client.UpdateReceivedShare(ctx, shareRequest) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc update received share request failed", err) return @@ -73,4 +79,31 @@ func (h *Handler) updateReceivedShare(w http.ResponseWriter, r *http.Request, sh response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc update received share request failed", errors.Errorf("code: %d, message: %s", shareRes.Status.Code, shareRes.Status.Message)) return } + + rs := shareRes.GetShare() + + info, status, err := h.getResourceInfoByID(ctx, client, rs.Share.ResourceId) + if err != nil || status.Code != rpc.Code_CODE_OK { + h.logProblems(status, err, "could not stat, skipping") + } + + data, err := conversions.CS3Share2ShareData(r.Context(), rs.Share) + if err != nil { + logger.Debug().Interface("share", rs.Share).Interface("shareData", data).Err(err).Msg("could not CS3Share2ShareData, skipping") + } + + data.State = mapState(rs.GetState()) + + if err := h.addFileInfo(ctx, data, info); err != nil { + logger.Debug().Interface("received_share", rs).Interface("info", info).Interface("shareData", data).Err(err).Msg("could not add file info, skipping") + } + h.mapUserIds(r.Context(), client, data) + + if data.State == ocsStateAccepted { + // Needed because received shares can be jailed in a folder in the users home + data.FileTarget = path.Join(h.sharePrefix, path.Base(info.Path)) + data.Path = path.Join(h.sharePrefix, path.Base(info.Path)) + } + + response.WriteOCSSuccess(w, r, data) } diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go index e574551d4e..5c8029f4a1 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go @@ -23,7 +23,6 @@ import ( "fmt" "net/http" "strconv" - "time" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" @@ -143,7 +142,7 @@ func (h *Handler) listPublicShares(r *http.Request, filters []*link.ListPublicSh ocsDataPayload := make([]*conversions.ShareData, 0) // TODO(refs) why is this guard needed? Are we moving towards a gateway only for service discovery? without a gateway this is dead code. if h.gatewayAddr != "" { - c, err := pool.GetGatewayServiceClient(h.gatewayAddr) + client, err := pool.GetGatewayServiceClient(h.gatewayAddr) if err != nil { return ocsDataPayload, nil, err } @@ -152,7 +151,7 @@ func (h *Handler) listPublicShares(r *http.Request, filters []*link.ListPublicSh Filters: filters, } - res, err := c.ListPublicShares(ctx, &req) + res, err := client.ListPublicShares(ctx, &req) if err != nil { return ocsDataPayload, nil, err } @@ -160,30 +159,11 @@ func (h *Handler) listPublicShares(r *http.Request, filters []*link.ListPublicSh return ocsDataPayload, res.Status, nil } - var info *provider.ResourceInfo for _, share := range res.GetShare() { - key := wrapResourceID(share.ResourceId) - if infoIf, err := h.resourceInfoCache.Get(key); h.resourceInfoCacheTTL > 0 && err == nil { - log.Debug().Msgf("cache hit for resource %+v", share.ResourceId) - info = infoIf.(*provider.ResourceInfo) - } else { - statRequest := &provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Id{ - Id: share.ResourceId, - }, - }, - } - - statResponse, err := c.Stat(ctx, statRequest) - if err != nil || res.Status.Code != rpc.Code_CODE_OK { - log.Debug().Interface("share", share).Interface("response", statResponse).Err(err).Msg("could not stat share, skipping") - continue - } - info = statResponse.Info - if h.resourceInfoCacheTTL > 0 { - _ = h.resourceInfoCache.SetWithExpire(key, info, time.Second*h.resourceInfoCacheTTL) - } + info, status, err := h.getResourceInfoByID(ctx, client, share.ResourceId) + if err != nil || status.Code != rpc.Code_CODE_OK { + log.Debug().Interface("share", share).Interface("status", status).Err(err).Msg("could not stat share, skipping") + continue } sData := conversions.PublicShare2ShareData(share, r, h.publicURL) @@ -194,7 +174,7 @@ func (h *Handler) listPublicShares(r *http.Request, filters []*link.ListPublicSh log.Debug().Interface("share", share).Interface("info", info).Err(err).Msg("could not add file info, skipping") continue } - h.mapUserIds(ctx, c, sData) + h.mapUserIds(ctx, client, sData) log.Debug().Interface("share", share).Interface("info", info).Interface("shareData", share).Msg("mapped") diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index 10e13afbc2..fefe0acad2 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -61,10 +61,10 @@ type Handler struct { publicURL string sharePrefix string homeNamespace string - resourceInfoCacheTTL time.Duration additionalInfoTemplate *template.Template userIdentifierCache *ttlcache.Cache resourceInfoCache gcache.Cache + resourceInfoCacheTTL time.Duration } // we only cache the minimal set of data instead of the full user metadata @@ -87,14 +87,13 @@ func (h *Handler) Init(c *config.Config) error { h.publicURL = c.Config.Host h.sharePrefix = c.SharePrefix h.homeNamespace = c.HomeNamespace - h.resourceInfoCacheTTL = time.Duration(c.ResourceInfoCacheTTL) + h.resourceInfoCache = gcache.New(c.ResourceInfoCacheSize).LFU().Build() + h.resourceInfoCacheTTL = time.Second * time.Duration(c.ResourceInfoCacheTTL) h.additionalInfoTemplate, _ = template.New("additionalInfo").Parse(c.AdditionalInfoAttribute) h.userIdentifierCache = ttlcache.NewCache() - _ = h.userIdentifierCache.SetTTL(60 * time.Second) - - h.resourceInfoCache = gcache.New(c.ResourceInfoCacheSize).LFU().Build() + _ = h.userIdentifierCache.SetTTL(time.Second * 60) if h.resourceInfoCacheTTL > 0 { cwm, err := getCacheWarmupManager(c) @@ -208,7 +207,7 @@ func (h *Handler) createShare(w http.ResponseWriter, r *http.Request) { } // get user permissions on the shared file - c, err := pool.GetGatewayServiceClient(h.gatewayAddr) + client, err := pool.GetGatewayServiceClient(h.gatewayAddr) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error getting grpc gateway client", err) return @@ -227,7 +226,7 @@ func (h *Handler) createShare(w http.ResponseWriter, r *http.Request) { sublog := appctx.GetLogger(ctx).With().Str("path", fn).Logger() - statRes, err := c.Stat(ctx, &statReq) + statRes, err := client.Stat(ctx, &statReq) if err != nil { sublog.Debug().Err(err).Str("createShare", "shares").Msg("error on stat call") response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "missing resource information", fmt.Errorf("error getting resource information")) @@ -274,7 +273,6 @@ func (h *Handler) createShare(w http.ResponseWriter, r *http.Request) { func (h *Handler) extractPermissions(w http.ResponseWriter, r *http.Request, ri *provider.ResourceInfo, defaultPermissions *conversions.Role) (*conversions.Role, []byte, error) { reqRole, reqPermissions := r.FormValue("role"), r.FormValue("permissions") var role *conversions.Role - var permissions conversions.Permissions // the share role overrides the requested permissions if reqRole != "" { @@ -290,7 +288,7 @@ func (h *Handler) extractPermissions(w http.ResponseWriter, r *http.Request, ri response.WriteOCSError(w, r, response.MetaBadRequest.StatusCode, "permissions must be an integer", nil) return nil, nil, err } - permissions, err = conversions.NewPermissions(pint) + perm, err := conversions.NewPermissions(pint) if err != nil { if err == conversions.ErrPermissionNotInRange { response.WriteOCSError(w, r, http.StatusNotFound, err.Error(), nil) @@ -299,25 +297,25 @@ func (h *Handler) extractPermissions(w http.ResponseWriter, r *http.Request, ri } return nil, nil, err } - role = conversions.RoleFromOCSPermissions(permissions) + role = conversions.RoleFromOCSPermissions(perm) } } - permissions = role.OCSPermissions() + permissions := role.OCSPermissions() if ri != nil && ri.Type == provider.ResourceType_RESOURCE_TYPE_FILE { // Single file shares should never have delete or create permissions permissions &^= conversions.PermissionCreate permissions &^= conversions.PermissionDelete if permissions == conversions.PermissionInvalid { response.WriteOCSError(w, r, response.MetaBadRequest.StatusCode, "Cannot set the requested share permissions", nil) - return nil, nil, fmt.Errorf("Cannot set the requested share permissions") + return nil, nil, errors.New("cannot set the requested share permissions") } } existingPermissions := conversions.RoleFromResourcePermissions(ri.PermissionSet).OCSPermissions() if permissions == conversions.PermissionInvalid || !existingPermissions.Contain(permissions) { response.WriteOCSError(w, r, http.StatusNotFound, "Cannot set the requested share permissions", nil) - return nil, nil, fmt.Errorf("Cannot set the requested share permissions") + return nil, nil, errors.New("cannot set the requested share permissions") } role = conversions.RoleFromOCSPermissions(permissions) @@ -424,37 +422,17 @@ func (h *Handler) getShare(w http.ResponseWriter, r *http.Request, shareID strin return } - var info *provider.ResourceInfo - key := wrapResourceID(resourceID) - if infoIf, err := h.resourceInfoCache.Get(key); h.resourceInfoCacheTTL > 0 && err == nil { - logger.Debug().Msgf("cache hit for resource %+v", resourceID) - info = infoIf.(*provider.ResourceInfo) - } else { - // prepare the stat request - statReq := &provider.StatRequest{ - // prepare the reference - Ref: &provider.Reference{ - // using ResourceId from the share - Spec: &provider.Reference_Id{Id: resourceID}, - }, - } - - statResponse, err := client.Stat(ctx, statReq) - if err != nil { - log.Error().Err(err).Msg("error mapping share data") - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) - return - } + info, status, err := h.getResourceInfoByID(ctx, client, resourceID) + if err != nil { + log.Error().Err(err).Msg("error mapping share data") + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) + return + } - if statResponse.Status.Code != rpc.Code_CODE_OK { - log.Error().Err(err).Str("status", statResponse.Status.Code.String()).Msg("error mapping share data") - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) - return - } - info = statResponse.Info - if h.resourceInfoCacheTTL > 0 { - _ = h.resourceInfoCache.SetWithExpire(key, info, time.Second*h.resourceInfoCacheTTL) - } + if status.Code != rpc.Code_CODE_OK { + log.Error().Err(err).Str("status", status.Code.String()).Msg("error mapping share data") + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) + return } err = h.addFileInfo(ctx, share, info) @@ -487,7 +465,7 @@ func (h *Handler) updateShare(w http.ResponseWriter, r *http.Request, shareID st return } - uClient, err := pool.GetGatewayServiceClient(h.gatewayAddr) + client, err := pool.GetGatewayServiceClient(h.gatewayAddr) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error getting grpc gateway client", err) return @@ -510,7 +488,7 @@ func (h *Handler) updateShare(w http.ResponseWriter, r *http.Request, shareID st }, }, } - uRes, err := uClient.UpdateShare(ctx, uReq) + uRes, err := client.UpdateShare(ctx, uReq) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc update share request", err) return @@ -525,31 +503,7 @@ func (h *Handler) updateShare(w http.ResponseWriter, r *http.Request, shareID st return } - gReq := &collaboration.GetShareRequest{ - Ref: &collaboration.ShareReference{ - Spec: &collaboration.ShareReference_Id{ - Id: &collaboration.ShareId{ - OpaqueId: shareID, - }, - }, - }, - } - gRes, err := uClient.GetShare(ctx, gReq) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc get share request", err) - return - } - - if gRes.Status.Code != rpc.Code_CODE_OK { - if gRes.Status.Code == rpc.Code_CODE_NOT_FOUND { - response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "not found", nil) - return - } - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc get share request failed", err) - return - } - - share, err := conversions.CS3Share2ShareData(ctx, gRes.Share) + share, err := conversions.CS3Share2ShareData(ctx, uRes.Share) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) return @@ -558,12 +512,12 @@ func (h *Handler) updateShare(w http.ResponseWriter, r *http.Request, shareID st statReq := provider.StatRequest{ Ref: &provider.Reference{ Spec: &provider.Reference_Id{ - Id: gRes.Share.ResourceId, + Id: uRes.Share.ResourceId, }, }, } - statRes, err := uClient.Stat(r.Context(), &statReq) + statRes, err := client.Stat(r.Context(), &statReq) if err != nil { log.Debug().Err(err).Str("shares", "update user share").Msg("error during stat") response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "missing resource information", fmt.Errorf("error getting resource information")) @@ -585,7 +539,7 @@ func (h *Handler) updateShare(w http.ResponseWriter, r *http.Request, shareID st response.WriteOCSError(w, r, response.MetaServerError.StatusCode, err.Error(), err) return } - h.mapUserIds(ctx, uClient, share) + h.mapUserIds(ctx, client, share) response.WriteOCSSuccess(w, r, share) } @@ -601,35 +555,24 @@ func (h *Handler) isListSharesWithMe(w http.ResponseWriter, r *http.Request) (li return } -const ocsStateUnknown = -1 -const ocsStateAccepted = 0 -const ocsStatePending = 1 -const ocsStateRejected = 2 +const ( + ocsStateUnknown = -1 + ocsStateAccepted = 0 + ocsStatePending = 1 + ocsStateRejected = 2 +) func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { // which pending state to list - var stateFilter collaboration.ShareState - switch r.FormValue("state") { - case "all": - stateFilter = ocsStateUnknown // no filter - case "0": // accepted - stateFilter = collaboration.ShareState_SHARE_STATE_ACCEPTED - case "1": // pending - stateFilter = collaboration.ShareState_SHARE_STATE_PENDING - case "2": // rejected - stateFilter = collaboration.ShareState_SHARE_STATE_REJECTED - default: - stateFilter = collaboration.ShareState_SHARE_STATE_ACCEPTED - } + stateFilter := getStateFilter(r.FormValue("state")) - gwc, err := pool.GetGatewayServiceClient(h.gatewayAddr) + client, err := pool.GetGatewayServiceClient(h.gatewayAddr) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error getting grpc gateway client", err) return } ctx := r.Context() - logger := appctx.GetLogger(ctx) var pinfo *provider.ResourceInfo p := r.URL.Query().Get("path") @@ -638,46 +581,26 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { // prefix the path with the owners home, because ocs share requests are relative to the home dir target := path.Join(h.homeNamespace, r.FormValue("path")) - if infoIf, err := h.resourceInfoCache.Get(target); h.resourceInfoCacheTTL > 0 && err == nil { - logger.Debug().Msgf("cache hit for resource %+v", target) - pinfo = infoIf.(*provider.ResourceInfo) - } else { - statReq := &provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Path{ - Path: target, - }, - }, - } - - statRes, err := gwc.Stat(ctx, statReq) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc stat request", err) - return - } - - if statRes.Status.Code != rpc.Code_CODE_OK { - switch statRes.Status.Code { - case rpc.Code_CODE_NOT_FOUND: - response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "path not found", nil) - case rpc.Code_CODE_PERMISSION_DENIED: - response.WriteOCSError(w, r, response.MetaUnauthorized.StatusCode, "permission denied", nil) - default: - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc stat request failed", nil) - } - return - } - - pinfo = statRes.GetInfo() - if h.resourceInfoCacheTTL > 0 { - _ = h.resourceInfoCache.SetWithExpire(target, pinfo, time.Second*h.resourceInfoCacheTTL) + var status *rpc.Status + pinfo, status, err = h.getResourceInfoByPath(ctx, client, target) + if err != nil { + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc stat request", err) + return + } + if status.Code != rpc.Code_CODE_OK { + switch status.Code { + case rpc.Code_CODE_NOT_FOUND: + response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "path not found", nil) + case rpc.Code_CODE_PERMISSION_DENIED: + response.WriteOCSError(w, r, response.MetaUnauthorized.StatusCode, "permission denied", nil) + default: + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc stat request failed", nil) } + return } } - lrsReq := collaboration.ListReceivedSharesRequest{} - - lrsRes, err := gwc.ListReceivedShares(r.Context(), &lrsReq) + lrsRes, err := client.ListReceivedShares(ctx, &collaboration.ListReceivedSharesRequest{}) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc ListReceivedShares request", err) return @@ -691,17 +614,15 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc ListReceivedShares request failed", err) return } - lrsRes.GetShares() - shares := make([]*conversions.ShareData, 0) + shares := make([]*conversions.ShareData, 0, len(lrsRes.GetShares())) - var info *provider.ResourceInfo // TODO(refs) filter out "invalid" shares for _, rs := range lrsRes.GetShares() { - if stateFilter != ocsStateUnknown && rs.GetState() != stateFilter { continue } + var info *provider.ResourceInfo if pinfo != nil { // check if the shared resource matches the path resource if rs.Share.ResourceId.StorageId != pinfo.GetId().StorageId || @@ -712,30 +633,11 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { // we can reuse the stat info info = pinfo } else { - key := wrapResourceID(rs.Share.ResourceId) - if infoIf, err := h.resourceInfoCache.Get(key); h.resourceInfoCacheTTL > 0 && err == nil { - logger.Debug().Msgf("cache hit for resource %+v", rs.Share.ResourceId) - info = infoIf.(*provider.ResourceInfo) - } else { - // we need to do a stat call - statRequest := provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Id{ - Id: rs.Share.ResourceId, - }, - }, - } - - statRes, err := gwc.Stat(r.Context(), &statRequest) - if err != nil || statRes.Status.Code != rpc.Code_CODE_OK { - h.logProblems(statRes.GetStatus(), err, "could not stat, skipping") - continue - } - - info = statRes.GetInfo() - if h.resourceInfoCacheTTL > 0 { - _ = h.resourceInfoCache.SetWithExpire(key, info, time.Second*h.resourceInfoCacheTTL) - } + var status *rpc.Status + info, status, err = h.getResourceInfoByID(ctx, client, rs.Share.ResourceId) + if err != nil || status.Code != rpc.Code_CODE_OK { + h.logProblems(status, err, "could not stat, skipping") + continue } } @@ -745,22 +647,13 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { continue } - switch rs.GetState() { - case collaboration.ShareState_SHARE_STATE_PENDING: - data.State = ocsStatePending - case collaboration.ShareState_SHARE_STATE_ACCEPTED: - data.State = ocsStateAccepted - case collaboration.ShareState_SHARE_STATE_REJECTED: - data.State = ocsStateRejected - default: - data.State = ocsStateUnknown - } + data.State = mapState(rs.GetState()) if err := h.addFileInfo(ctx, data, info); err != nil { log.Debug().Interface("received_share", rs).Interface("info", info).Interface("shareData", data).Err(err).Msg("could not add file info, skipping") continue } - h.mapUserIds(r.Context(), gwc, data) + h.mapUserIds(r.Context(), client, data) if data.State == ocsStateAccepted { // Needed because received shares can be jailed in a folder in the users home @@ -836,48 +729,30 @@ func (h *Handler) logProblems(s *rpc.Status, e error, msg string) { func (h *Handler) addFilters(w http.ResponseWriter, r *http.Request, prefix string) ([]*collaboration.ListSharesRequest_Filter, []*link.ListPublicSharesRequest_Filter, error) { collaborationFilters := []*collaboration.ListSharesRequest_Filter{} linkFilters := []*link.ListPublicSharesRequest_Filter{} - var info *provider.ResourceInfo ctx := r.Context() // first check if the file exists - gwClient, err := pool.GetGatewayServiceClient(h.gatewayAddr) + client, err := pool.GetGatewayServiceClient(h.gatewayAddr) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error getting grpc gateway client", err) return nil, nil, err } target := path.Join(prefix, r.FormValue("path")) - if infoIf, err := h.resourceInfoCache.Get(target); h.resourceInfoCacheTTL > 0 && err == nil { - info = infoIf.(*provider.ResourceInfo) - } else { - statReq := &provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Path{ - Path: target, - }, - }, - } - - res, err := gwClient.Stat(ctx, statReq) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc stat request", err) - return nil, nil, err - } + info, status, err := h.getResourceInfoByPath(ctx, client, target) + if err != nil { + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc stat request", err) + return nil, nil, err + } - if res.Status.Code != rpc.Code_CODE_OK { - err = errors.New(res.Status.Message) - if res.Status.Code == rpc.Code_CODE_NOT_FOUND { - response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "not found", err) - return nil, nil, err - } - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc stat request failed", err) + if status.Code != rpc.Code_CODE_OK { + err = errors.New(status.Message) + if status.Code == rpc.Code_CODE_NOT_FOUND { + response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "not found", err) return nil, nil, err } - - info = res.Info - if h.resourceInfoCacheTTL > 0 { - _ = h.resourceInfoCache.SetWithExpire(target, info, time.Second*h.resourceInfoCacheTTL) - } + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc stat request failed", err) + return nil, nil, err } collaborationFilters = append(collaborationFilters, &collaboration.ListSharesRequest_Filter{ @@ -943,14 +818,13 @@ func (h *Handler) addFileInfo(ctx context.Context, s *conversions.ShareData, inf } // mustGetIdentifiers always returns a struct with identifiers, if the user or group could not be found they will all be empty -func (h *Handler) mustGetIdentifiers(ctx context.Context, c gateway.GatewayAPIClient, id string, isGroup bool) *userIdentifiers { +func (h *Handler) mustGetIdentifiers(ctx context.Context, client gateway.GatewayAPIClient, id string, isGroup bool) *userIdentifiers { sublog := appctx.GetLogger(ctx).With().Str("id", id).Logger() if id == "" { return &userIdentifiers{} } - idIf, err := h.userIdentifierCache.Get(id) - if err == nil { + if idIf, err := h.userIdentifierCache.Get(id); err == nil { sublog.Debug().Msg("cache hit") return idIf.(*userIdentifiers) } @@ -959,7 +833,7 @@ func (h *Handler) mustGetIdentifiers(ctx context.Context, c gateway.GatewayAPICl var ui *userIdentifiers if isGroup { - res, err := c.GetGroup(ctx, &grouppb.GetGroupRequest{ + res, err := client.GetGroup(ctx, &grouppb.GetGroupRequest{ GroupId: &grouppb.GroupId{ OpaqueId: id, }, @@ -988,7 +862,7 @@ func (h *Handler) mustGetIdentifiers(ctx context.Context, c gateway.GatewayAPICl Mail: res.Group.Mail, } } else { - res, err := c.GetUser(ctx, &userpb.GetUserRequest{ + res, err := client.GetUser(ctx, &userpb.GetUserRequest{ UserId: &userpb.UserId{ OpaqueId: id, }, @@ -1022,9 +896,9 @@ func (h *Handler) mustGetIdentifiers(ctx context.Context, c gateway.GatewayAPICl return ui } -func (h *Handler) mapUserIds(ctx context.Context, c gateway.GatewayAPIClient, s *conversions.ShareData) { +func (h *Handler) mapUserIds(ctx context.Context, client gateway.GatewayAPIClient, s *conversions.ShareData) { if s.UIDOwner != "" { - owner := h.mustGetIdentifiers(ctx, c, s.UIDOwner, false) + owner := h.mustGetIdentifiers(ctx, client, s.UIDOwner, false) s.UIDOwner = owner.Username if s.DisplaynameOwner == "" { s.DisplaynameOwner = owner.DisplayName @@ -1035,7 +909,7 @@ func (h *Handler) mapUserIds(ctx context.Context, c gateway.GatewayAPIClient, s } if s.UIDFileOwner != "" { - fileOwner := h.mustGetIdentifiers(ctx, c, s.UIDFileOwner, false) + fileOwner := h.mustGetIdentifiers(ctx, client, s.UIDFileOwner, false) s.UIDFileOwner = fileOwner.Username if s.DisplaynameFileOwner == "" { s.DisplaynameFileOwner = fileOwner.DisplayName @@ -1046,7 +920,7 @@ func (h *Handler) mapUserIds(ctx context.Context, c gateway.GatewayAPIClient, s } if s.ShareWith != "" && s.ShareWith != "***redacted***" { - shareWith := h.mustGetIdentifiers(ctx, c, s.ShareWith, s.ShareType == conversions.ShareTypeGroup) + shareWith := h.mustGetIdentifiers(ctx, client, s.ShareWith, s.ShareType == conversions.ShareTypeGroup) s.ShareWith = shareWith.Username if s.ShareWithDisplayname == "" { s.ShareWithDisplayname = shareWith.DisplayName @@ -1058,11 +932,123 @@ func (h *Handler) mapUserIds(ctx context.Context, c gateway.GatewayAPIClient, s } func (h *Handler) getAdditionalInfoAttribute(ctx context.Context, u *userIdentifiers) string { - b := bytes.Buffer{} - if err := h.additionalInfoTemplate.Execute(&b, u); err != nil { + var buf bytes.Buffer + if err := h.additionalInfoTemplate.Execute(&buf, u); err != nil { log := appctx.GetLogger(ctx) log.Warn().Err(err).Msg("failed to parse additional info template") return "" } - return b.String() + return buf.String() +} + +func (h *Handler) getResourceInfoByPath(ctx context.Context, client gateway.GatewayAPIClient, path string) (*provider.ResourceInfo, *rpc.Status, error) { + return h.getResourceInfo(ctx, client, path, &provider.Reference{ + Spec: &provider.Reference_Path{ + Path: path, + }, + }) +} + +func (h *Handler) getResourceInfoByID(ctx context.Context, client gateway.GatewayAPIClient, id *provider.ResourceId) (*provider.ResourceInfo, *rpc.Status, error) { + return h.getResourceInfo(ctx, client, wrapResourceID(id), &provider.Reference{ + Spec: &provider.Reference_Id{ + Id: id, + }, + }) +} + +// getResourceInfo retrieves the resource info to a target. +// This method utilizes caching if it is enabled. +func (h *Handler) getResourceInfo(ctx context.Context, client gateway.GatewayAPIClient, key string, ref *provider.Reference) (*provider.ResourceInfo, *rpc.Status, error) { + logger := appctx.GetLogger(ctx) + + var pinfo *provider.ResourceInfo + var status *rpc.Status + if infoIf, err := h.resourceInfoCache.Get(key); h.resourceInfoCacheTTL > 0 && err == nil { + logger.Debug().Msgf("cache hit for resource %+v", key) + pinfo = infoIf.(*provider.ResourceInfo) + status = &rpc.Status{Code: rpc.Code_CODE_OK} + } else { + statReq := &provider.StatRequest{ + Ref: ref, + } + + statRes, err := client.Stat(ctx, statReq) + if err != nil { + return nil, nil, err + } + + if statRes.Status.Code != rpc.Code_CODE_OK { + return nil, statRes.Status, nil + } + + pinfo = statRes.GetInfo() + status = statRes.Status + if h.resourceInfoCacheTTL > 0 { + _ = h.resourceInfoCache.SetWithExpire(key, pinfo, h.resourceInfoCacheTTL) + } + } + + return pinfo, status, nil +} + +func (h *Handler) createCs3Share(ctx context.Context, w http.ResponseWriter, r *http.Request, client gateway.GatewayAPIClient, req *collaboration.CreateShareRequest, info *provider.ResourceInfo) { + createShareResponse, err := client.CreateShare(ctx, req) + if err != nil { + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc create share request", err) + return + } + if createShareResponse.Status.Code != rpc.Code_CODE_OK { + if createShareResponse.Status.Code == rpc.Code_CODE_NOT_FOUND { + response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "not found", nil) + return + } + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc create share request failed", err) + return + } + s, err := conversions.CS3Share2ShareData(ctx, createShareResponse.Share) + if err != nil { + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) + return + } + err = h.addFileInfo(ctx, s, info) + if err != nil { + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error adding fileinfo to share", err) + return + } + h.mapUserIds(ctx, client, s) + + response.WriteOCSSuccess(w, r, s) +} + +func mapState(state collaboration.ShareState) int { + var mapped int + switch state { + case collaboration.ShareState_SHARE_STATE_PENDING: + mapped = ocsStatePending + case collaboration.ShareState_SHARE_STATE_ACCEPTED: + mapped = ocsStateAccepted + case collaboration.ShareState_SHARE_STATE_REJECTED: + mapped = ocsStateRejected + default: + mapped = ocsStateUnknown + } + return mapped +} + +func getStateFilter(s string) collaboration.ShareState { + var stateFilter collaboration.ShareState + switch s { + case "all": + stateFilter = ocsStateUnknown // no filter + case "0": // accepted + stateFilter = collaboration.ShareState_SHARE_STATE_ACCEPTED + case "1": // pending + stateFilter = collaboration.ShareState_SHARE_STATE_PENDING + case "2": // rejected + stateFilter = collaboration.ShareState_SHARE_STATE_REJECTED + default: + stateFilter = collaboration.ShareState_SHARE_STATE_ACCEPTED + } + return stateFilter } diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares_test.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares_test.go new file mode 100644 index 0000000000..d21b7e42dc --- /dev/null +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares_test.go @@ -0,0 +1,72 @@ +// Copyright 2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction.package shares +package shares + +import ( + "testing" + + collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" +) + +func TestGetStateFilter(t *testing.T) { + tests := []struct { + input string + expected collaboration.ShareState + }{ + {"all", ocsStateUnknown}, + {"0", collaboration.ShareState_SHARE_STATE_ACCEPTED}, + {"1", collaboration.ShareState_SHARE_STATE_PENDING}, + {"2", collaboration.ShareState_SHARE_STATE_REJECTED}, + {"something_invalid", collaboration.ShareState_SHARE_STATE_ACCEPTED}, + {"", collaboration.ShareState_SHARE_STATE_ACCEPTED}, + } + + for _, tt := range tests { + state := getStateFilter(tt.input) + if state != tt.expected { + t.Errorf("getStateFilter(\"%s\") returned %s instead of expected %s", tt.input, state, tt.expected) + } + } +} + +func TestMapState(t *testing.T) { + // case collaboration.ShareState_SHARE_STATE_PENDING: + // mapped = ocsStatePending + // case collaboration.ShareState_SHARE_STATE_ACCEPTED: + // mapped = ocsStateAccepted + // case collaboration.ShareState_SHARE_STATE_REJECTED: + // mapped = ocsStateRejected + // default: + // mapped = ocsStateUnknown + tests := []struct { + input collaboration.ShareState + expected int + }{ + {collaboration.ShareState_SHARE_STATE_PENDING, ocsStatePending}, + {collaboration.ShareState_SHARE_STATE_ACCEPTED, ocsStateAccepted}, + {collaboration.ShareState_SHARE_STATE_REJECTED, ocsStateRejected}, + {42, ocsStateUnknown}, + } + + for _, tt := range tests { + state := mapState(tt.input) + if state != tt.expected { + t.Errorf("mapState(%d) returned %d instead of expected %d", tt.input, state, tt.expected) + } + } +} diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go index cac4cf61f8..1a133f34b6 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go @@ -20,7 +20,6 @@ package shares import ( "net/http" - "time" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" @@ -83,32 +82,7 @@ func (h *Handler) createUserShare(w http.ResponseWriter, r *http.Request, statIn }, } - createShareResponse, err := c.CreateShare(ctx, createShareReq) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc create share request", err) - return - } - if createShareResponse.Status.Code != rpc.Code_CODE_OK { - if createShareResponse.Status.Code == rpc.Code_CODE_NOT_FOUND { - response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "not found", nil) - return - } - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc create share request failed", err) - return - } - s, err := conversions.CS3Share2ShareData(ctx, createShareResponse.Share) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err) - return - } - err = h.addFileInfo(ctx, s, statInfo) - if err != nil { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error adding fileinfo to share", err) - return - } - h.mapUserIds(ctx, c, s) - - response.WriteOCSSuccess(w, r, s) + h.createCs3Share(ctx, w, r, c, createShareReq, statInfo) } func (h *Handler) removeUserShare(w http.ResponseWriter, r *http.Request, shareID string) { @@ -157,13 +131,13 @@ func (h *Handler) listUserShares(r *http.Request, filters []*collaboration.ListS ocsDataPayload := make([]*conversions.ShareData, 0) if h.gatewayAddr != "" { // get a connection to the users share provider - c, err := pool.GetGatewayServiceClient(h.gatewayAddr) + client, err := pool.GetGatewayServiceClient(h.gatewayAddr) if err != nil { return ocsDataPayload, nil, err } // do list shares request. filtered - lsUserSharesResponse, err := c.ListShares(ctx, &lsUserSharesRequest) + lsUserSharesResponse, err := client.ListShares(ctx, &lsUserSharesRequest) if err != nil { return ocsDataPayload, nil, err } @@ -179,35 +153,17 @@ func (h *Handler) listUserShares(r *http.Request, filters []*collaboration.ListS continue } - var info *provider.ResourceInfo - key := wrapResourceID(s.ResourceId) - if infoIf, err := h.resourceInfoCache.Get(key); h.resourceInfoCacheTTL > 0 && err == nil { - log.Debug().Msgf("cache hit for resource %+v", s.ResourceId) - info = infoIf.(*provider.ResourceInfo) - } else { - // prepare the stat request - statReq := &provider.StatRequest{ - Ref: &provider.Reference{ - Spec: &provider.Reference_Id{Id: s.ResourceId}, - }, - } - - statResponse, err := c.Stat(ctx, statReq) - if err != nil || statResponse.Status.Code != rpc.Code_CODE_OK { - log.Debug().Interface("share", s).Interface("response", statResponse).Interface("shareData", data).Err(err).Msg("could not stat share, skipping") - continue - } - info = statResponse.Info - if h.resourceInfoCacheTTL > 0 { - _ = h.resourceInfoCache.SetWithExpire(key, info, time.Second*h.resourceInfoCacheTTL) - } + info, status, err := h.getResourceInfoByID(ctx, client, s.ResourceId) + if err != nil || status.Code != rpc.Code_CODE_OK { + log.Debug().Interface("share", s).Interface("status", status).Interface("shareData", data).Err(err).Msg("could not stat share, skipping") + continue } if err := h.addFileInfo(ctx, data, info); err != nil { log.Debug().Interface("share", s).Interface("info", info).Interface("shareData", data).Err(err).Msg("could not add file info, skipping") continue } - h.mapUserIds(ctx, c, data) + h.mapUserIds(ctx, client, data) log.Debug().Interface("share", s).Interface("info", info).Interface("shareData", data).Msg("mapped") ocsDataPayload = append(ocsDataPayload, data) diff --git a/tests/acceptance/expected-failures-on-OCIS-storage.md b/tests/acceptance/expected-failures-on-OCIS-storage.md index 5edf2e3a3b..b14d72b910 100644 --- a/tests/acceptance/expected-failures-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-on-OCIS-storage.md @@ -640,8 +640,6 @@ File and sync features in a shared scenario #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) - [apiShareManagementToShares/acceptShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L82) -- [apiShareManagementToShares/acceptShares.feature:173](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L173) -- [apiShareManagementToShares/acceptShares.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L186) - [apiShareManagementToShares/acceptShares.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L207) - [apiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L260) - [apiShareManagementToShares/acceptSharesToSharesFolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L31) @@ -667,8 +665,6 @@ File and sync features in a shared scenario - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L157) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L290) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L291) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:308](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L308) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L309) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L46) - [apiShareManagementToShares/mergeShare.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L32) - [apiShareManagementToShares/mergeShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L42) @@ -713,10 +709,6 @@ File and sync features in a shared scenario - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L554) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:572](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L572) -#### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L347) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:348](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L348) - #### [File deletion using dav gives unique string in filename in the trashbin](https://github.com/owncloud/product/issues/178) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L58) @@ -1006,14 +998,6 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt #### [Resharing does not work with ocis storage](https://github.com/owncloud/product/issues/265) -- [apiShareReshareToShares1/reShare.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L61) -- [apiShareReshareToShares1/reShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L62) -- [apiShareReshareToShares1/reShare.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L78) -- [apiShareReshareToShares1/reShare.feature:79](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L79) -- [apiShareReshareToShares1/reShare.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L95) -- [apiShareReshareToShares1/reShare.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L96) -- [apiShareReshareToShares1/reShare.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L112) -- [apiShareReshareToShares1/reShare.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L113) - [apiShareReshareToShares1/reShare.feature:169](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L169) - [apiShareReshareToShares1/reShare.feature:170](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L170) - [apiShareReshareToShares1/reShare.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L171) @@ -1073,8 +1057,6 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareReshareToShares2/reShareDisabled.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L27) - [apiShareReshareToShares2/reShareDisabled.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L28) -- [apiShareReshareToShares2/reShareDisabled.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L42) -- [apiShareReshareToShares2/reShareDisabled.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L43) #### [share permissions are not enforced](https://github.com/owncloud/product/issues/270) @@ -1878,16 +1860,12 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:79](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L79) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L26) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L27) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L46) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L47) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L67) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L68) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L87) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L88) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L108) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L109) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L128) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:129](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L129) - [apiMain/caldav.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L8) - [apiMain/caldav.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L15) diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index d9b0756dba..42eb79096c 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -660,8 +660,6 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) - [apiShareManagementToShares/acceptShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L82) -- [apiShareManagementToShares/acceptShares.feature:173](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L173) -- [apiShareManagementToShares/acceptShares.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L186) - [apiShareManagementToShares/acceptShares.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L207) - [apiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L260) - [apiShareManagementToShares/acceptSharesToSharesFolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L31) @@ -687,8 +685,6 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L157) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L290) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L291) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:308](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L308) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L309) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L46) - [apiShareManagementToShares/mergeShare.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L32) - [apiShareManagementToShares/mergeShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L42) @@ -733,10 +729,6 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L554) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:572](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L572) -#### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L347) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:348](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L348) - #### [File deletion using dav gives unique string in filename in the trashbin](https://github.com/owncloud/product/issues/178) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L58) @@ -1027,14 +1019,6 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt #### [Resharing does not work with ocis storage](https://github.com/owncloud/product/issues/265) -- [apiShareReshareToShares1/reShare.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L61) -- [apiShareReshareToShares1/reShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L62) -- [apiShareReshareToShares1/reShare.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L78) -- [apiShareReshareToShares1/reShare.feature:79](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L79) -- [apiShareReshareToShares1/reShare.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L95) -- [apiShareReshareToShares1/reShare.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L96) -- [apiShareReshareToShares1/reShare.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L112) -- [apiShareReshareToShares1/reShare.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L113) - [apiShareReshareToShares1/reShare.feature:169](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L169) - [apiShareReshareToShares1/reShare.feature:170](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L170) - [apiShareReshareToShares1/reShare.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L171) @@ -1145,8 +1129,6 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareReshareToShares2/reShareDisabled.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L27) - [apiShareReshareToShares2/reShareDisabled.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L28) -- [apiShareReshareToShares2/reShareDisabled.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L42) -- [apiShareReshareToShares2/reShareDisabled.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L43) #### [share permissions are not enforced](https://github.com/owncloud/product/issues/270) @@ -2008,16 +1990,12 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:79](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L79) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L26) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L27) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L46) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L47) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L67) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L68) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L87) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L88) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L108) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L109) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L128) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:129](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L129) - [apiMain/caldav.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L8) - [apiMain/caldav.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L15) @@ -2233,12 +2211,3 @@ _ocdav: return checksum in upload response for chunked upload_ - [apiWebdavUploadTUS/uploadToShare.feature:248](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L248) - [apiWebdavUploadTUS/uploadToShare.feature:288](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L288) - [apiWebdavUploadTUS/uploadToShare.feature:289](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadToShare.feature#L289) - - -#### [Share inaccessible if folder with same name was deleted and recreated](https://github.com/owncloud/ocis/issues/1787) -- [apiShareReshareToShares1/reShare.feature:269](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L269) -- [apiShareReshareToShares1/reShare.feature:270](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L270) -- [apiShareReshareToShares1/reShare.feature:287](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L287) -- [apiShareReshareToShares1/reShare.feature:288](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L288) -- [apiShareReshareToShares1/reShare.feature:305](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L288) -- [apiShareReshareToShares1/reShare.feature:306](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L288) diff --git a/tests/acceptance/expected-failures-on-S3NG-storage.md b/tests/acceptance/expected-failures-on-S3NG-storage.md index 00e4e4bee6..1ff6314d6e 100644 --- a/tests/acceptance/expected-failures-on-S3NG-storage.md +++ b/tests/acceptance/expected-failures-on-S3NG-storage.md @@ -640,8 +640,6 @@ File and sync features in a shared scenario #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) - [apiShareManagementToShares/acceptShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L82) -- [apiShareManagementToShares/acceptShares.feature:173](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L173) -- [apiShareManagementToShares/acceptShares.feature:186](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L186) - [apiShareManagementToShares/acceptShares.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L207) - [apiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L260) - [apiShareManagementToShares/acceptSharesToSharesFolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L31) @@ -667,8 +665,6 @@ File and sync features in a shared scenario - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:157](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L157) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L290) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L291) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:308](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L308) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L309) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L46) - [apiShareManagementToShares/mergeShare.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L32) - [apiShareManagementToShares/mergeShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/mergeShare.feature#L42) @@ -713,10 +709,6 @@ File and sync features in a shared scenario - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L554) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:572](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L572) -#### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L347) -- [apiShareManagementBasicToShares/createShareToSharesFolder.feature:348](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L348) - #### [File deletion using dav gives unique string in filename in the trashbin](https://github.com/owncloud/product/issues/178) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:58](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L58) @@ -1006,14 +998,6 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt #### [Resharing does not work with ocis storage](https://github.com/owncloud/product/issues/265) -- [apiShareReshareToShares1/reShare.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L61) -- [apiShareReshareToShares1/reShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L62) -- [apiShareReshareToShares1/reShare.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L78) -- [apiShareReshareToShares1/reShare.feature:79](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L79) -- [apiShareReshareToShares1/reShare.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L95) -- [apiShareReshareToShares1/reShare.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L96) -- [apiShareReshareToShares1/reShare.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L112) -- [apiShareReshareToShares1/reShare.feature:113](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L113) - [apiShareReshareToShares1/reShare.feature:169](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L169) - [apiShareReshareToShares1/reShare.feature:170](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L170) - [apiShareReshareToShares1/reShare.feature:171](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares1/reShare.feature#L171) @@ -1073,8 +1057,6 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareReshareToShares2/reShareDisabled.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L27) - [apiShareReshareToShares2/reShareDisabled.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L28) -- [apiShareReshareToShares2/reShareDisabled.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L42) -- [apiShareReshareToShares2/reShareDisabled.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareDisabled.feature#L43) #### [share permissions are not enforced](https://github.com/owncloud/product/issues/270) @@ -1883,16 +1865,12 @@ Scenario Outline: Do a PROPFIND to a non-existing URL - [apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature:79](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareWhenExcludedFromSharing.feature#L79) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:26](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L26) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L27) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L46) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L47) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L67) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:68](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L68) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L87) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L88) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L108) - [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L109) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L128) -- [apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature:129](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWhenShareWithOnlyMembershipGroups.feature#L129) - [apiMain/caldav.feature:8](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L8) - [apiMain/caldav.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/caldav.feature#L15) From 11dfdd131503438ad3582633cd5b1a904f8344fa Mon Sep 17 00:00:00 2001 From: Samuel Alfageme Date: Thu, 20 May 2021 11:14:32 +0200 Subject: [PATCH 58/70] Fix: use the -static ldflag only for the 'build-ci' target (#1718) --- Makefile | 7 ++++--- changelog/unreleased/fix-static-ldflag-build-ci.md | 7 +++++++ 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 changelog/unreleased/fix-static-ldflag-build-ci.md diff --git a/Makefile b/Makefile index e2656c0bed..62553326c4 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,8 @@ GIT_BRANCH=`git rev-parse --symbolic-full-name --abbrev-ref HEAD` GIT_DIRTY=`git diff-index --quiet HEAD -- || echo "dirty-"` VERSION=`git describe --always` GO_VERSION=`go version | awk '{print $$3}'` -BUILD_FLAGS="-w -extldflags "-static" -X main.gitCommit=${GIT_COMMIT} -X main.version=${VERSION} -X main.goVersion=${GO_VERSION} -X main.buildDate=${BUILD_DATE}" +BUILD_FLAGS="-X main.gitCommit=${GIT_COMMIT} -X main.version=${VERSION} -X main.goVersion=${GO_VERSION} -X main.buildDate=${BUILD_DATE}" +CI_BUILD_FLAGS="-w -extldflags "-static" -X main.gitCommit=${GIT_COMMIT} -X main.version=${VERSION} -X main.goVersion=${GO_VERSION} -X main.buildDate=${BUILD_DATE}" LITMUS_URL_OLD="http://localhost:20080/remote.php/webdav" LITMUS_URL_NEW="http://localhost:20080/remote.php/dav/files/4c510ada-c86b-4815-8820-42cdf82c3d51" LITMUS_USERNAME="einstein" @@ -76,8 +77,8 @@ deps: cd /tmp && go get golang.org/x/tools/cmd/goimports build-ci: off - go build -ldflags ${BUILD_FLAGS} -o ./cmd/revad/revad ./cmd/revad - go build -ldflags ${BUILD_FLAGS} -o ./cmd/reva/reva ./cmd/reva + go build -ldflags ${CI_BUILD_FLAGS} -o ./cmd/revad/revad ./cmd/revad + go build -ldflags ${CI_BUILD_FLAGS} -o ./cmd/reva/reva ./cmd/reva lint-ci: go run tools/check-license/check-license.go diff --git a/changelog/unreleased/fix-static-ldflag-build-ci.md b/changelog/unreleased/fix-static-ldflag-build-ci.md new file mode 100644 index 0000000000..4b00f53493 --- /dev/null +++ b/changelog/unreleased/fix-static-ldflag-build-ci.md @@ -0,0 +1,7 @@ +Bugfix: Use the -static ldflag only for the 'build-ci' target + +It is not intended to statically link the generated binaries +for local development workflows. This resulted on segmentation +faults and compiller warnings. + +https://github.com/cs3org/reva/pull/1718 From 089f837e2333b87df436a9fd096bcd1f8fc3b55e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 May 2021 14:42:14 +0200 Subject: [PATCH 59/70] [Build-deps]: Bump google.golang.org/grpc from 1.37.1 to 1.38.0 (#1716) --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 46e50b33f1..db1cfe3977 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,7 @@ require ( golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/sys v0.0.0-20210423082822-04245dca01da golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 - google.golang.org/grpc v1.37.1 + google.golang.org/grpc v1.38.0 google.golang.org/protobuf v1.26.0 gotest.tools v2.2.0+incompatible ) From 3aba8fae57b05a3e4b128decc005353393fe801d Mon Sep 17 00:00:00 2001 From: Saw-jan Gurung Date: Thu, 20 May 2021 18:27:35 +0545 Subject: [PATCH 60/70] bump core commit id as of 20210518 (#1712) --- .drone.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.env b/.drone.env index 581c860a7a..742de977a1 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=1838750cbecf41a37fae5380c1c2763923cd3943 +CORE_COMMITID=aacaf7b5cb431713040219c72e91d7883f845652 CORE_BRANCH=master From 2327bcee0a350ade237dc14260ab4e8bd984d4eb Mon Sep 17 00:00:00 2001 From: David Christofas Date: Fri, 21 May 2021 16:30:19 +0200 Subject: [PATCH 61/70] fix response format (#1724) --- changelog/unreleased/update-share-response.md | 1 + .../owncloud/ocs/handlers/apps/sharing/shares/pending.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog/unreleased/update-share-response.md b/changelog/unreleased/update-share-response.md index b7645c3c3d..deae2d579a 100644 --- a/changelog/unreleased/update-share-response.md +++ b/changelog/unreleased/update-share-response.md @@ -3,3 +3,4 @@ Enhancement: Add share to update response After accepting or rejecting a share the API includes the updated share in the response. https://github.com/cs3org/reva/pull/1685 +https://github.com/cs3org/reva/pull/1724 diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/pending.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/pending.go index 4a7d06684a..33636f3227 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/pending.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/pending.go @@ -105,5 +105,5 @@ func (h *Handler) updateReceivedShare(w http.ResponseWriter, r *http.Request, sh data.Path = path.Join(h.sharePrefix, path.Base(info.Path)) } - response.WriteOCSSuccess(w, r, data) + response.WriteOCSSuccess(w, r, []*conversions.ShareData{data}) } From 2d20b0e11bdd701117f46fee87de9eb42c4a3997 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 12:31:20 +0200 Subject: [PATCH 62/70] [Build-deps]: Bump github.com/ReneKroon/ttlcache/v2 from 2.4.0 to 2.5.0 (#1728) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index db1cfe3977..f5bfebaa3e 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Masterminds/goutils v1.1.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible - github.com/ReneKroon/ttlcache/v2 v2.4.0 + github.com/ReneKroon/ttlcache/v2 v2.5.0 github.com/aws/aws-sdk-go v1.38.40 github.com/bluele/gcache v0.0.2 github.com/c-bata/go-prompt v0.2.5 diff --git a/go.sum b/go.sum index 9038a8daf7..010370e297 100644 --- a/go.sum +++ b/go.sum @@ -49,8 +49,8 @@ github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jB github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ReneKroon/ttlcache/v2 v2.4.0 h1:KywGhjik+ZFTDXMNLiPECSzmdx2yNvAlDNKESCRaVEs= -github.com/ReneKroon/ttlcache/v2 v2.4.0/go.mod h1:zbo6Pv/28e21Z8CzzqgYRArQYGYtjONRxaAKGxzQvG4= +github.com/ReneKroon/ttlcache/v2 v2.5.0 h1:Xy1Ou9kKVuoMtNU6dBcW+lzGDUHweoZt9Fk1HfGiCTk= +github.com/ReneKroon/ttlcache/v2 v2.5.0/go.mod h1:zbo6Pv/28e21Z8CzzqgYRArQYGYtjONRxaAKGxzQvG4= 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/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= From 597e362b1cdd627defa8940872a7f274276c9604 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 13:59:39 +0200 Subject: [PATCH 63/70] [Build-deps]: Bump github.com/ory/fosite from 0.39.0 to 0.40.1 (#1726) --- go.mod | 4 +- go.sum | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 172 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index f5bfebaa3e..ac5da95c0d 100644 --- a/go.mod +++ b/go.mod @@ -18,8 +18,6 @@ require ( github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/eventials/go-tus v0.0.0-20200718001131-45c7ec8f5d59 github.com/go-ldap/ldap/v3 v3.3.0 - github.com/go-openapi/errors v0.19.6 // indirect - github.com/go-openapi/strfmt v0.19.2 // indirect github.com/go-sql-driver/mysql v1.6.0 github.com/golang/protobuf v1.5.2 github.com/gomodule/redigo v1.8.4 @@ -36,7 +34,7 @@ require ( github.com/mitchellh/mapstructure v1.4.1 github.com/onsi/ginkgo v1.16.2 github.com/onsi/gomega v1.12.0 - github.com/ory/fosite v0.39.0 + github.com/ory/fosite v0.40.1 github.com/pkg/errors v0.9.1 github.com/pkg/xattr v0.4.3 github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect diff --git a/go.sum b/go.sum index 010370e297..3f111252b7 100644 --- a/go.sum +++ b/go.sum @@ -49,6 +49,9 @@ github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jB github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/ReneKroon/ttlcache/v2 v2.5.0 h1:Xy1Ou9kKVuoMtNU6dBcW+lzGDUHweoZt9Fk1HfGiCTk= github.com/ReneKroon/ttlcache/v2 v2.5.0/go.mod h1:zbo6Pv/28e21Z8CzzqgYRArQYGYtjONRxaAKGxzQvG4= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -77,6 +80,7 @@ github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgI github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= @@ -123,6 +127,7 @@ github.com/cockroachdb/cockroach-go v0.0.0-20200312223839-f565e4789405/go.mod h1 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= 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/containerd v1.4.3/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-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= @@ -159,6 +164,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v17.12.0-ce-rc1.0.20201201034508-7d75c1d40d88+incompatible/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= @@ -187,6 +194,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= 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= @@ -201,11 +210,63 @@ github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjR 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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys= +github.com/go-openapi/errors v0.19.3/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 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncCRnE= +github.com/go-openapi/errors v0.20.0 h1:Sxpo9PjEHDzhs3FbnGNonvDgWcMW2U7wGTcDDSFSceM= +github.com/go-openapi/errors v0.20.0/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= +github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= +github.com/go-openapi/runtime v0.19.26/go.mod h1:BvrQtn6iVb2QmiVXRsFAm6ZCAZBpbVKFfN6QWCp582M= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= +github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= github.com/go-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= @@ -214,6 +275,7 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/attrs v0.1.0/go.mod h1:fmNpaWyHM0tRm8gCZWKx8yY9fvaNLo2PyzBNSrBZ5Hw= 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= @@ -233,6 +295,8 @@ github.com/gobuffalo/buffalo-plugins v1.10.0/go.mod h1:4osg8d9s60txLuGwXnqH+RCjP github.com/gobuffalo/buffalo-plugins v1.11.0/go.mod h1:rtIvAYRjYibgmWhnjKmo7OadtnxuMG5ZQLr25ozAzjg= github.com/gobuffalo/buffalo-plugins v1.15.0/go.mod h1:BqSx01nwgKUQr/MArXzFkSD0QvdJidiky1OKgyfgrK8= github.com/gobuffalo/buffalo-pop v1.0.5/go.mod h1:Fw/LfFDnSmB/vvQXPvcXEjzP98Tc+AudyNWUBWKCwQ8= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= 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= @@ -260,6 +324,7 @@ github.com/gobuffalo/events v1.3.1/go.mod h1:9JOkQVoyRtailYVE/JJ2ZQ/6i4gTjM5t2Hs github.com/gobuffalo/events v1.4.1/go.mod h1:SjXgWKpeSuvQDvGhgMz5IXx3Czu+IbL+XPLR41NvVQY= github.com/gobuffalo/fizz v1.0.12/go.mod h1:C0sltPxpYK8Ftvf64kbsQa2yiCZY4RZviurNxXdAKwc= github.com/gobuffalo/fizz v1.9.8/go.mod h1:w1FEn1yKNVCc49KnADGyYGRPH7jFON3ak4Bj1yUudHo= +github.com/gobuffalo/fizz v1.10.0/go.mod h1:J2XGPO0AfJ1zKw7+2BA+6FEGAkyEsdCOLvN93WCT2WI= 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= @@ -271,6 +336,9 @@ github.com/gobuffalo/flect v0.0.0-20181114183036-47375f6d8328/go.mod h1:0HvNbHdf 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/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/gobuffalo/flect v0.2.1/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= @@ -297,6 +365,10 @@ github.com/gobuffalo/genny v0.0.0-20181207164119-84844398a37d/go.mod h1:y0ysCHGG 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/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= github.com/gobuffalo/genny v0.2.0/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= github.com/gobuffalo/genny v0.3.0/go.mod h1:ywJ2CoXrTZj7rbS8HTbzv7uybnLKlsNSBhEQ+yFI3E8= github.com/gobuffalo/genny v0.6.0/go.mod h1:Vigx9VDiNscYpa/LwrURqGXLSIbzTfapt9+K6gF1kTA= @@ -306,6 +378,9 @@ github.com/gobuffalo/github_flavored_markdown v1.0.4/go.mod h1:uRowCdK+q8d/RF0Kt 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/github_flavored_markdown v1.1.0/go.mod h1:TSpTKWcRTI0+v7W3x8dkSKMLJSUpuVitlptCkpeY8ic= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= github.com/gobuffalo/gogen v0.2.0/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= github.com/gobuffalo/helpers v0.2.2/go.mod h1:xYbzUdCUpVzLwLnqV8HIjT6hmG0Cs7YIBCJkNM597jw= github.com/gobuffalo/helpers v0.2.4/go.mod h1:NX7v27yxPDOPTgUFYmJ5ow37EbxdoLraucOGvMNawyk= @@ -365,6 +440,7 @@ github.com/gobuffalo/packd v0.0.0-20181114190715-f25c5d2471d7/go.mod h1:Yf2toFaI 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/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packd v0.2.0/go.mod h1:k2CkHP3bjbqL2GwxwhxUy1DgnlbW644hkLC9iIUvZwY= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= @@ -384,9 +460,12 @@ github.com/gobuffalo/packr/v2 v2.0.0-rc.12/go.mod h1:FV1zZTsVFi1DSCboO36Xgs4pzCZ 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/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/packr/v2 v2.4.0/go.mod h1:ra341gygw9/61nSjAbfwcwh8IrYL4WmR4IsPkPBhQiY= github.com/gobuffalo/packr/v2 v2.5.2/go.mod h1:sgEE1xNZ6G0FNN5xn9pevVu4nywaxHvgup67xisti08= github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= +github.com/gobuffalo/packr/v2 v2.8.0/go.mod h1:PDk2k3vGevNE3SwVyVRgQCCXETC9SaONCNSXT1Q8M1g= 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= @@ -408,6 +487,7 @@ github.com/gobuffalo/pop v4.8.3+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVD github.com/gobuffalo/pop v4.8.4+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= github.com/gobuffalo/pop v4.13.1+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= github.com/gobuffalo/pop/v5 v5.0.11/go.mod h1:mZJHJbA3cy2V18abXYuVop2ldEJ8UZ2DK6qOekC5u5g= +github.com/gobuffalo/pop/v5 v5.3.1/go.mod h1:vcEDhh6cJ3WVENqJDFt/6z7zNb7lLnlN8vj3n5G9rYA= 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= @@ -486,6 +566,7 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.8.4 h1:Z5JUg94HMTR1XpwBaSH4vq3+PNSIykBLxMdglbw10gg= github.com/gomodule/redigo v1.8.4/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -494,6 +575,7 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a 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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= @@ -514,6 +596,7 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 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/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -548,9 +631,11 @@ github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoP github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -578,6 +663,7 @@ github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/inhies/go-bytesize v0.0.0-20201103132853-d0aed0d254f8/go.mod h1:KrtyD5PFj++GKkFS/7/RRrfnRhAMGQwy75GLCHWrCNs= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -587,6 +673,7 @@ github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= github.com/jackc/pgconn v1.3.2/go.mod h1:LvCquS3HbBKwgl7KbX9KyqEIumJAbm1UMcTvGaIf3bM= github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.6.0/go.mod h1:yeseQo4xhQbgyJs2c87RAXOH2i624N0Fh1KSPJya7qo= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= @@ -596,20 +683,24 @@ github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.0/go.mod h1:b0JqxHvPmljG+HQ5IsvQ0yqeSi4nGcDTVjFoiLDb0Ik= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.4.1/go.mod h1:6iSW+JznC0YT+SgBn7rNxoEBsBgSmnC5FwyCekOGUiE= +github.com/jackc/pgx/v4 v4.6.0/go.mod h1:vPh43ZzxijXUVJ+t/EmXBtFmbFVO72cuneCT9oAlxAg= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jandelgado/gcov2lcov v1.0.4-0.20210120124023-b83752c6dc08/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss= github.com/jedib0t/go-pretty v4.3.0+incompatible h1:CGs8AVhEKg/n9YbUenWmNStRW2PHJzaeDodcfvRAbIo= 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= @@ -642,17 +733,23 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E 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/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/karrick/godirwalk v1.10.9/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/karrick/godirwalk v1.15.3/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/karrick/godirwalk v1.15.5/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= +github.com/knadh/koanf v0.14.1-0.20201201075439-e0853799f9ec/go.mod h1:H5mEFsTeWizwFXHKtsITL5ipsLTuAMQoGuQpp+1JL9U= 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/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -664,6 +761,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 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.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 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= @@ -677,12 +775,19 @@ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-b github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/luna-duclos/instrumentedsql v0.0.0-20181127104832-b7d587d28109/go.mod h1:PWUIzhtavmOR965zfawVsHXbEuU1G29BPZ/CB3C7jXk= github.com/luna-duclos/instrumentedsql v1.1.2/go.mod h1:4LGbEqDnopzNAiyxPPDXhLspyunZxgPTMJBKtC6U0BQ= +github.com/luna-duclos/instrumentedsql v1.1.3/go.mod h1:9J1njvFds+zN7y85EDhN9XNQLANWwZt2ULeIC8yMNYs= 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/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= 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/deplist v1.1.3/go.mod h1:BF7ioVzAJYEtzQN/os4rt8H8Ti3h0T7EoN+7eyALktE= +github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= 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= @@ -763,6 +868,7 @@ github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxd github.com/mitchellh/mapstructure v1.4.1/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/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -772,6 +878,8 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/morikuni/aec v1.0.0/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/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -823,7 +931,7 @@ github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= 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/opentracing/opentracing-go v1.1.1-0.20190913142402-a7454ce5950e/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= @@ -831,12 +939,13 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/ory/analytics-go/v4 v4.0.0/go.mod h1:FMx9cLRD9xN+XevPvZ5FDMfignpmcqPP6FUKnJ9/MmE= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/ory/dockertest/v3 v3.5.4/go.mod h1:J8ZUbNB2FOhm1cFZW9xBpDsODqsSWcyYgtJYVPcnF70= +github.com/ory/dockertest/v3 v3.6.3/go.mod h1:EFLcVUOl8qCwp9NyDAcCDtq/QviLtYswW/VbWzUnTNE= github.com/ory/fosite v0.29.0/go.mod h1:0atSZmXO7CAcs6NPMI/Qtot8tmZYj04Nddoold4S2h0= -github.com/ory/fosite v0.39.0 h1:u1Ct/ME7XYzREvufr7ehBIdq/KatjVLIYg/ABqWzprw= -github.com/ory/fosite v0.39.0/go.mod h1:37r59qkOSPueYKmaA7EHiXrDMF1B+XPN+MgkZgTRg3Y= +github.com/ory/fosite v0.40.1 h1:5HeOKbiOrPGh8HnILiP5l9NW0ftS5WGbTHzBtTMseYI= +github.com/ory/fosite v0.40.1/go.mod h1:KbDZzqSDLaOLDN2haRIsBQHUhl8MQp66cYMqCpO/8Mg= github.com/ory/go-acc v0.0.0-20181118080137-ddc355013f90/go.mod h1:sxnvPCxChFuSmTJGj8FdMupeq1BezCiEpDjTUXQ4hf4= -github.com/ory/go-acc v0.2.5 h1:31irXHzG2vnKQSE4weJm7AdfrnpaVjVCq3nD7viXCJE= -github.com/ory/go-acc v0.2.5/go.mod h1:4Kb/UnPcT8qRAk3IAxta+hvVapdxTLWtrr7bFLlEgpw= +github.com/ory/go-acc v0.2.6 h1:YfI+L9dxI7QCtWn2RbawqO0vXhiThdXu/RgizJBbaq0= +github.com/ory/go-acc v0.2.6/go.mod h1:4Kb/UnPcT8qRAk3IAxta+hvVapdxTLWtrr7bFLlEgpw= 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= @@ -844,6 +953,7 @@ github.com/ory/gojsonschema v1.1.1-0.20190919112458-f254ca73d5e9/go.mod h1:BNZpd github.com/ory/herodot v0.6.2/go.mod h1:3BOneqcyBsVybCPAJoi92KN2BpJHcmDqAMcAAaJiJow= github.com/ory/herodot v0.7.0/go.mod h1:YXKOfAXYdQojDP5sD8m0ajowq3+QXNdtxA+QiUXBwn0= github.com/ory/herodot v0.8.3/go.mod h1:rvLjxOAlU5omtmgjCfazQX2N82EpMfl3BytBWc1jjsk= +github.com/ory/herodot v0.9.2/go.mod h1:Da2HXR8mpwPbPrH+Gv9qV8mM5gI3v+PoJ69BA4l2RAk= github.com/ory/jsonschema/v3 v3.0.1/go.mod h1:jgLHekkFk0uiGdEWGleC+tOm6JSSP8cbf17PnBuGXlw= github.com/ory/viper v1.5.6/go.mod h1:TYmpFpKLxjQwvT4f0QPpkOn4sDXU1kDgAwJpgLYiQ28= github.com/ory/viper v1.7.4/go.mod h1:T6sodNZKNGPpashUOk7EtXz2isovz8oCd57GNVkkNmE= @@ -852,8 +962,9 @@ github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTa github.com/ory/x v0.0.84/go.mod h1:RXLPBG7B+hAViONVg0sHwK+U/ie1Y/NeXrq1JcARfoE= github.com/ory/x v0.0.93/go.mod h1:lfcTaGXpTZs7IEQAW00r9EtTCOxD//SiP5uWtNiz31g= github.com/ory/x v0.0.110/go.mod h1:DJfkE3GdakhshNhw4zlKoRaL/ozg/lcTahA9OCih2BE= -github.com/ory/x v0.0.162 h1:xE/UBmmMlInTvlgGXUyo+VeZAcWU5gyWb/xh6jmBWsI= -github.com/ory/x v0.0.162/go.mod h1:sj3z/MeCrAyNFFTfN6yK1nTmHXGSFnw+QwIIQ/Rowec= +github.com/ory/x v0.0.127/go.mod h1:FwUujfFuCj5d+xgLn4fGMYPnzriR5bdAIulFXMtnK0M= +github.com/ory/x v0.0.212 h1:7PpEOdrXGP/tMGyv0m1ERy74oCS/Z11hlkxVs9OC1GE= +github.com/ory/x v0.0.212/go.mod h1:RDxYOolvMdzumYnHWha8D+RoLjYtGszyDDed4OCGC54= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/parnurzeal/gorequest v0.2.15/go.mod h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -863,9 +974,11 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP 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/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw= github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -926,6 +1039,7 @@ github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZY github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rhnvrm/simples3 v0.5.0/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= 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= @@ -954,6 +1068,7 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/sciencemesh/meshdirectory-web v1.0.4 h1:1YSctF6PAXhoHUYCaeRTj7rHaF7b3rYrZf2R0VXBIbo= github.com/sciencemesh/meshdirectory-web v1.0.4/go.mod h1:fJSThTS3xf+sTdL0iXQoaQJssLI7tn7DetHMHUl4SRk= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210219220335-367fa274be2c/go.mod h1:/THDZYi7F/BsVEcYzYPqdcWFQ+1C2InkawTKfLOAnzg= github.com/segmentio/analytics-go v3.0.1+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48= github.com/segmentio/analytics-go v3.1.0+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48= github.com/segmentio/backo-go v0.0.0-20160424052352-204274ad699c/go.mod h1:kJ9mm9YmoWSkk+oQ+5Cj8DEoRCX2JT6As4kEtIIOp1M= @@ -979,6 +1094,7 @@ github.com/sirupsen/logrus v1.1.0/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8 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.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/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= @@ -1002,11 +1118,13 @@ github.com/spf13/afero v1.3.2 h1:GDarE4TJQI52kYSbSAmLiId1Elfj+xgSDqrUZxFhxlU= github.com/spf13/afero v1.3.2/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.2-0.20200723214538-8d17101741c8 h1:GbJaXkBXPYlxE45H4g2wo0Hb4TGzv/YbHVA1OGqx+mo= +github.com/spf13/cast v1.3.2-0.20200723214538-8d17101741c8/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= @@ -1024,6 +1142,7 @@ github.com/spf13/viper v1.3.1/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518/go.mod h1:CKI4AZ4XmGV240rTHfO0hfE83S6/a3/Q1siZJ/vXf7A= +github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693/go.mod h1:6hSY48PjDm4UObWmGLyJE9DxYVKTgR9kbCspXXJEhcU= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -1045,10 +1164,16 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= +github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= +github.com/tidwall/gjson v1.7.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= +github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y= +github.com/tidwall/sjson v1.1.5/go.mod h1:VuJzsZnTowhSxWdOgsAnb886i4AjEyTkk7tNtsL7EYE= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -1070,13 +1195,14 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb 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/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= 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/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/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= @@ -1087,8 +1213,11 @@ go.elastic.co/fastjson v1.0.0/go.mod h1:PmeUOMMtLHQr9ZS9J9owrAVg0FkaZDRZJEFTTGHt 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.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= +go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= 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= @@ -1131,10 +1260,14 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf 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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1206,6 +1339,7 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r 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-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/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= @@ -1216,6 +1350,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL 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-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191003171128-d98b1b443823/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= @@ -1225,6 +1360,7 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL 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/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1242,6 +1378,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ 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-20190412183630-56d357773e84/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= @@ -1274,14 +1411,18 @@ golang.org/x/sys v0.0.0-20190116161447-11f53e031339/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/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-20190419153524-e8e3143a4f4a/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-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1313,7 +1454,7 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200720211630-cb9d2d5c5666/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1348,6 +1489,7 @@ golang.org/x/tools v0.0.0-20181013182035-5e66757b835f/go.mod h1:n7NCudcB/nEzxVGm 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-20181030221726-6c7e314b6563/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= @@ -1369,15 +1511,22 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 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-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/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-20190524210228-3d17549cdc6b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190613204242-ed0dc450797f/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/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-20190624222133-a101b041ded4/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-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1406,10 +1555,10 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK 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-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200721223218-6123e77877b2/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1471,10 +1620,12 @@ google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98 h1:LCO0fg4kb6WwkXQXRQQgUYsFeFb5taTX5WAx5O/Vt28= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc/examples v0.0.0-20210304020650-930c79186c99/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= 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= @@ -1484,6 +1635,7 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= @@ -1534,10 +1686,12 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 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= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= 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= From b1d57b9313d743e3afdf0490b93c6f45e57559d0 Mon Sep 17 00:00:00 2001 From: Antoon P Date: Tue, 25 May 2021 19:59:31 +0200 Subject: [PATCH 64/70] Datatx createtransfershare (#1725) Co-authored-by: Ishank Arora --- changelog/unreleased/datatx-createtransfer.md | 5 + cmd/reva/ocm-share-list-received.go | 4 +- cmd/reva/ocm-share-list.go | 4 +- cmd/reva/transfer-create.go | 129 ++++++++++++++++-- internal/grpc/services/gateway/gateway.go | 13 +- .../grpc/services/gateway/ocmshareprovider.go | 44 ++++-- internal/grpc/services/ocmcore/ocmcore.go | 10 +- .../ocmshareprovider/ocmshareprovider.go | 19 ++- .../storageprovider/storageprovider.go | 2 +- pkg/ocm/share/manager/json/json.go | 44 ++++-- pkg/rgrpc/status/status.go | 11 ++ pkg/storage/utils/localfs/localfs.go | 41 ++++-- 12 files changed, 269 insertions(+), 57 deletions(-) create mode 100644 changelog/unreleased/datatx-createtransfer.md diff --git a/changelog/unreleased/datatx-createtransfer.md b/changelog/unreleased/datatx-createtransfer.md new file mode 100644 index 0000000000..9fc6e36376 --- /dev/null +++ b/changelog/unreleased/datatx-createtransfer.md @@ -0,0 +1,5 @@ +Enhancement: Create transfer type share + +`transfer-create` creates a share of type transfer. + +https://github.com/cs3org/reva/pull/1725 diff --git a/cmd/reva/ocm-share-list-received.go b/cmd/reva/ocm-share-list-received.go index 83a1122086..851264c7b9 100644 --- a/cmd/reva/ocm-share-list-received.go +++ b/cmd/reva/ocm-share-list-received.go @@ -55,13 +55,13 @@ func ocmShareListReceivedCommand() *command { t := table.NewWriter() t.SetOutputMirror(os.Stdout) t.AppendHeader(table.Row{"#", "Owner.Idp", "Owner.OpaqueId", "ResourceId", "Permissions", "Type", - "Grantee.Idp", "Grantee.OpaqueId", "Created", "Updated", "State"}) + "Grantee.Idp", "Grantee.OpaqueId", "Created", "Updated", "State", "ShareType"}) for _, s := range shareRes.Shares { t.AppendRows([]table.Row{ {s.Share.Id.OpaqueId, s.Share.Owner.Idp, s.Share.Owner.OpaqueId, s.Share.ResourceId.String(), s.Share.Permissions.String(), s.Share.Grantee.Type.String(), s.Share.Grantee.GetUserId().Idp, s.Share.Grantee.GetUserId().OpaqueId, time.Unix(int64(s.Share.Ctime.Seconds), 0), - time.Unix(int64(s.Share.Mtime.Seconds), 0), s.State.String()}, + time.Unix(int64(s.Share.Mtime.Seconds), 0), s.State.String(), s.Share.ShareType.String()}, }) } t.Render() diff --git a/cmd/reva/ocm-share-list.go b/cmd/reva/ocm-share-list.go index 9229b87e60..06b8836c9b 100644 --- a/cmd/reva/ocm-share-list.go +++ b/cmd/reva/ocm-share-list.go @@ -83,12 +83,12 @@ func ocmShareListCommand() *command { t := table.NewWriter() t.SetOutputMirror(os.Stdout) t.AppendHeader(table.Row{"#", "Owner.Idp", "Owner.OpaqueId", "ResourceId", "Permissions", "Type", - "Grantee.Idp", "Grantee.OpaqueId", "Created", "Updated"}) + "ShareType", "Grantee.Idp", "Grantee.OpaqueId", "Created", "Updated"}) for _, s := range shareRes.Shares { t.AppendRows([]table.Row{ {s.Id.OpaqueId, s.Owner.Idp, s.Owner.OpaqueId, s.ResourceId.String(), s.Permissions.String(), - s.Grantee.Type.String(), s.Grantee.GetUserId().Idp, s.Grantee.GetUserId().OpaqueId, + s.Grantee.Type.String(), s.ShareType.String(), s.Grantee.GetUserId().Idp, s.Grantee.GetUserId().OpaqueId, time.Unix(int64(s.Ctime.Seconds), 0), time.Unix(int64(s.Mtime.Seconds), 0)}, }) } diff --git a/cmd/reva/transfer-create.go b/cmd/reva/transfer-create.go index e77ba8df45..308c1b5438 100644 --- a/cmd/reva/transfer-create.go +++ b/cmd/reva/transfer-create.go @@ -19,24 +19,45 @@ package main import ( - "errors" "io" + "os" + "strconv" + "strings" + "time" + userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + invitepb "github.com/cs3org/go-cs3apis/cs3/ocm/invite/v1beta1" + ocmprovider "github.com/cs3org/go-cs3apis/cs3/ocm/provider/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" - tx "github.com/cs3org/go-cs3apis/cs3/tx/v1beta1" + ocm "github.com/cs3org/go-cs3apis/cs3/sharing/ocm/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + "github.com/jedib0t/go-pretty/table" + "github.com/pkg/errors" ) func transferCreateCommand() *command { cmd := newCommand("transfer-create") - cmd.Description = func() string { return "create transfer between 2 remotes" } - cmd.Usage = func() string { return "Usage: transfer-create [-flags]" } + cmd.Description = func() string { return "create transfer between 2 sites" } + cmd.Usage = func() string { return "Usage: transfer-create [-flags] " } grantee := cmd.String("grantee", "", "the grantee, receiver of the transfer") + granteeType := cmd.String("granteeType", "user", "the grantee type, one of: user, group") + idp := cmd.String("idp", "", "the idp of the grantee, default to same idp as the user triggering the action") cmd.Action = func(w ...io.Writer) error { - // validate flags + if cmd.NArg() < 1 { + return errors.New("Invalid arguments: " + cmd.Usage()) + } + if *grantee == "" { return errors.New("Grantee cannot be empty: use -grantee flag\n" + cmd.Usage()) } + if *idp == "" { + return errors.New("Idp cannot be empty: use -idp flag\n" + cmd.Usage()) + } + + // the resource to transfer; the path + fn := cmd.Args()[0] ctx := getAuthContext() client, err := getClient() @@ -44,17 +65,107 @@ func transferCreateCommand() *command { return err } - transferRequest := &tx.CreateTransferRequest{} + // check if invitation has been accepted + acceptedUserRes, err := client.GetAcceptedUser(ctx, &invitepb.GetAcceptedUserRequest{ + RemoteUserId: &userpb.UserId{OpaqueId: *grantee, Idp: *idp}, + }) + if err != nil { + return err + } + if acceptedUserRes.Status.Code != rpc.Code_CODE_OK { + return formatError(acceptedUserRes.Status) + } - transferResponse, err := client.CreateTransfer(ctx, transferRequest) + // verify resource stats + statReq := &provider.StatRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Path{ + Path: fn, + }, + }, + } + statRes, err := client.Stat(ctx, statReq) if err != nil { return err } - if transferResponse.Status.Code != rpc.Code_CODE_OK { - return formatError(transferResponse.Status) + if statRes.Status.Code != rpc.Code_CODE_OK { + return formatError(statRes.Status) } + providerInfoResp, err := client.GetInfoByDomain(ctx, &ocmprovider.GetInfoByDomainRequest{ + Domain: *idp, + }) + if err != nil { + return err + } + + resourcePermissions, pint, err := getOCMSharePerm(editorPermission) + if err != nil { + return err + } + + gt := provider.GranteeType_GRANTEE_TYPE_USER + if strings.ToLower(*granteeType) == "group" { + gt = provider.GranteeType_GRANTEE_TYPE_GROUP + } + + createShareReq := &ocm.CreateOCMShareRequest{ + Opaque: &types.Opaque{ + Map: map[string]*types.OpaqueEntry{ + "permissions": &types.OpaqueEntry{ + Decoder: "plain", + Value: []byte(strconv.Itoa(pint)), + }, + "name": &types.OpaqueEntry{ + Decoder: "plain", + Value: []byte(statRes.Info.Path), + }, + "protocol": &types.OpaqueEntry{ + Decoder: "plain", + Value: []byte("datatx"), + }, + }, + }, + ResourceId: statRes.Info.Id, + Grant: &ocm.ShareGrant{ + Grantee: &provider.Grantee{ + Type: gt, + Id: &provider.Grantee_UserId{ + UserId: &userpb.UserId{ + Idp: *idp, + OpaqueId: *grantee, + }, + }, + }, + Permissions: resourcePermissions, + }, + RecipientMeshProvider: providerInfoResp.ProviderInfo, + } + + createShareResponse, err := client.CreateOCMShare(ctx, createShareReq) + if err != nil { + return err + } + if createShareResponse.Status.Code != rpc.Code_CODE_OK { + if createShareResponse.Status.Code == rpc.Code_CODE_NOT_FOUND { + return formatError(statRes.Status) + } + return err + } + + t := table.NewWriter() + t.SetOutputMirror(os.Stdout) + t.AppendHeader(table.Row{"#", "Owner.Idp", "Owner.OpaqueId", "ResourceId", "Permissions", "Type", "Grantee.Idp", "Grantee.OpaqueId", "ShareType", "Created", "Updated"}) + + s := createShareResponse.Share + t.AppendRows([]table.Row{ + {s.Id.OpaqueId, s.Owner.Idp, s.Owner.OpaqueId, s.ResourceId.String(), s.Permissions.String(), + s.Grantee.Type.String(), s.Grantee.GetUserId().Idp, s.Grantee.GetUserId().OpaqueId, s.ShareType.String(), + time.Unix(int64(s.Ctime.Seconds), 0), time.Unix(int64(s.Mtime.Seconds), 0)}, + }) + t.Render() return nil } + return cmd } diff --git a/internal/grpc/services/gateway/gateway.go b/internal/grpc/services/gateway/gateway.go index f91678f6bd..80420e04a0 100644 --- a/internal/grpc/services/gateway/gateway.go +++ b/internal/grpc/services/gateway/gateway.go @@ -63,10 +63,11 @@ type config struct { TransferExpires int64 `mapstructure:"transfer_expires"` TokenManager string `mapstructure:"token_manager"` // ShareFolder is the location where to create shares in the recipient's storage provider. - ShareFolder string `mapstructure:"share_folder"` - HomeMapping string `mapstructure:"home_mapping"` - TokenManagers map[string]map[string]interface{} `mapstructure:"token_managers"` - EtagCacheTTL int `mapstructure:"etag_cache_ttl"` + ShareFolder string `mapstructure:"share_folder"` + DataTransfersFolder string `mapstructure:"data_transfers_folder"` + HomeMapping string `mapstructure:"home_mapping"` + TokenManagers map[string]map[string]interface{} `mapstructure:"token_managers"` + EtagCacheTTL int `mapstructure:"etag_cache_ttl"` } // sets defaults @@ -77,6 +78,10 @@ func (c *config) init() { c.ShareFolder = strings.Trim(c.ShareFolder, "/") + if c.DataTransfersFolder == "" { + c.DataTransfersFolder = "Data-Transfers" + } + if c.TokenManager == "" { c.TokenManager = "jwt" } diff --git a/internal/grpc/services/gateway/ocmshareprovider.go b/internal/grpc/services/gateway/ocmshareprovider.go index 8ee4935f3b..872009d9c1 100644 --- a/internal/grpc/services/gateway/ocmshareprovider.go +++ b/internal/grpc/services/gateway/ocmshareprovider.go @@ -260,7 +260,7 @@ func (s *svc) UpdateReceivedOCMShare(ctx context.Context, req *ocm.UpdateReceive panic("gateway: error updating a received share: the share is nil") } - createRefStatus, err := s.createWebdavReference(ctx, share.Share) + createRefStatus, err := s.createOCMReference(ctx, share.Share) return &ocm.UpdateReceivedOCMShareResponse{ Status: createRefStatus, }, err @@ -291,7 +291,7 @@ func (s *svc) GetReceivedOCMShare(ctx context.Context, req *ocm.GetReceivedOCMSh return res, nil } -func (s *svc) createWebdavReference(ctx context.Context, share *ocm.Share) (*rpc.Status, error) { +func (s *svc) createOCMReference(ctx context.Context, share *ocm.Share) (*rpc.Status, error) { log := appctx.GetLogger(ctx) @@ -314,17 +314,39 @@ func (s *svc) createWebdavReference(ctx context.Context, share *ocm.Share) (*rpc return status.NewInternal(ctx, err, "error updating received share"), nil } - // reference path is the home path + some name on the corresponding - // mesh provider (/home/MyShares/x) - // It is the responsibility of the gateway to resolve these references and merge the response back - // from the main request. - refPath := path.Join(homeRes.Path, s.c.ShareFolder, path.Base(share.Name)) - log.Info().Msg("mount path will be:" + refPath) + var refPath, targetURI string + if share.ShareType == ocm.Share_SHARE_TYPE_TRANSFER { + createTransferDir, err := s.CreateContainer(ctx, &provider.CreateContainerRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Path{ + Path: path.Join(homeRes.Path, s.c.DataTransfersFolder), + }, + }, + }) + if err != nil { + return status.NewInternal(ctx, err, "error creating transfers directory"), nil + } + if createTransferDir.Status.Code != rpc.Code_CODE_OK && createTransferDir.Status.Code != rpc.Code_CODE_ALREADY_EXISTS { + err := status.NewErrorFromCode(createTransferDir.Status.GetCode(), "gateway") + return status.NewInternal(ctx, err, "error creating transfers directory"), nil + } - createRefReq := &provider.CreateReferenceRequest{ - Path: refPath, + refPath = path.Join(homeRes.Path, s.c.DataTransfersFolder, path.Base(share.Name)) + targetURI = fmt.Sprintf("datatx://%s@%s?name=%s", token, share.Creator.Idp, share.Name) + } else { + // reference path is the home path + some name on the corresponding + // mesh provider (/home/MyShares/x) + // It is the responsibility of the gateway to resolve these references and merge the response back + // from the main request. + refPath = path.Join(homeRes.Path, s.c.ShareFolder, path.Base(share.Name)) // webdav is the scheme, token@host the opaque part and the share name the query of the URL. - TargetUri: fmt.Sprintf("webdav://%s@%s?name=%s", token, share.Creator.Idp, share.Name), + targetURI = fmt.Sprintf("webdav://%s@%s?name=%s", token, share.Creator.Idp, share.Name) + } + + log.Info().Msg("mount path will be:" + refPath) + createRefReq := &provider.CreateReferenceRequest{ + Path: refPath, + TargetUri: targetURI, } c, err := s.findByPath(ctx, refPath) diff --git a/internal/grpc/services/ocmcore/ocmcore.go b/internal/grpc/services/ocmcore/ocmcore.go index f6bbbf6725..81ae633154 100644 --- a/internal/grpc/services/ocmcore/ocmcore.go +++ b/internal/grpc/services/ocmcore/ocmcore.go @@ -172,7 +172,15 @@ func (s *service) CreateOCMCoreShare(ctx context.Context, req *ocmcore.CreateOCM }, } - share, err := s.sm.Share(ctx, resource, grant, req.Name, nil, "", req.Owner, token, ocm.Share_SHARE_TYPE_REGULAR) + var shareType ocm.Share_ShareType + switch req.Protocol.Name { + case "datatx": + shareType = ocm.Share_SHARE_TYPE_TRANSFER + default: + shareType = ocm.Share_SHARE_TYPE_REGULAR + } + + share, err := s.sm.Share(ctx, resource, grant, req.Name, nil, "", req.Owner, token, shareType) if err != nil { return &ocmcore.CreateOCMCoreShareResponse{ Status: status.NewInternal(ctx, err, "error creating ocm core share"), diff --git a/internal/grpc/services/ocmshareprovider/ocmshareprovider.go b/internal/grpc/services/ocmshareprovider/ocmshareprovider.go index 676da090cc..1b4e8676db 100644 --- a/internal/grpc/services/ocmshareprovider/ocmshareprovider.go +++ b/internal/grpc/services/ocmshareprovider/ocmshareprovider.go @@ -144,7 +144,24 @@ func (s *service) CreateOCMShare(ctx context.Context, req *ocm.CreateOCMShareReq }, nil } - share, err := s.sm.Share(ctx, req.ResourceId, req.Grant, name, req.RecipientMeshProvider, permissions, nil, "", ocm.Share_SHARE_TYPE_REGULAR) + // discover share type + sharetype := ocm.Share_SHARE_TYPE_REGULAR + protocol, ok := req.Opaque.Map["protocol"] + if ok { + switch protocol.Decoder { + case "plain": + if string(protocol.Value) == "datatx" { + sharetype = ocm.Share_SHARE_TYPE_TRANSFER + } + default: + err := errors.New("protocol decoder not recognized") + return &ocm.CreateOCMShareResponse{ + Status: status.NewInternal(ctx, err, "error creating share"), + }, nil + } + } + + share, err := s.sm.Share(ctx, req.ResourceId, req.Grant, name, req.RecipientMeshProvider, permissions, nil, "", sharetype) if err != nil { return &ocm.CreateOCMShareResponse{ Status: status.NewInternal(ctx, err, "error creating share"), diff --git a/internal/grpc/services/storageprovider/storageprovider.go b/internal/grpc/services/storageprovider/storageprovider.go index bede723ced..7785771fcb 100644 --- a/internal/grpc/services/storageprovider/storageprovider.go +++ b/internal/grpc/services/storageprovider/storageprovider.go @@ -460,7 +460,7 @@ func (s *service) CreateContainer(ctx context.Context, req *provider.CreateConta case errtypes.IsNotFound: st = status.NewNotFound(ctx, "path not found when creating container") case errtypes.AlreadyExists: - st = status.NewInternal(ctx, err, "error: container already exists") + st = status.NewAlreadyExists(ctx, err, "container already exists") case errtypes.PermissionDenied: st = status.NewPermissionDenied(ctx, err, "permission denied") default: diff --git a/pkg/ocm/share/manager/json/json.go b/pkg/ocm/share/manager/json/json.go index b37e0f5450..7a4e9d867a 100644 --- a/pkg/ocm/share/manager/json/json.go +++ b/pkg/ocm/share/manager/json/json.go @@ -269,20 +269,40 @@ func (m *mgr) Share(ctx context.Context, md *provider.ResourceId, g *ocm.ShareGr } if isOwnersMeshProvider { + token, ok := tokenpkg.ContextGetToken(ctx) + if !ok { + return nil, errors.New("Could not get token from context") + } + var protocol []byte + if st == ocm.Share_SHARE_TYPE_TRANSFER { + protocol, err = json.Marshal( + map[string]interface{}{ + "name": "datatx", + "options": map[string]string{ + "permissions": pm, + "token": token, + }, + }, + ) + if err != nil { + err = errors.Wrap(err, "error marshalling protocol data") + return nil, err + } - // Call the remote provider's CreateOCMCoreShare method - protocol, err := json.Marshal( - map[string]interface{}{ - "name": "webdav", - "options": map[string]string{ - "permissions": pm, - "token": tokenpkg.ContextMustGetToken(ctx), + } else { + protocol, err = json.Marshal( + map[string]interface{}{ + "name": "webdav", + "options": map[string]string{ + "permissions": pm, + "token": tokenpkg.ContextMustGetToken(ctx), + }, }, - }, - ) - if err != nil { - err = errors.Wrap(err, "error marshalling protocol data") - return nil, err + ) + if err != nil { + err = errors.Wrap(err, "error marshalling protocol data") + return nil, err + } } requestBody := url.Values{ diff --git a/pkg/rgrpc/status/status.go b/pkg/rgrpc/status/status.go index c8c7dc0f31..5be9c670d0 100644 --- a/pkg/rgrpc/status/status.go +++ b/pkg/rgrpc/status/status.go @@ -124,6 +124,17 @@ func NewUnimplemented(ctx context.Context, err error, msg string) *rpc.Status { } } +// NewAlreadyExists returns a Status with CODE_ALREADY_EXISTS and logs the msg. +func NewAlreadyExists(ctx context.Context, err error, msg string) *rpc.Status { + log := appctx.GetLogger(ctx).With().CallerWithSkipFrameCount(3).Logger() + log.Error().Err(err).Msg(msg) + return &rpc.Status{ + Code: rpc.Code_CODE_ALREADY_EXISTS, + Message: msg, + Trace: getTrace(ctx), + } +} + // NewInvalidArg returns a Status with CODE_INVALID_ARGUMENT. func NewInvalidArg(ctx context.Context, msg string) *rpc.Status { return &rpc.Status{Code: rpc.Code_CODE_INVALID_ARGUMENT, diff --git a/pkg/storage/utils/localfs/localfs.go b/pkg/storage/utils/localfs/localfs.go index d27b4bb91e..3ed3873aba 100644 --- a/pkg/storage/utils/localfs/localfs.go +++ b/pkg/storage/utils/localfs/localfs.go @@ -48,16 +48,17 @@ import ( // Config holds the configuration details for the local fs. type Config struct { - Root string `mapstructure:"root"` - DisableHome bool `mapstructure:"disable_home"` - UserLayout string `mapstructure:"user_layout"` - ShareFolder string `mapstructure:"share_folder"` - Uploads string `mapstructure:"uploads"` - DataDirectory string `mapstructure:"data_directory"` - RecycleBin string `mapstructure:"recycle_bin"` - Versions string `mapstructure:"versions"` - Shadow string `mapstructure:"shadow"` - References string `mapstructure:"references"` + Root string `mapstructure:"root"` + DisableHome bool `mapstructure:"disable_home"` + UserLayout string `mapstructure:"user_layout"` + ShareFolder string `mapstructure:"share_folder"` + DataTransfersFolder string `mapstructure:"data_transfers_folder"` + Uploads string `mapstructure:"uploads"` + DataDirectory string `mapstructure:"data_directory"` + RecycleBin string `mapstructure:"recycle_bin"` + Versions string `mapstructure:"versions"` + Shadow string `mapstructure:"shadow"` + References string `mapstructure:"references"` } func (c *Config) init() { @@ -73,6 +74,10 @@ func (c *Config) init() { c.ShareFolder = "/MyShares" } + if c.DataTransfersFolder == "" { + c.DataTransfersFolder = "/Data-Transfers" + } + // ensure share folder always starts with slash c.ShareFolder = path.Join("/", c.ShareFolder) @@ -244,6 +249,10 @@ func (fs *localfs) isShareFolder(ctx context.Context, p string) bool { return strings.HasPrefix(p, fs.conf.ShareFolder) } +func (fs *localfs) isDataTransfersFolder(ctx context.Context, p string) bool { + return strings.HasPrefix(p, fs.conf.DataTransfersFolder) +} + func (fs *localfs) isShareFolderRoot(ctx context.Context, p string) bool { return path.Clean(p) == fs.conf.ShareFolder } @@ -518,12 +527,16 @@ func (fs *localfs) UpdateGrant(ctx context.Context, ref *provider.Reference, g * } func (fs *localfs) CreateReference(ctx context.Context, path string, targetURI *url.URL) error { - if !fs.isShareFolder(ctx, path) { - return errtypes.PermissionDenied("localfs: cannot create references outside the share folder") + var fn string + switch { + case fs.isShareFolder(ctx, path): + fn = fs.wrapReferences(ctx, path) + case fs.isDataTransfersFolder(ctx, path): + fn = fs.wrap(ctx, path) + default: + return errtypes.PermissionDenied("localfs: cannot create references outside the share folder and data transfers folder") } - fn := fs.wrapReferences(ctx, path) - err := os.MkdirAll(fn, 0700) if err != nil { if os.IsNotExist(err) { From c7df38f2e44dc62ea5c58bd8f707b01c7a53ca6b Mon Sep 17 00:00:00 2001 From: Hugo Gonzalez Labrador Date: Wed, 31 Mar 2021 16:35:43 +0200 Subject: [PATCH 65/70] allow full paths targets --- .../owncloud/ocs/handlers/apps/sharing/shares/shares.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index fefe0acad2..651f708a6b 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -657,11 +657,12 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { if data.State == ocsStateAccepted { // Needed because received shares can be jailed in a folder in the users home - data.FileTarget = path.Join(h.sharePrefix, path.Base(info.Path)) - data.Path = path.Join(h.sharePrefix, path.Base(info.Path)) + data.FileTarget = path.Join(h.sharePrefix, info.Path) + data.Path = path.Join(h.sharePrefix, info.Path) } shares = append(shares, data) + log.Info().Msgf("listSharesWithMe: %+v", *data) } response.WriteOCSSuccess(w, r, shares) @@ -799,7 +800,7 @@ func (h *Handler) addFileInfo(ctx context.Context, s *conversions.ShareData, inf // TODO Storage: int s.ItemSource = wrapResourceID(info.Id) s.FileSource = s.ItemSource - s.FileTarget = path.Join("/", path.Base(info.Path)) + s.FileTarget = path.Join("/", info.Path) s.Path = path.Join("/", path.Base(info.Path)) // TODO hm this might have to be relative to the users home ... depends on the webdav_namespace config // TODO FileParent: // item type From 1e16364a61f5157abf581bd25071937eee9e0ae7 Mon Sep 17 00:00:00 2001 From: Hugo Gonzalez Labrador Date: Wed, 31 Mar 2021 16:49:36 +0200 Subject: [PATCH 66/70] add changelog --- changelog/unreleased/fix-sharing-paths.md | 6 ++++++ .../owncloud/ocs/handlers/apps/sharing/shares/shares.go | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 changelog/unreleased/fix-sharing-paths.md diff --git a/changelog/unreleased/fix-sharing-paths.md b/changelog/unreleased/fix-sharing-paths.md new file mode 100644 index 0000000000..c59bc5c38a --- /dev/null +++ b/changelog/unreleased/fix-sharing-paths.md @@ -0,0 +1,6 @@ +Bugfix: Allow to expose full paths in OCS API + +Before this fix a share file_target was always harcoded to use a base path. +This fix provides the possiblity to expose full paths in the OCIS API and asymptotically in OCIS web. + +https://github.com/cs3org/reva/pull/1605 diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index 651f708a6b..f45278561b 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -662,7 +662,7 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { } shares = append(shares, data) - log.Info().Msgf("listSharesWithMe: %+v", *data) + log.Debug().Msgf("listSharesWithMe: %+v", *data) } response.WriteOCSSuccess(w, r, shares) From 765e21ff7fe74a1992ffe08470049f0ca3176e8b Mon Sep 17 00:00:00 2001 From: Hugo Gonzalez Labrador Date: Thu, 1 Apr 2021 13:36:29 +0200 Subject: [PATCH 67/70] fix logic --- .../owncloud/ocs/handlers/apps/sharing/shares/shares.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index f45278561b..588f67aace 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -800,8 +800,8 @@ func (h *Handler) addFileInfo(ctx context.Context, s *conversions.ShareData, inf // TODO Storage: int s.ItemSource = wrapResourceID(info.Id) s.FileSource = s.ItemSource - s.FileTarget = path.Join("/", info.Path) - s.Path = path.Join("/", path.Base(info.Path)) // TODO hm this might have to be relative to the users home ... depends on the webdav_namespace config + s.FileTarget = path.Join("/", path.Base(info.Path)) + s.Path = path.Join("/", info.Path) // TODO hm this might have to be relative to the users home ... depends on the webdav_namespace config // TODO FileParent: // item type s.ItemType = conversions.ResourceType(info.GetType()).String() From f296b4fbd59e0ed9d1423966e4f3b4d9ac99c5cc Mon Sep 17 00:00:00 2001 From: Hugo Gonzalez Labrador Date: Thu, 1 Apr 2021 16:20:44 +0200 Subject: [PATCH 68/70] more fixes --- .../owncloud/ocs/handlers/apps/sharing/shares/shares.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index 588f67aace..f552c92a83 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -657,12 +657,12 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { if data.State == ocsStateAccepted { // Needed because received shares can be jailed in a folder in the users home - data.FileTarget = path.Join(h.sharePrefix, info.Path) + data.FileTarget = path.Join(h.sharePrefix, path.Base(info.Path)) data.Path = path.Join(h.sharePrefix, info.Path) } shares = append(shares, data) - log.Debug().Msgf("listSharesWithMe: %+v", *data) + log.Debug().Msgf("share: %+v", *data) } response.WriteOCSSuccess(w, r, shares) From 4209caaddc655d0b29457081d22953c6e77798bc Mon Sep 17 00:00:00 2001 From: Hugo Gonzalez Labrador Date: Tue, 6 Apr 2021 10:47:11 +0200 Subject: [PATCH 69/70] use full paths for file target --- .../owncloud/ocs/handlers/apps/sharing/shares/shares.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index f552c92a83..8796800b54 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -657,7 +657,7 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { if data.State == ocsStateAccepted { // Needed because received shares can be jailed in a folder in the users home - data.FileTarget = path.Join(h.sharePrefix, path.Base(info.Path)) + data.FileTarget = path.Join(h.sharePrefix, info.Path) data.Path = path.Join(h.sharePrefix, info.Path) } @@ -800,8 +800,8 @@ func (h *Handler) addFileInfo(ctx context.Context, s *conversions.ShareData, inf // TODO Storage: int s.ItemSource = wrapResourceID(info.Id) s.FileSource = s.ItemSource - s.FileTarget = path.Join("/", path.Base(info.Path)) - s.Path = path.Join("/", info.Path) // TODO hm this might have to be relative to the users home ... depends on the webdav_namespace config + s.FileTarget = path.Join("/", info.Path) + s.Path = path.Join("/", info.Path) // TODO FileParent: // item type s.ItemType = conversions.ResourceType(info.GetType()).String() From fee1db910c98874eaa59b4c66f77811a5486d5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Thu, 6 May 2021 12:50:16 +0000 Subject: [PATCH 70/70] use path and name from shares jail if it is configured MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- .../handlers/apps/sharing/shares/shares.go | 64 ++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index 8796800b54..60ced6ae67 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -615,6 +615,29 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { return } + // in a jailed namespace we have to point to the mount point in the users /Shares jail + // to do that we have to list the /Shares jail and use those paths instead of stating the shared resources + // The stat results would start with a path outside the jail and thus be inaccessible + + var shareJailInfos []*provider.ResourceInfo + + if h.sharePrefix != "/" { + // we only need the path from the share jail for accepted shares + if stateFilter == collaboration.ShareState_SHARE_STATE_ACCEPTED || stateFilter == ocsStateUnknown { + // only log errors. They may happen but we can continue trying to at least list the shares + lcRes, err := client.ListContainer(ctx, &provider.ListContainerRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Path{Path: path.Join(h.homeNamespace, h.sharePrefix)}, + }, + }) + if err != nil || lcRes.Status.Code != rpc.Code_CODE_OK { + h.logProblems(lcRes.GetStatus(), err, "could not list container, continuing without share jail path info") + } else { + shareJailInfos = lcRes.Infos + } + } + } + shares := make([]*conversions.ShareData, 0, len(lrsRes.GetShares())) // TODO(refs) filter out "invalid" shares @@ -656,9 +679,37 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { h.mapUserIds(r.Context(), client, data) if data.State == ocsStateAccepted { + // only accepted shares can be accessed when jailing users into their home. + // in this case we cannot stat shared resources that are outside the users home (/home), + // the path (/users/u-u-i-d/foo) will not be accessible + + // in a global namespace we can access the share using the full path + // in a jailed namespace we have to point to the mount point in the users /Shares jail + // - needed for oc10 hot migration + // or use the /dav/spaces/ endpoint? + + // list /Shares and match fileids with list of received shares + // - only works for a /Shares folder jail + // - does not work for freely mountable shares as in oc10 because we would need to iterate over the whole tree, there is no listing of mountpoints, yet + + // can we return the mountpoint when the gateway resolves the listing of shares? + // - no, the gateway only sees the same list any has the same options as the ocs service + // - we would need to have a list of mountpoints for the shares -> owncloudstorageprovider for hot migration migration + + // best we can do for now is stat the /Shares jail if it is set and return those paths + + // if we are in a jail and the current share has been accepted use the stat from the share jail // Needed because received shares can be jailed in a folder in the users home - data.FileTarget = path.Join(h.sharePrefix, info.Path) - data.Path = path.Join(h.sharePrefix, info.Path) + + // if we have share jail infos use them to build the path + if sji := findMatch(shareJailInfos, rs.Share.ResourceId); sji != nil { + // override path with info from share jail + data.FileTarget = path.Join(h.sharePrefix, path.Base(sji.Path)) + data.Path = path.Join(h.sharePrefix, path.Base(sji.Path)) + } else { + data.FileTarget = info.Path + data.Path = info.Path + } } shares = append(shares, data) @@ -668,6 +719,15 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { response.WriteOCSSuccess(w, r, shares) } +func findMatch(shareJailInfos []*provider.ResourceInfo, id *provider.ResourceId) *provider.ResourceInfo { + for i := range shareJailInfos { + if shareJailInfos[i].Id != nil && shareJailInfos[i].Id.StorageId == id.StorageId && shareJailInfos[i].Id.OpaqueId == id.OpaqueId { + return shareJailInfos[i] + } + } + return nil +} + func (h *Handler) listSharesWithOthers(w http.ResponseWriter, r *http.Request) { shares := make([]*conversions.ShareData, 0)