Blame view

sources/apps/documents/ajax/otpoll.php 2.87 KB
d1bafeea1   Kload   [fix] Upgrade to ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  <?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();
  	$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());
  		throw $ex;
  	}
  	
  	$command = $request->getParam('command');
  	switch ($command){
  		case 'sync_ops':
  			$seqHead = (string) $request->getParam('args/seq_head');
  			if (!is_null($seqHead)){
  				$ops = $request->getParam('args/client_ops');
  				$hasOps = is_array($ops) && count($ops)>0;
  
  				$op = new Db_Op();
  				$currentHead = $op->getHeadSeq($esId);
  				
  				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($request->getRawRequest());
  			throw $ex;
  			break;
  	}
  
  	\OCP\JSON::success($response);
  } catch (BadRequestException $e){
  	header('HTTP/1.1 400: BAD REQUEST');
  	\OCP\JSON::error( array(
  		'err' => 'bad request:[' . $e->getBody() . ']',
  	));
  }
  exit();