/** * Process partial/complete file download * @param array $args - array containing session id as an element with a key es_id */ public static function serve($args) { $session = new Db_Session(); $sessionData = $session->load(@$args['es_id'])->getData(); $file = new File(@$sessionData['file_id']); if (!$file->isPublicShare()) { self::preDispatch(false); } else { self::preDispatchGuest(false); } $filename = isset($sessionData['genesis_url']) ? $sessionData['genesis_url'] : ''; $download = new Download($sessionData['owner'], $filename); $download->sendResponse(); }
} $response = array(); try { $request = new Request(); $esId = $request->getParam('args/es_id'); $session = new Db_Session(); $sessionData = $session->load($esId)->getData(); try { $file = new File(@$sessionData['file_id']); } catch (\Exception $e) { Helper::warnLog('Error. Session no longer exists. ' . $e->getMessage()); $ex = new BadRequestException(); $ex->setBody("{err:'bad request: [" . $request->getRawRequest() . "]'}"); throw $ex; } if (!$file->isPublicShare()) { Controller::preDispatch(false); } else { Controller::preDispatchGuest(false); } $command = $request->getParam('command'); switch ($command) { case 'sync_ops': $seqHead = (string) $request->getParam('args/seq_head'); if (!is_null($seqHead)) { $memberId = $request->getParam('args/member_id'); $ops = $request->getParam('args/client_ops'); $hasOps = is_array($ops) && count($ops) > 0; $op = new Db_Op(); $currentHead = $op->getHeadSeq($esId); $member = new Db_Member();
/** * Store the document content to its origin */ public static function save() { try { $esId = @$_SERVER['HTTP_WEBODF_SESSION_ID']; if (!$esId) { throw new \Exception('Session id can not be empty'); } $memberId = @$_SERVER['HTTP_WEBODF_MEMBER_ID']; $sessionRevision = @$_SERVER['HTTP_WEBODF_SESSION_REVISION']; $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->hasData()) { throw new \Exception('Session does not exist'); } $sessionData = $session->getData(); $file = new File($sessionData['file_id']); if (!$file->isPublicShare()) { self::preDispatch(); } else { self::preDispatchGuest(); } list($view, $path) = $file->getOwnerViewAndPath(); $isWritable = $view->file_exists($path) && $view->isUpdatable($path) || $view->isCreatable($path); if (!$isWritable) { throw new \Exception($path . ' does not exist or is not writable for user ' . $uid); } $member = new Db_Member(); $members = $member->getActiveCollection($esId); $memberIds = array_map(function ($x) { return $x['member_id']; }, $members); //check if member belongs to the session if (!in_array($memberId, $memberIds)) { throw new \Exception($memberId . ' does not belong to session ' . $esId); } // Active users except current user $memberCount = count($memberIds) - 1; if ($view->file_exists($path)) { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; $currentHash = sha1($view->file_get_contents($path)); \OC_FileProxy::$enabled = $proxyStatus; if (!Helper::isVersionsEnabled() && $currentHash !== $sessionData['genesis_hash']) { // Original file was modified externally. Save to a new one $path = Helper::getNewFileName($view, $path, '-conflict'); } } if ($view->file_put_contents($path, $content)) { // Not a last user if ($memberCount > 0) { // Update genesis hash to prevent conflicts Helper::debugLog('Update hash'); $session->updateGenesisHash($esId, sha1($content)); } else { // Last user. Kill session data Db_Session::cleanUp($esId); } $view->touch($path); } \OCP\JSON::success(); exit; } catch (\Exception $e) { Helper::warnLog('Saving failed. Reason:' . $e->getMessage()); \OCP\JSON::error(array('message' => $e->getMessage())); exit; } }