Example #1
0
 /**
  * @NoAdminRequired
  * @PublicPage
  * Store the document content to its origin
  */
 public function save()
 {
     try {
         $esId = $this->request->server['HTTP_WEBODF_SESSION_ID'];
         if (!$esId) {
             throw new \Exception('Session id can not be empty');
         }
         $memberId = $this->request->server['HTTP_WEBODF_MEMBER_ID'];
         $currentMember = new Db\Member();
         $currentMember->load($memberId);
         //check if member belongs to the session
         if ($esId != $currentMember->getEsId()) {
             throw new \Exception($memberId . ' does not belong to session ' . $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);
         $session = new Db\Session();
         $session->load($esId);
         if (!$session->getEsId()) {
             throw new \Exception('Session does not exist');
         }
         try {
             if ($currentMember->getIsGuest()) {
                 $file = File::getByShareToken($currentMember->getToken());
             } else {
                 $file = new File($session->getFileId());
             }
             list($view, $path) = $file->getOwnerViewAndPath(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 = \OCP\Config::getUserValue($this->uid, 'documents', '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 = sha1($view->file_get_contents($path));
             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', array('app' => $this->appName));
                 $session->updateGenesisHash($esId, sha1($data['content']));
             } else {
                 // Last user. Kill session data
                 Db\Session::cleanUp($esId);
             }
             $view->touch($path);
         }
         $response = array('status' => 'success');
     } catch (\Exception $e) {
         $this->logger->warning('Saving failed. Reason:' . $e->getMessage(), array('app' => $this->appName));
         \OC_Response::setStatus(500);
         $response = array();
     }
     return $response;
 }
Example #2
0
 /**
  * @NoAdminRequired
  * lists the documents the user has access to (including shared files, once the code in core has been fixed)
  * also adds session and member info for these files
  */
 public function listAll()
 {
     $found = Storage::getDocuments();
     $fileIds = array();
     $documents = array();
     foreach ($found as $key => $document) {
         if (is_object($document)) {
             $documents[] = $document->getData();
         } else {
             $documents[$key] = $document;
         }
         $documents[$key]['icon'] = preg_replace('/\\.png$/', '.svg', \OC_Helper::mimetypeIcon($document['mimetype']));
         $fileIds[] = $document['fileid'];
     }
     usort($documents, function ($a, $b) {
         return @$b['mtime'] - @$a['mtime'];
     });
     $session = new Db\Session();
     $sessions = $session->getCollectionBy('file_id', $fileIds);
     $members = array();
     $member = new Db\Member();
     foreach ($sessions as $session) {
         $members[$session['es_id']] = $member->getActiveCollection($session['es_id']);
     }
     return array('status' => 'success', 'documents' => $documents, 'sessions' => $sessions, 'members' => $members);
 }
Example #3
0
 protected function getUniqueSessionId()
 {
     $testSession = new Session();
     do {
         $id = \OC_Util::generateRandomBytes(30);
     } while ($testSession->load($id)->hasData());
     return $id;
 }
Example #4
0
 protected function getUniqueSessionId()
 {
     $testSession = new Session();
     do {
         $id = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(30, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
     } while ($testSession->load($id)->hasData());
     return $id;
 }
 protected function loadSession($esId)
 {
     if (!$esId) {
         throw new \Exception('Session id can not be empty');
     }
     $session = new Db\Session();
     $session->load($esId);
     if (!$session->getEsId()) {
         throw new \Exception('Session does not exist');
     }
     return $session;
 }