From 2635421222d043b5570c4a8675655326ccc7aa49 Mon Sep 17 00:00:00 2001 From: Victor Dubiniuk Date: Sun, 18 Aug 2013 19:02:48 +0300 Subject: [PATCH] Track and log failures --- ajax/controller.php | 132 ++++++++++++++++++++++------------------ ajax/userController.php | 16 +++-- lib/helper.php | 35 +++++++++++ 3 files changed, 118 insertions(+), 65 deletions(-) create mode 100644 lib/helper.php diff --git a/ajax/controller.php b/ajax/controller.php index 15ede426..c8d85a84 100644 --- a/ajax/controller.php +++ b/ajax/controller.php @@ -16,10 +16,10 @@ class Controller { /** * Process partial/complete file download - * @param type $args - array containing session id as anelement with a key es_id + * @param array $args - array containing session id as anelement with a key es_id */ public static function serve($args){ - \OCP\JSON::checkLoggedIn(); + self::preDispatch(false); $session = Session::getSession(@$args['es_id']); $filename = isset($session['genesis_url']) ? $session['genesis_url'] : ''; @@ -27,55 +27,65 @@ class Controller { $download = new Download($officeView, $filename); $download->sendResponse(); } - + public static function startSession($args){ - $uid = self::getUser(); - $fileId = @$_POST['fileid']; - $officeView = View::initOfficeView($uid); - $genesisPath = View::storeDocument($uid, $fileId); + $uid = self::preDispatch(); + try{ + $fileId = @$_POST['fileid']; + if (!$fileId){ + throw new \Exception('No fileId has been passed'); + } + + $officeView = View::initOfficeView($uid); + $genesisPath = View::storeDocument($uid, $fileId); + if (!$genesisPath){ + throw new \Exception('Unable to copy document. Check permissions and make sure you have enought free space.'); + } - if ($genesisPath){ $session = Session::getSessionByFileId($fileId); - try { - if (!$session){ - $hash = View::getHashByGenesis($uid, $genesisPath); - $session = Session::add($genesisPath, $hash, $fileId); - } - - $session['member_id'] = (string) Member::add($session['es_id'], \OCP\User::getUser(), self::getRandomColor()); - - \OCP\JSON::success($session); - exit(); - } catch (\Exception $e){ - //TODO: Log - throw $e; //Debug + if (!$session || empty($session)){ + $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(); } - \OCP\JSON::error(); - exit(); } - + public static function joinSession($args){ $esId = @$args['es_id']; - \OCP\JSON::checkLoggedIn(); - try { - if ($esId){ - $session = Session::getSession($esId); + $uid = self::preDispatch(); + try{ + if (!$esId){ + throw new \Exception('Session id is empty'); + } - $session['member_id'] = (string) Member::add($session['es_id'], \OCP\User::getUser(), self::getRandomColor()); - \OCP\JSON::success($session); - exit(); + $session = Session::getSession($esId); + if (!$session || empty($session)){ + throw new \Exception('Session doesn\'t exist'); } - throw new \Exception(); + $session['member_id'] = (string) Member::add($session['es_id'], $uid, Helper::getRandomColor()); + \OCP\JSON::success($session); + exit(); } catch (\Exception $e){ - //TODO: Log + Helper::warnLog('Joining a session failed. Reason:') . $e->getMessage(); + \OCP\JSON::error(); + exit(); } - \OCP\JSON::error(); } - + + /** + * Store the document content to its origin + */ public static function save(){ - $uid = self::getUser(); + $uid = self::preDispatch(); $esId = @$_POST['es_id']; $memberId = @$_POST['member_id']; $content = @$_POST['content']; @@ -84,37 +94,38 @@ class Controller { $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 + // TODO: report an error, broke a plate, burn a house, conquer the galaxy } } } public static function listSessions(){ - self::getUser(); + self::preDispatch(); $sessions = Session::getAll(); if (!is_array($sessions)){ $sessions = array(); } $preparedSessions = array_map( - function($x){return ($x['es_id']);}, - $sessions + function($x){ + return ($x['es_id']); + }, $sessions ); \OCP\JSON::success(array( "session_list" => $preparedSessions )); } - + public static function sessionInfo(){ - self::getUser(); + self::preDispatch(); $items = @$_POST['items']; $info = array(); - + if (is_array($items)){ $info = Session::getInfoByFileid($items); } @@ -123,39 +134,42 @@ class Controller { "info" => $info )); } - + public static function listSessionsHtml(){ - self::getUser(); + self::preDispatch(); $sessions = Session::getAll(); if (!is_array($sessions)){ $sessions = array(); } $preparedSessions = array_map( - function($x){return ($x['es_id']);}, - $sessions + function($x){ + return ($x['es_id']); + }, $sessions ); - + $invites = Invite::getAllInvites(); if (!is_array($invites)){ $invites = array(); } - - $tmpl = new \OCP\Template('office', 'part.sessions', ''); + + $tmpl = new \OCP\Template('office', 'part.sessions', ''); $tmpl->assign('invites', $invites); $tmpl->assign('sessions', $sessions); echo $tmpl->fetchPage(); } - - protected static function getRandomColor(){ - $str = dechex(floor(rand(0, 16777215))); - $str = str_pad($str, 6, "0", STR_PAD_LEFT); - return '#' . $str; - } - protected static function getUser(){ + /** + * 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(); } -} \ No newline at end of file +} diff --git a/ajax/userController.php b/ajax/userController.php index a0e81a42..59c654cb 100644 --- a/ajax/userController.php +++ b/ajax/userController.php @@ -18,7 +18,7 @@ class UserController { * Search users according to the pattern */ public static function search(){ - $uid = self::getUser(); + $uid = self::preDispatch(); if (@$_GET['search']){ $found = array(); $users = array(); @@ -45,7 +45,7 @@ class UserController { * Invite users to the editing session */ public static function invite(){ - self::getUser(); + self::preDispatch(); $invitees = @$_POST['users']; if (is_array($invitees)){ @@ -67,7 +67,7 @@ class UserController { * Stub - sends a generic avatar */ public static function sendAvatar(){ - $uid = self::getUser(); + $uid = self::preDispatch(false); $image = new \OC_Image('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'); \OC_Util::obEnd(); @@ -75,10 +75,14 @@ class UserController { } /** - * Checks if the user is logged in - * @return string userid of the current user + * Do security precheck + * @param bool callcheck - whether security token check is needed + * @return string userId of the currently logged in user */ - protected static function getUser(){ + protected static function preDispatch($callcheck = true){ + if ($callcheck){ + \OCP\JSON::callCheck(); + } \OCP\JSON::checkLoggedIn(); return \OCP\User::getUser(); } diff --git a/lib/helper.php b/lib/helper.php new file mode 100644 index 00000000..d929d5b7 --- /dev/null +++ b/lib/helper.php @@ -0,0 +1,35 @@ +