/** * @brief Cleanup session data on removing the document * @param array * * This function is connected to the delete signal of OC_Filesystem * to delete the related info from database */ public static function onDelete($params) { $info = \OC\Files\Filesystem::getFileInfo($params['path']); $fileId = @$info['fileid']; if (!$fileId) { return; } $sessionObj = new Db_Session(); $session = $sessionObj->loadBy('file_id', $fileId)->getData(); if (!is_array($session) || !isset($session['es_id'])) { return; } Db_Session::cleanUp($session['es_id']); }
/** * @brief Cleanup session data on removing the document * @param array * * This function is connected to the delete signal of OC_Filesystem * to delete the related info from database */ public static function onDelete($params) { $info = \OC\Files\Filesystem::getFileInfo($params['path']); $fileId = @$info['fileid']; if (!$fileId) { return; } $session = new Db_Session(); $session->loadBy('file_id', $fileId); if (!$session->getEsId()) { return; } $member = new Db_Member(); $sessionMembers = $member->getCollectionBy('es_id', $session->getEsId()); foreach ($sessionMembers as $memberData) { if (intval($memberData['status']) === Db_Member::MEMBER_STATUS_ACTIVE) { return; } } Db_Session::cleanUp($session->getEsId()); }
/** * 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 static function listAll() { self::preDispatch(); $documents = Storage::getDocuments(); $fileIds = array(); //$previewAvailable = \OCP\Preview::show($file); foreach ($documents as $key => $document) { //\OCP\Preview::show($document['path']); $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']); } \OCP\JSON::success(array('documents' => $documents, 'sessions' => $sessions, 'members' => $members)); }
protected function getUniqueSessionId() { $testSession = new Db_Session(); do { $id = \OC_Util::generateRandomBytes(30); } while ($testSession->load($id)->hasData()); return $id; }
if (isset($_GET['t'])) { $token = $_GET['t']; $tmpl = new \OCP\Template('documents', 'public', 'guest'); try { $file = File::getByShareToken($token); if ($file->isPasswordProtected() && !$file->checkPassword(@$_POST['password'])) { if (isset($_POST['password'])) { $tmpl->assign('wrongpw', true); } $tmpl->assign('hasPassword', true); } else { \OCP\Util::addStyle('documents', '3rdparty/webodf/dojo-app'); \OCP\Util::addStyle('documents', '3rdparty/webodf/editor'); \OCP\Util::addScript('documents', 'documents'); if ($file->getFileId()) { $session = new Db_Session(); $session->loadBy('file_id', $file->getFileId()); if ($session->getEsId()) { $member = new Db_Member(); $members = $member->getCollectionBy('es_id', $session->getEsId()); } else { $members = 0; } $tmpl->assign('total', count($members) + 1); } else { $tmpl->assign('total', 1); } $tmpl->assign('document', $token); } } catch (\Exception $e) { $tmpl->assign('notFound', true);
{ protected $body = ""; public function setBody($body) { $this->body = $body; } public function getBody() { return $this->body; } } $response = array(); try { $request = new Request(); $esId = $request->getParam('args/es_id'); $session = new Db_Session(); $session->load($esId); $memberId = $request->getParam('args/member_id'); $member = new Db_Member(); $member->load($memberId); if ($member->getIsGuest() || is_null($member->getIsGuest())) { Controller::preDispatchGuest(false); } else { Controller::preDispatch(false); } try { $file = new File($session->getFileId()); } catch (\Exception $e) { Helper::warnLog('Error. Session no longer exists. ' . $e->getMessage()); $ex = new BadRequestException(); $ex->setBody($request->getRawRequest());
public static function listAll() { self::preDispatch(); $session = new Db_Session(); $sessions = $session->getCollection(); $preparedSessions = array_map(function ($x) { return $x['es_id']; }, $sessions); \OCP\JSON::success(array("session_list" => $preparedSessions)); }
{ protected $body = ""; public function setBody($body) { $this->body = $body; } public function getBody() { return $this->body; } } $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');
/** * 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']; $currentMember = new Db_Member(); $currentMember->load($memberId); if (is_null($currentMember->getIsGuest()) || $currentMember->getIsGuest()) { $uid = self::preDispatchGuest(); } else { self::preDispatch(); } //check if member belongs to the session if ($esId != $currentMember->getEsId()) { throw new \Exception($memberId . ' does not belong to session ' . $esId); } $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->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 :( $view = new \OC\Files\View('/' . $uid . '/files'); $dir = \OCP\Config::getUserValue(\OCP\User::getUser(), 'documents', 'save_path', ''); $path = Helper::getNewFileName($view, $dir . 'New Document.odt'); } $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)) { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; $currentHash = sha1($view->file_get_contents($path)); \OC_FileProxy::$enabled = $proxyStatus; 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 Helper::debugLog('Update hash'); $session->updateGenesisHash($esId, sha1($data['content'])); } else { // Last user. Kill session data Db_Session::cleanUp($esId); } $view->touch($path); } \OCP\JSON::success(); } catch (\Exception $e) { Helper::warnLog('Saving failed. Reason:' . $e->getMessage()); //\OCP\JSON::error(array('message'=>$e->getMessage())); \OC_Response::setStatus(500); } exit; }
public static function listAllHtml() { self::preDispatch(); $session = new Db_Session(); $sessions = $session->getCollection(); $preparedSessions = array_map(function ($x) { return $x['es_id']; }, $sessions); $invites = Invite::getAllInvites(); if (!is_array($invites)) { $invites = array(); } $tmpl = new \OCP\Template('documents', 'part.sessions', ''); $tmpl->assign('invites', $invites); $tmpl->assign('sessions', $sessions); echo $tmpl->fetchPage(); }
protected function getUniqueSessionId() { $testSession = new Db_Session(); do { // this prevents branching for stable5 for now: // OC_Util::generate_random_bytes was camelCased if (method_exists('\\OC_Util', 'generate_random_bytes')) { $id = \OC_Util::generate_random_bytes(30); } else { $id = \OC_Util::generateRandomBytes(30); } } while ($testSession->load($id)->hasData()); return $id; }