diff --git a/api/tests/Vfs/Links/StreamWrapperTest.php b/api/tests/Vfs/Links/StreamWrapperTest.php index 431a8b3c31..1ce3cbabea 100644 --- a/api/tests/Vfs/Links/StreamWrapperTest.php +++ b/api/tests/Vfs/Links/StreamWrapperTest.php @@ -57,6 +57,23 @@ class StreamWrapperTest extends Vfs\StreamWrapperBase parent::testNoReadAccess(); } + public function testWithAccess(): void + { + $info_id = $this->make_infolog(); + $this->files[] = $this->test_file = $this->getFilename(null, $info_id); + + parent::testWithAccess(); + } + + protected function allowAccess(string $test_name, string $test_file, int $test_user, string $needed) + { + // We'll allow access by putting test user in responsible + $so = new \infolog_so(); + $element = $so->read($this->entries[0]); + $element['info_responsible'] = [$test_user]; + $so->write($so); + } + /** * Make an infolog entry */ diff --git a/api/tests/Vfs/ProppatchTest.php b/api/tests/Vfs/ProppatchTest.php index b44b635c6f..905fc61619 100644 --- a/api/tests/Vfs/ProppatchTest.php +++ b/api/tests/Vfs/ProppatchTest.php @@ -19,7 +19,7 @@ use EGroupware\Api\Vfs; use EGroupware\Stylite\Vfs\Versioning; -class ProppatchTest extends StreamWrapperBase +class ProppatchTest extends LoggedInTest { protected function setUp() : void { @@ -113,4 +113,17 @@ class ProppatchTest extends StreamWrapperBase ); } + + /** + * Make a filename that reflects the current test + */ + protected function getFilename($path = null) + { + if(is_null($path)) $path = Vfs::get_home_dir().'/'; + if(substr($path,-1,1) !== '/') $path = $path . '/'; + + $reflect = new \ReflectionClass($this); + return $path . $reflect->getShortName() . '_' . $this->getName(false) . '.txt'; + } + } \ No newline at end of file diff --git a/api/tests/Vfs/StreamWrapperBase.php b/api/tests/Vfs/StreamWrapperBase.php index d11a3f31e4..b159f253e1 100644 --- a/api/tests/Vfs/StreamWrapperBase.php +++ b/api/tests/Vfs/StreamWrapperBase.php @@ -261,6 +261,67 @@ class StreamWrapperBase extends LoggedInTest } + + /** + * Check that a user with permission to a file can access the file + * + * @depends testSimpleReadWrite + * @throws Api\Exception\AssertionFailed + */ + public function testWithAccess() : void + { + if(!$this->test_file) + { + $this->markTestSkipped("No test file set - set it in setUp() or overriding test"); + } + + // Check that the file is not there + $pre_start = Vfs::stat($this->test_file); + $this->assertEquals(null,$pre_start, + "File '$this->test_file' was there before we started, check clean up" + ); + + // Write + $file = $this->test_file; + $contents = $this->getName() . "\nJust a test ;)\n"; + $this->assertNotFalse( + file_put_contents(Vfs::PREFIX . $file, $contents), + "Could not write file $file" + ); + $pre = Vfs::stat($this->test_file); + + + // Create another user who has no access to our file + $user_b = $this->makeUser(); + + // Allow access + $this->allowAccess( + $this->getName(false), + $file, + $user_b, + 'r' + ); + + // Log in as them + $this->switchUser($this->account['account_lid'], $this->account['account_passwd']); + + // Check the file + $post = Vfs::stat($file); + $this->assertNotNull($post, + "File '$file' was not accessible by another user who had permission" + ); + $this->assertEquals( + $contents, + file_get_contents(Vfs::PREFIX . $file), + "Problem reading someone else's file with permission" + ); + $this->assertTrue( + Vfs::is_readable($file), + "Vfs says $file is not readable. It should be." + ); + + } + ////// Handy functions /////// /**