Blame view

sources/apps/documents/ajax/sessionController.php 5.23 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
  <?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 SessionController extends Controller{
  	
  	public static function joinAsGuest($args){
  		self::preDispatchGuest();
  		
  		$uid = Helper::getArrayValueByKey($_POST, 'name');
6d9380f96   Cédric Dupont   Update sources OC...
21
  		$uid = substr($uid, 0, 16);
d1bafeea1   Kload   [fix] Upgrade to ...
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
  		
  		try {
  			$token = Helper::getArrayValueByKey($args, 'token');
  			$file = File::getByShareToken($token);
  			$session = Db_Session::start($uid, $file, true);
  			\OCP\JSON::success($session);
  		} catch (\Exception $e){
  			Helper::warnLog('Starting a session failed. Reason: ' . $e->getMessage());
  			\OCP\JSON::error();
  			exit();
  		}
  	}
  
  	public static function joinAsUser($args){
  		$uid = self::preDispatch();
  		$fileId = Helper::getArrayValueByKey($args, 'file_id');
  		
  		try {
  			$view = \OC\Files\Filesystem::getView();
  			$path = $view->getPath($fileId);
  			
  			if ($view->isUpdatable($path)) {
  				$file = new File($fileId);
  				$session = Db_Session::start($uid, $file);
  				\OCP\JSON::success($session);
  			} else {
  				$info = $view->getFileInfo();
  				\OCP\JSON::success(array(
  					'permissions' => $info['permissions'],
  					'id' => $fileId
  				));
  			}
  			exit();
  		} catch (\Exception $e){
  			Helper::warnLog('Starting a session failed. Reason: ' . $e->getMessage());
  			\OCP\JSON::error();
  			exit();
  		}
  	}
  	
  
  	/**
  	 * Store the document content to its origin
  	 */
  	public static function save(){
  		try {
  			$esId = @$_SERVER['HTTP_WEBODF_SESSION_ID'];
  			if (!$esId){
  				throw new \Exception('Session id can not be empty');
  			}
  			
  			$memberId = @$_SERVER['HTTP_WEBODF_MEMBER_ID'];
  			$currentMember = new Db_Member();
  			$currentMember->load($memberId);
  			if (is_null($currentMember->getIsGuest()) || $currentMember->getIsGuest()){
6d9380f96   Cédric Dupont   Update sources OC...
77
  				self::preDispatchGuest();
d1bafeea1   Kload   [fix] Upgrade to ...
78
  			} else {
6d9380f96   Cédric Dupont   Update sources OC...
79
  				$uid = self::preDispatch();
d1bafeea1   Kload   [fix] Upgrade to ...
80
81
82
83
84
85
86
  			}
  			
  			//check if member belongs to the session
  			if ($esId != $currentMember->getEsId()){
  				throw new \Exception($memberId . ' does not belong to session ' . $esId);
  			}
  			
6d9380f96   Cédric Dupont   Update sources OC...
87
88
  			// Extra info for future usage
  			// $sessionRevision = Helper::getArrayValueByKey($_SERVER, 'HTTP_WEBODF_SESSION_REVISION');
d1bafeea1   Kload   [fix] Upgrade to ...
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  			
  			$stream = fopen('php://input','r');
  			if (!$stream){
  				throw new \Exception('New content missing');
  			}
  			$content = stream_get_contents($stream);
  
  			$session = new Db_Session();
  			$session->load($esId);
  			
  			if (!$session->getEsId()){
  				throw new \Exception('Session does not exist');
  			}
  
  			try {
  				if ($currentMember->getIsGuest()){
  					$file = File::getByShareToken($currentMember->getToken());
  				} else {
  					$file = new File($session->getFileId());
  				}
  				
6d9380f96   Cédric Dupont   Update sources OC...
110
  				list($view, $path) = $file->getOwnerViewAndPath(true);
d1bafeea1   Kload   [fix] Upgrade to ...
111
112
113
  			} catch (\Exception $e){
  				//File was deleted or unshared. We need to save content as new file anyway
  				//Sorry, but for guests it would be lost :(
6d9380f96   Cédric Dupont   Update sources OC...
114
115
  				if (isset($uid)){
  					$view = new \OC\Files\View('/' . $uid . '/files');
d1bafeea1   Kload   [fix] Upgrade to ...
116
  		
6d9380f96   Cédric Dupont   Update sources OC...
117
118
119
  					$dir = \OCP\Config::getUserValue(\OCP\User::getUser(), 'documents', 'save_path', '');
  					$path = Helper::getNewFileName($view, $dir . 'New Document.odt');
  				}
d1bafeea1   Kload   [fix] Upgrade to ...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
  			}
  			
  			$member = new Db_Member();
  			$members = $member->getActiveCollection($esId);
  			$memberIds = array_map(
  				function($x){
  					return ($x['member_id']);
  				},
  				$members
  			);
  			
  			// Active users except current user
  			$memberCount = count($memberIds) - 1;
  			
  			if ($view->file_exists($path)){
  				$proxyStatus = \OC_FileProxy::$enabled;
  				\OC_FileProxy::$enabled = false;	
  				$currentHash = sha1($view->file_get_contents($path));
  				\OC_FileProxy::$enabled = $proxyStatus;
  				
  				if (!Helper::isVersionsEnabled() && $currentHash !== $session->getGenesisHash()){
  					// Original file was modified externally. Save to a new one
  					$path = Helper::getNewFileName($view, $path, '-conflict');
  				}
  				
  				$mimetype = $view->getMimeType($path);
  			} else {
  				$mimetype = Storage::MIMETYPE_LIBREOFFICE_WORDPROCESSOR;
  			}
  			
  			$data = Filter::write($content, $mimetype);
  			
  			if ($view->file_put_contents($path, $data['content'])){
  				// Not a last user
  				if ($memberCount>0){
  					// Update genesis hash to prevent conflicts
  					Helper::debugLog('Update hash');
  					$session->updateGenesisHash($esId, sha1($data['content']));
  				} else {
  					// Last user. Kill session data
  					Db_Session::cleanUp($esId);
  				}
  				
  				$view->touch($path);
  			}
  			\OCP\JSON::success();
  		} catch (\Exception $e){
  			Helper::warnLog('Saving failed. Reason:' . $e->getMessage());
  			//\OCP\JSON::error(array('message'=>$e->getMessage()));
  			\OC_Response::setStatus(500);
  		}
  		exit();
  	}
  	
  	public static function info(){
  		self::preDispatch();
  		$items = @$_POST['items'];
  		$info = array();
  
  		if (is_array($items)){
  			$session = new Db_Session();
  			$info = $session->getInfoByFileId($items);
  		}
  
  		\OCP\JSON::success(array(
  			"info" => $info
  		));
  	}
  	
  	public static function listAll(){
  		self::preDispatch();
  		$session = new Db_Session();
  		$sessions = $session->getCollection();
  
  		$preparedSessions = array_map(
  				function($x){
  					return ($x['es_id']);
  				}, $sessions
  		);
  		\OCP\JSON::success(array(
  			"session_list" => $preparedSessions
  		));
  	}
  
  }