| 
									
										
										
										
											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
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright (C) 2013 KO GmbH <copyright@kogmbh.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @licstart | 
					
						
							|  |  |  |  * The JavaScript code in this page is free software: you can redistribute it | 
					
						
							|  |  |  |  * and/or modify it under the terms of the GNU Affero General Public License | 
					
						
							|  |  |  |  * (GNU AGPL) as published by the Free Software Foundation, either version 3 of | 
					
						
							|  |  |  |  * the License, or (at your option) any later version.  The code is distributed | 
					
						
							|  |  |  |  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
					
						
							|  |  |  |  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU AGPL for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * As additional permission under GNU AGPL version 3 section 7, you | 
					
						
							|  |  |  |  * may distribute non-source (e.g., minimized or compacted) forms of | 
					
						
							|  |  |  |  * that code without the copy of the GNU GPL normally required by | 
					
						
							|  |  |  |  * section 4, provided you include this license notice and a URL | 
					
						
							|  |  |  |  * through which recipients can access the Corresponding Source. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * As a special exception to the AGPL, any HTML file which merely makes function
 | 
					
						
							|  |  |  |  * calls to this code, and for that purpose includes it by reference shall be | 
					
						
							|  |  |  |  * deemed a separate work for copyright law purposes. In addition, the copyright | 
					
						
							|  |  |  |  * holders of this code give you permission to combine this code with free | 
					
						
							|  |  |  |  * software libraries that are released under the GNU LGPL. You may copy and | 
					
						
							|  |  |  |  * distribute such a system following the terms of the GNU AGPL for this code | 
					
						
							|  |  |  |  * and the LGPL for the libraries. If you modify this code, you may extend this | 
					
						
							|  |  |  |  * exception to your version of the code, but you are not obligated to do so. | 
					
						
							|  |  |  |  * If you do not wish to do so, delete this exception statement from your | 
					
						
							|  |  |  |  * version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This license applies to this entire compilation. | 
					
						
							|  |  |  |  * @licend | 
					
						
							|  |  |  |  * @source: http://www.webodf.org/ | 
					
						
							|  |  |  |  * @source: http://gitorious.org/webodf/webodf/ | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-08-09 19:31:20 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |  OCP\JSON::checkLoggedIn(); | 
					
						
							|  |  |  |  OCP\JSON::checkAppEnabled('office'); | 
					
						
							|  |  |  |  // session_write_close();
 | 
					
						
							| 
									
										
										
										
											2013-07-17 00:10:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-07 23:56:46 +03:00
										 |  |  | $response = array(); | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | try{ | 
					
						
							|  |  |  | 	$request = new OCA\Office\Request(); | 
					
						
							|  |  |  | 	$command = $request->getParam('command'); | 
					
						
							|  |  |  | 	switch ($command){ | 
					
						
							| 
									
										
										
										
											2013-08-09 19:49:30 +03:00
										 |  |  | 		case 'query_memberdata_list': | 
					
						
							| 
									
										
										
										
											2013-08-17 18:32:24 +03:00
										 |  |  | 			$esId = $request->getParam('args/es_id'); | 
					
						
							|  |  |  | 			$inactiveMembers = \OCA\Office\Member::cleanSession($esId); | 
					
						
							|  |  |  | 			if (is_array($inactiveMembers)){ | 
					
						
							|  |  |  | 				foreach ($inactiveMembers as $member){ | 
					
						
							|  |  |  | 					\OCA\Office\Op::removeCursor($esId, $member['member_id']); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2013-08-09 19:49:30 +03:00
										 |  |  | 			$ids = $request->getParam('args/member_ids'); | 
					
						
							|  |  |  | 			$members = OCA\Office\Member::getMembersAsArray($ids); | 
					
						
							| 
									
										
										
										
											2013-08-09 20:05:33 +03:00
										 |  |  | 			$response["memberdata_list"] = array_map( | 
					
						
							|  |  |  | 					function($x){ | 
					
						
							|  |  |  | 						$x['display_name'] = \OCP\User::getDisplayName($x['uid']); | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						// Stub
 | 
					
						
							| 
									
										
										
										
											2013-08-13 19:38:30 +03:00
										 |  |  | 						$x['avatar_url'] = \OCP\Util::linkToRoute('office_user_avatar'); | 
					
						
							| 
									
										
										
										
											2013-08-09 20:05:33 +03:00
										 |  |  | 						return $x; | 
					
						
							|  |  |  | 					},  | 
					
						
							|  |  |  | 					$members | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2013-08-09 19:49:30 +03:00
										 |  |  | 			break; | 
					
						
							| 
									
										
										
										
											2013-08-10 01:49:20 +03:00
										 |  |  | 		case 'session_list': | 
					
						
							| 
									
										
										
										
											2013-08-09 19:31:20 +03:00
										 |  |  | 			OCA\Office\Controller::listSessions(); | 
					
						
							|  |  |  | 			exit(); | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 			break; | 
					
						
							| 
									
										
										
										
											2013-08-10 01:49:20 +03:00
										 |  |  | 		case 'join_session': | 
					
						
							|  |  |  | 			 // should fail when session is non-existent
 | 
					
						
							|  |  |  | 			break; | 
					
						
							| 
									
										
										
										
											2013-08-09 20:30:14 +03:00
										 |  |  | 			OCA\Office\Controller::joinSession(array( | 
					
						
							|  |  |  | 				'es_id' => $request->getParam('args/es_id') | 
					
						
							|  |  |  | 			)); | 
					
						
							|  |  |  | 			exit(); | 
					
						
							| 
									
										
										
										
											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)){ | 
					
						
							|  |  |  | 				$esId = $request->getParam('args/es_id'); | 
					
						
							|  |  |  | 				$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-07-20 18:25:25 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 				$currentHead = OCA\Office\Op::getHeadSeq($esId); | 
					
						
							| 
									
										
										
										
											2013-08-12 15:49:15 +03:00
										 |  |  | 				try { | 
					
						
							|  |  |  | 					OCA\Office\Member::updateMemberActivity($memberId); | 
					
						
							|  |  |  | 				} 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-08-07 16:49:52 +03:00
										 |  |  | 						$newHead = OCA\Office\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-08-07 18:01:14 +03:00
										 |  |  | 					$response["ops"] = OCA\Office\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
										 |  |  | 				} | 
					
						
							|  |  |  | 			} 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(); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | class BadRequestException extends Exception { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected $body = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function setBody($body){ | 
					
						
							|  |  |  | 		$this->body = $body; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-07-20 18:56:09 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 19:43:26 +03:00
										 |  |  | 	public function getBody(){ | 
					
						
							|  |  |  | 		return $this->body; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-08-06 20:35:23 +02:00
										 |  |  | } |