diff --git a/ajax/documentController.php b/ajax/documentController.php index bad06d3c..4904e110 100644 --- a/ajax/documentController.php +++ b/ajax/documentController.php @@ -84,13 +84,8 @@ class DocumentController extends Controller{ $members = array(); $member = new Db_Member(); - foreach ($sessions as $session) { - $sessionMembers = $member->getCollectionBy('es_id', $session['es_id']); - $activeMembers = array_filter($sessionMembers, function($member){ - return $member['status']==Db_Member::MEMBER_STATUS_ACTIVE; - }); - - $members[$session['es_id']] = array_values($activeMembers); + foreach ($sessions as $session) { + $members[$session['es_id']] = $member->getActiveCollection($session['es_id']); } \OCP\JSON::success(array('documents' => $documents,'sessions' => $sessions,'members' => $members)); diff --git a/ajax/sessionController.php b/ajax/sessionController.php index fcb3db45..4af868d5 100644 --- a/ajax/sessionController.php +++ b/ajax/sessionController.php @@ -81,6 +81,23 @@ class SessionController extends Controller{ 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)){ $currentHash = sha1($view->file_get_contents($path)); if ($currentHash !== $sessionData['genesis_hash']){ @@ -90,9 +107,15 @@ class SessionController extends Controller{ } if ($view->file_put_contents($path, $content)){ - //Document saved successfully. Cleaning session data - // temporary workaround for https://github.com/owncloud/documents/issues/63 - Db_Session::cleanUp($esId); + // Not a last user + if ($memberCount>0){ + // Update genesis hash to prevent conflicts + $session->updateGenesisHash($esId, sha1($content)); + } else { + // Last user. Kill session data + Db_Session::cleanUp($esId); + } + $view->touch($path); } \OCP\JSON::success(); diff --git a/lib/db/member.php b/lib/db/member.php index be270a68..c98c9680 100644 --- a/lib/db/member.php +++ b/lib/db/member.php @@ -39,6 +39,27 @@ class Db_Member extends Db{ ); } + + public function getActiveCollection($esId){ + $result = $this->execute(' + SELECT `es_id`, `member_id` + FROM ' . self::DB_TABLE . ' + WHERE `es_id`= ? + AND `status`=? + ', + array( + $esId, + self::MEMBER_STATUS_ACTIVE + ) + ); + $members = $result->fetchAll(); + if (!is_array($members)){ + $members = array(); + } + return $members; + + } + /** * Mark members as inactive * @param string $esId - session Id diff --git a/lib/db/session.php b/lib/db/session.php index 2ab565a3..93fa1015 100644 --- a/lib/db/session.php +++ b/lib/db/session.php @@ -102,6 +102,15 @@ class Db_Session extends \OCA\Documents\Db { array_unshift($this->data, $esId); return parent::insert($this->data); } + + public function updateGenesisHash($esId, $genesisHash){ + return $this->execute( + 'UPDATE `*PREFIX*documents_session` SET `genesis_hash`=? WHERE `es_id`=?', + array( + $esId, $genesisHash + ) + ); + } public function getInfo($esId){ $result = $this->execute('