| 
									
										
										
										
											2013-07-17 00:10:06 +02:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2013-07-20 18:25:25 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-17 00:10:06 +02:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2013-10-22 15:39:37 +03:00
										 |  |  |  * ownCloud - Documents App | 
					
						
							| 
									
										
										
										
											2013-07-17 00:10:06 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-10-22 15:39:37 +03:00
										 |  |  |  * @author Victor Dubiniuk | 
					
						
							|  |  |  |  * @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com | 
					
						
							| 
									
										
										
										
											2013-07-17 00:10:06 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-10-22 15:39:37 +03:00
										 |  |  |  * This file is licensed under the Affero General Public License version 3 or | 
					
						
							|  |  |  |  * later. | 
					
						
							| 
									
										
										
										
											2013-07-17 00:10:06 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-08-09 19:31:20 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-04 16:59:51 +03:00
										 |  |  | namespace OCA\Documents; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-22 15:39:37 +03:00
										 |  |  | class BadRequestException extends \Exception { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected $body = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function setBody($body){ | 
					
						
							|  |  |  | 		$this->body = $body; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function getBody(){ | 
					
						
							|  |  |  | 		return $this->body; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-07 23:56:46 +03:00
										 |  |  | $response = array(); | 
					
						
							| 
									
										
										
										
											2013-09-26 21:01:41 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | try{ | 
					
						
							| 
									
										
										
										
											2013-09-04 16:59:51 +03:00
										 |  |  | 	$request = new Request(); | 
					
						
							| 
									
										
										
										
											2013-09-26 21:01:41 +03:00
										 |  |  | 	$esId = $request->getParam('args/es_id'); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 	$session = new Db_Session(); | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 	$session->load($esId); | 
					
						
							| 
									
										
										
										
											2014-04-10 21:23:26 +03:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	$memberId = $request->getParam('args/member_id'); | 
					
						
							|  |  |  | 	$member = new Db_Member(); | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 	$member->load($memberId); | 
					
						
							| 
									
										
										
										
											2014-04-10 21:23:26 +03:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 	if ($member->getIsGuest() || is_null($member->getIsGuest())){ | 
					
						
							| 
									
										
										
										
											2014-04-10 21:23:26 +03:00
										 |  |  | 		Controller::preDispatchGuest(false); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		Controller::preDispatch(false); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-10-16 20:39:25 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	try { | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 		$file = new File($session->getFileId()); | 
					
						
							| 
									
										
										
										
											2013-10-16 20:39:25 +03:00
										 |  |  | 	} catch (\Exception $e){ | 
					
						
							|  |  |  | 		Helper::warnLog('Error. Session no longer exists. ' . $e->getMessage()); | 
					
						
							|  |  |  | 		$ex = new BadRequestException(); | 
					
						
							| 
									
										
										
										
											2014-02-04 21:40:51 +03:00
										 |  |  | 		$ex->setBody($request->getRawRequest()); | 
					
						
							| 
									
										
										
										
											2013-10-16 20:39:25 +03:00
										 |  |  | 		throw $ex; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-09-26 21:01:41 +03:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 	$command = $request->getParam('command'); | 
					
						
							|  |  |  | 	switch ($command){ | 
					
						
							| 
									
										
										
										
											2013-08-10 01:00:25 +03:00
										 |  |  | 		case 'sync_ops': | 
					
						
							| 
									
										
										
										
											2013-08-12 19:07:44 +03:00
										 |  |  | 			$seqHead = (string) $request->getParam('args/seq_head'); | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 			if (!is_null($seqHead)){ | 
					
						
							|  |  |  | 				$ops = $request->getParam('args/client_ops'); | 
					
						
							| 
									
										
										
										
											2013-08-07 18:02:20 +03:00
										 |  |  | 				$hasOps = is_array($ops) && count($ops)>0; | 
					
						
							| 
									
										
										
										
											2013-09-04 20:48:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 				$op = new Db_Op(); | 
					
						
							|  |  |  | 				$currentHead = $op->getHeadSeq($esId); | 
					
						
							|  |  |  | 				 | 
					
						
							| 
									
										
										
										
											2013-08-12 15:49:15 +03:00
										 |  |  | 				try { | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 					$member->updateActivity($memberId); | 
					
						
							| 
									
										
										
										
											2013-08-12 15:49:15 +03:00
										 |  |  | 				} catch (\Exception $e){ | 
					
						
							| 
									
										
										
										
											2014-05-14 00:34:39 +03:00
										 |  |  | 					//Db error. Not critical
 | 
					
						
							| 
									
										
										
										
											2013-08-12 15:49:15 +03:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-08-06 11:37:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-07 13:04:32 +02:00
										 |  |  | 				// TODO handle the case ($currentHead == "") && ($seqHead != "")
 | 
					
						
							|  |  |  | 				if ($seqHead == $currentHead) { | 
					
						
							|  |  |  | 					// matching heads
 | 
					
						
							| 
									
										
										
										
											2013-08-07 16:49:52 +03:00
										 |  |  | 					if ($hasOps) { | 
					
						
							| 
									
										
										
										
											2013-08-07 13:04:32 +02:00
										 |  |  | 						// incoming ops without conflict
 | 
					
						
							|  |  |  | 						// Add incoming ops, respond with a new head
 | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 						$newHead = Db_Op::addOpsArray($esId, $memberId, $ops); | 
					
						
							| 
									
										
										
										
											2013-08-07 13:04:32 +02:00
										 |  |  | 						$response["result"] = 'added'; | 
					
						
							| 
									
										
										
										
											2013-08-10 01:49:20 +03:00
										 |  |  | 						$response["head_seq"] = $newHead ? $newHead : $currentHead; | 
					
						
							| 
									
										
										
										
											2013-08-07 13:04:32 +02:00
										 |  |  | 					} else { | 
					
						
							|  |  |  | 						// no incoming ops (just checking for new ops...)
 | 
					
						
							| 
									
										
										
										
											2013-08-10 01:49:20 +03:00
										 |  |  | 						$response["result"] = 'new_ops'; | 
					
						
							| 
									
										
										
										
											2013-08-07 16:49:52 +03:00
										 |  |  | 						$response["ops"] = array(); | 
					
						
							| 
									
										
										
										
											2013-08-10 01:49:20 +03:00
										 |  |  | 						$response["head_seq"] = $currentHead; | 
					
						
							| 
									
										
										
										
											2013-08-06 20:35:23 +02:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2013-08-07 13:04:32 +02:00
										 |  |  | 				} else { // HEADs do not match
 | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 					$response["ops"] = $op->getOpsAfterJson($esId, $seqHead); | 
					
						
							| 
									
										
										
										
											2013-08-10 01:49:20 +03:00
										 |  |  | 					$response["head_seq"] = $currentHead; | 
					
						
							| 
									
										
										
										
											2013-08-10 16:52:09 +03:00
										 |  |  | 					$response["result"] = $hasOps ? 'conflict' : 'new_ops'; | 
					
						
							| 
									
										
										
										
											2013-08-06 18:07:05 +03:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-09-04 20:48:14 +03:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 				$inactiveMembers = $member->updateByTimeout($esId); | 
					
						
							|  |  |  | 				foreach ($inactiveMembers as $inactive){ | 
					
						
							| 
									
										
										
										
											2013-10-22 15:20:14 +03:00
										 |  |  | 					$op->removeCursor($esId, $inactive); | 
					
						
							| 
									
										
										
										
											2013-12-06 01:12:12 +03:00
										 |  |  | 					$op->removeMember($esId, $inactive); | 
					
						
							| 
									
										
										
										
											2013-09-04 20:48:14 +03:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2013-08-06 18:07:05 +03:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2013-08-07 13:04:32 +02:00
										 |  |  | 				// Error - no seq_head passed
 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 				throw new BadRequestException(); | 
					
						
							| 
									
										
										
										
											2013-08-06 18:07:05 +03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			$ex = new BadRequestException(); | 
					
						
							| 
									
										
										
										
											2014-02-04 21:40:51 +03:00
										 |  |  | 			$ex->setBody($request->getRawRequest()); | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 			throw $ex; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	\OCP\JSON::success($response); | 
					
						
							|  |  |  | } catch (BadRequestException $e){ | 
					
						
							|  |  |  | 	header('HTTP/1.1 400: BAD REQUEST'); | 
					
						
							| 
									
										
										
										
											2014-02-03 02:26:29 +01:00
										 |  |  | 	\OCP\JSON::error( array( | 
					
						
							| 
									
										
										
										
											2014-02-04 21:40:51 +03:00
										 |  |  | 		'err' => 'bad request:[' . $e->getBody() . ']', | 
					
						
							| 
									
										
										
										
											2014-02-03 02:26:29 +01:00
										 |  |  | 	)); | 
					
						
							| 
									
										
										
										
											2013-07-17 00:10:06 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | exit(); |