| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | <?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; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2014-05-13 23:17:25 +03:00
										 |  |  |  *  Session management | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * @method string getEsId() | 
					
						
							|  |  |  |  * @method int getFileId() | 
					
						
							|  |  |  |  * @method string getGenesisUrl() | 
					
						
							|  |  |  |  * @method string getOwner() | 
					
						
							|  |  |  |  * @method string getGenesisHash() | 
					
						
							|  |  |  |  *  | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  |  */ | 
					
						
							|  |  |  | class Db_Session extends \OCA\Documents\Db { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * DB table | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	const DB_TABLE = '`*PREFIX*documents_session`'; | 
					
						
							|  |  |  | 	protected $tableName  = '`*PREFIX*documents_session`'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected $insertStatement  = 'INSERT INTO `*PREFIX*documents_session` (`es_id`, `genesis_url`, `genesis_hash`, `owner`, `file_id`) | 
					
						
							|  |  |  | 			VALUES (?, ?, ?, ?, ?)'; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	protected $loadStatement = 'SELECT * FROM `*PREFIX*documents_session` WHERE `es_id`= ?'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Start a editing session or return an existing one | 
					
						
							|  |  |  | 	 * @param string $uid of the user starting a session | 
					
						
							|  |  |  | 	 * @param \OCA\Documents\File $file - file object | 
					
						
							|  |  |  | 	 * @return array | 
					
						
							|  |  |  | 	 * @throws \Exception | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2014-04-10 21:23:26 +03:00
										 |  |  | 	public static function start($uid, $file){ | 
					
						
							| 
									
										
										
										
											2013-10-02 19:55:33 +03:00
										 |  |  | 		// Create a directory to store genesis
 | 
					
						
							| 
									
										
										
										
											2014-04-10 19:53:56 +03:00
										 |  |  | 		$genesis = new Genesis($file); | 
					
						
							| 
									
										
										
										
											2013-11-09 17:29:12 +03:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2014-04-10 19:53:56 +03:00
										 |  |  | 		list($ownerView, $path) = $file->getOwnerViewAndPath(); | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 		$oldSession = new Db_Session(); | 
					
						
							|  |  |  | 		$oldSession->loadBy('file_id', $file->getFileId()); | 
					
						
							| 
									
										
										
										
											2013-10-02 19:55:33 +03:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 		//If there is no existing session we need to start a new one
 | 
					
						
							|  |  |  | 		if (!$oldSession->hasData()){ | 
					
						
							|  |  |  | 			$newSession = new Db_Session(array( | 
					
						
							| 
									
										
										
										
											2013-11-09 17:29:12 +03:00
										 |  |  | 				$genesis->getPath(), | 
					
						
							|  |  |  | 				$genesis->getHash(), | 
					
						
							|  |  |  | 				$file->getOwner(), | 
					
						
							|  |  |  | 				$file->getFileId() | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 			)); | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			if (!$newSession->insert()){ | 
					
						
							|  |  |  | 				throw new \Exception('Failed to add session into database'); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 		$sessionData = $oldSession | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 					->loadBy('file_id', $file->getFileId()) | 
					
						
							|  |  |  | 					->getData() | 
					
						
							| 
									
										
										
										
											2013-11-09 17:29:12 +03:00
										 |  |  | 		; | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2014-02-12 15:46:53 +03:00
										 |  |  | 		$memberColor = Helper::getMemberColor($uid); | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 		$member = new Db_Member(array( | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 			$sessionData['es_id'],  | 
					
						
							| 
									
										
										
										
											2013-11-25 23:14:32 +03:00
										 |  |  | 			$uid, | 
					
						
							|  |  |  | 			$memberColor, | 
					
						
							| 
									
										
										
										
											2014-04-09 17:48:48 +03:00
										 |  |  | 			time(), | 
					
						
							| 
									
										
										
										
											2014-04-11 00:59:51 +03:00
										 |  |  | 			intval($file->isPublicShare()), | 
					
						
							|  |  |  | 			$file->getToken() | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 		)); | 
					
						
							| 
									
										
										
										
											2013-11-25 23:14:32 +03:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 		if ($member->insert()){ | 
					
						
							| 
									
										
										
										
											2013-11-25 23:14:32 +03:00
										 |  |  | 			// Do we have OC_Avatar in out disposal?
 | 
					
						
							|  |  |  | 			if (!class_exists('\OC_Avatar') || \OC_Config::getValue('enable_avatars', true) !== true){ | 
					
						
							|  |  |  | 				$imageUrl = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw=='; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$imageUrl = $uid; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-04-09 17:48:48 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-10 21:23:26 +03:00
										 |  |  | 			$displayName = $file->isPublicShare() ? $uid . ' ' . Db_Member::getGuestPostfix() : \OCP\User::getDisplayName($uid); | 
					
						
							| 
									
										
										
										
											2013-11-25 23:14:32 +03:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 			$sessionData['member_id'] = (string) $member->getLastInsertId(); | 
					
						
							| 
									
										
										
										
											2013-11-25 23:14:32 +03:00
										 |  |  | 			$op = new Db_Op(); | 
					
						
							|  |  |  | 			$op->addMember( | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 					$sessionData['es_id'], | 
					
						
							|  |  |  | 					$sessionData['member_id'], | 
					
						
							| 
									
										
										
										
											2014-04-09 17:48:48 +03:00
										 |  |  | 					$displayName, | 
					
						
							| 
									
										
										
										
											2013-11-25 23:14:32 +03:00
										 |  |  | 					$memberColor, | 
					
						
							|  |  |  | 					$imageUrl | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			throw new \Exception('Failed to add member into database'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 		$sessionData['title'] = basename($path); | 
					
						
							|  |  |  | 		$sessionData['permissions'] = $ownerView->getFilePermissions($path); | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2014-04-11 23:12:23 +03:00
										 |  |  | 		return $sessionData; | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	public static function cleanUp($esId){ | 
					
						
							|  |  |  | 		$session = new Db_Session(); | 
					
						
							|  |  |  | 		$session->deleteBy('es_id', $esId); | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		$member = new Db_Member(); | 
					
						
							|  |  |  | 		$member->deleteBy('es_id', $esId); | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		$op= new Db_Op(); | 
					
						
							|  |  |  | 		$op->deleteBy('es_id', $esId); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	public function insert(){ | 
					
						
							|  |  |  | 		$esId = $this->getUniqueSessionId(); | 
					
						
							|  |  |  | 		array_unshift($this->data, $esId); | 
					
						
							|  |  |  | 		return parent::insert($this->data); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-10-31 20:24:55 +03:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	public function updateGenesisHash($esId, $genesisHash){ | 
					
						
							|  |  |  | 		return $this->execute( | 
					
						
							|  |  |  | 			'UPDATE `*PREFIX*documents_session` SET `genesis_hash`=? WHERE `es_id`=?', | 
					
						
							|  |  |  | 			array( | 
					
						
							| 
									
										
										
										
											2013-11-09 18:24:03 +03:00
										 |  |  | 				$genesisHash, $esId | 
					
						
							| 
									
										
										
										
											2013-10-31 20:24:55 +03:00
										 |  |  | 			) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	public function getInfo($esId){ | 
					
						
							|  |  |  | 		$result = $this->execute(' | 
					
						
							|  |  |  | 			SELECT `s`.*, COUNT(`m`.`member_id`) AS `users` | 
					
						
							|  |  |  | 			FROM ' . $this->tableName . ' AS `s` | 
					
						
							|  |  |  | 			LEFT JOIN `*PREFIX*documents_member` AS `m` ON `s`.`es_id`=`m`.`es_id` | 
					
						
							|  |  |  | 				AND `m`.`status`=' . Db_Member::MEMBER_STATUS_ACTIVE . ' | 
					
						
							|  |  |  | 				AND `m`.`uid` != ? | 
					
						
							|  |  |  | 			WHERE `s`.`es_id` = ? | 
					
						
							|  |  |  | 			GROUP BY `m`.`es_id` | 
					
						
							|  |  |  | 			', | 
					
						
							|  |  |  | 			array( | 
					
						
							|  |  |  | 					\OCP\User::getUser(), | 
					
						
							|  |  |  | 					$esId | 
					
						
							|  |  |  | 			) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$info = $result->fetchRow(); | 
					
						
							|  |  |  | 		if (!is_array($info)){ | 
					
						
							|  |  |  | 			$info = array(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return $info; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function getInfoByFileId($fileIds){ | 
					
						
							|  |  |  | 		if (!is_array($fileIds)){ | 
					
						
							|  |  |  | 			return array(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$stmt = $this->buildInQuery('file_id', $fileIds); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$result = $this->execute(' | 
					
						
							|  |  |  | 			SELECT `s`.*, COUNT(`m`.`member_id`) AS `users` | 
					
						
							|  |  |  | 			FROM ' . $this->tableName . ' AS `s` | 
					
						
							|  |  |  | 			LEFT JOIN `*PREFIX*documents_member` AS `m` ON `s`.`es_id`=`m`.`es_id` | 
					
						
							|  |  |  | 				AND `m`.`status`=' . Db_Member::MEMBER_STATUS_ACTIVE . ' | 
					
						
							|  |  |  | 			WHERE `s`.`file_id` ' . $stmt .' | 
					
						
							|  |  |  | 			GROUP BY `m`.`es_id`', | 
					
						
							|  |  |  | 			$fileIds | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$info = $result->fetchAll(); | 
					
						
							|  |  |  | 		if (!is_array($info)){ | 
					
						
							|  |  |  | 			$info = array(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return $info; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected function getUniqueSessionId(){ | 
					
						
							|  |  |  | 		$testSession = new Db_Session(); | 
					
						
							|  |  |  | 		do{ | 
					
						
							| 
									
										
										
										
											2014-04-10 17:13:19 +03:00
										 |  |  | 			$id = \OC_Util::generateRandomBytes(30); | 
					
						
							|  |  |  | 		} while ($testSession->load($id)->hasData()); | 
					
						
							| 
									
										
										
										
											2013-09-27 18:43:10 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return $id; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |