Beispiel #1
0
 /**
  * Create new genesis document
  * @param File $file 
  * */
 public function __construct(File $file)
 {
     $view = $file->getOwnerView();
     $path = $file->getPath();
     $owner = $file->getOwner();
     $this->view = new View('/' . $owner);
     if (!$this->view->file_exists(self::DOCUMENTS_DIRNAME)) {
         $this->view->mkdir(self::DOCUMENTS_DIRNAME);
     }
     $this->validate($view, $path);
     $this->hash = $view->hash('sha1', $path, false);
     $this->path = self::DOCUMENTS_DIRNAME . '/' . $this->hash . '.odt';
     if (!$this->view->file_exists($this->path)) {
         //copy new genesis to /user/documents/{hash}.odt
         // get decrypted content
         $content = $view->file_get_contents($path);
         $mimetype = $view->getMimeType($path);
         $data = Filter::read($content, $mimetype);
         $this->view->file_put_contents($this->path, $data['content']);
     }
     try {
         $this->validate($this->view, $this->path);
     } catch (\Exception $e) {
         throw new \Exception('Failed to copy genesis');
     }
 }
 public function render()
 {
     if ($this->getStatus() === Http::STATUS_NOT_FOUND) {
         return '';
     }
     $info = $this->view->getFileInfo($this->path);
     $this->ETag = $info['etag'];
     $content = $this->view->file_get_contents($this->path);
     $data = \OCA\Richdocuments\Filter::read($content, $info['mimetype']);
     $size = strlen($data['content']);
     if (isset($this->request->server['HTTP_RANGE']) && !is_null($this->request->server['HTTP_RANGE'])) {
         $isValidRange = preg_match('/^bytes=\\d*-\\d*(,\\d*-\\d*)*$/', $this->request->server['HTTP_RANGE']);
         if (!$isValidRange) {
             return $this->sendRangeNotSatisfiable($size);
         }
         $ranges = explode(',', substr($this->request->server['HTTP_RANGE'], 6));
         foreach ($ranges as $range) {
             $parts = explode('-', $range);
             if ($parts[0] === '' && $parts[1] == '') {
                 $this->sendNotSatisfiable($size);
             }
             if ($parts[0] === '') {
                 $start = $size - $parts[1];
                 $end = $size - 1;
             } else {
                 $start = $parts[0];
                 $end = $parts[1] === '' ? $size - 1 : $parts[1];
             }
             if ($start > $end) {
                 $this->sendNotSatisfiable($size);
             }
             $buffer = substr($data['content'], $start, $end - $start);
             $md5Sum = md5($buffer);
             // send the headers and data
             $this->addHeader('Content-Length', $end - $start);
             $this->addHeader('Content-md5', $md5Sum);
             $this->addHeader('Accept-Ranges', 'bytes');
             $this->addHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $size);
             $this->addHeader('Connection', 'close');
             $this->addHeader('Content-Type', $data['mimetype']);
             $this->addContentDispositionHeader();
             return $buffer;
         }
     }
     $this->addHeader('Content-Type', $data['mimetype']);
     $this->addContentDispositionHeader();
     $this->addHeader('Content-Length', $size);
     return $data['content'];
 }
 /**
  * @NoAdminRequired
  */
 public function getSupportedMimes()
 {
     return array('status' => 'success', 'mimes' => Filter::getAll());
 }
Beispiel #4
0
 protected function initViews()
 {
     $this->ownerView = new View('/' . $this->owner);
     $this->ownerViewFiles = new View('/' . $this->owner . '/files');
     $this->path = $this->ownerView->getPath($this->fileId);
     $this->pathFiles = $this->ownerViewFiles->getPath($this->fileId);
     if (!$this->path || !$this->pathFiles) {
         throw new \Exception($this->fileId . ' can not be resolved');
     }
     if (!$this->ownerView->file_exists($this->path)) {
         throw new \Exception($this->path . ' doesn\'t exist');
     }
     if (!$this->ownerViewFiles->file_exists($this->pathFiles)) {
         throw new \Exception($this->pathFiles . ' doesn\'t exist');
     }
     if (!$this->ownerView->is_file($this->path)) {
         throw new \Exception('Object ' . $this->path . ' is not a file.');
     }
     //TODO check if it is a valid odt
     $mimetype = $this->ownerView->getMimeType($this->path);
     if (!Filter::isSupportedMimetype($mimetype)) {
         throw new \Exception($this->path . ' is ' . $mimetype . ' and is not supported by RichDocuments app');
     }
 }
 /**
  * Store the document content to its origin
  * @NoAdminRequired
  */
 public function save()
 {
     $response = new JSONResponse();
     try {
         $esId = $this->request->server['HTTP_WEBODF_SESSION_ID'];
         $session = $this->loadSession($esId);
         $memberId = $this->request->server['HTTP_WEBODF_MEMBER_ID'];
         $currentMember = $this->loadMember($memberId, $esId);
         // Extra info for future usage
         // $sessionRevision = $this->request->server['HTTP_WEBODF_SESSION_REVISION'];
         //NB ouch! New document content is passed as an input stream content
         $stream = fopen('php://input', 'r');
         if (!$stream) {
             throw new \Exception('New content missing');
         }
         $content = stream_get_contents($stream);
         try {
             if ($currentMember->getIsGuest()) {
                 $file = File::getByShareToken($currentMember->getToken());
             } else {
                 $file = new File($session->getFileId());
             }
             $view = $file->getOwnerView(true);
             $path = $file->getPath(true);
         } catch (\Exception $e) {
             //File was deleted or unshared. We need to save content as new file anyway
             //Sorry, but for guests it would be lost :(
             if ($this->uid) {
                 $view = new View('/' . $this->uid . '/files');
                 $dir = \OC::$server->getConfig()->getUserValue($this->uid, 'richdocuments', 'save_path', '');
                 $path = Helper::getNewFileName($view, $dir . 'New Document.odt');
             } else {
                 throw $e;
             }
         }
         $member = new Db\Member();
         $members = $member->getActiveCollection($esId);
         $memberIds = array_map(function ($x) {
             return $x['member_id'];
         }, $members);
         // Active users except current user
         $memberCount = count($memberIds) - 1;
         if ($view->file_exists($path)) {
             $currentHash = $view->hash('sha1', $path, false);
             if (!Helper::isVersionsEnabled() && $currentHash !== $session->getGenesisHash()) {
                 // Original file was modified externally. Save to a new one
                 $path = Helper::getNewFileName($view, $path, '-conflict');
             }
             $mimetype = $view->getMimeType($path);
         } else {
             $mimetype = Storage::MIMETYPE_LIBREOFFICE_WORDPROCESSOR;
         }
         $data = Filter::write($content, $mimetype);
         if ($view->file_put_contents($path, $data['content'])) {
             // Not a last user
             if ($memberCount > 0) {
                 // Update genesis hash to prevent conflicts
                 $this->logger->debug('Update hash', ['app' => $this->appName]);
                 $session->updateGenesisHash($esId, sha1($data['content']));
             } else {
                 // Last user. Kill session data
                 Db\Session::cleanUp($esId);
             }
             $view->touch($path);
         }
         $response->setData(['status' => 'success']);
     } catch (\Exception $e) {
         $response->setStatus(Http::STATUS_INTERNAL_SERVER_ERROR);
         $response->setData([]);
         $this->logger->warning('Saving failed. Reason:' . $e->getMessage(), ['app' => $this->appName]);
     }
     return $response;
 }
Beispiel #6
0
 public function __construct($mimeSpec)
 {
     $this->readSpec = $mimeSpec['read'];
     $this->writeSpec = $mimeSpec['write'];
     \OCA\Richdocuments\Filter::add($mimeSpec['write']['target'], $this);
 }