Passed
Push — master ( c00d6f...a085a8 )
by Morris
09:54 queued 11s
created
lib/private/legacy/files.php 3 patches
Braces   +6 added lines, -12 removed lines patch added patch discarded remove patch
@@ -83,13 +83,11 @@  discard block
 block discarded – undo
83 83
 			    if (count($rangeArray) > 1) {
84 84
 				$type = 'multipart/byteranges; boundary='.self::getBoundary();
85 85
 				// no Content-Length header here
86
-			    }
87
-			    else {
86
+			    } else {
88 87
 				header(sprintf('Content-Range: bytes %d-%d/%d', $rangeArray[0]['from'], $rangeArray[0]['to'], $fileSize), true);
89 88
 				OC_Response::setContentLengthHeader($rangeArray[0]['to'] - $rangeArray[0]['from'] + 1);
90 89
 			    }
91
-			}
92
-			else {
90
+			} else {
93 91
 			    OC_Response::setContentLengthHeader($fileSize);
94 92
 			}
95 93
 		}
@@ -223,13 +221,11 @@  discard block
 block discarded – undo
223 221
 				if ($minOffset >= $fileSize) {
224 222
 					break;
225 223
 				}
226
-			}
227
-			elseif (is_numeric($ranges[0]) && $ranges[0] < $fileSize) {
224
+			} elseif (is_numeric($ranges[0]) && $ranges[0] < $fileSize) {
228 225
 				// case: x-
229 226
 				$rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $fileSize-1, 'size' => $fileSize );
230 227
 				break;
231
-			}
232
-			elseif (is_numeric($ranges[1])) {
228
+			} elseif (is_numeric($ranges[1])) {
233 229
 				// case: -x
234 230
 				if ($ranges[1] > $fileSize) {
235 231
 					$ranges[1] = $fileSize;
@@ -277,8 +273,7 @@  discard block
 block discarded – undo
277 273
 			try {
278 274
 			    if (count($rangeArray) == 1) {
279 275
 				$view->readfilePart($filename, $rangeArray[0]['from'], $rangeArray[0]['to']);
280
-			    }
281
-			    else {
276
+			    } else {
282 277
 				// check if file is seekable (if not throw UnseekableException)
283 278
 				// we have to check it before body contents
284 279
 				$view->readfilePart($filename, $rangeArray[0]['size'], $rangeArray[0]['size']);
@@ -301,8 +296,7 @@  discard block
 block discarded – undo
301 296
 			    self::sendHeaders($filename, $name, array());
302 297
 			    $view->readfile($filename);
303 298
 			}
304
-		}
305
-		else {
299
+		} else {
306 300
 		    $view->readfile($filename);
307 301
 		}
308 302
 	}
Please login to merge, or discard this patch.
Indentation   +348 added lines, -348 removed lines patch added patch discarded remove patch
@@ -49,356 +49,356 @@
 block discarded – undo
49 49
  *
50 50
  */
51 51
 class OC_Files {
52
-	const FILE = 1;
53
-	const ZIP_FILES = 2;
54
-	const ZIP_DIR = 3;
55
-
56
-	const UPLOAD_MIN_LIMIT_BYTES = 1048576; // 1 MiB
57
-
58
-
59
-	private static $multipartBoundary = '';
60
-
61
-	/**
62
-	 * @return string
63
-	 */
64
-	private static function getBoundary() {
65
-		if (empty(self::$multipartBoundary)) {
66
-			self::$multipartBoundary = md5(mt_rand());
67
-		}
68
-		return self::$multipartBoundary;
69
-	}
70
-
71
-	/**
72
-	 * @param string $filename
73
-	 * @param string $name
74
-	 * @param array $rangeArray ('from'=>int,'to'=>int), ...
75
-	 */
76
-	private static function sendHeaders($filename, $name, array $rangeArray) {
77
-		OC_Response::setContentDispositionHeader($name, 'attachment');
78
-		header('Content-Transfer-Encoding: binary', true);
79
-		header('Pragma: public');// enable caching in IE
80
-		header('Expires: 0');
81
-		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
82
-		$fileSize = \OC\Files\Filesystem::filesize($filename);
83
-		$type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename));
84
-		if ($fileSize > -1) {
85
-			if (!empty($rangeArray)) {
86
-			    http_response_code(206);
87
-			    header('Accept-Ranges: bytes', true);
88
-			    if (count($rangeArray) > 1) {
89
-				$type = 'multipart/byteranges; boundary='.self::getBoundary();
90
-				// no Content-Length header here
91
-			    }
92
-			    else {
93
-				header(sprintf('Content-Range: bytes %d-%d/%d', $rangeArray[0]['from'], $rangeArray[0]['to'], $fileSize), true);
94
-				OC_Response::setContentLengthHeader($rangeArray[0]['to'] - $rangeArray[0]['from'] + 1);
95
-			    }
96
-			}
97
-			else {
98
-			    OC_Response::setContentLengthHeader($fileSize);
99
-			}
100
-		}
101
-		header('Content-Type: '.$type, true);
102
-	}
103
-
104
-	/**
105
-	 * return the content of a file or return a zip file containing multiple files
106
-	 *
107
-	 * @param string $dir
108
-	 * @param string $files ; separated list of files to download
109
-	 * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
110
-	 */
111
-	public static function get($dir, $files, $params = null) {
112
-
113
-		$view = \OC\Files\Filesystem::getView();
114
-		$getType = self::FILE;
115
-		$filename = $dir;
116
-		try {
117
-
118
-			if (is_array($files) && count($files) === 1) {
119
-				$files = $files[0];
120
-			}
121
-
122
-			if (!is_array($files)) {
123
-				$filename = $dir . '/' . $files;
124
-				if (!$view->is_dir($filename)) {
125
-					self::getSingleFile($view, $dir, $files, is_null($params) ? array() : $params);
126
-					return;
127
-				}
128
-			}
129
-
130
-			$name = 'download';
131
-			if (is_array($files)) {
132
-				$getType = self::ZIP_FILES;
133
-				$basename = basename($dir);
134
-				if ($basename) {
135
-					$name = $basename;
136
-				}
137
-
138
-				$filename = $dir . '/' . $name;
139
-			} else {
140
-				$filename = $dir . '/' . $files;
141
-				$getType = self::ZIP_DIR;
142
-				// downloading root ?
143
-				if ($files !== '') {
144
-					$name = $files;
145
-				}
146
-			}
147
-
148
-			self::lockFiles($view, $dir, $files);
149
-
150
-			/* Calculate filesize and number of files */
151
-			if ($getType === self::ZIP_FILES) {
152
-				$fileInfos = array();
153
-				$fileSize = 0;
154
-				foreach ($files as $file) {
155
-					$fileInfo = \OC\Files\Filesystem::getFileInfo($dir . '/' . $file);
156
-					$fileSize += $fileInfo->getSize();
157
-					$fileInfos[] = $fileInfo;
158
-				}
159
-				$numberOfFiles = self::getNumberOfFiles($fileInfos);
160
-			} elseif ($getType === self::ZIP_DIR) {
161
-				$fileInfo = \OC\Files\Filesystem::getFileInfo($dir . '/' . $files);
162
-				$fileSize = $fileInfo->getSize();
163
-				$numberOfFiles = self::getNumberOfFiles(array($fileInfo));
164
-			}
165
-
166
-			$streamer = new Streamer(\OC::$server->getRequest(), $fileSize, $numberOfFiles);
167
-			OC_Util::obEnd();
168
-
169
-			$streamer->sendHeaders($name);
170
-			$executionTime = (int)OC::$server->getIniWrapper()->getNumeric('max_execution_time');
171
-			if (strpos(@ini_get('disable_functions'), 'set_time_limit') === false) {
172
-				@set_time_limit(0);
173
-			}
174
-			ignore_user_abort(true);
175
-
176
-			if ($getType === self::ZIP_FILES) {
177
-				foreach ($files as $file) {
178
-					$file = $dir . '/' . $file;
179
-					if (\OC\Files\Filesystem::is_file($file)) {
180
-						$fileSize = \OC\Files\Filesystem::filesize($file);
181
-						$fileTime = \OC\Files\Filesystem::filemtime($file);
182
-						$fh = \OC\Files\Filesystem::fopen($file, 'r');
183
-						$streamer->addFileFromStream($fh, basename($file), $fileSize, $fileTime);
184
-						fclose($fh);
185
-					} elseif (\OC\Files\Filesystem::is_dir($file)) {
186
-						$streamer->addDirRecursive($file);
187
-					}
188
-				}
189
-			} elseif ($getType === self::ZIP_DIR) {
190
-				$file = $dir . '/' . $files;
191
-				$streamer->addDirRecursive($file);
192
-			}
193
-			$streamer->finalize();
194
-			set_time_limit($executionTime);
195
-			self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
196
-		} catch (\OCP\Lock\LockedException $ex) {
197
-			self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
198
-			OC::$server->getLogger()->logException($ex);
199
-			$l = \OC::$server->getL10N('core');
200
-			$hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
201
-			\OC_Template::printErrorPage($l->t('File is currently busy, please try again later'), $hint, 200);
202
-		} catch (\OCP\Files\ForbiddenException $ex) {
203
-			self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
204
-			OC::$server->getLogger()->logException($ex);
205
-			$l = \OC::$server->getL10N('core');
206
-			\OC_Template::printErrorPage($l->t('Can\'t read file'), $ex->getMessage(), 200);
207
-		} catch (\Exception $ex) {
208
-			self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
209
-			OC::$server->getLogger()->logException($ex);
210
-			$l = \OC::$server->getL10N('core');
211
-			$hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
212
-			\OC_Template::printErrorPage($l->t('Can\'t read file'), $hint, 200);
213
-		}
214
-	}
215
-
216
-	/**
217
-	 * @param string $rangeHeaderPos
218
-	 * @param int $fileSize
219
-	 * @return array $rangeArray ('from'=>int,'to'=>int), ...
220
-	 */
221
-	private static function parseHttpRangeHeader($rangeHeaderPos, $fileSize) {
222
-		$rArray=explode(',', $rangeHeaderPos);
223
-		$minOffset = 0;
224
-		$ind = 0;
225
-
226
-		$rangeArray = array();
227
-
228
-		foreach ($rArray as $value) {
229
-			$ranges = explode('-', $value);
230
-			if (is_numeric($ranges[0])) {
231
-				if ($ranges[0] < $minOffset) { // case: bytes=500-700,601-999
232
-					$ranges[0] = $minOffset;
233
-				}
234
-				if ($ind > 0 && $rangeArray[$ind-1]['to']+1 == $ranges[0]) { // case: bytes=500-600,601-999
235
-					$ind--;
236
-					$ranges[0] = $rangeArray[$ind]['from'];
237
-				}
238
-			}
239
-
240
-			if (is_numeric($ranges[0]) && is_numeric($ranges[1]) && $ranges[0] < $fileSize && $ranges[0] <= $ranges[1]) {
241
-				// case: x-x
242
-				if ($ranges[1] >= $fileSize) {
243
-					$ranges[1] = $fileSize-1;
244
-				}
245
-				$rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $ranges[1], 'size' => $fileSize );
246
-				$minOffset = $ranges[1] + 1;
247
-				if ($minOffset >= $fileSize) {
248
-					break;
249
-				}
250
-			}
251
-			elseif (is_numeric($ranges[0]) && $ranges[0] < $fileSize) {
252
-				// case: x-
253
-				$rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $fileSize-1, 'size' => $fileSize );
254
-				break;
255
-			}
256
-			elseif (is_numeric($ranges[1])) {
257
-				// case: -x
258
-				if ($ranges[1] > $fileSize) {
259
-					$ranges[1] = $fileSize;
260
-				}
261
-				$rangeArray[$ind++] = array( 'from' => $fileSize-$ranges[1], 'to' => $fileSize-1, 'size' => $fileSize );
262
-				break;
263
-			}
264
-		}
265
-		return $rangeArray;
266
-	}
267
-
268
-	/**
269
-	 * @param View $view
270
-	 * @param string $name
271
-	 * @param string $dir
272
-	 * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
273
-	 */
274
-	private static function getSingleFile($view, $dir, $name, $params) {
275
-		$filename = $dir . '/' . $name;
276
-		OC_Util::obEnd();
277
-		$view->lockFile($filename, ILockingProvider::LOCK_SHARED);
52
+    const FILE = 1;
53
+    const ZIP_FILES = 2;
54
+    const ZIP_DIR = 3;
55
+
56
+    const UPLOAD_MIN_LIMIT_BYTES = 1048576; // 1 MiB
57
+
58
+
59
+    private static $multipartBoundary = '';
60
+
61
+    /**
62
+     * @return string
63
+     */
64
+    private static function getBoundary() {
65
+        if (empty(self::$multipartBoundary)) {
66
+            self::$multipartBoundary = md5(mt_rand());
67
+        }
68
+        return self::$multipartBoundary;
69
+    }
70
+
71
+    /**
72
+     * @param string $filename
73
+     * @param string $name
74
+     * @param array $rangeArray ('from'=>int,'to'=>int), ...
75
+     */
76
+    private static function sendHeaders($filename, $name, array $rangeArray) {
77
+        OC_Response::setContentDispositionHeader($name, 'attachment');
78
+        header('Content-Transfer-Encoding: binary', true);
79
+        header('Pragma: public');// enable caching in IE
80
+        header('Expires: 0');
81
+        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
82
+        $fileSize = \OC\Files\Filesystem::filesize($filename);
83
+        $type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename));
84
+        if ($fileSize > -1) {
85
+            if (!empty($rangeArray)) {
86
+                http_response_code(206);
87
+                header('Accept-Ranges: bytes', true);
88
+                if (count($rangeArray) > 1) {
89
+                $type = 'multipart/byteranges; boundary='.self::getBoundary();
90
+                // no Content-Length header here
91
+                }
92
+                else {
93
+                header(sprintf('Content-Range: bytes %d-%d/%d', $rangeArray[0]['from'], $rangeArray[0]['to'], $fileSize), true);
94
+                OC_Response::setContentLengthHeader($rangeArray[0]['to'] - $rangeArray[0]['from'] + 1);
95
+                }
96
+            }
97
+            else {
98
+                OC_Response::setContentLengthHeader($fileSize);
99
+            }
100
+        }
101
+        header('Content-Type: '.$type, true);
102
+    }
103
+
104
+    /**
105
+     * return the content of a file or return a zip file containing multiple files
106
+     *
107
+     * @param string $dir
108
+     * @param string $files ; separated list of files to download
109
+     * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
110
+     */
111
+    public static function get($dir, $files, $params = null) {
112
+
113
+        $view = \OC\Files\Filesystem::getView();
114
+        $getType = self::FILE;
115
+        $filename = $dir;
116
+        try {
117
+
118
+            if (is_array($files) && count($files) === 1) {
119
+                $files = $files[0];
120
+            }
121
+
122
+            if (!is_array($files)) {
123
+                $filename = $dir . '/' . $files;
124
+                if (!$view->is_dir($filename)) {
125
+                    self::getSingleFile($view, $dir, $files, is_null($params) ? array() : $params);
126
+                    return;
127
+                }
128
+            }
129
+
130
+            $name = 'download';
131
+            if (is_array($files)) {
132
+                $getType = self::ZIP_FILES;
133
+                $basename = basename($dir);
134
+                if ($basename) {
135
+                    $name = $basename;
136
+                }
137
+
138
+                $filename = $dir . '/' . $name;
139
+            } else {
140
+                $filename = $dir . '/' . $files;
141
+                $getType = self::ZIP_DIR;
142
+                // downloading root ?
143
+                if ($files !== '') {
144
+                    $name = $files;
145
+                }
146
+            }
147
+
148
+            self::lockFiles($view, $dir, $files);
149
+
150
+            /* Calculate filesize and number of files */
151
+            if ($getType === self::ZIP_FILES) {
152
+                $fileInfos = array();
153
+                $fileSize = 0;
154
+                foreach ($files as $file) {
155
+                    $fileInfo = \OC\Files\Filesystem::getFileInfo($dir . '/' . $file);
156
+                    $fileSize += $fileInfo->getSize();
157
+                    $fileInfos[] = $fileInfo;
158
+                }
159
+                $numberOfFiles = self::getNumberOfFiles($fileInfos);
160
+            } elseif ($getType === self::ZIP_DIR) {
161
+                $fileInfo = \OC\Files\Filesystem::getFileInfo($dir . '/' . $files);
162
+                $fileSize = $fileInfo->getSize();
163
+                $numberOfFiles = self::getNumberOfFiles(array($fileInfo));
164
+            }
165
+
166
+            $streamer = new Streamer(\OC::$server->getRequest(), $fileSize, $numberOfFiles);
167
+            OC_Util::obEnd();
168
+
169
+            $streamer->sendHeaders($name);
170
+            $executionTime = (int)OC::$server->getIniWrapper()->getNumeric('max_execution_time');
171
+            if (strpos(@ini_get('disable_functions'), 'set_time_limit') === false) {
172
+                @set_time_limit(0);
173
+            }
174
+            ignore_user_abort(true);
175
+
176
+            if ($getType === self::ZIP_FILES) {
177
+                foreach ($files as $file) {
178
+                    $file = $dir . '/' . $file;
179
+                    if (\OC\Files\Filesystem::is_file($file)) {
180
+                        $fileSize = \OC\Files\Filesystem::filesize($file);
181
+                        $fileTime = \OC\Files\Filesystem::filemtime($file);
182
+                        $fh = \OC\Files\Filesystem::fopen($file, 'r');
183
+                        $streamer->addFileFromStream($fh, basename($file), $fileSize, $fileTime);
184
+                        fclose($fh);
185
+                    } elseif (\OC\Files\Filesystem::is_dir($file)) {
186
+                        $streamer->addDirRecursive($file);
187
+                    }
188
+                }
189
+            } elseif ($getType === self::ZIP_DIR) {
190
+                $file = $dir . '/' . $files;
191
+                $streamer->addDirRecursive($file);
192
+            }
193
+            $streamer->finalize();
194
+            set_time_limit($executionTime);
195
+            self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
196
+        } catch (\OCP\Lock\LockedException $ex) {
197
+            self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
198
+            OC::$server->getLogger()->logException($ex);
199
+            $l = \OC::$server->getL10N('core');
200
+            $hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
201
+            \OC_Template::printErrorPage($l->t('File is currently busy, please try again later'), $hint, 200);
202
+        } catch (\OCP\Files\ForbiddenException $ex) {
203
+            self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
204
+            OC::$server->getLogger()->logException($ex);
205
+            $l = \OC::$server->getL10N('core');
206
+            \OC_Template::printErrorPage($l->t('Can\'t read file'), $ex->getMessage(), 200);
207
+        } catch (\Exception $ex) {
208
+            self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
209
+            OC::$server->getLogger()->logException($ex);
210
+            $l = \OC::$server->getL10N('core');
211
+            $hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
212
+            \OC_Template::printErrorPage($l->t('Can\'t read file'), $hint, 200);
213
+        }
214
+    }
215
+
216
+    /**
217
+     * @param string $rangeHeaderPos
218
+     * @param int $fileSize
219
+     * @return array $rangeArray ('from'=>int,'to'=>int), ...
220
+     */
221
+    private static function parseHttpRangeHeader($rangeHeaderPos, $fileSize) {
222
+        $rArray=explode(',', $rangeHeaderPos);
223
+        $minOffset = 0;
224
+        $ind = 0;
225
+
226
+        $rangeArray = array();
227
+
228
+        foreach ($rArray as $value) {
229
+            $ranges = explode('-', $value);
230
+            if (is_numeric($ranges[0])) {
231
+                if ($ranges[0] < $minOffset) { // case: bytes=500-700,601-999
232
+                    $ranges[0] = $minOffset;
233
+                }
234
+                if ($ind > 0 && $rangeArray[$ind-1]['to']+1 == $ranges[0]) { // case: bytes=500-600,601-999
235
+                    $ind--;
236
+                    $ranges[0] = $rangeArray[$ind]['from'];
237
+                }
238
+            }
239
+
240
+            if (is_numeric($ranges[0]) && is_numeric($ranges[1]) && $ranges[0] < $fileSize && $ranges[0] <= $ranges[1]) {
241
+                // case: x-x
242
+                if ($ranges[1] >= $fileSize) {
243
+                    $ranges[1] = $fileSize-1;
244
+                }
245
+                $rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $ranges[1], 'size' => $fileSize );
246
+                $minOffset = $ranges[1] + 1;
247
+                if ($minOffset >= $fileSize) {
248
+                    break;
249
+                }
250
+            }
251
+            elseif (is_numeric($ranges[0]) && $ranges[0] < $fileSize) {
252
+                // case: x-
253
+                $rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $fileSize-1, 'size' => $fileSize );
254
+                break;
255
+            }
256
+            elseif (is_numeric($ranges[1])) {
257
+                // case: -x
258
+                if ($ranges[1] > $fileSize) {
259
+                    $ranges[1] = $fileSize;
260
+                }
261
+                $rangeArray[$ind++] = array( 'from' => $fileSize-$ranges[1], 'to' => $fileSize-1, 'size' => $fileSize );
262
+                break;
263
+            }
264
+        }
265
+        return $rangeArray;
266
+    }
267
+
268
+    /**
269
+     * @param View $view
270
+     * @param string $name
271
+     * @param string $dir
272
+     * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
273
+     */
274
+    private static function getSingleFile($view, $dir, $name, $params) {
275
+        $filename = $dir . '/' . $name;
276
+        OC_Util::obEnd();
277
+        $view->lockFile($filename, ILockingProvider::LOCK_SHARED);
278 278
 		
279
-		$rangeArray = array();
279
+        $rangeArray = array();
280 280
 
281
-		if (isset($params['range']) && substr($params['range'], 0, 6) === 'bytes=') {
282
-			$rangeArray = self::parseHttpRangeHeader(substr($params['range'], 6), 
283
-								 \OC\Files\Filesystem::filesize($filename));
284
-		}
281
+        if (isset($params['range']) && substr($params['range'], 0, 6) === 'bytes=') {
282
+            $rangeArray = self::parseHttpRangeHeader(substr($params['range'], 6), 
283
+                                    \OC\Files\Filesystem::filesize($filename));
284
+        }
285 285
 		
286
-		if (\OC\Files\Filesystem::isReadable($filename)) {
287
-			self::sendHeaders($filename, $name, $rangeArray);
288
-		} elseif (!\OC\Files\Filesystem::file_exists($filename)) {
289
-			http_response_code(404);
290
-			$tmpl = new OC_Template('', '404', 'guest');
291
-			$tmpl->printPage();
292
-			exit();
293
-		} else {
294
-			http_response_code(403);
295
-			die('403 Forbidden');
296
-		}
297
-		if (isset($params['head']) && $params['head']) {
298
-			return;
299
-		}
300
-		if (!empty($rangeArray)) {
301
-			try {
302
-			    if (count($rangeArray) == 1) {
303
-				$view->readfilePart($filename, $rangeArray[0]['from'], $rangeArray[0]['to']);
304
-			    }
305
-			    else {
306
-				// check if file is seekable (if not throw UnseekableException)
307
-				// we have to check it before body contents
308
-				$view->readfilePart($filename, $rangeArray[0]['size'], $rangeArray[0]['size']);
309
-
310
-				$type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename));
311
-
312
-				foreach ($rangeArray as $range) {
313
-				    echo "\r\n--".self::getBoundary()."\r\n".
314
-				         "Content-type: ".$type."\r\n".
315
-				         "Content-range: bytes ".$range['from']."-".$range['to']."/".$range['size']."\r\n\r\n";
316
-				    $view->readfilePart($filename, $range['from'], $range['to']);
317
-				}
318
-				echo "\r\n--".self::getBoundary()."--\r\n";
319
-			    }
320
-			} catch (\OCP\Files\UnseekableException $ex) {
321
-			    // file is unseekable
322
-			    header_remove('Accept-Ranges');
323
-			    header_remove('Content-Range');
324
-			    http_response_code(200);
325
-			    self::sendHeaders($filename, $name, array());
326
-			    $view->readfile($filename);
327
-			}
328
-		}
329
-		else {
330
-		    $view->readfile($filename);
331
-		}
332
-	}
333
-
334
-	/**
335
-	 * Returns the total (recursive) number of files and folders in the given
336
-	 * FileInfos.
337
-	 *
338
-	 * @param \OCP\Files\FileInfo[] $fileInfos the FileInfos to count
339
-	 * @return int the total number of files and folders
340
-	 */
341
-	private static function getNumberOfFiles($fileInfos) {
342
-		$numberOfFiles = 0;
343
-
344
-		$view = new View();
345
-
346
-		while ($fileInfo = array_pop($fileInfos)) {
347
-			$numberOfFiles++;
348
-
349
-			if ($fileInfo->getType() === \OCP\Files\FileInfo::TYPE_FOLDER) {
350
-				$fileInfos = array_merge($fileInfos, $view->getDirectoryContent($fileInfo->getPath()));
351
-			}
352
-		}
353
-
354
-		return $numberOfFiles;
355
-	}
356
-
357
-	/**
358
-	 * @param View $view
359
-	 * @param string $dir
360
-	 * @param string[]|string $files
361
-	 */
362
-	public static function lockFiles($view, $dir, $files) {
363
-		if (!is_array($files)) {
364
-			$file = $dir . '/' . $files;
365
-			$files = [$file];
366
-		}
367
-		foreach ($files as $file) {
368
-			$file = $dir . '/' . $file;
369
-			$view->lockFile($file, ILockingProvider::LOCK_SHARED);
370
-			if ($view->is_dir($file)) {
371
-				$contents = $view->getDirectoryContent($file);
372
-				$contents = array_map(function($fileInfo) use ($file) {
373
-					/** @var \OCP\Files\FileInfo $fileInfo */
374
-					return $file . '/' . $fileInfo->getName();
375
-				}, $contents);
376
-				self::lockFiles($view, $dir, $contents);
377
-			}
378
-		}
379
-	}
380
-
381
-	/**
382
-	 * @param string $dir
383
-	 * @param $files
384
-	 * @param integer $getType
385
-	 * @param View $view
386
-	 * @param string $filename
387
-	 */
388
-	private static function unlockAllTheFiles($dir, $files, $getType, $view, $filename) {
389
-		if ($getType === self::FILE) {
390
-			$view->unlockFile($filename, ILockingProvider::LOCK_SHARED);
391
-		}
392
-		if ($getType === self::ZIP_FILES) {
393
-			foreach ($files as $file) {
394
-				$file = $dir . '/' . $file;
395
-				$view->unlockFile($file, ILockingProvider::LOCK_SHARED);
396
-			}
397
-		}
398
-		if ($getType === self::ZIP_DIR) {
399
-			$file = $dir . '/' . $files;
400
-			$view->unlockFile($file, ILockingProvider::LOCK_SHARED);
401
-		}
402
-	}
286
+        if (\OC\Files\Filesystem::isReadable($filename)) {
287
+            self::sendHeaders($filename, $name, $rangeArray);
288
+        } elseif (!\OC\Files\Filesystem::file_exists($filename)) {
289
+            http_response_code(404);
290
+            $tmpl = new OC_Template('', '404', 'guest');
291
+            $tmpl->printPage();
292
+            exit();
293
+        } else {
294
+            http_response_code(403);
295
+            die('403 Forbidden');
296
+        }
297
+        if (isset($params['head']) && $params['head']) {
298
+            return;
299
+        }
300
+        if (!empty($rangeArray)) {
301
+            try {
302
+                if (count($rangeArray) == 1) {
303
+                $view->readfilePart($filename, $rangeArray[0]['from'], $rangeArray[0]['to']);
304
+                }
305
+                else {
306
+                // check if file is seekable (if not throw UnseekableException)
307
+                // we have to check it before body contents
308
+                $view->readfilePart($filename, $rangeArray[0]['size'], $rangeArray[0]['size']);
309
+
310
+                $type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename));
311
+
312
+                foreach ($rangeArray as $range) {
313
+                    echo "\r\n--".self::getBoundary()."\r\n".
314
+                            "Content-type: ".$type."\r\n".
315
+                            "Content-range: bytes ".$range['from']."-".$range['to']."/".$range['size']."\r\n\r\n";
316
+                    $view->readfilePart($filename, $range['from'], $range['to']);
317
+                }
318
+                echo "\r\n--".self::getBoundary()."--\r\n";
319
+                }
320
+            } catch (\OCP\Files\UnseekableException $ex) {
321
+                // file is unseekable
322
+                header_remove('Accept-Ranges');
323
+                header_remove('Content-Range');
324
+                http_response_code(200);
325
+                self::sendHeaders($filename, $name, array());
326
+                $view->readfile($filename);
327
+            }
328
+        }
329
+        else {
330
+            $view->readfile($filename);
331
+        }
332
+    }
333
+
334
+    /**
335
+     * Returns the total (recursive) number of files and folders in the given
336
+     * FileInfos.
337
+     *
338
+     * @param \OCP\Files\FileInfo[] $fileInfos the FileInfos to count
339
+     * @return int the total number of files and folders
340
+     */
341
+    private static function getNumberOfFiles($fileInfos) {
342
+        $numberOfFiles = 0;
343
+
344
+        $view = new View();
345
+
346
+        while ($fileInfo = array_pop($fileInfos)) {
347
+            $numberOfFiles++;
348
+
349
+            if ($fileInfo->getType() === \OCP\Files\FileInfo::TYPE_FOLDER) {
350
+                $fileInfos = array_merge($fileInfos, $view->getDirectoryContent($fileInfo->getPath()));
351
+            }
352
+        }
353
+
354
+        return $numberOfFiles;
355
+    }
356
+
357
+    /**
358
+     * @param View $view
359
+     * @param string $dir
360
+     * @param string[]|string $files
361
+     */
362
+    public static function lockFiles($view, $dir, $files) {
363
+        if (!is_array($files)) {
364
+            $file = $dir . '/' . $files;
365
+            $files = [$file];
366
+        }
367
+        foreach ($files as $file) {
368
+            $file = $dir . '/' . $file;
369
+            $view->lockFile($file, ILockingProvider::LOCK_SHARED);
370
+            if ($view->is_dir($file)) {
371
+                $contents = $view->getDirectoryContent($file);
372
+                $contents = array_map(function($fileInfo) use ($file) {
373
+                    /** @var \OCP\Files\FileInfo $fileInfo */
374
+                    return $file . '/' . $fileInfo->getName();
375
+                }, $contents);
376
+                self::lockFiles($view, $dir, $contents);
377
+            }
378
+        }
379
+    }
380
+
381
+    /**
382
+     * @param string $dir
383
+     * @param $files
384
+     * @param integer $getType
385
+     * @param View $view
386
+     * @param string $filename
387
+     */
388
+    private static function unlockAllTheFiles($dir, $files, $getType, $view, $filename) {
389
+        if ($getType === self::FILE) {
390
+            $view->unlockFile($filename, ILockingProvider::LOCK_SHARED);
391
+        }
392
+        if ($getType === self::ZIP_FILES) {
393
+            foreach ($files as $file) {
394
+                $file = $dir . '/' . $file;
395
+                $view->unlockFile($file, ILockingProvider::LOCK_SHARED);
396
+            }
397
+        }
398
+        if ($getType === self::ZIP_DIR) {
399
+            $file = $dir . '/' . $files;
400
+            $view->unlockFile($file, ILockingProvider::LOCK_SHARED);
401
+        }
402
+    }
403 403
 
