| 
									
										
										
										
											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(); | 
					
						
							|  |  |  | 	$sessionData = $session->load($esId)->getData(); | 
					
						
							| 
									
										
										
										
											2013-10-16 20:39:25 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	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; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-09-26 21:01:41 +03:00
										 |  |  | 	if (!$file->isPublicShare()){ | 
					
						
							|  |  |  | 		Controller::preDispatch(false); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		Controller::preDispatchGuest(false); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 	$command = $request->getParam('command'); | 
					
						
							|  |  |  | 	switch ($command){ | 
					
						
							| 
									
										
										
										
											2013-08-09 19:49:30 +03:00
										 |  |  | 		case 'query_memberdata_list': | 
					
						
							|  |  |  | 			$ids = $request->getParam('args/member_ids'); | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			$member = new Db_Member(); | 
					
						
							|  |  |  | 			$members = $member->getCollectionBy('member_id', $ids); | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2013-08-09 20:05:33 +03:00
										 |  |  | 			$response["memberdata_list"] = array_map( | 
					
						
							|  |  |  | 					function($x){ | 
					
						
							|  |  |  | 						$x['display_name'] = \OCP\User::getDisplayName($x['uid']); | 
					
						
							|  |  |  | 						 | 
					
						
							| 
									
										
										
										
											2013-09-05 23:05:07 +03:00
										 |  |  | 						// Do we have OC_Avatar in out disposal?
 | 
					
						
							| 
									
										
										
										
											2013-09-16 16:34:07 +03:00
										 |  |  | 						if (!class_exists('\OC_Avatar') || \OC_Config::getValue('enable_avatars', true) !== true){ | 
					
						
							| 
									
										
										
										
											2013-09-24 04:14:10 +03:00
										 |  |  | 							//$x['avatar_url'] = \OCP\Util::linkToRoute('documents_user_avatar');
 | 
					
						
							|  |  |  | 							$x['avatar_url'] = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw=='; | 
					
						
							| 
									
										
										
										
											2013-09-02 21:22:38 +03:00
										 |  |  | 						} else { | 
					
						
							| 
									
										
										
										
											2013-09-30 19:32:35 +03:00
										 |  |  | 						// https://github.com/owncloud/documents/issues/51
 | 
					
						
							|  |  |  | 						// Temporary stub
 | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 							$x['avatar_url'] = $x['uid']; | 
					
						
							|  |  |  | 							 | 
					
						
							|  |  |  | 							/* | 
					
						
							| 
									
										
										
										
											2013-09-16 16:34:07 +03:00
										 |  |  | 							$avatar = new \OC_Avatar($x['uid']); | 
					
						
							|  |  |  | 							$image = $avatar->get(64); | 
					
						
							| 
									
										
										
										
											2013-09-05 23:05:07 +03:00
										 |  |  | 							// User has an avatar 
 | 
					
						
							| 
									
										
										
										
											2013-09-02 21:22:38 +03:00
										 |  |  | 							if ($image instanceof \OC_Image) { | 
					
						
							|  |  |  | 								$x['avatar_url'] = \OC_Helper::linkToRoute( | 
					
						
							|  |  |  | 										'core_avatar_get', | 
					
						
							|  |  |  | 										array( 'user' => $x['uid'], 'size' => 64) | 
					
						
							| 
									
										
										
										
											2013-09-16 16:34:07 +03:00
										 |  |  | 								) . '?requesttoken=' . \OC::$session->get('requesttoken'); | 
					
						
							| 
									
										
										
										
											2013-09-02 21:22:38 +03:00
										 |  |  | 							} else { | 
					
						
							|  |  |  | 								//shortcircuit if it's not an image
 | 
					
						
							| 
									
										
										
										
											2013-09-24 04:14:10 +03:00
										 |  |  | 								$x['avatar_url'] = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw=='; | 
					
						
							| 
									
										
										
										
											2013-09-02 21:22:38 +03:00
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2013-09-30 19:32:35 +03:00
										 |  |  | 							  | 
					
						
							|  |  |  | 							 */ | 
					
						
							| 
									
										
										
										
											2013-09-02 21:22:38 +03:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2013-09-30 19:32:35 +03:00
										 |  |  | 						 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-09 20:05:33 +03:00
										 |  |  | 						return $x; | 
					
						
							|  |  |  | 					},  | 
					
						
							|  |  |  | 					$members | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 			break; | 
					
						
							| 
									
										
										
										
											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)){ | 
					
						
							|  |  |  | 				$memberId = $request->getParam('args/member_id'); | 
					
						
							|  |  |  | 				$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); | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				$member = new Db_Member(); | 
					
						
							| 
									
										
										
										
											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){ | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											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-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(); | 
					
						
							|  |  |  | 			$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(""); | 
					
						
							| 
									
										
										
										
											2013-07-17 00:10:06 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | exit(); |