/**
  * 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());
     }
 }
Exemple #2
0
 /**
  * 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;
 }
Exemple #3
0
 /**
  * @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());
 }
Exemple #4
0
 /**
  * @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;
 }
Exemple #7
0
 /**
  * @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();
 }