117 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * ownCloud - Documents App
 | 
						|
 *
 | 
						|
 * @author Victor Dubiniuk
 | 
						|
 * @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com
 | 
						|
 *
 | 
						|
 * This file is licensed under the Affero General Public License version 3 or
 | 
						|
 * later.
 | 
						|
 */
 | 
						|
 | 
						|
namespace OCA\Documents;
 | 
						|
 | 
						|
class BadRequestException extends \Exception {
 | 
						|
 | 
						|
	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');
 | 
						|
	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();
 | 
						|
				try {
 | 
						|
					$member->updateActivity($memberId);
 | 
						|
				} catch (\Exception $e){
 | 
						|
				}
 | 
						|
 | 
						|
				// TODO handle the case ($currentHead == "") && ($seqHead != "")
 | 
						|
				if ($seqHead == $currentHead) {
 | 
						|
					// matching heads
 | 
						|
					if ($hasOps) {
 | 
						|
						// incoming ops without conflict
 | 
						|
						// Add incoming ops, respond with a new head
 | 
						|
						$newHead = Db_Op::addOpsArray($esId, $memberId, $ops);
 | 
						|
						$response["result"] = 'added';
 | 
						|
						$response["head_seq"] = $newHead ? $newHead : $currentHead;
 | 
						|
					} else {
 | 
						|
						// no incoming ops (just checking for new ops...)
 | 
						|
						$response["result"] = 'new_ops';
 | 
						|
						$response["ops"] = array();
 | 
						|
						$response["head_seq"] = $currentHead;
 | 
						|
					}
 | 
						|
				} else { // HEADs do not match
 | 
						|
					$response["ops"] = $op->getOpsAfterJson($esId, $seqHead);
 | 
						|
					$response["head_seq"] = $currentHead;
 | 
						|
					$response["result"] = $hasOps ? 'conflict' : 'new_ops';
 | 
						|
				}
 | 
						|
				
 | 
						|
				$inactiveMembers = $member->updateByTimeout($esId);
 | 
						|
				foreach ($inactiveMembers as $inactive){
 | 
						|
					$op->removeCursor($esId, $inactive);
 | 
						|
					$op->removeMember($esId, $inactive);
 | 
						|
				}
 | 
						|
			
 | 
						|
			} else {
 | 
						|
				// Error - no seq_head passed
 | 
						|
				throw new BadRequestException();
 | 
						|
			}
 | 
						|
 | 
						|
			break;
 | 
						|
		default:
 | 
						|
			$ex = new BadRequestException();
 | 
						|
			$ex->setBody("{err:'bad request: [" . $request->getRawRequest() . "]'}");
 | 
						|
			throw $ex;
 | 
						|
			break;
 | 
						|
	}
 | 
						|
 | 
						|
	\OCP\JSON::success($response);
 | 
						|
} catch (BadRequestException $e){
 | 
						|
	header('HTTP/1.1 400: BAD REQUEST');
 | 
						|
	print("");
 | 
						|
	print($e->getBody());
 | 
						|
	print("");
 | 
						|
}
 | 
						|
exit();
 |