@@ -237,4 +237,123 @@ public function testRename() {
237237 // cleanup
238238 $ this ->shareManager ->deleteShare ($ share );
239239 }
240+
241+ /**
242+ * If a folder gets moved into shared folder, children shares should have their uid_owner and permissions adjusted
243+ * user1
244+ * |-folder1 --> shared with user2
245+ * user2
246+ * |-folder2 --> shared with user3 and moved into folder1
247+ * |-subfolder1 --> shared with user3
248+ * |-file1.txt --> shared with user3
249+ * |-subfolder2
250+ * |-file2.txt --> shared with user3
251+ */
252+ public function testMovedIntoShareChangeOwner () {
253+ $ this ->markTestSkipped ('Skipped because this is failing with S3 as primary as file id are change when moved. ' );
254+
255+ // user1 creates folder1
256+ $ viewUser1 = new \OC \Files \View ('/ ' . self ::TEST_FILES_SHARING_API_USER1 . '/files ' );
257+ $ folder1 = 'folder1 ' ;
258+ $ viewUser1 ->mkdir ($ folder1 );
259+
260+ // user1 shares folder1 to user2
261+ $ folder1Share = $ this ->share (
262+ IShare::TYPE_USER ,
263+ $ folder1 ,
264+ self ::TEST_FILES_SHARING_API_USER1 ,
265+ self ::TEST_FILES_SHARING_API_USER2 ,
266+ \OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE
267+ );
268+
269+ $ this ->loginHelper (self ::TEST_FILES_SHARING_API_USER2 );
270+ $ viewUser2 = new \OC \Files \View ('/ ' . self ::TEST_FILES_SHARING_API_USER2 . '/files ' );
271+ // Create user2 files
272+ $ folder2 = 'folder2 ' ;
273+ $ viewUser2 ->mkdir ($ folder2 );
274+ $ file1 = 'folder2/file1.txt ' ;
275+ $ viewUser2 ->touch ($ file1 );
276+ $ subfolder1 = 'folder2/subfolder1 ' ;
277+ $ viewUser2 ->mkdir ($ subfolder1 );
278+ $ subfolder2 = 'folder2/subfolder2 ' ;
279+ $ viewUser2 ->mkdir ($ subfolder2 );
280+ $ file2 = 'folder2/subfolder2/file2.txt ' ;
281+ $ viewUser2 ->touch ($ file2 );
282+
283+ // user2 shares folder2 to user3
284+ $ folder2Share = $ this ->share (
285+ IShare::TYPE_USER ,
286+ $ folder2 ,
287+ self ::TEST_FILES_SHARING_API_USER2 ,
288+ self ::TEST_FILES_SHARING_API_USER3 ,
289+ \OCP \Constants::PERMISSION_ALL
290+ );
291+ // user2 shares folder2/file1 to user3
292+ $ file1Share = $ this ->share (
293+ IShare::TYPE_USER ,
294+ $ file1 ,
295+ self ::TEST_FILES_SHARING_API_USER2 ,
296+ self ::TEST_FILES_SHARING_API_USER3 ,
297+ \OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE
298+ );
299+ // user2 shares subfolder1 to user3
300+ $ subfolder1Share = $ this ->share (
301+ IShare::TYPE_USER ,
302+ $ subfolder1 ,
303+ self ::TEST_FILES_SHARING_API_USER2 ,
304+ self ::TEST_FILES_SHARING_API_USER3 ,
305+ \OCP \Constants::PERMISSION_ALL
306+ );
307+ // user2 shares subfolder2/file2.txt to user3
308+ $ file2Share = $ this ->share (
309+ IShare::TYPE_USER ,
310+ $ file2 ,
311+ self ::TEST_FILES_SHARING_API_USER2 ,
312+ self ::TEST_FILES_SHARING_API_USER3 ,
313+ \OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE
314+ );
315+
316+ // user2 moves folder2 into folder1
317+ $ viewUser2 ->rename ($ folder2 , $ folder1 .'/ ' .$ folder2 );
318+ $ folder2Share = $ this ->shareManager ->getShareById ($ folder2Share ->getFullId ());
319+ $ file1Share = $ this ->shareManager ->getShareById ($ file1Share ->getFullId ());
320+ $ subfolder1Share = $ this ->shareManager ->getShareById ($ subfolder1Share ->getFullId ());
321+ $ file2Share = $ this ->shareManager ->getShareById ($ file2Share ->getFullId ());
322+
323+ // Expect uid_owner of both shares to be user1
324+ $ this ->assertEquals (self ::TEST_FILES_SHARING_API_USER1 , $ folder2Share ->getShareOwner ());
325+ $ this ->assertEquals (self ::TEST_FILES_SHARING_API_USER1 , $ file1Share ->getShareOwner ());
326+ $ this ->assertEquals (self ::TEST_FILES_SHARING_API_USER1 , $ subfolder1Share ->getShareOwner ());
327+ $ this ->assertEquals (self ::TEST_FILES_SHARING_API_USER1 , $ file2Share ->getShareOwner ());
328+ // Expect permissions to be limited by the permissions of the destination share
329+ $ this ->assertEquals (\OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE , $ folder2Share ->getPermissions ());
330+ $ this ->assertEquals (\OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE , $ file1Share ->getPermissions ());
331+ $ this ->assertEquals (\OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE , $ subfolder1Share ->getPermissions ());
332+ $ this ->assertEquals (\OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE , $ file2Share ->getPermissions ());
333+
334+ // user2 moves folder2 out of folder1
335+ $ viewUser2 ->rename ($ folder1 .'/ ' .$ folder2 , $ folder2 );
336+ $ folder2Share = $ this ->shareManager ->getShareById ($ folder2Share ->getFullId ());
337+ $ file1Share = $ this ->shareManager ->getShareById ($ file1Share ->getFullId ());
338+ $ subfolder1Share = $ this ->shareManager ->getShareById ($ subfolder1Share ->getFullId ());
339+ $ file2Share = $ this ->shareManager ->getShareById ($ file2Share ->getFullId ());
340+
341+ // Expect uid_owner of both shares to be user2
342+ $ this ->assertEquals (self ::TEST_FILES_SHARING_API_USER2 , $ folder2Share ->getShareOwner ());
343+ $ this ->assertEquals (self ::TEST_FILES_SHARING_API_USER2 , $ file1Share ->getShareOwner ());
344+ $ this ->assertEquals (self ::TEST_FILES_SHARING_API_USER2 , $ subfolder1Share ->getShareOwner ());
345+ $ this ->assertEquals (self ::TEST_FILES_SHARING_API_USER2 , $ file2Share ->getShareOwner ());
346+ // Expect permissions to not change
347+ $ this ->assertEquals (\OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE , $ folder2Share ->getPermissions ());
348+ $ this ->assertEquals (\OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE , $ file1Share ->getPermissions ());
349+ $ this ->assertEquals (\OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE , $ subfolder1Share ->getPermissions ());
350+ $ this ->assertEquals (\OCP \Constants::PERMISSION_READ | \OCP \Constants::PERMISSION_SHARE , $ file2Share ->getPermissions ());
351+
352+ // cleanup
353+ $ this ->shareManager ->deleteShare ($ folder1Share );
354+ $ this ->shareManager ->deleteShare ($ folder2Share );
355+ $ this ->shareManager ->deleteShare ($ file1Share );
356+ $ this ->shareManager ->deleteShare ($ subfolder1Share );
357+ $ this ->shareManager ->deleteShare ($ file2Share );
358+ }
240359}
0 commit comments