/** * Creates a new file in the directory * * Data will either be supplied as a stream resource, or in certain cases * as a string. Keep in mind that you may have to support either. * * After successful creation of the file, you may choose to return the ETag * of the new file here. * * The returned ETag must be surrounded by double-quotes (The quotes should * be part of the actual string). * * If you cannot accurately determine the ETag, you should not return it. * If you don't store the file exactly as-is (you're transforming it * somehow) you should also not return an ETag. * * This means that if a subsequent GET to this new file does not exactly * return the same contents of what was submitted here, you are strongly * recommended to omit the ETag. * * @param string $name Name of the file * @param resource|string $data Initial payload * @throws \Sabre\DAV\Exception\Forbidden * @return null|string */ public function createFile($name, $data = null) { try { // for chunked upload also updating a existing file is a "createFile" // because we create all the chunks before re-assemble them to the existing file. if (isset($_SERVER['HTTP_OC_CHUNKED'])) { // exit if we can't create a new file and we don't updatable existing file $info = OC_FileChunking::decodeName($name); if (!$this->fileView->isCreatable($this->path) && !$this->fileView->isUpdatable($this->path . '/' . $info['name'])) { throw new \Sabre\DAV\Exception\Forbidden(); } } else { // For non-chunked upload it is enough to check if we can create a new file if (!$this->fileView->isCreatable($this->path)) { throw new \Sabre\DAV\Exception\Forbidden(); } } $path = $this->fileView->getAbsolutePath($this->path) . '/' . $name; // using a dummy FileInfo is acceptable here since it will be refreshed after the put is complete $info = new \OC\Files\FileInfo($path, null, null, array(), null); $node = new OC_Connector_Sabre_File($this->fileView, $info); return $node->put($data); } catch (\OCP\Files\StorageNotAvailableException $e) { throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); } }
/** * Returns the INode object for the requested path * * @param string $path * @throws \Sabre_DAV_Exception_NotFound * @return \Sabre_DAV_INode */ public function getNodeForPath($path) { $path = trim($path, '/'); if (isset($this->cache[$path])) { return $this->cache[$path]; } // Is it the root node? if (!strlen($path)) { return $this->rootNode; } if (pathinfo($path, PATHINFO_EXTENSION) === 'part') { // read from storage $absPath = $this->getFileView()->getAbsolutePath($path); list($storage, $internalPath) = Filesystem::resolvePath('/' . $absPath); if ($storage) { $scanner = $storage->getScanner($internalPath); // get data directly $info = $scanner->getData($internalPath); } } else { // read from cache $info = $this->getFileView()->getFileInfo($path); } if (!$info) { throw new \Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located'); } if ($info['mimetype'] === 'httpd/unix-directory') { $node = new \OC_Connector_Sabre_Directory($path); } else { $node = new \OC_Connector_Sabre_File($path); } $node->setFileinfoCache($info); $this->cache[$path] = $node; return $node; }
/** * @dataProvider davPermissionsProvider */ public function testDavPermissions($permissions, $type, $shared, $mounted, $expected) { $info = $this->getMockBuilder('\\OC\\Files\\FileInfo')->disableOriginalConstructor()->setMethods(array('getPermissions', 'isShared', 'isMounted', 'getType'))->getMock(); $info->expects($this->any())->method('getPermissions')->will($this->returnValue($permissions)); $info->expects($this->any())->method('isShared')->will($this->returnValue($shared)); $info->expects($this->any())->method('isMounted')->will($this->returnValue($mounted)); $info->expects($this->any())->method('getType')->will($this->returnValue($type)); $view = $this->getMock('\\OC\\Files\\View'); $node = new \OC_Connector_Sabre_File($view, $info); $this->assertEquals($expected, $node->getDavPermissions()); }
/** * @expectedException \Sabre\DAV\Exception\BadRequest */ public function testUploadAbort() { // setup $view = $this->getMock('\\OC\\Files\\View', array('file_put_contents', 'rename', 'getRelativePath', 'filesize')); $view->expects($this->any())->method('file_put_contents')->withAnyParameters()->will($this->returnValue(true)); $view->expects($this->any())->method('rename')->withAnyParameters()->will($this->returnValue(false)); $view->expects($this->any())->method('getRelativePath')->will($this->returnValue('/test.txt')); $view->expects($this->any())->method('filesize')->will($this->returnValue(123456)); $_SERVER['CONTENT_LENGTH'] = 12345; $info = new \OC\Files\FileInfo('/test.txt', null, null, array('permissions' => \OCP\PERMISSION_ALL)); $file = new OC_Connector_Sabre_File($view, $info); // action $file->put('test data'); }
/** * Returns the INode object for the requested path * * @param string $path * @throws \Sabre_DAV_Exception_NotFound * @return \Sabre_DAV_INode */ public function getNodeForPath($path) { $path = trim($path, '/'); if (isset($this->cache[$path])) { return $this->cache[$path]; } // Is it the root node? if (!strlen($path)) { return $this->rootNode; } $info = $this->getFileView()->getFileInfo($path); if (!$info) { throw new \Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located'); } if ($info['mimetype'] === 'httpd/unix-directory') { $node = new \OC_Connector_Sabre_Directory($path); } else { $node = new \OC_Connector_Sabre_File($path); } $node->setFileinfoCache($info); $this->cache[$path] = $node; return $node; }
/** * Returns a specific child node, referenced by its name * * @param string $name * @throws Sabre_DAV_Exception_FileNotFound * @return Sabre_DAV_INode */ public function getChild($name, $info = null) { $path = $this->path . '/' . $name; if (is_null($info)) { $info = \OC\Files\Filesystem::getFileInfo($path); } if (!$info) { throw new Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located'); } if ($info['mimetype'] == 'httpd/unix-directory') { $node = new OC_Connector_Sabre_Directory($path); } else { $node = new OC_Connector_Sabre_File($path); } $node->setFileinfoCache($info); return $node; }
/** * @expectedException \Sabre\DAV\Exception\Forbidden */ public function testDeleteThrowsWhenDeletionFailed() { // setup $view = $this->getMock('\\OC\\Files\\View', array()); // but fails $view->expects($this->once())->method('unlink')->will($this->returnValue(false)); $info = new \OC\Files\FileInfo('/test.txt', null, null, array('permissions' => \OCP\Constants::PERMISSION_ALL), null); $file = new OC_Connector_Sabre_File($view, $info); // action $file->delete(); }