sendResponse(); } public static function startSession($args){ $uid = self::preDispatch(); try{ $path = \OC\Files\Filesystem::getPath(@$_POST['fileid']); if (!$path){ throw new \Exception('No file has been passed'); } $info = \OC\Files\Filesystem::getFileInfo($path); if (!$info){ // Is it shared? //searchByMime returns incorrect path for shared items // if (substr($path, 0, 14) === '/Shared/files/'){ // remove 'files/' from path as it's relative to '/Shared' $path = '/Shared' . substr($path, 13); $sharedInfo = \OC\Files\Filesystem::getFileInfo($path); $fileId = $sharedInfo['fileid']; } } else { $fileId = $info['fileid']; } $session = Session::getSessionByFileId($fileId); //If there is no existing session we need to start a new one if (!$session || empty($session)){ $documentsView = View::initDocumentsView($uid); $genesisPath = View::storeDocument($uid, $path); if (!$genesisPath){ throw new \Exception('Unable to copy document. Check permissions and make sure you have enought free space.'); } $hash = View::getHashByGenesis($uid, $genesisPath); $session = Session::add($genesisPath, $hash, $fileId); } $session['member_id'] = (string) Member::add($session['es_id'], $uid, Helper::getRandomColor()); \OCP\JSON::success($session); exit(); } catch (\Exception $e){ Helper::warnLog('Starting a session failed. Reason: ' . $e->getMessage()); \OCP\JSON::error(); exit(); } } public static function joinSession($args){ $esId = @$args['es_id']; $uid = self::preDispatch(); try{ if (!$esId){ throw new \Exception('Session id is empty'); } $session = Session::getSession($esId); if (!$session || empty($session)){ throw new \Exception('Session doesn\'t exist'); } $session['member_id'] = (string) Member::add($session['es_id'], $uid, Helper::getRandomColor()); \OCP\JSON::success($session); exit(); } catch (\Exception $e){ Helper::warnLog('Joining a session failed. Reason:' . $e->getMessage()); \OCP\JSON::error(array('message'=>$e->getMessage())); exit(); } } /** * Store the document content to its origin */ public static function save(){ $uid = self::preDispatch(); $sessionID = @$_SERVER['HTTP_WEBODF_SESSION_ID']; $memberId = @$_SERVER['HTTP_WEBODF_MEMBER_ID']; $sessionRevision = @$_SERVER['HTTP_WEBODF_SESSION_REVISION']; $content = fopen('php://input','r'); if ($sessionID && $content){ $session = Session::getSession($sessionID); $fileInfo = \OC\Files\Cache\Cache::getById($session['file_id']); $path = $fileInfo[1]; $view = new \OC\Files\View('/' . $session['owner']); $canWrite = ($view->file_exists($path) && $view->isUpdatable($path)) || $view->isCreatable($path); if ($canWrite){ $view->file_put_contents($path, $content); } else { // TODO: report an error, break a plate, burn a house, conquer the galaxy } } } /** * 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 listDocuments(){ self::preDispatch(); $documents = Storage::getDocuments(); $fileIds = array(); foreach ($documents as $document) { $fileIds[] = $document['fileid']; } $sessions = Session::getSessionsByFileIds($fileIds); $members = array(); foreach ($sessions as $session) { $members[$session['es_id']] = Member::getMembersByEsId($session['es_id']); } \OCP\JSON::success(array('documents' => $documents,'sessions' => $sessions,'members' => $members)); } public static function listSessions(){ self::preDispatch(); $sessions = Session::getAll(); if (!is_array($sessions)){ $sessions = array(); } $preparedSessions = array_map( function($x){ return ($x['es_id']); }, $sessions ); \OCP\JSON::success(array( "session_list" => $preparedSessions )); } public static function sessionInfo(){ self::preDispatch(); $items = @$_POST['items']; $info = array(); if (is_array($items)){ $info = Session::getInfoByFileid($items); } \OCP\JSON::success(array( "info" => $info )); } public static function listSessionsHtml(){ self::preDispatch(); $sessions = Session::getAll(); if (!is_array($sessions)){ $sessions = array(); } $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(); } /** * Do security precheck * @param bool callcheck - whether security token check is needed * @return string userId of the currently logged in user */ protected static function preDispatch($callcheck = true){ if ($callcheck){ \OCP\JSON::callCheck(); } \OCP\JSON::checkLoggedIn(); return \OCP\User::getUser(); } }