404 404
 }
Please login to merge, or discard this patch.
Spacing   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
 	private static function sendHeaders($filename, $name, array $rangeArray) {
77 77
 		OC_Response::setContentDispositionHeader($name, 'attachment');
78 78
 		header('Content-Transfer-Encoding: binary', true);
79
-		header('Pragma: public');// enable caching in IE
79
+		header('Pragma: public'); // enable caching in IE
80 80
 		header('Expires: 0');
81 81
 		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
82 82
 		$fileSize = \OC\Files\Filesystem::filesize($filename);
@@ -120,7 +120,7 @@  discard block
 block discarded – undo
120 120
 			}
121 121
 
122 122
 			if (!is_array($files)) {
123
-				$filename = $dir . '/' . $files;
123
+				$filename = $dir.'/'.$files;
124 124
 				if (!$view->is_dir($filename)) {
125 125
 					self::getSingleFile($view, $dir, $files, is_null($params) ? array() : $params);
126 126
 					return;
@@ -135,9 +135,9 @@  discard block
 block discarded – undo
135 135
 					$name = $basename;
136 136
 				}
137 137
 
138
-				$filename = $dir . '/' . $name;
138
+				$filename = $dir.'/'.$name;
139 139
 			} else {
140
-				$filename = $dir . '/' . $files;
140
+				$filename = $dir.'/'.$files;
141 141
 				$getType = self::ZIP_DIR;
142 142
 				// downloading root ?
143 143
 				if ($files !== '') {
@@ -152,13 +152,13 @@  discard block
 block discarded – undo
152 152
 				$fileInfos = array();
153 153
 				$fileSize = 0;
154 154
 				foreach ($files as $file) {
155
-					$fileInfo = \OC\Files\Filesystem::getFileInfo($dir . '/' . $file);
155
+					$fileInfo = \OC\Files\Filesystem::getFileInfo($dir.'/'.$file);
156 156
 					$fileSize += $fileInfo->getSize();
157 157
 					$fileInfos[] = $fileInfo;
158 158
 				}
159 159
 				$numberOfFiles = self::getNumberOfFiles($fileInfos);
160 160
 			} elseif ($getType === self::ZIP_DIR) {
161
-				$fileInfo = \OC\Files\Filesystem::getFileInfo($dir . '/' . $files);
161
+				$fileInfo = \OC\Files\Filesystem::getFileInfo($dir.'/'.$files);
162 162
 				$fileSize = $fileInfo->getSize();
163 163
 				$numberOfFiles = self::getNumberOfFiles(array($fileInfo));
164 164
 			}
@@ -167,7 +167,7 @@  discard block
 block discarded – undo
167 167
 			OC_Util::obEnd();
168 168
 
169 169
 			$streamer->sendHeaders($name);
170
-			$executionTime = (int)OC::$server->getIniWrapper()->getNumeric('max_execution_time');
170
+			$executionTime = (int) OC::$server->getIniWrapper()->getNumeric('max_execution_time');
171 171
 			if (strpos(@ini_get('disable_functions'), 'set_time_limit') === false) {
172 172
 				@set_time_limit(0);
173 173
 			}
@@ -175,7 +175,7 @@  discard block
 block discarded – undo
175 175
 
176 176
 			if ($getType === self::ZIP_FILES) {
177 177
 				foreach ($files as $file) {
178
-					$file = $dir . '/' . $file;
178
+					$file = $dir.'/'.$file;
179 179
 					if (\OC\Files\Filesystem::is_file($file)) {
180 180
 						$fileSize = \OC\Files\Filesystem::filesize($file);
181 181
 						$fileTime = \OC\Files\Filesystem::filemtime($file);
@@ -187,7 +187,7 @@  discard block
 block discarded – undo
187 187
 					}
188 188
 				}
189 189
 			} elseif ($getType === self::ZIP_DIR) {
190
-				$file = $dir . '/' . $files;
190
+				$file = $dir.'/'.$files;
191 191
 				$streamer->addDirRecursive($file);
192 192
 			}
193 193
 			$streamer->finalize();
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
 	 * @return array $rangeArray ('from'=>int,'to'=>int), ...
220 220
 	 */
221 221
 	private static function parseHttpRangeHeader($rangeHeaderPos, $fileSize) {
222
-		$rArray=explode(',', $rangeHeaderPos);
222
+		$rArray = explode(',', $rangeHeaderPos);
223 223
 		$minOffset = 0;
224 224
 		$ind = 0;
225 225
 
@@ -231,7 +231,7 @@  discard block
 block discarded – undo
231 231
 				if ($ranges[0] < $minOffset) { // case: bytes=500-700,601-999
232 232
 					$ranges[0] = $minOffset;
233 233
 				}
234
-				if ($ind > 0 && $rangeArray[$ind-1]['to']+1 == $ranges[0]) { // case: bytes=500-600,601-999
234
+				if ($ind > 0 && $rangeArray[$ind - 1]['to'] + 1 == $ranges[0]) { // case: bytes=500-600,601-999
235 235
 					$ind--;
236 236
 					$ranges[0] = $rangeArray[$ind]['from'];
237 237
 				}
@@ -240,9 +240,9 @@  discard block
 block discarded – undo
240 240
 			if (is_numeric($ranges[0]) && is_numeric($ranges[1]) && $ranges[0] < $fileSize && $ranges[0] <= $ranges[1]) {
241 241
 				// case: x-x
242 242
 				if ($ranges[1] >= $fileSize) {
243
-					$ranges[1] = $fileSize-1;
243
+					$ranges[1] = $fileSize - 1;
244 244
 				}
245
-				$rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $ranges[1], 'size' => $fileSize );
245
+				$rangeArray[$ind++] = array('from' => $ranges[0], 'to' => $ranges[1], 'size' => $fileSize);
246 246
 				$minOffset = $ranges[1] + 1;
247 247
 				if ($minOffset >= $fileSize) {
248 248
 					break;
@@ -250,7 +250,7 @@  discard block
 block discarded – undo
250 250
 			}
251 251
 			elseif (is_numeric($ranges[0]) && $ranges[0] < $fileSize) {
252 252
 				// case: x-
253
-				$rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $fileSize-1, 'size' => $fileSize );
253
+				$rangeArray[$ind++] = array('from' => $ranges[0], 'to' => $fileSize - 1, 'size' => $fileSize);
254 254
 				break;
255 255
 			}
256 256
 			elseif (is_numeric($ranges[1])) {
@@ -258,7 +258,7 @@  discard block
 block discarded – undo
258 258
 				if ($ranges[1] > $fileSize) {
259 259
 					$ranges[1] = $fileSize;
260 260
 				}
261
-				$rangeArray[$ind++] = array( 'from' => $fileSize-$ranges[1], 'to' => $fileSize-1, 'size' => $fileSize );
261
+				$rangeArray[$ind++] = array('from' => $fileSize - $ranges[1], 'to' => $fileSize - 1, 'size' => $fileSize);
262 262
 				break;
263 263
 			}
264 264
 		}
@@ -272,7 +272,7 @@  discard block
 block discarded – undo
272 272
 	 * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
273 273
 	 */
274 274
 	private static function getSingleFile($view, $dir, $name, $params) {
275
-		$filename = $dir . '/' . $name;
275
+		$filename = $dir.'/'.$name;
276 276
 		OC_Util::obEnd();
277 277
 		$view->lockFile($filename, ILockingProvider::LOCK_SHARED);
278 278
 		
@@ -361,17 +361,17 @@  discard block
 block discarded – undo
361 361
 	 */
362 362
 	public static function lockFiles($view, $dir, $files) {
363 363
 		if (!is_array($files)) {
364
-			$file = $dir . '/' . $files;
364
+			$file = $dir.'/'.$files;
365 365
 			$files = [$file];
366 366
 		}
367 367
 		foreach ($files as $file) {
368
-			$file = $dir . '/' . $file;
368
+			$file = $dir.'/'.$file;
369 369
 			$view->lockFile($file, ILockingProvider::LOCK_SHARED);
370 370
 			if ($view->is_dir($file)) {
371 371
 				$contents = $view->getDirectoryContent($file);
372 372
 				$contents = array_map(function($fileInfo) use ($file) {
373 373
 					/** @var \OCP\Files\FileInfo $fileInfo */
374
-					return $file . '/' . $fileInfo->getName();
374
+					return $file.'/'.$fileInfo->getName();
375 375
 				}, $contents);
376 376
 				self::lockFiles($view, $dir, $contents);
377 377
 			}
@@ -391,12 +391,12 @@  discard block
 block discarded – undo
391 391
 		}
392 392
 		if ($getType === self::ZIP_FILES) {
393 393
 			foreach ($files as $file) {
394
-				$file = $dir . '/' . $file;
394
+				$file = $dir.'/'.$file;
395 395
 				$view->unlockFile($file, ILockingProvider::LOCK_SHARED);
396 396
 			}
397 397
 		}
398 398
 		if ($getType === self::ZIP_DIR) {
399
-			$file = $dir . '/' . $files;
399
+			$file = $dir.'/'.$files;
400 400
 			$view->unlockFile($file, ILockingProvider::LOCK_SHARED);
401 401
 		}
402 402
 	}
Please login to merge, or discard this patch.
lib/private/legacy/filechunking.php 2 patches
Indentation   +152 added lines, -152 removed lines patch added patch discarded remove patch
@@ -30,156 +30,156 @@
 block discarded – undo
30 30
 
31 31
 
32 32
 class OC_FileChunking {
33
-	protected $info;
34
-	protected $cache;
35
-
36
-	/**
37
-	 * TTL of chunks
38
-	 *
39
-	 * @var int
40
-	 */
41
-	protected $ttl;
42
-
43
-	static public function decodeName($name) {
44
-		preg_match('/(?P<name>.*)-chunking-(?P<transferid>\d+)-(?P<chunkcount>\d+)-(?P<index>\d+)/', $name, $matches);
45
-		return $matches;
46
-	}
47
-
48
-	/**
49
-	 * @param string[] $info
50
-	 */
51
-	public function __construct($info) {
52
-		$this->info = $info;
53
-		$this->ttl = \OC::$server->getConfig()->getSystemValue('cache_chunk_gc_ttl', 86400);
54
-	}
55
-
56
-	public function getPrefix() {
57
-		$name = $this->info['name'];
58
-		$transferid = $this->info['transferid'];
59
-
60
-		return $name.'-chunking-'.$transferid.'-';
61
-	}
62
-
63
-	protected function getCache() {
64
-		if (!isset($this->cache)) {
65
-			$this->cache = new \OC\Cache\File();
66
-		}
67
-		return $this->cache;
68
-	}
69
-
70
-	/**
71
-	 * Stores the given $data under the given $key - the number of stored bytes is returned
72
-	 *
73
-	 * @param string $index
74
-	 * @param resource $data
75
-	 * @return int
76
-	 */
77
-	public function store($index, $data) {
78
-		$cache = $this->getCache();
79
-		$name = $this->getPrefix().$index;
80
-		$cache->set($name, $data, $this->ttl);
81
-
82
-		return $cache->size($name);
83
-	}
84
-
85
-	public function isComplete() {
86
-		$prefix = $this->getPrefix();
87
-		$cache = $this->getCache();
88
-		$chunkcount = (int)$this->info['chunkcount'];
89
-
90
-		for($i=($chunkcount-1); $i >= 0; $i--) {
91
-			if (!$cache->hasKey($prefix.$i)) {
92
-				return false;
93
-			}
94
-		}
95
-
96
-		return true;
97
-	}
98
-
99
-	/**
100
-	 * Assembles the chunks into the file specified by the path.
101
-	 * Chunks are deleted afterwards.
102
-	 *
103
-	 * @param resource $f target path
104
-	 *
105
-	 * @return integer assembled file size
106
-	 *
107
-	 * @throws \OC\InsufficientStorageException when file could not be fully
108
-	 * assembled due to lack of free space
109
-	 */
110
-	public function assemble($f) {
111
-		$cache = $this->getCache();
112
-		$prefix = $this->getPrefix();
113
-		$count = 0;
114
-		for ($i = 0; $i < $this->info['chunkcount']; $i++) {
115
-			$chunk = $cache->get($prefix.$i);
116
-			// remove after reading to directly save space
117
-			$cache->remove($prefix.$i);
118
-			$count += fwrite($f, $chunk);
119
-			// let php release the memory to work around memory exhausted error with php 5.6
120
-			$chunk = null;
121
-		}
122
-
123
-		return $count;
124
-	}
125
-
126
-	/**
127
-	 * Returns the size of the chunks already present
128
-	 * @return integer size in bytes
129
-	 */
130
-	public function getCurrentSize() {
131
-		$cache = $this->getCache();
132
-		$prefix = $this->getPrefix();
133
-		$total = 0;
134
-		for ($i = 0; $i < $this->info['chunkcount']; $i++) {
135
-			$total += $cache->size($prefix.$i);
136
-		}
137
-		return $total;
138
-	}
139
-
140
-	/**
141
-	 * Removes all chunks which belong to this transmission
142
-	 */
143
-	public function cleanup() {
144
-		$cache = $this->getCache();
145
-		$prefix = $this->getPrefix();
146
-		for($i=0; $i < $this->info['chunkcount']; $i++) {
147
-			$cache->remove($prefix.$i);
148
-		}
149
-	}
150
-
151
-	/**
152
-	 * Removes one specific chunk
153
-	 * @param string $index
154
-	 */
155
-	public function remove($index) {
156
-		$cache = $this->getCache();
157
-		$prefix = $this->getPrefix();
158
-		$cache->remove($prefix.$index);
159
-	}
160
-
161
-	/**
162
-	 * Assembles the chunks into the file specified by the path.
163
-	 * Also triggers the relevant hooks and proxies.
164
-	 *
165
-	 * @param \OC\Files\Storage\Storage $storage storage
166
-	 * @param string $path target path relative to the storage
167
-	 * @return bool true on success or false if file could not be created
168
-	 *
169
-	 * @throws \OC\ServerNotAvailableException
170
-	 */
171
-	public function file_assemble($storage, $path) {
172
-		// use file_put_contents as method because that best matches what this function does
173
-		if (\OC\Files\Filesystem::isValidPath($path)) {
174
-			$target = $storage->fopen($path, 'w');
175
-			if ($target) {
176
-				$count = $this->assemble($target);
177
-				fclose($target);
178
-				return $count > 0;
179
-			} else {
180
-				return false;
181
-			}
182
-		}
183
-		return false;
184
-	}
33
+    protected $info;
34
+    protected $cache;
35
+
36
+    /**
37
+     * TTL of chunks
38
+     *
39
+     * @var int
40
+     */
41
+    protected $ttl;
42
+
43
+    static public function decodeName($name) {
44
+        preg_match('/(?P<name>.*)-chunking-(?P<transferid>\d+)-(?P<chunkcount>\d+)-(?P<index>\d+)/', $name, $matches);
45
+        return $matches;
46
+    }
47
+
48
+    /**
49
+     * @param string[] $info
50
+     */
51
+    public function __construct($info) {
52
+        $this->info = $info;
53
+        $this->ttl = \OC::$server->getConfig()->getSystemValue('cache_chunk_gc_ttl', 86400);
54
+    }
55
+
56
+    public function getPrefix() {
57
+        $name = $this->info['name'];
58
+        $transferid = $this->info['transferid'];
59
+
60
+        return $name.'-chunking-'.$transferid.'-';
61
+    }
62
+
63
+    protected function getCache() {
64
+        if (!isset($this->cache)) {
65
+            $this->cache = new \OC\Cache\File();
66
+        }
67
+        return $this->cache;
68
+    }
69
+
70
+    /**
71
+     * Stores the given $data under the given $key - the number of stored bytes is returned
72
+     *
73
+     * @param string $index
74
+     * @param resource $data
75
+     * @return int
76
+     */
77
+    public function store($index, $data) {
78
+        $cache = $this->getCache();
79
+        $name = $this->getPrefix().$index;
80
+        $cache->set($name, $data, $this->ttl);
81
+
82
+        return $cache->size($name);
83
+    }
84
+
85
+    public function isComplete() {
86
+        $prefix = $this->getPrefix();
87
+        $cache = $this->getCache();
88
+        $chunkcount = (int)$this->info['chunkcount'];
89
+
90
+        for($i=($chunkcount-1); $i >= 0; $i--) {
91
+            if (!$cache->hasKey($prefix.$i)) {
92
+                return false;
93
+            }
94
+        }
95
+
96
+        return true;
97
+    }
98
+
99
+    /**
100
+     * Assembles the chunks into the file specified by the path.
101
+     * Chunks are deleted afterwards.
102
+     *
103
+     * @param resource $f target path
104
+     *
105
+     * @return integer assembled file size
106
+     *
107
+     * @throws \OC\InsufficientStorageException when file could not be fully
108
+     * assembled due to lack of free space
109
+     */
110
+    public function assemble($f) {
111
+        $cache = $this->getCache();
112
+        $prefix = $this->getPrefix();
113
+        $count = 0;
114
+        for ($i = 0; $i < $this->info['chunkcount']; $i++) {
115
+            $chunk = $cache->get($prefix.$i);
116
+            // remove after reading to directly save space
117
+            $cache->remove($prefix.$i);
118
+            $count += fwrite($f, $chunk);
119
+            // let php release the memory to work around memory exhausted error with php 5.6
120
+            $chunk = null;
121
+        }
122
+
123
+        return $count;
124
+    }
125
+
126
+    /**
127
+     * Returns the size of the chunks already present
128
+     * @return integer size in bytes
129
+     */
130
+    public function getCurrentSize() {
131
+        $cache = $this->getCache();
132
+        $prefix = $this->getPrefix();
133
+        $total = 0;
134
+        for ($i = 0; $i < $this->info['chunkcount']; $i++) {
135
+            $total += $cache->size($prefix.$i);
136
+        }
137
+        return $total;
138
+    }
139
+
140
+    /**
141
+     * Removes all chunks which belong to this transmission
142
+     */
143
+    public function cleanup() {
144
+        $cache = $this->getCache();
145
+        $prefix = $this->getPrefix();
146
+        for($i=0; $i < $this->info['chunkcount']; $i++) {
147
+            $cache->remove($prefix.$i);
148
+        }
149
+    }
150
+
151
+    /**
152
+     * Removes one specific chunk
153
+     * @param string $index
154
+     */
155
+    public function remove($index) {
156
+        $cache = $this->getCache();
157
+        $prefix = $this->getPrefix();
158
+        $cache->remove($prefix.$index);
159
+    }
160
+
161
+    /**
162
+     * Assembles the chunks into the file specified by the path.
163
+     * Also triggers the relevant hooks and proxies.
164
+     *
165
+     * @param \OC\Files\Storage\Storage $storage storage
166
+     * @param string $path target path relative to the storage
167
+     * @return bool true on success or false if file could not be created
168
+     *
169
+     * @throws \OC\ServerNotAvailableException
170
+     */
171
+    public function file_assemble($storage, $path) {
172
+        // use file_put_contents as method because that best matches what this function does
173
+        if (\OC\Files\Filesystem::isValidPath($path)) {
174
+            $target = $storage->fopen($path, 'w');
175
+            if ($target) {
176
+                $count = $this->assemble($target);
177
+                fclose($target);
178
+                return $count > 0;
179
+            } else {
180
+                return false;
181
+            }
182
+        }
183
+        return false;
184
+    }
185 185
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -85,9 +85,9 @@  discard block
 block discarded – undo
85 85
 	public function isComplete() {
86 86
 		$prefix = $this->getPrefix();
87 87
 		$cache = $this->getCache();
88
-		$chunkcount = (int)$this->info['chunkcount'];
88
+		$chunkcount = (int) $this->info['chunkcount'];
89 89
 
90
-		for($i=($chunkcount-1); $i >= 0; $i--) {
90
+		for ($i = ($chunkcount - 1); $i >= 0; $i--) {
91 91
 			if (!$cache->hasKey($prefix.$i)) {
92 92
 				return false;
93 93
 			}
@@ -143,7 +143,7 @@  discard block
 block discarded – undo
143 143
 	public function cleanup() {
144 144
 		$cache = $this->getCache();
145 145
 		$prefix = $this->getPrefix();
146
-		for($i=0; $i < $this->info['chunkcount']; $i++) {
146
+		for ($i = 0; $i < $this->info['chunkcount']; $i++) {
147 147
 			$cache->remove($prefix.$i);
148 148
 		}
149 149
 	}
Please login to merge, or discard this patch.
lib/private/legacy/hook.php 3 patches
Indentation   +103 added lines, -103 removed lines patch added patch discarded remove patch
@@ -29,118 +29,118 @@
 block discarded – undo
29 29
  *
30 30
  */
31 31
 class OC_Hook{
32
-	public static $thrownExceptions = [];
32
+    public static $thrownExceptions = [];
33 33
 
34
-	static private $registered = array();
34
+    static private $registered = array();
35 35
 
36
-	/**
37
-	 * connects a function to a hook
38
-	 *
39
-	 * @param string $signalClass class name of emitter
40
-	 * @param string $signalName name of signal
41
-	 * @param string|object $slotClass class name of slot
42
-	 * @param string $slotName name of slot
43
-	 * @return bool
44
-	 *
45
-	 * This function makes it very easy to connect to use hooks.
46
-	 *
47
-	 * TODO: write example
48
-	 */
49
-	static public function connect($signalClass, $signalName, $slotClass, $slotName ) {
50
-		// If we're trying to connect to an emitting class that isn't
51
-		// yet registered, register it
52
-		if( !array_key_exists($signalClass, self::$registered )) {
53
-			self::$registered[$signalClass] = array();
54
-		}
55
-		// If we're trying to connect to an emitting method that isn't
56
-		// yet registered, register it with the emitting class
57
-		if( !array_key_exists( $signalName, self::$registered[$signalClass] )) {
58
-			self::$registered[$signalClass][$signalName] = array();
59
-		}
36
+    /**
37
+     * connects a function to a hook
38
+     *
39
+     * @param string $signalClass class name of emitter
40
+     * @param string $signalName name of signal
41
+     * @param string|object $slotClass class name of slot
42
+     * @param string $slotName name of slot
43
+     * @return bool
44
+     *
45
+     * This function makes it very easy to connect to use hooks.
46
+     *
47
+     * TODO: write example
48
+     */
49
+    static public function connect($signalClass, $signalName, $slotClass, $slotName ) {
50
+        // If we're trying to connect to an emitting class that isn't
51
+        // yet registered, register it
52
+        if( !array_key_exists($signalClass, self::$registered )) {
53
+            self::$registered[$signalClass] = array();
54
+        }
55
+        // If we're trying to connect to an emitting method that isn't
56
+        // yet registered, register it with the emitting class
57
+        if( !array_key_exists( $signalName, self::$registered[$signalClass] )) {
58
+            self::$registered[$signalClass][$signalName] = array();
59
+        }
60 60
 
61
-		// don't connect hooks twice
62
-		foreach (self::$registered[$signalClass][$signalName] as $hook) {
63
-			if ($hook['class'] === $slotClass and $hook['name'] === $slotName) {
64
-				return false;
65
-			}
66
-		}
67
-		// Connect the hook handler to the requested emitter
68
-		self::$registered[$signalClass][$signalName][] = array(
69
-				"class" => $slotClass,
70
-				"name" => $slotName
71
-		);
61
+        // don't connect hooks twice
62
+        foreach (self::$registered[$signalClass][$signalName] as $hook) {
63
+            if ($hook['class'] === $slotClass and $hook['name'] === $slotName) {
64
+                return false;
65
+            }
66
+        }
67
+        // Connect the hook handler to the requested emitter
68
+        self::$registered[$signalClass][$signalName][] = array(
69
+                "class" => $slotClass,
70
+                "name" => $slotName
71
+        );
72 72
 
73
-		// No chance for failure ;-)
74
-		return true;
75
-	}
73
+        // No chance for failure ;-)
74
+        return true;
75
+    }
76 76
 
77
-	/**
78
-	 * emits a signal
79
-	 *
80
-	 * @param string $signalClass class name of emitter
81
-	 * @param string $signalName name of signal
82
-	 * @param mixed $params default: array() array with additional data
83
-	 * @return bool true if slots exists or false if not
84
-	 * @throws \OC\HintException
85
-	 * @throws \OC\ServerNotAvailableException Emits a signal. To get data from the slot use references!
86
-	 *
87
-	 * TODO: write example
88
-	 */
89
-	static public function emit($signalClass, $signalName, $params = []) {
77
+    /**
78
+     * emits a signal
79
+     *
80
+     * @param string $signalClass class name of emitter
81
+     * @param string $signalName name of signal
82
+     * @param mixed $params default: array() array with additional data
83
+     * @return bool true if slots exists or false if not
84
+     * @throws \OC\HintException
85
+     * @throws \OC\ServerNotAvailableException Emits a signal. To get data from the slot use references!
86
+     *
87
+     * TODO: write example
88
+     */
89
+    static public function emit($signalClass, $signalName, $params = []) {
90 90
 
91
-		// Return false if no hook handlers are listening to this
92
-		// emitting class
93
-		if( !array_key_exists($signalClass, self::$registered )) {
94
-			return false;
95
-		}
91
+        // Return false if no hook handlers are listening to this
92
+        // emitting class
93
+        if( !array_key_exists($signalClass, self::$registered )) {
94
+            return false;
95
+        }
96 96
 
97
-		// Return false if no hook handlers are listening to this
98
-		// emitting method
99
-		if( !array_key_exists( $signalName, self::$registered[$signalClass] )) {
100
-			return false;
101
-		}
97
+        // Return false if no hook handlers are listening to this
98
+        // emitting method
99
+        if( !array_key_exists( $signalName, self::$registered[$signalClass] )) {
100
+            return false;
101
+        }
102 102
 
103
-		// Call all slots
104
-		foreach( self::$registered[$signalClass][$signalName] as $i ) {
105
-			try {
106
-				call_user_func( array( $i["class"], $i["name"] ), $params );
107
-			} catch (Exception $e){
108
-				self::$thrownExceptions[] = $e;
109
-				\OC::$server->getLogger()->logException($e);
110
-				if($e instanceof \OC\HintException) {
111
-					throw $e;
112
-				}
113
-				if($e instanceof \OC\ServerNotAvailableException) {
114
-					throw $e;
115
-				}
116
-			}
117
-		}
103
+        // Call all slots
104
+        foreach( self::$registered[$signalClass][$signalName] as $i ) {
105
+            try {
106
+                call_user_func( array( $i["class"], $i["name"] ), $params );
107
+            } catch (Exception $e){
108
+                self::$thrownExceptions[] = $e;
109
+                \OC::$server->getLogger()->logException($e);
110
+                if($e instanceof \OC\HintException) {
111
+                    throw $e;
112
+                }
113
+                if($e instanceof \OC\ServerNotAvailableException) {
114
+                    throw $e;
115
+                }
116
+            }
117
+        }
118 118
 
119
-		return true;
120
-	}
119
+        return true;
120
+    }
121 121
 
122
-	/**
123
-	 * clear hooks
124
-	 * @param string $signalClass
125
-	 * @param string $signalName
126
-	 */
127
-	static public function clear($signalClass='', $signalName='') {
128
-		if ($signalClass) {
129
-			if ($signalName) {
130
-				self::$registered[$signalClass][$signalName]=array();
131
-			}else{
132
-				self::$registered[$signalClass]=array();
133
-			}
134
-		}else{
135
-			self::$registered=array();
136
-		}
137
-	}
122
+    /**
123
+     * clear hooks
124
+     * @param string $signalClass
125
+     * @param string $signalName
126
+     */
127
+    static public function clear($signalClass='', $signalName='') {
128
+        if ($signalClass) {
129
+            if ($signalName) {
130
+                self::$registered[$signalClass][$signalName]=array();
131
+            }else{
132
+                self::$registered[$signalClass]=array();
133
+            }
134
+        }else{
135
+            self::$registered=array();
136
+        }
137
+    }
138 138
 
139
-	/**
140
-	 * DO NOT USE!
141
-	 * For unit tests ONLY!
142
-	 */
143
-	static public function getHooks() {
144
-		return self::$registered;
145
-	}
139
+    /**
140
+     * DO NOT USE!
141
+     * For unit tests ONLY!
142
+     */
143
+    static public function getHooks() {
144
+        return self::$registered;
145
+    }
146 146
 }
Please login to merge, or discard this patch.
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -28,7 +28,7 @@  discard block
 block discarded – undo
28 28
  * along with this program.  If not, see <http://www.gnu.org/licenses/>
29 29
  *
30 30
  */
31
-class OC_Hook{
31
+class OC_Hook {
32 32
 	public static $thrownExceptions = [];
33 33
 
34 34
 	static private $registered = array();
@@ -46,15 +46,15 @@  discard block
 block discarded – undo
46 46
 	 *
47 47
 	 * TODO: write example
48 48
 	 */
49
-	static public function connect($signalClass, $signalName, $slotClass, $slotName ) {
49
+	static public function connect($signalClass, $signalName, $slotClass, $slotName) {
50 50
 		// If we're trying to connect to an emitting class that isn't
51 51
 		// yet registered, register it
52
-		if( !array_key_exists($signalClass, self::$registered )) {
52
+		if (!array_key_exists($signalClass, self::$registered)) {
53 53
 			self::$registered[$signalClass] = array();
54 54
 		}
55 55
 		// If we're trying to connect to an emitting method that isn't
56 56
 		// yet registered, register it with the emitting class
57
-		if( !array_key_exists( $signalName, self::$registered[$signalClass] )) {
57
+		if (!array_key_exists($signalName, self::$registered[$signalClass])) {
58 58
 			self::$registered[$signalClass][$signalName] = array();
59 59
 		}
60 60
 
@@ -90,27 +90,27 @@  discard block
 block discarded – undo
90 90
 
91 91
 		// Return false if no hook handlers are listening to this
92 92
 		// emitting class
93
-		if( !array_key_exists($signalClass, self::$registered )) {
93
+		if (!array_key_exists($signalClass, self::$registered)) {
94 94
 			return false;
95 95
 		}
96 96
 
97 97
 		// Return false if no hook handlers are listening to this
98 98
 		// emitting method
99
-		if( !array_key_exists( $signalName, self::$registered[$signalClass] )) {
99
+		if (!array_key_exists($signalName, self::$registered[$signalClass])) {
100 100
 			return false;
101 101
 		}
102 102
 
103 103
 		// Call all slots
104
-		foreach( self::$registered[$signalClass][$signalName] as $i ) {
104
+		foreach (self::$registered[$signalClass][$signalName] as $i) {
105 105
 			try {
106
-				call_user_func( array( $i["class"], $i["name"] ), $params );
107
-			} catch (Exception $e){
106
+				call_user_func(array($i["class"], $i["name"]), $params);
107
+			} catch (Exception $e) {
108 108
 				self::$thrownExceptions[] = $e;
109 109
 				\OC::$server->getLogger()->logException($e);
110
-				if($e instanceof \OC\HintException) {
110
+				if ($e instanceof \OC\HintException) {
111 111
 					throw $e;
112 112
 				}
113
-				if($e instanceof \OC\ServerNotAvailableException) {
113
+				if ($e instanceof \OC\ServerNotAvailableException) {
114 114
 					throw $e;
115 115
 				}
116 116
 			}
@@ -124,15 +124,15 @@  discard block
 block discarded – undo
124 124
 	 * @param string $signalClass
125 125
 	 * @param string $signalName
126 126
 	 */
127
-	static public function clear($signalClass='', $signalName='') {
127
+	static public function clear($signalClass = '', $signalName = '') {
128 128
 		if ($signalClass) {
129 129
 			if ($signalName) {
130
-				self::$registered[$signalClass][$signalName]=array();
131
-			}else{
132
-				self::$registered[$signalClass]=array();
130
+				self::$registered[$signalClass][$signalName] = array();
131
+			} else {
132
+				self::$registered[$signalClass] = array();
133 133
 			}
134
-		}else{
135
-			self::$registered=array();
134
+		} else {
135
+			self::$registered = array();
136 136
 		}
137 137
 	}
138 138
 
Please login to merge, or discard this patch.
Braces   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -128,10 +128,10 @@
 block discarded – undo
128 128
 		if ($signalClass) {
129 129
 			if ($signalName) {
130 130
 				self::$registered[$signalClass][$signalName]=array();
131
-			}else{
131
+			} else{
132 132
 				self::$registered[$signalClass]=array();
133 133
 			}
134
-		}else{
134
+		} else{
135 135
 			self::$registered=array();
136 136
 		}
137 137
 	}
Please login to merge, or discard this patch.
lib/private/legacy/helper.php 3 patches
Braces   +3 added lines, -2 removed lines patch added patch discarded remove patch
@@ -271,8 +271,9 @@
 block discarded – undo
271 271
 		}
272 272
 		foreach ($dirs as $dir) {
273 273
 			foreach ($exts as $ext) {
274
-				if ($check_fn("$dir/$name" . $ext))
275
-					return true;
274
+				if ($check_fn("$dir/$name" . $ext)) {
275
+									return true;
276
+				}
276 277
 			}
277 278
 		}
278 279
 		return false;
Please login to merge, or discard this patch.
Indentation   +547 added lines, -547 removed lines patch added patch discarded remove patch
@@ -49,551 +49,551 @@
 block discarded – undo
49 49
  * Collection of useful functions
50 50
  */
51 51
 class OC_Helper {
52
-	private static $templateManager;
53
-
54
-	/**
55
-	 * Make a human file size
56
-	 * @param int $bytes file size in bytes
57
-	 * @return string a human readable file size
58
-	 *
59
-	 * Makes 2048 to 2 kB.
60
-	 */
61
-	public static function humanFileSize($bytes) {
62
-		if ($bytes < 0) {
63
-			return "?";
64
-		}
65
-		if ($bytes < 1024) {
66
-			return "$bytes B";
67
-		}
68
-		$bytes = round($bytes / 1024, 0);
69
-		if ($bytes < 1024) {
70
-			return "$bytes KB";
71
-		}
72
-		$bytes = round($bytes / 1024, 1);
73
-		if ($bytes < 1024) {
74
-			return "$bytes MB";
75
-		}
76
-		$bytes = round($bytes / 1024, 1);
77
-		if ($bytes < 1024) {
78
-			return "$bytes GB";
79
-		}
80
-		$bytes = round($bytes / 1024, 1);
81
-		if ($bytes < 1024) {
82
-			return "$bytes TB";
83
-		}
84
-
85
-		$bytes = round($bytes / 1024, 1);
86
-		return "$bytes PB";
87
-	}
88
-
89
-	/**
90
-	 * Make a computer file size
91
-	 * @param string $str file size in human readable format
92
-	 * @return float|bool a file size in bytes
93
-	 *
94
-	 * Makes 2kB to 2048.
95
-	 *
96
-	 * Inspired by: http://www.php.net/manual/en/function.filesize.php#92418
97
-	 */
98
-	public static function computerFileSize($str) {
99
-		$str = strtolower($str);
100
-		if (is_numeric($str)) {
101
-			return (float)$str;
102
-		}
103
-
104
-		$bytes_array = array(
105
-			'b' => 1,
106
-			'k' => 1024,
107
-			'kb' => 1024,
108
-			'mb' => 1024 * 1024,
109
-			'm' => 1024 * 1024,
110
-			'gb' => 1024 * 1024 * 1024,
111
-			'g' => 1024 * 1024 * 1024,
112
-			'tb' => 1024 * 1024 * 1024 * 1024,
113
-			't' => 1024 * 1024 * 1024 * 1024,
114
-			'pb' => 1024 * 1024 * 1024 * 1024 * 1024,
115
-			'p' => 1024 * 1024 * 1024 * 1024 * 1024,
116
-		);
117
-
118
-		$bytes = (float)$str;
119
-
120
-		if (preg_match('#([kmgtp]?b?)$#si', $str, $matches) && !empty($bytes_array[$matches[1]])) {
121
-			$bytes *= $bytes_array[$matches[1]];
122
-		} else {
123
-			return false;
124
-		}
125
-
126
-		$bytes = round($bytes);
127
-
128
-		return $bytes;
129
-	}
130
-
131
-	/**
132
-	 * Recursive copying of folders
133
-	 * @param string $src source folder
134
-	 * @param string $dest target folder
135
-	 *
136
-	 */
137
-	static function copyr($src, $dest) {
138
-		if (is_dir($src)) {
139
-			if (!is_dir($dest)) {
140
-				mkdir($dest);
141
-			}
142
-			$files = scandir($src);
143
-			foreach ($files as $file) {
144
-				if ($file != "." && $file != "..") {
145
-					self::copyr("$src/$file", "$dest/$file");
146
-				}
147
-			}
148
-		} elseif (file_exists($src) && !\OC\Files\Filesystem::isFileBlacklisted($src)) {
149
-			copy($src, $dest);
150
-		}
151
-	}
152
-
153
-	/**
154
-	 * Recursive deletion of folders
155
-	 * @param string $dir path to the folder
156
-	 * @param bool $deleteSelf if set to false only the content of the folder will be deleted
157
-	 * @return bool
158
-	 */
159
-	static function rmdirr($dir, $deleteSelf = true) {
160
-		if (is_dir($dir)) {
161
-			$files = new RecursiveIteratorIterator(
162
-				new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
163
-				RecursiveIteratorIterator::CHILD_FIRST
164
-			);
165
-
166
-			foreach ($files as $fileInfo) {
167
-				/** @var SplFileInfo $fileInfo */
168
-				if ($fileInfo->isLink()) {
169
-					unlink($fileInfo->getPathname());
170
-				} else if ($fileInfo->isDir()) {
171
-					rmdir($fileInfo->getRealPath());
172
-				} else {
173
-					unlink($fileInfo->getRealPath());
174
-				}
175
-			}
176
-			if ($deleteSelf) {
177
-				rmdir($dir);
178
-			}
179
-		} elseif (file_exists($dir)) {
180
-			if ($deleteSelf) {
181
-				unlink($dir);
182
-			}
183
-		}
184
-		if (!$deleteSelf) {
185
-			return true;
186
-		}
187
-
188
-		return !file_exists($dir);
189
-	}
190
-
191
-	/**
192
-	 * @return \OC\Files\Type\TemplateManager
193
-	 */
194
-	static public function getFileTemplateManager() {
195
-		if (!self::$templateManager) {
196
-			self::$templateManager = new \OC\Files\Type\TemplateManager();
197
-		}
198
-		return self::$templateManager;
199
-	}
200
-
201
-	/**
202
-	 * detect if a given program is found in the search PATH
203
-	 *
204
-	 * @param string $name
205
-	 * @param bool $path
206
-	 * @internal param string $program name
207
-	 * @internal param string $optional search path, defaults to $PATH
208
-	 * @return bool    true if executable program found in path
209
-	 */
210
-	public static function canExecute($name, $path = false) {
211
-		// path defaults to PATH from environment if not set
212
-		if ($path === false) {
213
-			$path = getenv("PATH");
214
-		}
215
-		// we look for an executable file of that name
216
-		$exts = [""];
217
-		$check_fn = "is_executable";
218
-		// Default check will be done with $path directories :
219
-		$dirs = explode(PATH_SEPARATOR, $path);
220
-		// WARNING : We have to check if open_basedir is enabled :
221
-		$obd = OC::$server->getIniWrapper()->getString('open_basedir');
222
-		if ($obd != "none") {
223
-			$obd_values = explode(PATH_SEPARATOR, $obd);
224
-			if (count($obd_values) > 0 and $obd_values[0]) {
225
-				// open_basedir is in effect !
226
-				// We need to check if the program is in one of these dirs :
227
-				$dirs = $obd_values;
228
-			}
229
-		}
230
-		foreach ($dirs as $dir) {
231
-			foreach ($exts as $ext) {
232
-				if ($check_fn("$dir/$name" . $ext))
233
-					return true;
234
-			}
235
-		}
236
-		return false;
237
-	}
238
-
239
-	/**
240
-	 * copy the contents of one stream to another
241
-	 *
242
-	 * @param resource $source
243
-	 * @param resource $target
244
-	 * @return array the number of bytes copied and result
245
-	 */
246
-	public static function streamCopy($source, $target) {
247
-		if (!$source or !$target) {
248
-			return array(0, false);
249
-		}
250
-		$bufSize = 8192;
251
-		$result = true;
252
-		$count = 0;
253
-		while (!feof($source)) {
254
-			$buf = fread($source, $bufSize);
255
-			$bytesWritten = fwrite($target, $buf);
256
-			if ($bytesWritten !== false) {
257
-				$count += $bytesWritten;
258
-			}
259
-			// note: strlen is expensive so only use it when necessary,
260
-			// on the last block
261
-			if ($bytesWritten === false
262
-				|| ($bytesWritten < $bufSize && $bytesWritten < strlen($buf))
263
-			) {
264
-				// write error, could be disk full ?
265
-				$result = false;
266
-				break;
267
-			}
268
-		}
269
-		return array($count, $result);
270
-	}
271
-
272
-	/**
273
-	 * Adds a suffix to the name in case the file exists
274
-	 *
275
-	 * @param string $path
276
-	 * @param string $filename
277
-	 * @return string
278
-	 */
279
-	public static function buildNotExistingFileName($path, $filename) {
280
-		$view = \OC\Files\Filesystem::getView();
281
-		return self::buildNotExistingFileNameForView($path, $filename, $view);
282
-	}
283
-
284
-	/**
285
-	 * Adds a suffix to the name in case the file exists
286
-	 *
287
-	 * @param string $path
288
-	 * @param string $filename
289
-	 * @return string
290
-	 */
291
-	public static function buildNotExistingFileNameForView($path, $filename, \OC\Files\View $view) {
292
-		if ($path === '/') {
293
-			$path = '';
294
-		}
295
-		if ($pos = strrpos($filename, '.')) {
296
-			$name = substr($filename, 0, $pos);
297
-			$ext = substr($filename, $pos);
298
-		} else {
299
-			$name = $filename;
300
-			$ext = '';
301
-		}
302
-
303
-		$newpath = $path . '/' . $filename;
304
-		if ($view->file_exists($newpath)) {
305
-			if (preg_match_all('/\((\d+)\)/', $name, $matches, PREG_OFFSET_CAPTURE)) {
306
-				//Replace the last "(number)" with "(number+1)"
307
-				$last_match = count($matches[0]) - 1;
308
-				$counter = $matches[1][$last_match][0] + 1;
309
-				$offset = $matches[0][$last_match][1];
310
-				$match_length = strlen($matches[0][$last_match][0]);
311
-			} else {
312
-				$counter = 2;
313
-				$match_length = 0;
314
-				$offset = false;
315
-			}
316
-			do {
317
-				if ($offset) {
318
-					//Replace the last "(number)" with "(number+1)"
319
-					$newname = substr_replace($name, '(' . $counter . ')', $offset, $match_length);
320
-				} else {
321
-					$newname = $name . ' (' . $counter . ')';
322
-				}
323
-				$newpath = $path . '/' . $newname . $ext;
324
-				$counter++;
325
-			} while ($view->file_exists($newpath));
326
-		}
327
-
328
-		return $newpath;
329
-	}
330
-
331
-	/**
332
-	 * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
333
-	 *
334
-	 * @param array $input The array to work on
335
-	 * @param int $case Either MB_CASE_UPPER or MB_CASE_LOWER (default)
336
-	 * @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
337
-	 * @return array
338
-	 *
339
-	 * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
340
-	 * based on http://www.php.net/manual/en/function.array-change-key-case.php#107715
341
-	 *
342
-	 */
343
-	public static function mb_array_change_key_case($input, $case = MB_CASE_LOWER, $encoding = 'UTF-8') {
344
-		$case = ($case != MB_CASE_UPPER) ? MB_CASE_LOWER : MB_CASE_UPPER;
345
-		$ret = array();
346
-		foreach ($input as $k => $v) {
347
-			$ret[mb_convert_case($k, $case, $encoding)] = $v;
348
-		}
349
-		return $ret;
350
-	}
351
-
352
-	/**
353
-	 * performs a search in a nested array
354
-	 * @param array $haystack the array to be searched
355
-	 * @param string $needle the search string
356
-	 * @param mixed $index optional, only search this key name
357
-	 * @return mixed the key of the matching field, otherwise false
358
-	 *
359
-	 * performs a search in a nested array
360
-	 *
361
-	 * taken from http://www.php.net/manual/en/function.array-search.php#97645
362
-	 */
363
-	public static function recursiveArraySearch($haystack, $needle, $index = null) {
364
-		$aIt = new RecursiveArrayIterator($haystack);
365
-		$it = new RecursiveIteratorIterator($aIt);
366
-
367
-		while ($it->valid()) {
368
-			if (((isset($index) AND ($it->key() == $index)) OR !isset($index)) AND ($it->current() == $needle)) {
369
-				return $aIt->key();
370
-			}
371
-
372
-			$it->next();
373
-		}
374
-
375
-		return false;
376
-	}
377
-
378
-	/**
379
-	 * calculates the maximum upload size respecting system settings, free space and user quota
380
-	 *
381
-	 * @param string $dir the current folder where the user currently operates
382
-	 * @param int $freeSpace the number of bytes free on the storage holding $dir, if not set this will be received from the storage directly
383
-	 * @return int number of bytes representing
384
-	 */
385
-	public static function maxUploadFilesize($dir, $freeSpace = null) {
386
-		if (is_null($freeSpace) || $freeSpace < 0){
387
-			$freeSpace = self::freeSpace($dir);
388
-		}
389
-		return min($freeSpace, self::uploadLimit());
390
-	}
391
-
392
-	/**
393
-	 * Calculate free space left within user quota
394
-	 *
395
-	 * @param string $dir the current folder where the user currently operates
396
-	 * @return int number of bytes representing
397
-	 */
398
-	public static function freeSpace($dir) {
399
-		$freeSpace = \OC\Files\Filesystem::free_space($dir);
400
-		if ($freeSpace < \OCP\Files\FileInfo::SPACE_UNLIMITED) {
401
-			$freeSpace = max($freeSpace, 0);
402
-			return $freeSpace;
403
-		} else {
404
-			return (INF > 0)? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
405
-		}
406
-	}
407
-
408
-	/**
409
-	 * Calculate PHP upload limit
410
-	 *
411
-	 * @return int PHP upload file size limit
412
-	 */
413
-	public static function uploadLimit() {
414
-		$ini = \OC::$server->getIniWrapper();
415
-		$upload_max_filesize = OCP\Util::computerFileSize($ini->get('upload_max_filesize'));
416
-		$post_max_size = OCP\Util::computerFileSize($ini->get('post_max_size'));
417
-		if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) {
418
-			return INF;
419
-		} elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) {
420
-			return max($upload_max_filesize, $post_max_size); //only the non 0 value counts
421
-		} else {
422
-			return min($upload_max_filesize, $post_max_size);
423
-		}
424
-	}
425
-
426
-	/**
427
-	 * Checks if a function is available
428
-	 *
429
-	 * @param string $function_name
430
-	 * @return bool
431
-	 */
432
-	public static function is_function_enabled($function_name) {
433
-		if (!function_exists($function_name)) {
434
-			return false;
435
-		}
436
-		$ini = \OC::$server->getIniWrapper();
437
-		$disabled = explode(',', $ini->get('disable_functions') ?: '');
438
-		$disabled = array_map('trim', $disabled);
439
-		if (in_array($function_name, $disabled)) {
440
-			return false;
441
-		}
442
-		$disabled = explode(',', $ini->get('suhosin.executor.func.blacklist') ?: '');
443
-		$disabled = array_map('trim', $disabled);
444
-		if (in_array($function_name, $disabled)) {
445
-			return false;
446
-		}
447
-		return true;
448
-	}
449
-
450
-	/**
451
-	 * Try to find a program
452
-	 *
453
-	 * @param string $program
454
-	 * @return null|string
455
-	 */
456
-	public static function findBinaryPath($program) {
457
-		$memcache = \OC::$server->getMemCacheFactory()->createDistributed('findBinaryPath');
458
-		if ($memcache->hasKey($program)) {
459
-			return $memcache->get($program);
460
-		}
461
-		$result = null;
462
-		if (self::is_function_enabled('exec')) {
463
-			$exeSniffer = new ExecutableFinder();
464
-			// Returns null if nothing is found
465
-			$result = $exeSniffer->find($program, null, ['/usr/local/sbin', '/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin', '/bin', '/opt/bin']);
466
-		}
467
-		// store the value for 5 minutes
468
-		$memcache->set($program, $result, 300);
469
-		return $result;
470
-	}
471
-
472
-	/**
473
-	 * Calculate the disc space for the given path
474
-	 *
475
-	 * @param string $path
476
-	 * @param \OCP\Files\FileInfo $rootInfo (optional)
477
-	 * @return array
478
-	 * @throws \OCP\Files\NotFoundException
479
-	 */
480
-	public static function getStorageInfo($path, $rootInfo = null) {
481
-		// return storage info without adding mount points
482
-		$includeExtStorage = \OC::$server->getSystemConfig()->getValue('quota_include_external_storage', false);
483
-
484
-		if (!$rootInfo) {
485
-			$rootInfo = \OC\Files\Filesystem::getFileInfo($path, $includeExtStorage ? 'ext' : false);
486
-		}
487
-		if (!$rootInfo instanceof \OCP\Files\FileInfo) {
488
-			throw new \OCP\Files\NotFoundException();
489
-		}
490
-		$used = $rootInfo->getSize();
491
-		if ($used < 0) {
492
-			$used = 0;
493
-		}
494
-		$quota = \OCP\Files\FileInfo::SPACE_UNLIMITED;
495
-		$storage = $rootInfo->getStorage();
496
-		$sourceStorage = $storage;
497
-		if ($storage->instanceOfStorage('\OCA\Files_Sharing\SharedStorage')) {
498
-			$includeExtStorage = false;
499
-			$sourceStorage = $storage->getSourceStorage();
500
-		}
501
-		if ($includeExtStorage) {
502
-			if ($storage->instanceOfStorage('\OC\Files\Storage\Home')
503
-				|| $storage->instanceOfStorage('\OC\Files\ObjectStore\HomeObjectStoreStorage')
504
-			) {
505
-				/** @var \OC\Files\Storage\Home $storage */
506
-				$userInstance = $storage->getUser();
507
-				$user = ($userInstance === null) ? null : $userInstance->getUID();
508
-			} else {
509
-				$user = \OC::$server->getUserSession()->getUser()->getUID();
510
-			}
511
-			if ($user) {
512
-				$quota = OC_Util::getUserQuota($user);
513
-			} else {
514
-				$quota = \OCP\Files\FileInfo::SPACE_UNLIMITED;
515
-			}
516
-			if ($quota !== \OCP\Files\FileInfo::SPACE_UNLIMITED) {
517
-				// always get free space / total space from root + mount points
518
-				return self::getGlobalStorageInfo();
519
-			}
520
-		}
521
-
522
-		// TODO: need a better way to get total space from storage
523
-		if ($sourceStorage->instanceOfStorage('\OC\Files\Storage\Wrapper\Quota')) {
524
-			/** @var \OC\Files\Storage\Wrapper\Quota $storage */
525
-			$quota = $sourceStorage->getQuota();
526
-		}
527
-		$free = $sourceStorage->free_space($rootInfo->getInternalPath());
528
-		if ($free >= 0) {
529
-			$total = $free + $used;
530
-		} else {
531
-			$total = $free; //either unknown or unlimited
532
-		}
533
-		if ($total > 0) {
534
-			if ($quota > 0 && $total > $quota) {
535
-				$total = $quota;
536
-			}
537
-			// prevent division by zero or error codes (negative values)
538
-			$relative = round(($used / $total) * 10000) / 100;
539
-		} else {
540
-			$relative = 0;
541
-		}
542
-
543
-		$ownerId = $storage->getOwner($path);
544
-		$ownerDisplayName = '';
545
-		$owner = \OC::$server->getUserManager()->get($ownerId);
546
-		if($owner) {
547
-			$ownerDisplayName = $owner->getDisplayName();
548
-		}
549
-
550
-		return [
551
-			'free' => $free,
552
-			'used' => $used,
553
-			'quota' => $quota,
554
-			'total' => $total,
555
-			'relative' => $relative,
556
-			'owner' => $ownerId,
557
-			'ownerDisplayName' => $ownerDisplayName,
558
-		];
559
-	}
560
-
561
-	/**
562
-	 * Get storage info including all mount points and quota
563
-	 *
564
-	 * @return array
565
-	 */
566
-	private static function getGlobalStorageInfo() {
567
-		$quota = OC_Util::getUserQuota(\OCP\User::getUser());
568
-
569
-		$rootInfo = \OC\Files\Filesystem::getFileInfo('', 'ext');
570
-		$used = $rootInfo['size'];
571
-		if ($used < 0) {
572
-			$used = 0;
573
-		}
574
-
575
-		$total = $quota;
576
-		$free = $quota - $used;
577
-
578
-		if ($total > 0) {
579
-			if ($quota > 0 && $total > $quota) {
580
-				$total = $quota;
581
-			}
582
-			// prevent division by zero or error codes (negative values)
583
-			$relative = round(($used / $total) * 10000) / 100;
584
-		} else {
585
-			$relative = 0;
586
-		}
587
-
588
-		return array('free' => $free, 'used' => $used, 'total' => $total, 'relative' => $relative);
589
-
590
-	}
591
-
592
-	/**
593
-	 * Returns whether the config file is set manually to read-only
594
-	 * @return bool
595
-	 */
596
-	public static function isReadOnlyConfigEnabled() {
597
-		return \OC::$server->getConfig()->getSystemValue('config_is_read_only', false);
598
-	}
52
+    private static $templateManager;
53
+
54
+    /**
55
+     * Make a human file size
56
+     * @param int $bytes file size in bytes
57
+     * @return string a human readable file size
58
+     *
59
+     * Makes 2048 to 2 kB.
60
+     */
61
+    public static function humanFileSize($bytes) {
62
+        if ($bytes < 0) {
63
+            return "?";
64
+        }
65
+        if ($bytes < 1024) {
66
+            return "$bytes B";
67
+        }
68
+        $bytes = round($bytes / 1024, 0);
69
+        if ($bytes < 1024) {
70
+            return "$bytes KB";
71
+        }
72
+        $bytes = round($bytes / 1024, 1);
73
+        if ($bytes < 1024) {
74
+            return "$bytes MB";
75
+        }
76
+        $bytes = round($bytes / 1024, 1);
77
+        if ($bytes < 1024) {
78
+            return "$bytes GB";
79
+        }
80
+        $bytes = round($bytes / 1024, 1);
81
+        if ($bytes < 1024) {
82
+            return "$bytes TB";
83
+        }
84
+
85
+        $bytes = round($bytes / 1024, 1);
86
+        return "$bytes PB";
87
+    }
88
+
89
+    /**
90
+     * Make a computer file size
91
+     * @param string $str file size in human readable format
92
+     * @return float|bool a file size in bytes
93
+     *
94
+     * Makes 2kB to 2048.
95
+     *
96
+     * Inspired by: http://www.php.net/manual/en/function.filesize.php#92418
97
+     */
98
+    public static function computerFileSize($str) {
99
+        $str = strtolower($str);
100
+        if (is_numeric($str)) {
101
+            return (float)$str;
102
+        }
103
+
104
+        $bytes_array = array(
105
+            'b' => 1,
106
+            'k' => 1024,
107
+            'kb' => 1024,
108
+            'mb' => 1024 * 1024,
109
+            'm' => 1024 * 1024,
110
+            'gb' => 1024 * 1024 * 1024,
111
+            'g' => 1024 * 1024 * 1024,
112
+            'tb' => 1024 * 1024 * 1024 * 1024,
113
+            't' => 1024 * 1024 * 1024 * 1024,
114
+            'pb' => 1024 * 1024 * 1024 * 1024 * 1024,
115
+            'p' => 1024 * 1024 * 1024 * 1024 * 1024,
116
+        );
117
+
118
+        $bytes = (float)$str;
119
+
120
+        if (preg_match('#([kmgtp]?b?)$#si', $str, $matches) && !empty($bytes_array[$matches[1]])) {
121
+            $bytes *= $bytes_array[$matches[1]];
122
+        } else {
123
+            return false;
124
+        }
125
+
126
+        $bytes = round($bytes);
127
+
128
+        return $bytes;
129
+    }
130
+
131
+    /**
132
+     * Recursive copying of folders
133
+     * @param string $src source folder
134
+     * @param string $dest target folder
135
+     *
136
+     */
137
+    static function copyr($src, $dest) {
138
+        if (is_dir($src)) {
139
+            if (!is_dir($dest)) {
140
+                mkdir($dest);
141
+            }
142
+            $files = scandir($src);
143
+            foreach ($files as $file) {
144
+                if ($file != "." && $file != "..") {
145
+                    self::copyr("$src/$file", "$dest/$file");
146
+                }
147
+            }
148
+        } elseif (file_exists($src) && !\OC\Files\Filesystem::isFileBlacklisted($src)) {
149
+            copy($src, $dest);
150
+        }
151
+    }
152
+
153
+    /**
154
+     * Recursive deletion of folders
155
+     * @param string $dir path to the folder
156
+     * @param bool $deleteSelf if set to false only the content of the folder will be deleted
157
+     * @return bool
158
+     */
159
+    static function rmdirr($dir, $deleteSelf = true) {
160
+        if (is_dir($dir)) {
161
+            $files = new RecursiveIteratorIterator(
162
+                new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
163
+                RecursiveIteratorIterator::CHILD_FIRST
164
+            );
165
+
166
+            foreach ($files as $fileInfo) {
167
+                /** @var SplFileInfo $fileInfo */
168
+                if ($fileInfo->isLink()) {
169
+                    unlink($fileInfo->getPathname());
170
+                } else if ($fileInfo->isDir()) {
171
+                    rmdir($fileInfo->getRealPath());
172
+                } else {
173
+                    unlink($fileInfo->getRealPath());
174
+                }
175
+            }
176
+            if ($deleteSelf) {
177
+                rmdir($dir);
178
+            }
179
+        } elseif (file_exists($dir)) {
180
+            if ($deleteSelf) {
181
+                unlink($dir);
182
+            }
183
+        }
184
+        if (!$deleteSelf) {
185
+            return true;
186
+        }
187
+
188
+        return !file_exists($dir);
189
+    }
190
+
191
+    /**
192
+     * @return \OC\Files\Type\TemplateManager
193
+     */
194
+    static public function getFileTemplateManager() {
195
+        if (!self::$templateManager) {
196
+            self::$templateManager = new \OC\Files\Type\TemplateManager();
197
+        }
198
+        return self::$templateManager;
199
+    }
200
+
201
+    /**
202
+     * detect if a given program is found in the search PATH
203
+     *
204
+     * @param string $name
205
+     * @param bool $path
206
+     * @internal param string $program name
207
+     * @internal param string $optional search path, defaults to $PATH
208
+     * @return bool    true if executable program found in path
209
+     */
210
+    public static function canExecute($name, $path = false) {
211
+        // path defaults to PATH from environment if not set
212
+        if ($path === false) {
213
+            $path = getenv("PATH");
214
+        }
215
+        // we look for an executable file of that name
216
+        $exts = [""];
217
+        $check_fn = "is_executable";
218
+        // Default check will be done with $path directories :
219
+        $dirs = explode(PATH_SEPARATOR, $path);
220
+        // WARNING : We have to check if open_basedir is enabled :
221
+        $obd = OC::$server->getIniWrapper()->getString('open_basedir');
222
+        if ($obd != "none") {
223
+            $obd_values = explode(PATH_SEPARATOR, $obd);
224
+            if (count($obd_values) > 0 and $obd_values[0]) {
225
+                // open_basedir is in effect !
226
+                // We need to check if the program is in one of these dirs :
227
+                $dirs = $obd_values;
228
+            }
229
+        }
230
+        foreach ($dirs as $dir) {
231
+            foreach ($exts as $ext) {
232
+                if ($check_fn("$dir/$name" . $ext))
233
+                    return true;
234
+            }
235
+        }
236
+        return false;
237
+    }
238
+
239
+    /**
240
+     * copy the contents of one stream to another
241
+     *
242
+     * @param resource $source
243
+     * @param resource $target
244
+     * @return array the number of bytes copied and result
245
+     */
246
+    public static function streamCopy($source, $target) {
247
+        if (!$source or !$target) {
248
+            return array(0, false);
249
+        }
250
+        $bufSize = 8192;
251
+        $result = true;
252
+        $count = 0;
253
+        while (!feof($source)) {
254
+            $buf = fread($source, $bufSize);
255
+            $bytesWritten = fwrite($target, $buf);
256
+            if ($bytesWritten !== false) {
257
+                $count += $bytesWritten;
258
+            }
259
+            // note: strlen is expensive so only use it when necessary,
260
+            // on the last block
261
+            if ($bytesWritten === false
262
+                || ($bytesWritten < $bufSize && $bytesWritten < strlen($buf))
263
+            ) {
264
+                // write error, could be disk full ?
265
+                $result = false;
266
+                break;
267
+            }
268
+        }
269
+        return array($count, $result);
270
+    }
271
+
272
+    /**
273
+     * Adds a suffix to the name in case the file exists
274
+     *
275
+     * @param string $path
276
+     * @param string $filename
277
+     * @return string
278
+     */
279
+    public static function buildNotExistingFileName($path, $filename) {
280
+        $view = \OC\Files\Filesystem::getView();
281
+        return self::buildNotExistingFileNameForView($path, $filename, $view);
282
+    }
283
+
284
+    /**
285
+     * Adds a suffix to the name in case the file exists
286
+     *
287
+     * @param string $path
288
+     * @param string $filename
289
+     * @return string
290
+     */
291
+    public static function buildNotExistingFileNameForView($path, $filename, \OC\Files\View $view) {
292
+        if ($path === '/') {
293
+            $path = '';
294
+        }
295
+        if ($pos = strrpos($filename, '.')) {
296
+            $name = substr($filename, 0, $pos);
297
+            $ext = substr($filename, $pos);
298
+        } else {
299
+            $name = $filename;
300
+            $ext = '';
301
+        }
302
+
303
+        $newpath = $path . '/' . $filename;
304
+        if ($view->file_exists($newpath)) {
305
+            if (preg_match_all('/\((\d+)\)/', $name, $matches, PREG_OFFSET_CAPTURE)) {
306
+                //Replace the last "(number)" with "(number+1)"
307
+                $last_match = count($matches[0]) - 1;
308
+                $counter = $matches[1][$last_match][0] + 1;
309
+                $offset = $matches[0][$last_match][1];
310
+                $match_length = strlen($matches[0][$last_match][0]);
311
+            } else {
312
+                $counter = 2;
313
+                $match_length = 0;
314
+                $offset = false;
315
+            }
316
+            do {
317
+                if ($offset) {
318
+                    //Replace the last "(number)" with "(number+1)"
319
+                    $newname = substr_replace($name, '(' . $counter . ')', $offset, $match_length);
320
+                } else {
321
+                    $newname = $name . ' (' . $counter . ')';
322
+                }
323
+                $newpath = $path . '/' . $newname . $ext;
324
+                $counter++;
325
+            } while ($view->file_exists($newpath));
326
+        }
327
+
328
+        return $newpath;
329
+    }
330
+
331
+    /**
332
+     * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
333
+     *
334
+     * @param array $input The array to work on
335
+     * @param int $case Either MB_CASE_UPPER or MB_CASE_LOWER (default)
336
+     * @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
337
+     * @return array
338
+     *
339
+     * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
340
+     * based on http://www.php.net/manual/en/function.array-change-key-case.php#107715
341
+     *
342
+     */
343
+    public static function mb_array_change_key_case($input, $case = MB_CASE_LOWER, $encoding = 'UTF-8') {
344
+        $case = ($case != MB_CASE_UPPER) ? MB_CASE_LOWER : MB_CASE_UPPER;
345
+        $ret = array();
346
+        foreach ($input as $k => $v) {
347
+            $ret[mb_convert_case($k, $case, $encoding)] = $v;
348
+        }
349
+        return $ret;
350
+    }
351
+
352
+    /**
353
+     * performs a search in a nested array
354
+     * @param array $haystack the array to be searched
355
+     * @param string $needle the search string
356
+     * @param mixed $index optional, only search this key name
357
+     * @return mixed the key of the matching field, otherwise false
358
+     *
359
+     * performs a search in a nested array
360
+     *
361
+     * taken from http://www.php.net/manual/en/function.array-search.php#97645
362
+     */
363
+    public static function recursiveArraySearch($haystack, $needle, $index = null) {
364
+        $aIt = new RecursiveArrayIterator($haystack);
365
+        $it = new RecursiveIteratorIterator($aIt);
366
+
367
+        while ($it->valid()) {
368
+            if (((isset($index) AND ($it->key() == $index)) OR !isset($index)) AND ($it->current() == $needle)) {
369
+                return $aIt->key();
370
+            }
371
+
372
+            $it->next();
373
+        }
374
+
375
+        return false;
376
+    }
377
+
378
+    /**
379
+     * calculates the maximum upload size respecting system settings, free space and user quota
380
+     *
381
+     * @param string $dir the current folder where the user currently operates
382
+     * @param int $freeSpace the number of bytes free on the storage holding $dir, if not set this will be received from the storage directly
383
+     * @return int number of bytes representing
384
+     */
385
+    public static function maxUploadFilesize($dir, $freeSpace = null) {
386
+        if (is_null($freeSpace) || $freeSpace < 0){
387
+            $freeSpace = self::freeSpace($dir);
388
+        }
389
+        return min($freeSpace, self::uploadLimit());
390
+    }
391
+
392
+    /**
393
+     * Calculate free space left within user quota
394
+     *
395
+     * @param string $dir the current folder where the user currently operates
396
+     * @return int number of bytes representing
397
+     */
398
+    public static function freeSpace($dir) {
399
+        $freeSpace = \OC\Files\Filesystem::free_space($dir);
400
+        if ($freeSpace < \OCP\Files\FileInfo::SPACE_UNLIMITED) {
401
+            $freeSpace = max($freeSpace, 0);
402
+            return $freeSpace;
403
+        } else {
404
+            return (INF > 0)? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
405
+        }
406
+    }
407
+
408
+    /**
409
+     * Calculate PHP upload limit
410
+     *
411
+     * @return int PHP upload file size limit
412
+     */
413
+    public static function uploadLimit() {
414
+        $ini = \OC::$server->getIniWrapper();
415
+        $upload_max_filesize = OCP\Util::computerFileSize($ini->get('upload_max_filesize'));
416
+        $post_max_size = OCP\Util::computerFileSize($ini->get('post_max_size'));
417
+        if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) {
418
+            return INF;
419
+        } elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) {
420
+            return max($upload_max_filesize, $post_max_size); //only the non 0 value counts
421
+        } else {
422
+            return min($upload_max_filesize, $post_max_size);
423
+        }
424
+    }
425
+
426
+    /**
427
+     * Checks if a function is available
428
+     *
429
+     * @param string $function_name
430
+     * @return bool
431
+     */
432
+    public static function is_function_enabled($function_name) {
433
+        if (!function_exists($function_name)) {
434
+            return false;
435
+        }
436
+        $ini = \OC::$server->getIniWrapper();
437
+        $disabled = explode(',', $ini->get('disable_functions') ?: '');
438
+        $disabled = array_map('trim', $disabled);
439
+        if (in_array($function_name, $disabled)) {
440
+            return false;
441
+        }
442
+        $disabled = explode(',', $ini->get('suhosin.executor.func.blacklist') ?: '');
443
+        $disabled = array_map('trim', $disabled);
444
+        if (in_array($function_name, $disabled)) {
445
+            return false;
446
+        }
447
+        return true;
448
+    }
449
+
450
+    /**
451
+     * Try to find a program
452
+     *
453
+     * @param string $program
454
+     * @return null|string
455
+     */
456
+    public static function findBinaryPath($program) {
457
+        $memcache = \OC::$server->getMemCacheFactory()->createDistributed('findBinaryPath');
458
+        if ($memcache->hasKey($program)) {
459
+            return $memcache->get($program);
460
+        }
461
+        $result = null;
462
+        if (self::is_function_enabled('exec')) {
463
+            $exeSniffer = new ExecutableFinder();
464
+            // Returns null if nothing is found
465
+            $result = $exeSniffer->find($program, null, ['/usr/local/sbin', '/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin', '/bin', '/opt/bin']);
466
+        }
467
+        // store the value for 5 minutes
468
+        $memcache->set($program, $result, 300);
469
+        return $result;
470
+    }
471
+
472
+    /**
473
+     * Calculate the disc space for the given path
474
+     *
475
+     * @param string $path
476
+     * @param \OCP\Files\FileInfo $rootInfo (optional)
477
+     * @return array
478
+     * @throws \OCP\Files\NotFoundException
479
+     */
480
+    public static function getStorageInfo($path, $rootInfo = null) {
481
+        // return storage info without adding mount points
482
+        $includeExtStorage = \OC::$server->getSystemConfig()->getValue('quota_include_external_storage', false);
483
+
484
+        if (!$rootInfo) {
485
+            $rootInfo = \OC\Files\Filesystem::getFileInfo($path, $includeExtStorage ? 'ext' : false);
486
+        }
487
+        if (!$rootInfo instanceof \OCP\Files\FileInfo) {
488
+            throw new \OCP\Files\NotFoundException();
489
+        }
490
+        $used = $rootInfo->getSize();
491
+        if ($used < 0) {
492
+            $used = 0;
493
+        }
494
+        $quota = \OCP\Files\FileInfo::SPACE_UNLIMITED;
495
+        $storage = $rootInfo->getStorage();
496
+        $sourceStorage = $storage;
497
+        if ($storage->instanceOfStorage('\OCA\Files_Sharing\SharedStorage')) {
498
+            $includeExtStorage = false;
499
+            $sourceStorage = $storage->getSourceStorage();
500
+        }
501
+        if ($includeExtStorage) {
502
+            if ($storage->instanceOfStorage('\OC\Files\Storage\Home')
503
+                || $storage->instanceOfStorage('\OC\Files\ObjectStore\HomeObjectStoreStorage')
504
+            ) {
505
+                /** @var \OC\Files\Storage\Home $storage */
506
+                $userInstance = $storage->getUser();
507
+                $user = ($userInstance === null) ? null : $userInstance->getUID();
508
+            } else {
509
+                $user = \OC::$server->getUserSession()->getUser()->getUID();
510
+            }
511
+            if ($user) {
512
+                $quota = OC_Util::getUserQuota($user);
513
+            } else {
514
+                $quota = \OCP\Files\FileInfo::SPACE_UNLIMITED;
515
+            }
516
+            if ($quota !== \OCP\Files\FileInfo::SPACE_UNLIMITED) {
517
+                // always get free space / total space from root + mount points
518
+                return self::getGlobalStorageInfo();
519
+            }
520
+        }
521
+
522
+        // TODO: need a better way to get total space from storage
523
+        if ($sourceStorage->instanceOfStorage('\OC\Files\Storage\Wrapper\Quota')) {
524
+            /** @var \OC\Files\Storage\Wrapper\Quota $storage */
525
+            $quota = $sourceStorage->getQuota();
526
+        }
527
+        $free = $sourceStorage->free_space($rootInfo->getInternalPath());
528
+        if ($free >= 0) {
529
+            $total = $free + $used;
530
+        } else {
531
+            $total = $free; //either unknown or unlimited
532
+        }
533
+        if ($total > 0) {
534
+            if ($quota > 0 && $total > $quota) {
535
+                $total = $quota;
536
+            }
537
+            // prevent division by zero or error codes (negative values)
538
+            $relative = round(($used / $total) * 10000) / 100;
539
+        } else {
540
+            $relative = 0;
541
+        }
542
+
543
+        $ownerId = $storage->getOwner($path);
544
+        $ownerDisplayName = '';
545
+        $owner = \OC::$server->getUserManager()->get($ownerId);
546
+        if($owner) {
547
+            $ownerDisplayName = $owner->getDisplayName();
548
+        }
549
+
550
+        return [
551
+            'free' => $free,
552
+            'used' => $used,
553
+            'quota' => $quota,
554
+            'total' => $total,
555
+            'relative' => $relative,
556
+            'owner' => $ownerId,
557
+            'ownerDisplayName' => $ownerDisplayName,
558
+        ];
559
+    }
560
+
561
+    /**
562
+     * Get storage info including all mount points and quota
563
+     *
564
+     * @return array
565
+     */
566
+    private static function getGlobalStorageInfo() {
567
+        $quota = OC_Util::getUserQuota(\OCP\User::getUser());
568
+
569
+        $rootInfo = \OC\Files\Filesystem::getFileInfo('', 'ext');
570
+        $used = $rootInfo['size'];
571
+        if ($used < 0) {
572
+            $used = 0;
573
+        }
574
+
575
+        $total = $quota;
576
+        $free = $quota - $used;
577
+
578
+        if ($total > 0) {
579
+            if ($quota > 0 && $total > $quota) {
580
+                $total = $quota;
581
+            }
582
+            // prevent division by zero or error codes (negative values)
583
+            $relative = round(($used / $total) * 10000) / 100;
584
+        } else {
585
+            $relative = 0;
586
+        }
587
+
588
+        return array('free' => $free, 'used' => $used, 'total' => $total, 'relative' => $relative);
589
+
590
+    }
591
+
592
+    /**
593
+     * Returns whether the config file is set manually to read-only
594
+     * @return bool
595
+     */
596
+    public static function isReadOnlyConfigEnabled() {
597
+        return \OC::$server->getConfig()->getSystemValue('config_is_read_only', false);
598
+    }
599 599
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -98,7 +98,7 @@  discard block
 block discarded – undo
98 98
 	public static function computerFileSize($str) {
99 99
 		$str = strtolower($str);
100 100
 		if (is_numeric($str)) {
101
-			return (float)$str;
101
+			return (float) $str;
102 102
 		}
103 103
 
104 104
 		$bytes_array = array(
@@ -115,7 +115,7 @@  discard block
 block discarded – undo
115 115
 			'p' => 1024 * 1024 * 1024 * 1024 * 1024,
116 116
 		);
117 117
 
118
-		$bytes = (float)$str;
118
+		$bytes = (float) $str;
119 119
 
120 120
 		if (preg_match('#([kmgtp]?b?)$#si', $str, $matches) && !empty($bytes_array[$matches[1]])) {
121 121
 			$bytes *= $bytes_array[$matches[1]];
@@ -229,7 +229,7 @@  discard block
 block discarded – undo
229 229
 		}
230 230
 		foreach ($dirs as $dir) {
231 231
 			foreach ($exts as $ext) {
232
-				if ($check_fn("$dir/$name" . $ext))
232
+				if ($check_fn("$dir/$name".$ext))
233 233
 					return true;
234 234
 			}
235 235
 		}
@@ -300,7 +300,7 @@  discard block
 block discarded – undo
300 300
 			$ext = '';
301 301
 		}
302 302
 
303
-		$newpath = $path . '/' . $filename;
303
+		$newpath = $path.'/'.$filename;
304 304
 		if ($view->file_exists($newpath)) {
305 305
 			if (preg_match_all('/\((\d+)\)/', $name, $matches, PREG_OFFSET_CAPTURE)) {
306 306
 				//Replace the last "(number)" with "(number+1)"
@@ -316,11 +316,11 @@  discard block
 block discarded – undo
316 316
 			do {
317 317
 				if ($offset) {
318 318
 					//Replace the last "(number)" with "(number+1)"
319
-					$newname = substr_replace($name, '(' . $counter . ')', $offset, $match_length);
319
+					$newname = substr_replace($name, '('.$counter.')', $offset, $match_length);
320 320
 				} else {
321
-					$newname = $name . ' (' . $counter . ')';
321
+					$newname = $name.' ('.$counter.')';
322 322
 				}
323
-				$newpath = $path . '/' . $newname . $ext;
323
+				$newpath = $path.'/'.$newname.$ext;
324 324
 				$counter++;
325 325
 			} while ($view->file_exists($newpath));
326 326
 		}
@@ -383,7 +383,7 @@  discard block
 block discarded – undo
383 383
 	 * @return int number of bytes representing
384 384
 	 */
385 385
 	public static function maxUploadFilesize($dir, $freeSpace = null) {
386
-		if (is_null($freeSpace) || $freeSpace < 0){
386
+		if (is_null($freeSpace) || $freeSpace < 0) {
387 387
 			$freeSpace = self::freeSpace($dir);
388 388
 		}
389 389
 		return min($freeSpace, self::uploadLimit());
@@ -401,7 +401,7 @@  discard block
 block discarded – undo
401 401
 			$freeSpace = max($freeSpace, 0);
402 402
 			return $freeSpace;
403 403
 		} else {
404
-			return (INF > 0)? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
404
+			return (INF > 0) ? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
405 405
 		}
406 406
 	}
407 407
 
@@ -414,9 +414,9 @@  discard block
 block discarded – undo
414 414
 		$ini = \OC::$server->getIniWrapper();
415 415
 		$upload_max_filesize = OCP\Util::computerFileSize($ini->get('upload_max_filesize'));
416 416
 		$post_max_size = OCP\Util::computerFileSize($ini->get('post_max_size'));
417
-		if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) {
417
+		if ((int) $upload_max_filesize === 0 and (int) $post_max_size === 0) {
418 418
 			return INF;
419
-		} elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) {
419
+		} elseif ((int) $upload_max_filesize === 0 or (int) $post_max_size === 0) {
420 420
 			return max($upload_max_filesize, $post_max_size); //only the non 0 value counts
421 421
 		} else {
422 422
 			return min($upload_max_filesize, $post_max_size);
@@ -543,7 +543,7 @@  discard block
 block discarded – undo
543 543
 		$ownerId = $storage->getOwner($path);
544 544
 		$ownerDisplayName = '';
545 545
 		$owner = \OC::$server->getUserManager()->get($ownerId);
546
-		if($owner) {
546
+		if ($owner) {
547 547
 			$ownerDisplayName = $owner->getDisplayName();
548 548
 		}
549 549
 
Please login to merge, or discard this patch.
lib/private/BackgroundJob/Legacy/RegularJob.php 1 patch
Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -26,14 +26,14 @@
 block discarded – undo
26 26
 use OCP\AutoloadNotAllowedException;
27 27
 
28 28
 class RegularJob extends \OC\BackgroundJob\Job {
29
-	public function run($argument) {
30
-		try {
31
-			if (is_callable($argument)) {
32
-				call_user_func($argument);
33
-			}
34
-		} catch (AutoloadNotAllowedException $e) {
35
-			// job is from a disabled app, ignore
36
-			return null;
37
-		}
38
-	}
29
+    public function run($argument) {
30
+        try {
31
+            if (is_callable($argument)) {
32
+                call_user_func($argument);
33
+            }
34
+        } catch (AutoloadNotAllowedException $e) {
35
+            // job is from a disabled app, ignore
36
+            return null;
37
+        }
38
+    }
39 39
 }
Please login to merge, or discard this patch.
lib/private/BackgroundJob/Legacy/QueuedJob.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -24,12 +24,12 @@
 block discarded – undo
24 24
 namespace OC\BackgroundJob\Legacy;
25 25
 
26 26
 class QueuedJob extends \OC\BackgroundJob\QueuedJob {
27
-	public function run($argument) {
28
-		$class = $argument['klass'];
29
-		$method = $argument['method'];
30
-		$parameters = $argument['parameters'];
31
-		if (is_callable(array($class, $method))) {
32
-			call_user_func(array($class, $method), $parameters);
33
-		}
34
-	}
27
+    public function run($argument) {
28
+        $class = $argument['klass'];
29
+        $method = $argument['method'];
30
+        $parameters = $argument['parameters'];
31
+        if (is_callable(array($class, $method))) {
32
+            call_user_func(array($class, $method), $parameters);
33
+        }
34
+    }
35 35
 }
Please login to merge, or discard this patch.
lib/private/Settings/Section.php 1 patch
Indentation   +58 added lines, -58 removed lines patch added patch discarded remove patch
@@ -26,67 +26,67 @@
 block discarded – undo
26 26
 use OCP\Settings\IIconSection;
27 27
 
28 28
 class Section implements IIconSection {
29
-	/** @var string */
30
-	private $id;
31
-	/** @var string */
32
-	private $name;
33
-	/** @var int */
34
-	private $priority;
35
-	/** @var string */
36
-	private $icon;
29
+    /** @var string */
30
+    private $id;
31
+    /** @var string */
32
+    private $name;
33
+    /** @var int */
34
+    private $priority;
35
+    /** @var string */
36
+    private $icon;
37 37
 
38
-	/**
39
-	 * @param string $id
40
-	 * @param string $name
41
-	 * @param int $priority
42
-	 * @param string $icon
43
-	 */
44
-	public function __construct($id, $name, $priority, $icon = '') {
45
-		$this->id = $id;
46
-		$this->name = $name;
47
-		$this->priority = $priority;
48
-		$this->icon = $icon;
49
-	}
38
+    /**
39
+     * @param string $id
40
+     * @param string $name
41
+     * @param int $priority
42
+     * @param string $icon
43
+     */
44
+    public function __construct($id, $name, $priority, $icon = '') {
45
+        $this->id = $id;
46
+        $this->name = $name;
47
+        $this->priority = $priority;
48
+        $this->icon = $icon;
49
+    }
50 50
 
51
-	/**
52
-	 * returns the ID of the section. It is supposed to be a lower case string,
53
-	 * e.g. 'ldap'
54
-	 *
55
-	 * @returns string
56
-	 */
57
-	public function getID() {
58
-		return $this->id;
59
-	}
51
+    /**
52
+     * returns the ID of the section. It is supposed to be a lower case string,
53
+     * e.g. 'ldap'
54
+     *
55
+     * @returns string
56
+     */
57
+    public function getID() {
58
+        return $this->id;
59
+    }
60 60
 
61
-	/**
62
-	 * returns the translated name as it should be displayed, e.g. 'LDAP / AD
63
-	 * integration'. Use the L10N service to translate it.
64
-	 *
65
-	 * @return string
66
-	 */
67
-	public function getName() {
68
-		return $this->name;
69
-	}
61
+    /**
62
+     * returns the translated name as it should be displayed, e.g. 'LDAP / AD
63
+     * integration'. Use the L10N service to translate it.
64
+     *
65
+     * @return string
66
+     */
67
+    public function getName() {
68
+        return $this->name;
69
+    }
70 70
 
71
-	/**
72
-	 * @return int whether the form should be rather on the top or bottom of
73
-	 * the settings navigation. The sections are arranged in ascending order of
74
-	 * the priority values. It is required to return a value between 0 and 99.
75
-	 *
76
-	 * E.g.: 70
77
-	 */
78
-	public function getPriority() {
79
-		return $this->priority;
80
-	}
71
+    /**
72
+     * @return int whether the form should be rather on the top or bottom of
73
+     * the settings navigation. The sections are arranged in ascending order of
74
+     * the priority values. It is required to return a value between 0 and 99.
75
+     *
76
+     * E.g.: 70
77
+     */
78
+    public function getPriority() {
79
+        return $this->priority;
80
+    }
81 81
 
82
-	/**
83
-	 * returns the relative path to an 16*16 icon describing the section.
84
-	 * e.g. '/core/img/places/files.svg'
85
-	 *
86
-	 * @returns string
87
-	 * @since 12
88
-	 */
89
-	public function getIcon() {
90
-		return $this->icon;
91
-	}
82
+    /**
83
+     * returns the relative path to an 16*16 icon describing the section.
84
+     * e.g. '/core/img/places/files.svg'
85
+     *
86
+     * @returns string
87
+     * @since 12
88
+     */
89
+    public function getIcon() {
90
+        return $this->icon;
91
+    }
92 92
 }
Please login to merge, or discard this patch.
lib/private/Streamer.php 3 patches
Braces   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -80,7 +80,7 @@
 block discarded – undo
80 80
 				$fh = \OC\Files\Filesystem::fopen($file, 'r');
81 81
 				$this->addFileFromStream($fh, $internalDir . $filename, $filesize, $fileTime);
82 82
 				fclose($fh);
83
-			}elseif(\OC\Files\Filesystem::is_dir($file)) {
83
+			} elseif(\OC\Files\Filesystem::is_dir($file)) {
84 84
 				$this->addDirRecursive($file, $internalDir);
85 85
 			}
86 86
 		}
Please login to merge, or discard this patch.
Indentation   +121 added lines, -121 removed lines patch added patch discarded remove patch
@@ -29,135 +29,135 @@
 block discarded – undo
29 29
 use ZipStreamer\ZipStreamer;
30 30
 
31 31
 class Streamer {
32
-	// array of regexp. Matching user agents will get tar instead of zip
33
-	private $preferTarFor = [ '/macintosh|mac os x/i' ];
32
+    // array of regexp. Matching user agents will get tar instead of zip
33
+    private $preferTarFor = [ '/macintosh|mac os x/i' ];
34 34
 
35
-	// streamer instance
36
-	private $streamerInstance;
35
+    // streamer instance
36
+    private $streamerInstance;
37 37
 
38
-	/**
39
-	 * Streamer constructor.
40
-	 *
41
-	 * @param IRequest $request
42
-	 * @param int $size The size of the files in bytes
43
-	 * @param int $numberOfFiles The number of files (and directories) that will
44
-	 *        be included in the streamed file
45
-	 */
46
-	public function __construct(IRequest $request, int $size, int $numberOfFiles){
38
+    /**
39
+     * Streamer constructor.
40
+     *
41
+     * @param IRequest $request
42
+     * @param int $size The size of the files in bytes
43
+     * @param int $numberOfFiles The number of files (and directories) that will
44
+     *        be included in the streamed file
45
+     */
46
+    public function __construct(IRequest $request, int $size, int $numberOfFiles){
47 47
 
48
-		/**
49
-		 * zip32 constraints for a basic (without compression, volumes nor
50
-		 * encryption) zip file according to the Zip specification:
51
-		 * - No file size is larger than 4 bytes (file size < 4294967296); see
52
-		 *   4.4.9 uncompressed size
53
-		 * - The size of all files plus their local headers is not larger than
54
-		 *   4 bytes; see 4.4.16 relative offset of local header and 4.4.24
55
-		 *   offset of start of central directory with respect to the starting
56
-		 *   disk number
57
-		 * - The total number of entries (files and directories) in the zip file
58
-		 *   is not larger than 2 bytes (number of entries < 65536); see 4.4.22
59
-		 *   total number of entries in the central dir
60
-		 * - The size of the central directory is not larger than 4 bytes; see
61
-		 *   4.4.23 size of the central directory
62
-		 *
63
-		 * Due to all that, zip32 is used if the size is below 4GB and there are
64
-		 * less than 65536 files; the margin between 4*1000^3 and 4*1024^3
65
-		 * should give enough room for the extra zip metadata. Technically, it
66
-		 * would still be possible to create an invalid zip32 file (for example,
67
-		 * a zip file from files smaller than 4GB with a central directory
68
-		 * larger than 4GiB), but it should not happen in the real world.
69
-		 */
70
-		if ($size < 4 * 1000 * 1000 * 1000 && $numberOfFiles < 65536) {
71
-			$this->streamerInstance = new ZipStreamer(['zip64' => false]);
72
-		} else if ($request->isUserAgent($this->preferTarFor)) {
73
-			$this->streamerInstance = new TarStreamer();
74
-		} else {
75
-			$this->streamerInstance = new ZipStreamer(['zip64' => PHP_INT_SIZE !== 4]);
76
-		}
77
-	}
48
+        /**
49
+         * zip32 constraints for a basic (without compression, volumes nor
50
+         * encryption) zip file according to the Zip specification:
51
+         * - No file size is larger than 4 bytes (file size < 4294967296); see
52
+         *   4.4.9 uncompressed size
53
+         * - The size of all files plus their local headers is not larger than
54
+         *   4 bytes; see 4.4.16 relative offset of local header and 4.4.24
55
+         *   offset of start of central directory with respect to the starting
56
+         *   disk number
57
+         * - The total number of entries (files and directories) in the zip file
58
+         *   is not larger than 2 bytes (number of entries < 65536); see 4.4.22
59
+         *   total number of entries in the central dir
60
+         * - The size of the central directory is not larger than 4 bytes; see
61
+         *   4.4.23 size of the central directory
62
+         *
63
+         * Due to all that, zip32 is used if the size is below 4GB and there are
64
+         * less than 65536 files; the margin between 4*1000^3 and 4*1024^3
65
+         * should give enough room for the extra zip metadata. Technically, it
66
+         * would still be possible to create an invalid zip32 file (for example,
67
+         * a zip file from files smaller than 4GB with a central directory
68
+         * larger than 4GiB), but it should not happen in the real world.
69
+         */
70
+        if ($size < 4 * 1000 * 1000 * 1000 && $numberOfFiles < 65536) {
71
+            $this->streamerInstance = new ZipStreamer(['zip64' => false]);
72
+        } else if ($request->isUserAgent($this->preferTarFor)) {
73
+            $this->streamerInstance = new TarStreamer();
74
+        } else {
75
+            $this->streamerInstance = new ZipStreamer(['zip64' => PHP_INT_SIZE !== 4]);
76
+        }
77
+    }
78 78
 	
79
-	/**
80
-	 * Send HTTP headers
81
-	 * @param string $name 
82
-	 */
83
-	public function sendHeaders($name){
84
-		$extension = $this->streamerInstance instanceof ZipStreamer ? '.zip' : '.tar';
85
-		$fullName = $name . $extension;
86
-		$this->streamerInstance->sendHeaders($fullName);
87
-	}
79
+    /**
80
+     * Send HTTP headers
81
+     * @param string $name 
82
+     */
83
+    public function sendHeaders($name){
84
+        $extension = $this->streamerInstance instanceof ZipStreamer ? '.zip' : '.tar';
85
+        $fullName = $name . $extension;
86
+        $this->streamerInstance->sendHeaders($fullName);
87
+    }
88 88
 	
89
-	/**
90
-	 * Stream directory recursively
91
-	 * @param string $dir
92
-	 * @param string $internalDir
93
-	 */
94
-	public function addDirRecursive($dir, $internalDir='') {
95
-		$dirname = basename($dir);
96
-		$rootDir = $internalDir . $dirname;
97
-		if (!empty($rootDir)) {
98
-			$this->streamerInstance->addEmptyDir($rootDir);
99
-		}
100
-		$internalDir .= $dirname . '/';
101
-		// prevent absolute dirs
102
-		$internalDir = ltrim($internalDir, '/');
89
+    /**
90
+     * Stream directory recursively
91
+     * @param string $dir
92
+     * @param string $internalDir
93
+     */
94
+    public function addDirRecursive($dir, $internalDir='') {
95
+        $dirname = basename($dir);
96
+        $rootDir = $internalDir . $dirname;
97
+        if (!empty($rootDir)) {
98
+            $this->streamerInstance->addEmptyDir($rootDir);
99
+        }
100
+        $internalDir .= $dirname . '/';
101
+        // prevent absolute dirs
102
+        $internalDir = ltrim($internalDir, '/');
103 103
 
104
-		$files= \OC\Files\Filesystem::getDirectoryContent($dir);
105
-		foreach($files as $file) {
106
-			$filename = $file['name'];
107
-			$file = $dir . '/' . $filename;
108
-			if(\OC\Files\Filesystem::is_file($file)) {
109
-				$filesize = \OC\Files\Filesystem::filesize($file);
110
-				$fileTime = \OC\Files\Filesystem::filemtime($file);
111
-				$fh = \OC\Files\Filesystem::fopen($file, 'r');
112
-				$this->addFileFromStream($fh, $internalDir . $filename, $filesize, $fileTime);
113
-				fclose($fh);
114
-			}elseif(\OC\Files\Filesystem::is_dir($file)) {
115
-				$this->addDirRecursive($file, $internalDir);
116
-			}
117
-		}
118
-	}
104
+        $files= \OC\Files\Filesystem::getDirectoryContent($dir);
105
+        foreach($files as $file) {
106
+            $filename = $file['name'];
107
+            $file = $dir . '/' . $filename;
108
+            if(\OC\Files\Filesystem::is_file($file)) {
109
+                $filesize = \OC\Files\Filesystem::filesize($file);
110
+                $fileTime = \OC\Files\Filesystem::filemtime($file);
111
+                $fh = \OC\Files\Filesystem::fopen($file, 'r');
112
+                $this->addFileFromStream($fh, $internalDir . $filename, $filesize, $fileTime);
113
+                fclose($fh);
114
+            }elseif(\OC\Files\Filesystem::is_dir($file)) {
115
+                $this->addDirRecursive($file, $internalDir);
116
+            }
117
+        }
118
+    }
119 119
 	
120
-	/**
121
-	 * Add a file to the archive at the specified location and file name.
122
-	 *
123
-	 * @param string $stream Stream to read data from
124
-	 * @param string $internalName Filepath and name to be used in the archive.
125
-	 * @param int $size Filesize
126
-	 * @param int|bool $time File mtime as int, or false
127
-	 * @return bool $success
128
-	 */
129
-	public function addFileFromStream($stream, $internalName, $size, $time) {
130
-		$options = [];
131
-		if ($time) {
132
-			$options = [
133
-				'timestamp' => $time
134
-			];
135
-		}
120
+    /**
121
+     * Add a file to the archive at the specified location and file name.
122
+     *
123
+     * @param string $stream Stream to read data from
124
+     * @param string $internalName Filepath and name to be used in the archive.
125
+     * @param int $size Filesize
126
+     * @param int|bool $time File mtime as int, or false
127
+     * @return bool $success
128
+     */
129
+    public function addFileFromStream($stream, $internalName, $size, $time) {
130
+        $options = [];
131
+        if ($time) {
132
+            $options = [
133
+                'timestamp' => $time
134
+            ];
135
+        }
136 136
 
137
-		if ($this->streamerInstance instanceof ZipStreamer) {
138
-			return $this->streamerInstance->addFileFromStream($stream, $internalName, $options);
139
-		} else {
140
-			return $this->streamerInstance->addFileFromStream($stream, $internalName, $size, $options);
141
-		}
142
-	}
137
+        if ($this->streamerInstance instanceof ZipStreamer) {
138
+            return $this->streamerInstance->addFileFromStream($stream, $internalName, $options);
139
+        } else {
140
+            return $this->streamerInstance->addFileFromStream($stream, $internalName, $size, $options);
141
+        }
142
+    }
143 143
 
144
-	/**
145
-	 * Add an empty directory entry to the archive.
146
-	 *
147
-	 * @param string $dirName Directory Path and name to be added to the archive.
148
-	 * @return bool $success
149
-	 */
150
-	public function addEmptyDir($dirName){
151
-		return $this->streamerInstance->addEmptyDir($dirName);
152
-	}
144
+    /**
145
+     * Add an empty directory entry to the archive.
146
+     *
147
+     * @param string $dirName Directory Path and name to be added to the archive.
148
+     * @return bool $success
149
+     */
150
+    public function addEmptyDir($dirName){
151
+        return $this->streamerInstance->addEmptyDir($dirName);
152
+    }
153 153
 
154
-	/**
155
-	 * Close the archive.
156
-	 * A closed archive can no longer have new files added to it. After
157
-	 * closing, the file is completely written to the output stream.
158
-	 * @return bool $success
159
-	 */
160
-	public function finalize(){
161
-		return $this->streamerInstance->finalize();
162
-	}
154
+    /**
155
+     * Close the archive.
156
+     * A closed archive can no longer have new files added to it. After
157
+     * closing, the file is completely written to the output stream.
158
+     * @return bool $success
159
+     */
160
+    public function finalize(){
161
+        return $this->streamerInstance->finalize();
162
+    }
163 163
 }
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -30,7 +30,7 @@  discard block
 block discarded – undo
30 30
 
31 31
 class Streamer {
32 32
 	// array of regexp. Matching user agents will get tar instead of zip
33
-	private $preferTarFor = [ '/macintosh|mac os x/i' ];
33
+	private $preferTarFor = ['/macintosh|mac os x/i'];
34 34
 
35 35
 	// streamer instance
36 36
 	private $streamerInstance;
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
 	 * @param int $numberOfFiles The number of files (and directories) that will
44 44
 	 *        be included in the streamed file
45 45
 	 */
46
-	public function __construct(IRequest $request, int $size, int $numberOfFiles){
46
+	public function __construct(IRequest $request, int $size, int $numberOfFiles) {
47 47
 
48 48
 		/**
49 49
 		 * zip32 constraints for a basic (without compression, volumes nor
@@ -80,9 +80,9 @@  discard block
 block discarded – undo
80 80
 	 * Send HTTP headers
81 81
 	 * @param string $name 
82 82
 	 */
83
-	public function sendHeaders($name){
83
+	public function sendHeaders($name) {
84 84
 		$extension = $this->streamerInstance instanceof ZipStreamer ? '.zip' : '.tar';
85
-		$fullName = $name . $extension;
85
+		$fullName = $name.$extension;
86 86
 		$this->streamerInstance->sendHeaders($fullName);
87 87
 	}
88 88
 	
@@ -91,27 +91,27 @@  discard block
 block discarded – undo
91 91
 	 * @param string $dir
92 92
 	 * @param string $internalDir
93 93
 	 */
94
-	public function addDirRecursive($dir, $internalDir='') {
94
+	public function addDirRecursive($dir, $internalDir = '') {
95 95
 		$dirname = basename($dir);
96
-		$rootDir = $internalDir . $dirname;
96
+		$rootDir = $internalDir.$dirname;
97 97
 		if (!empty($rootDir)) {
98 98
 			$this->streamerInstance->addEmptyDir($rootDir);
99 99
 		}
100
-		$internalDir .= $dirname . '/';
100
+		$internalDir .= $dirname.'/';
101 101
 		// prevent absolute dirs
102 102
 		$internalDir = ltrim($internalDir, '/');
103 103
 
104
-		$files= \OC\Files\Filesystem::getDirectoryContent($dir);
105
-		foreach($files as $file) {
104
+		$files = \OC\Files\Filesystem::getDirectoryContent($dir);
105
+		foreach ($files as $file) {
106 106
 			$filename = $file['name'];
107
-			$file = $dir . '/' . $filename;
108
-			if(\OC\Files\Filesystem::is_file($file)) {
107
+			$file = $dir.'/'.$filename;
108
+			if (\OC\Files\Filesystem::is_file($file)) {
109 109
 				$filesize = \OC\Files\Filesystem::filesize($file);
110 110
 				$fileTime = \OC\Files\Filesystem::filemtime($file);
111 111
 				$fh = \OC\Files\Filesystem::fopen($file, 'r');
112
-				$this->addFileFromStream($fh, $internalDir . $filename, $filesize, $fileTime);
112
+				$this->addFileFromStream($fh, $internalDir.$filename, $filesize, $fileTime);
113 113
 				fclose($fh);
114
-			}elseif(\OC\Files\Filesystem::is_dir($file)) {
114
+			}elseif (\OC\Files\Filesystem::is_dir($file)) {
115 115
 				$this->addDirRecursive($file, $internalDir);
116 116
 			}
117 117
 		}
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
 	 * @param string $dirName Directory Path and name to be added to the archive.
148 148
 	 * @return bool $success
149 149
 	 */
150
-	public function addEmptyDir($dirName){
150
+	public function addEmptyDir($dirName) {
151 151
 		return $this->streamerInstance->addEmptyDir($dirName);
152 152
 	}
153 153
 
@@ -157,7 +157,7 @@  discard block
 block discarded – undo
157 157
 	 * closing, the file is completely written to the output stream.
158 158
 	 * @return bool $success
159 159
 	 */
160
-	public function finalize(){
160
+	public function finalize() {
161 161
 		return $this->streamerInstance->finalize();
162 162
 	}
163 163
 }
Please login to merge, or discard this patch.
lib/private/Memcache/CASTrait.php 2 patches
Indentation   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -23,35 +23,35 @@
 block discarded – undo
23 23
 namespace OC\Memcache;
24 24
 
25 25
 trait CASTrait {
26
-	abstract public function get($key);
26
+    abstract public function get($key);
27 27
 
28
-	abstract public function set($key, $value, $ttl = 0);
28
+    abstract public function set($key, $value, $ttl = 0);
29 29
 
30
-	abstract public function remove($key);
30
+    abstract public function remove($key);
31 31
 
32
-	abstract public function add($key, $value, $ttl = 0);
32
+    abstract public function add($key, $value, $ttl = 0);
33 33
 
34
-	/**
35
-	 * Compare and set
36
-	 *
37
-	 * @param string $key
38
-	 * @param mixed $old
39
-	 * @param mixed $new
40
-	 * @return bool
41
-	 */
42
-	public function cas($key, $old, $new) {
43
-		//no native cas, emulate with locking
44
-		if ($this->add($key . '_lock', true)) {
45
-			if ($this->get($key) === $old) {
46
-				$this->set($key, $new);
47
-				$this->remove($key . '_lock');
48
-				return true;
49
-			} else {
50
-				$this->remove($key . '_lock');
51
-				return false;
52
-			}
53
-		} else {
54
-			return false;
55
-		}
56
-	}
34
+    /**
35
+     * Compare and set
36
+     *
37
+     * @param string $key
38
+     * @param mixed $old
39
+     * @param mixed $new
40
+     * @return bool
41
+     */
42
+    public function cas($key, $old, $new) {
43
+        //no native cas, emulate with locking
44
+        if ($this->add($key . '_lock', true)) {
45
+            if ($this->get($key) === $old) {
46
+                $this->set($key, $new);
47
+                $this->remove($key . '_lock');
48
+                return true;
49
+            } else {
50
+                $this->remove($key . '_lock');
51
+                return false;
52
+            }
53
+        } else {
54
+            return false;
55
+        }
56
+    }
57 57
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -41,13 +41,13 @@
 block discarded – undo
41 41
 	 */
42 42
 	public function cas($key, $old, $new) {
43 43
 		//no native cas, emulate with locking
44
-		if ($this->add($key . '_lock', true)) {
44
+		if ($this->add($key.'_lock', true)) {
45 45
 			if ($this->get($key) === $old) {
46 46
 				$this->set($key, $new);
47
-				$this->remove($key . '_lock');
47
+				$this->remove($key.'_lock');
48 48
 				return true;
49 49
 			} else {
50
-				$this->remove($key . '_lock');
50
+				$this->remove($key.'_lock');
51 51
 				return false;
52 52
 			}
53 53
 		} else {
Please login to merge, or discard this patch.