Completed
Push — stable13 ( 0404ac...57ca18 )
by Morris
158:38 queued 134:00
created
lib/private/legacy/response.php 3 patches
Braces   +3 added lines, -6 removed lines patch added patch discarded remove patch
@@ -51,13 +51,11 @@  discard block
 block discarded – undo
51 51
 			if ($cache_time > 0) {
52 52
 				self::setExpiresHeader('PT'.$cache_time.'S');
53 53
 				header('Cache-Control: max-age='.$cache_time.', must-revalidate');
54
-			}
55
-			else {
54
+			} else {
56 55
 				self::setExpiresHeader(0);
57 56
 				header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
58 57
 			}
59
-		}
60
-		else {
58
+		} else {
61 59
 			header('Cache-Control: cache');
62 60
 			header('Pragma: cache');
63 61
 		}
@@ -228,8 +226,7 @@  discard block
 block discarded – undo
228 226
 
229 227
 			self::setContentLengthHeader(filesize($filepath));
230 228
 			fpassthru($fp);
231
-		}
232
-		else {
229
+		} else {
233 230
 			self::setStatus(self::STATUS_NOT_FOUND);
234 231
 		}
235 232
 	}
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -47,7 +47,7 @@  discard block
 block discarded – undo
47 47
 	*/
48 48
 	static public function enableCaching($cache_time = null) {
49 49
 		if (is_numeric($cache_time)) {
50
-			header('Pragma: public');// enable caching in IE
50
+			header('Pragma: public'); // enable caching in IE
51 51
 			if ($cache_time > 0) {
52 52
 				self::setExpiresHeader('PT'.$cache_time.'S');
53 53
 				header('Cache-Control: max-age='.$cache_time.', must-revalidate');
@@ -78,29 +78,29 @@  discard block
 block discarded – undo
78 78
 	*/
79 79
 	static public function setStatus($status) {
80 80
 		$protocol = \OC::$server->getRequest()->getHttpProtocol();
81
-		switch($status) {
81
+		switch ($status) {
82 82
 			case self::STATUS_NOT_MODIFIED:
83
-				$status = $status . ' Not Modified';
83
+				$status = $status.' Not Modified';
84 84
 				break;
85 85
 			case self::STATUS_TEMPORARY_REDIRECT:
86 86
 				if ($protocol == 'HTTP/1.1') {
87
-					$status = $status . ' Temporary Redirect';
87
+					$status = $status.' Temporary Redirect';
88 88
 					break;
89 89
 				} else {
90 90
 					$status = self::STATUS_FOUND;
91 91
 					// fallthrough
92 92
 				}
93 93
 			case self::STATUS_FOUND;
94
-				$status = $status . ' Found';
94
+				$status = $status.' Found';
95 95
 				break;
96 96
 			case self::STATUS_NOT_FOUND;
97
-				$status = $status . ' Not Found';
97
+				$status = $status.' Not Found';
98 98
 				break;
99 99
 			case self::STATUS_INTERNAL_SERVER_ERROR;
100
-				$status = $status . ' Internal Server Error';
100
+				$status = $status.' Internal Server Error';
101 101
 				break;
102 102
 			case self::STATUS_SERVICE_UNAVAILABLE;
103
-				$status = $status . ' Service Unavailable';
103
+				$status = $status.' Service Unavailable';
104 104
 				break;
105 105
 		}
106 106
 		header($protocol.' '.$status);
@@ -180,17 +180,17 @@  discard block
 block discarded – undo
180 180
 	 * @param string $filename file name
181 181
 	 * @param string $type disposition type, either 'attachment' or 'inline'
182 182
 	 */
183
-	static public function setContentDispositionHeader( $filename, $type = 'attachment' ) {
183
+	static public function setContentDispositionHeader($filename, $type = 'attachment') {
184 184
 		if (\OC::$server->getRequest()->isUserAgent(
185 185
 			[
186 186
 				\OC\AppFramework\Http\Request::USER_AGENT_IE,
187 187
 				\OC\AppFramework\Http\Request::USER_AGENT_ANDROID_MOBILE_CHROME,
188 188
 				\OC\AppFramework\Http\Request::USER_AGENT_FREEBOX,
189 189
 			])) {
190
-			header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' );
190
+			header('Content-Disposition: '.rawurlencode($type).'; filename="'.rawurlencode($filename).'"');
191 191
 		} else {
192
-			header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename )
193
-												 . '; filename="' . rawurlencode( $filename ) . '"' );
192
+			header('Content-Disposition: '.rawurlencode($type).'; filename*=UTF-8\'\''.rawurlencode($filename)
193
+												 . '; filename="'.rawurlencode($filename).'"');
194 194
 		}
195 195
 	}
196 196
 
@@ -256,12 +256,12 @@  discard block
 block discarded – undo
256 256
 			. 'connect-src *; '
257 257
 			. 'object-src \'none\'; '
258 258
 			. 'base-uri \'self\'; ';
259
-		header('Content-Security-Policy:' . $policy);
259
+		header('Content-Security-Policy:'.$policy);
260 260
 		header('X-Frame-Options: SAMEORIGIN'); // Disallow iFraming from other domains
261 261
 
262 262
 		// Send fallback headers for installations that don't have the possibility to send
263 263
 		// custom headers on the webserver side
264
-		if(getenv('modHeadersAvailable') !== 'true') {
264
+		if (getenv('modHeadersAvailable') !== 'true') {
265 265
 			header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters
266 266
 			header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE
267 267
 			header('X-Robots-Tag: none'); // https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag
Please login to merge, or discard this patch.
Indentation   +226 added lines, -226 removed lines patch added patch discarded remove patch
@@ -29,245 +29,245 @@
 block discarded – undo
29 29
  */
30 30
 
31 31
 class OC_Response {
32
-	const STATUS_FOUND = 304;
33
-	const STATUS_NOT_MODIFIED = 304;
34
-	const STATUS_TEMPORARY_REDIRECT = 307;
35
-	const STATUS_BAD_REQUEST = 400;
36
-	const STATUS_FORBIDDEN = 403;
37
-	const STATUS_NOT_FOUND = 404;
38
-	const STATUS_INTERNAL_SERVER_ERROR = 500;
39
-	const STATUS_SERVICE_UNAVAILABLE = 503;
32
+    const STATUS_FOUND = 304;
33
+    const STATUS_NOT_MODIFIED = 304;
34
+    const STATUS_TEMPORARY_REDIRECT = 307;
35
+    const STATUS_BAD_REQUEST = 400;
36
+    const STATUS_FORBIDDEN = 403;
37
+    const STATUS_NOT_FOUND = 404;
38
+    const STATUS_INTERNAL_SERVER_ERROR = 500;
39
+    const STATUS_SERVICE_UNAVAILABLE = 503;
40 40
 
41
-	/**
42
-	* Enable response caching by sending correct HTTP headers
43
-	* @param integer $cache_time time to cache the response
44
-	*  >0		cache time in seconds
45
-	*  0 and <0	enable default browser caching
46
-	*  null		cache indefinitely
47
-	*/
48
-	static public function enableCaching($cache_time = null) {
49
-		if (is_numeric($cache_time)) {
50
-			header('Pragma: public');// enable caching in IE
51
-			if ($cache_time > 0) {
52
-				self::setExpiresHeader('PT'.$cache_time.'S');
53
-				header('Cache-Control: max-age='.$cache_time.', must-revalidate');
54
-			}
55
-			else {
56
-				self::setExpiresHeader(0);
57
-				header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
58
-			}
59
-		}
60
-		else {
61
-			header('Cache-Control: cache');
62
-			header('Pragma: cache');
63
-		}
41
+    /**
42
+     * Enable response caching by sending correct HTTP headers
43
+     * @param integer $cache_time time to cache the response
44
+     *  >0		cache time in seconds
45
+     *  0 and <0	enable default browser caching
46
+     *  null		cache indefinitely
47
+     */
48
+    static public function enableCaching($cache_time = null) {
49
+        if (is_numeric($cache_time)) {
50
+            header('Pragma: public');// enable caching in IE
51
+            if ($cache_time > 0) {
52
+                self::setExpiresHeader('PT'.$cache_time.'S');
53
+                header('Cache-Control: max-age='.$cache_time.', must-revalidate');
54
+            }
55
+            else {
56
+                self::setExpiresHeader(0);
57
+                header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
58
+            }
59
+        }
60
+        else {
61
+            header('Cache-Control: cache');
62
+            header('Pragma: cache');
63
+        }
64 64
 
65
-	}
65
+    }
66 66
 
67
-	/**
68
-	* disable browser caching
69
-	* @see enableCaching with cache_time = 0
70
-	*/
71
-	static public function disableCaching() {
72
-		self::enableCaching(0);
73
-	}
67
+    /**
68
+     * disable browser caching
69
+     * @see enableCaching with cache_time = 0
70
+     */
71
+    static public function disableCaching() {
72
+        self::enableCaching(0);
73
+    }
74 74
 
75
-	/**
76
-	* Set response status
77
-	* @param int $status a HTTP status code, see also the STATUS constants
78
-	*/
79
-	static public function setStatus($status) {
80
-		$protocol = \OC::$server->getRequest()->getHttpProtocol();
81
-		switch($status) {
82
-			case self::STATUS_NOT_MODIFIED:
83
-				$status = $status . ' Not Modified';
84
-				break;
85
-			case self::STATUS_TEMPORARY_REDIRECT:
86
-				if ($protocol == 'HTTP/1.1') {
87
-					$status = $status . ' Temporary Redirect';
88
-					break;
89
-				} else {
90
-					$status = self::STATUS_FOUND;
91
-					// fallthrough
92
-				}
93
-			case self::STATUS_FOUND;
94
-				$status = $status . ' Found';
95
-				break;
96
-			case self::STATUS_NOT_FOUND;
97
-				$status = $status . ' Not Found';
98
-				break;
99
-			case self::STATUS_INTERNAL_SERVER_ERROR;
100
-				$status = $status . ' Internal Server Error';
101
-				break;
102
-			case self::STATUS_SERVICE_UNAVAILABLE;
103
-				$status = $status . ' Service Unavailable';
104
-				break;
105
-		}
106
-		header($protocol.' '.$status);
107
-	}
75
+    /**
76
+     * Set response status
77
+     * @param int $status a HTTP status code, see also the STATUS constants
78
+     */
79
+    static public function setStatus($status) {
80
+        $protocol = \OC::$server->getRequest()->getHttpProtocol();
81
+        switch($status) {
82
+            case self::STATUS_NOT_MODIFIED:
83
+                $status = $status . ' Not Modified';
84
+                break;
85
+            case self::STATUS_TEMPORARY_REDIRECT:
86
+                if ($protocol == 'HTTP/1.1') {
87
+                    $status = $status . ' Temporary Redirect';
88
+                    break;
89
+                } else {
90
+                    $status = self::STATUS_FOUND;
91
+                    // fallthrough
92
+                }
93
+            case self::STATUS_FOUND;
94
+                $status = $status . ' Found';
95
+                break;
96
+            case self::STATUS_NOT_FOUND;
97
+                $status = $status . ' Not Found';
98
+                break;
99
+            case self::STATUS_INTERNAL_SERVER_ERROR;
100
+                $status = $status . ' Internal Server Error';
101
+                break;
102
+            case self::STATUS_SERVICE_UNAVAILABLE;
103
+                $status = $status . ' Service Unavailable';
104
+                break;
105
+        }
106
+        header($protocol.' '.$status);
107
+    }
108 108
 
109
-	/**
110
-	* Send redirect response
111
-	* @param string $location to redirect to
112
-	*/
113
-	static public function redirect($location) {
114
-		self::setStatus(self::STATUS_TEMPORARY_REDIRECT);
115
-		header('Location: '.$location);
116
-	}
109
+    /**
110
+     * Send redirect response
111
+     * @param string $location to redirect to
112
+     */
113
+    static public function redirect($location) {
114
+        self::setStatus(self::STATUS_TEMPORARY_REDIRECT);
115
+        header('Location: '.$location);
116
+    }
117 117
 
118
-	/**
119
-	 * Set response expire time
120
-	 * @param string|DateTime|int $expires date-time when the response expires
121
-	 * string for DateInterval from now
122
-	 * DateTime object when to expire response
123
-	 */
124
-	static public function setExpiresHeader($expires) {
125
-		if (is_string($expires) && $expires[0] == 'P') {
126
-			$interval = $expires;
127
-			$expires = new DateTime('now');
128
-			$expires->add(new DateInterval($interval));
129
-		}
130
-		if ($expires instanceof DateTime) {
131
-			$expires->setTimezone(new DateTimeZone('GMT'));
132
-			$expires = $expires->format(DateTime::RFC2822);
133
-		}
134
-		header('Expires: '.$expires);
135
-	}
118
+    /**
119
+     * Set response expire time
120
+     * @param string|DateTime|int $expires date-time when the response expires
121
+     * string for DateInterval from now
122
+     * DateTime object when to expire response
123
+     */
124
+    static public function setExpiresHeader($expires) {
125
+        if (is_string($expires) && $expires[0] == 'P') {
126
+            $interval = $expires;
127
+            $expires = new DateTime('now');
128
+            $expires->add(new DateInterval($interval));
129
+        }
130
+        if ($expires instanceof DateTime) {
131
+            $expires->setTimezone(new DateTimeZone('GMT'));
132
+            $expires = $expires->format(DateTime::RFC2822);
133
+        }
134
+        header('Expires: '.$expires);
135
+    }
136 136
 
137
-	/**
138
-	* Checks and set ETag header, when the request matches sends a
139
-	* 'not modified' response
140
-	* @param string $etag token to use for modification check
141
-	*/
142
-	static public function setETagHeader($etag) {
143
-		if (empty($etag)) {
144
-			return;
145
-		}
146
-		$etag = '"'.$etag.'"';
147
-		if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
148
-		    trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
149
-			self::setStatus(self::STATUS_NOT_MODIFIED);
150
-			exit;
151
-		}
152
-		header('ETag: '.$etag);
153
-	}
137
+    /**
138
+     * Checks and set ETag header, when the request matches sends a
139
+     * 'not modified' response
140
+     * @param string $etag token to use for modification check
141
+     */
142
+    static public function setETagHeader($etag) {
143
+        if (empty($etag)) {
144
+            return;
145
+        }
146
+        $etag = '"'.$etag.'"';
147
+        if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
148
+            trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
149
+            self::setStatus(self::STATUS_NOT_MODIFIED);
150
+            exit;
151
+        }
152
+        header('ETag: '.$etag);
153
+    }
154 154
 
155
-	/**
156
-	* Checks and set Last-Modified header, when the request matches sends a
157
-	* 'not modified' response
158
-	* @param int|DateTime|string $lastModified time when the response was last modified
159
-	*/
160
-	static public function setLastModifiedHeader($lastModified) {
161
-		if (empty($lastModified)) {
162
-			return;
163
-		}
164
-		if (is_int($lastModified)) {
165
-			$lastModified = gmdate(DateTime::RFC2822, $lastModified);
166
-		}
167
-		if ($lastModified instanceof DateTime) {
168
-			$lastModified = $lastModified->format(DateTime::RFC2822);
169
-		}
170
-		if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
171
-		    trim($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModified) {
172
-			self::setStatus(self::STATUS_NOT_MODIFIED);
173
-			exit;
174
-		}
175
-		header('Last-Modified: '.$lastModified);
176
-	}
155
+    /**
156
+     * Checks and set Last-Modified header, when the request matches sends a
157
+     * 'not modified' response
158
+     * @param int|DateTime|string $lastModified time when the response was last modified
159
+     */
160
+    static public function setLastModifiedHeader($lastModified) {
161
+        if (empty($lastModified)) {
162
+            return;
163
+        }
164
+        if (is_int($lastModified)) {
165
+            $lastModified = gmdate(DateTime::RFC2822, $lastModified);
166
+        }
167
+        if ($lastModified instanceof DateTime) {
168
+            $lastModified = $lastModified->format(DateTime::RFC2822);
169
+        }
170
+        if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
171
+            trim($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModified) {
172
+            self::setStatus(self::STATUS_NOT_MODIFIED);
173
+            exit;
174
+        }
175
+        header('Last-Modified: '.$lastModified);
176
+    }
177 177
 
178
-	/**
179
-	 * Sets the content disposition header (with possible workarounds)
180
-	 * @param string $filename file name
181
-	 * @param string $type disposition type, either 'attachment' or 'inline'
182
-	 */
183
-	static public function setContentDispositionHeader( $filename, $type = 'attachment' ) {
184
-		if (\OC::$server->getRequest()->isUserAgent(
185
-			[
186
-				\OC\AppFramework\Http\Request::USER_AGENT_IE,
187
-				\OC\AppFramework\Http\Request::USER_AGENT_ANDROID_MOBILE_CHROME,
188
-				\OC\AppFramework\Http\Request::USER_AGENT_FREEBOX,
189
-			])) {
190
-			header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' );
191
-		} else {
192
-			header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename )
193
-												 . '; filename="' . rawurlencode( $filename ) . '"' );
194
-		}
195
-	}
178
+    /**
179
+     * Sets the content disposition header (with possible workarounds)
180
+     * @param string $filename file name
181
+     * @param string $type disposition type, either 'attachment' or 'inline'
182
+     */
183
+    static public function setContentDispositionHeader( $filename, $type = 'attachment' ) {
184
+        if (\OC::$server->getRequest()->isUserAgent(
185
+            [
186
+                \OC\AppFramework\Http\Request::USER_AGENT_IE,
187
+                \OC\AppFramework\Http\Request::USER_AGENT_ANDROID_MOBILE_CHROME,
188
+                \OC\AppFramework\Http\Request::USER_AGENT_FREEBOX,
189
+            ])) {
190
+            header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' );
191
+        } else {
192
+            header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename )
193
+                                                    . '; filename="' . rawurlencode( $filename ) . '"' );
194
+        }
195
+    }
196 196
 
197
-	/**
198
-	 * Sets the content length header (with possible workarounds)
199
-	 * @param string|int|float $length Length to be sent
200
-	 */
201
-	static public function setContentLengthHeader($length) {
202
-		if (PHP_INT_SIZE === 4) {
203
-			if ($length > PHP_INT_MAX && stripos(PHP_SAPI, 'apache') === 0) {
204
-				// Apache PHP SAPI casts Content-Length headers to PHP integers.
205
-				// This enforces a limit of PHP_INT_MAX (2147483647 on 32-bit
206
-				// platforms). So, if the length is greater than PHP_INT_MAX,
207
-				// we just do not send a Content-Length header to prevent
208
-				// bodies from being received incompletely.
209
-				return;
210
-			}
211
-			// Convert signed integer or float to unsigned base-10 string.
212
-			$lfh = new \OC\LargeFileHelper;
213
-			$length = $lfh->formatUnsignedInteger($length);
214
-		}
215
-		header('Content-Length: '.$length);
216
-	}
197
+    /**
198
+     * Sets the content length header (with possible workarounds)
199
+     * @param string|int|float $length Length to be sent
200
+     */
201
+    static public function setContentLengthHeader($length) {
202
+        if (PHP_INT_SIZE === 4) {
203
+            if ($length > PHP_INT_MAX && stripos(PHP_SAPI, 'apache') === 0) {
204
+                // Apache PHP SAPI casts Content-Length headers to PHP integers.
205
+                // This enforces a limit of PHP_INT_MAX (2147483647 on 32-bit
206
+                // platforms). So, if the length is greater than PHP_INT_MAX,
207
+                // we just do not send a Content-Length header to prevent
208
+                // bodies from being received incompletely.
209
+                return;
210
+            }
211
+            // Convert signed integer or float to unsigned base-10 string.
212
+            $lfh = new \OC\LargeFileHelper;
213
+            $length = $lfh->formatUnsignedInteger($length);
214
+        }
215
+        header('Content-Length: '.$length);
216
+    }
217 217
 
218
-	/**
219
-	 * Send file as response, checking and setting caching headers
220
-	 * @param string $filepath of file to send
221
-	 * @deprecated 8.1.0 - Use \OCP\AppFramework\Http\StreamResponse or another AppFramework controller instead
222
-	 */
223
-	static public function sendFile($filepath) {
224
-		$fp = fopen($filepath, 'rb');
225
-		if ($fp) {
226
-			self::setLastModifiedHeader(filemtime($filepath));
227
-			self::setETagHeader(md5_file($filepath));
218
+    /**
219
+     * Send file as response, checking and setting caching headers
220
+     * @param string $filepath of file to send
221
+     * @deprecated 8.1.0 - Use \OCP\AppFramework\Http\StreamResponse or another AppFramework controller instead
222
+     */
223
+    static public function sendFile($filepath) {
224
+        $fp = fopen($filepath, 'rb');
225
+        if ($fp) {
226
+            self::setLastModifiedHeader(filemtime($filepath));
227
+            self::setETagHeader(md5_file($filepath));
228 228
 
229
-			self::setContentLengthHeader(filesize($filepath));
230
-			fpassthru($fp);
231
-		}
232
-		else {
233
-			self::setStatus(self::STATUS_NOT_FOUND);
234
-		}
235
-	}
229
+            self::setContentLengthHeader(filesize($filepath));
230
+            fpassthru($fp);
231
+        }
232
+        else {
233
+            self::setStatus(self::STATUS_NOT_FOUND);
234
+        }
235
+    }
236 236
 
237
-	/**
238
-	 * This function adds some security related headers to all requests served via base.php
239
-	 * The implementation of this function has to happen here to ensure that all third-party
240
-	 * components (e.g. SabreDAV) also benefit from this headers.
241
-	 */
242
-	public static function addSecurityHeaders() {
243
-		/**
244
-		 * FIXME: Content Security Policy for legacy ownCloud components. This
245
-		 * can be removed once \OCP\AppFramework\Http\Response from the AppFramework
246
-		 * is used everywhere.
247
-		 * @see \OCP\AppFramework\Http\Response::getHeaders
248
-		 */
249
-		$policy = 'default-src \'self\'; '
250
-			. 'script-src \'self\' \'unsafe-eval\' \'nonce-'.\OC::$server->getContentSecurityPolicyNonceManager()->getNonce().'\'; '
251
-			. 'style-src \'self\' \'unsafe-inline\'; '
252
-			. 'frame-src *; '
253
-			. 'img-src * data: blob:; '
254
-			. 'font-src \'self\' data:; '
255
-			. 'media-src *; ' 
256
-			. 'connect-src *; '
257
-			. 'object-src \'none\'; '
258
-			. 'base-uri \'self\'; ';
259
-		header('Content-Security-Policy:' . $policy);
260
-		header('X-Frame-Options: SAMEORIGIN'); // Disallow iFraming from other domains
237
+    /**
238
+     * This function adds some security related headers to all requests served via base.php
239
+     * The implementation of this function has to happen here to ensure that all third-party
240
+     * components (e.g. SabreDAV) also benefit from this headers.
241
+     */
242
+    public static function addSecurityHeaders() {
243
+        /**
244
+         * FIXME: Content Security Policy for legacy ownCloud components. This
245
+         * can be removed once \OCP\AppFramework\Http\Response from the AppFramework
246
+         * is used everywhere.
247
+         * @see \OCP\AppFramework\Http\Response::getHeaders
248
+         */
249
+        $policy = 'default-src \'self\'; '
250
+            . 'script-src \'self\' \'unsafe-eval\' \'nonce-'.\OC::$server->getContentSecurityPolicyNonceManager()->getNonce().'\'; '
251
+            . 'style-src \'self\' \'unsafe-inline\'; '
252
+            . 'frame-src *; '
253
+            . 'img-src * data: blob:; '
254
+            . 'font-src \'self\' data:; '
255
+            . 'media-src *; ' 
256
+            . 'connect-src *; '
257
+            . 'object-src \'none\'; '
258
+            . 'base-uri \'self\'; ';
259
+        header('Content-Security-Policy:' . $policy);
260
+        header('X-Frame-Options: SAMEORIGIN'); // Disallow iFraming from other domains
261 261
 
262
-		// Send fallback headers for installations that don't have the possibility to send
263
-		// custom headers on the webserver side
264
-		if(getenv('modHeadersAvailable') !== 'true') {
265
-			header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters
266
-			header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE
267
-			header('X-Robots-Tag: none'); // https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag
268
-			header('X-Download-Options: noopen'); // https://msdn.microsoft.com/en-us/library/jj542450(v=vs.85).aspx
269
-			header('X-Permitted-Cross-Domain-Policies: none'); // https://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html
270
-		}
271
-	}
262
+        // Send fallback headers for installations that don't have the possibility to send
263
+        // custom headers on the webserver side
264
+        if(getenv('modHeadersAvailable') !== 'true') {
265
+            header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters
266
+            header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE
267
+            header('X-Robots-Tag: none'); // https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag
268
+            header('X-Download-Options: noopen'); // https://msdn.microsoft.com/en-us/library/jj542450(v=vs.85).aspx
269
+            header('X-Permitted-Cross-Domain-Policies: none'); // https://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html
270
+        }
271
+    }
272 272
 
273 273
 }
Please login to merge, or discard this patch.
lib/private/legacy/files.php 4 patches
Spacing   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -115,7 +115,7 @@  discard block
 block discarded – undo
115 115
 			}
116 116
 
117 117
 			if (!is_array($files)) {
118
-				$filename = $dir . '/' . $files;
118
+				$filename = $dir.'/'.$files;
119 119
 				if (!$view->is_dir($filename)) {
120 120
 					self::getSingleFile($view, $dir, $files, is_null($params) ? array() : $params);
121 121
 					return;
@@ -130,9 +130,9 @@  discard block
 block discarded – undo
130 130
 					$name = $basename;
131 131
 				}
132 132
 
133
-				$filename = $dir . '/' . $name;
133
+				$filename = $dir.'/'.$name;
134 134
 			} else {
135
-				$filename = $dir . '/' . $files;
135
+				$filename = $dir.'/'.$files;
136 136
 				$getType = self::ZIP_DIR;
137 137
 				// downloading root ?
138 138
 				if ($files !== '') {
@@ -151,7 +151,7 @@  discard block
 block discarded – undo
151 151
 			ignore_user_abort(true);
152 152
 			if ($getType === self::ZIP_FILES) {
153 153
 				foreach ($files as $file) {
154
-					$file = $dir . '/' . $file;
154
+					$file = $dir.'/'.$file;
155 155
 					if (\OC\Files\Filesystem::is_file($file)) {
156 156
 						$fileSize = \OC\Files\Filesystem::filesize($file);
157 157
 						$fileTime = \OC\Files\Filesystem::filemtime($file);
@@ -163,7 +163,7 @@  discard block
 block discarded – undo
163 163
 					}
164 164
 				}
165 165
 			} elseif ($getType === self::ZIP_DIR) {
166
-				$file = $dir . '/' . $files;
166
+				$file = $dir.'/'.$files;
167 167
 				$streamer->addDirRecursive($file);
168 168
 			}
169 169
 			$streamer->finalize();
@@ -195,7 +195,7 @@  discard block
 block discarded – undo
195 195
 	 * @return array $rangeArray ('from'=>int,'to'=>int), ...
196 196
 	 */
197 197
 	private static function parseHttpRangeHeader($rangeHeaderPos, $fileSize) {
198
-		$rArray=explode(',', $rangeHeaderPos);
198
+		$rArray = explode(',', $rangeHeaderPos);
199 199
 		$minOffset = 0;
200 200
 		$ind = 0;
201 201
 
@@ -207,7 +207,7 @@  discard block
 block discarded – undo
207 207
 				if ($ranges[0] < $minOffset) { // case: bytes=500-700,601-999
208 208
 					$ranges[0] = $minOffset;
209 209
 				}
210
-				if ($ind > 0 && $rangeArray[$ind-1]['to']+1 == $ranges[0]) { // case: bytes=500-600,601-999
210
+				if ($ind > 0 && $rangeArray[$ind - 1]['to'] + 1 == $ranges[0]) { // case: bytes=500-600,601-999
211 211
 					$ind--;
212 212
 					$ranges[0] = $rangeArray[$ind]['from'];
213 213
 				}
@@ -216,9 +216,9 @@  discard block
 block discarded – undo
216 216
 			if (is_numeric($ranges[0]) && is_numeric($ranges[1]) && $ranges[0] < $fileSize && $ranges[0] <= $ranges[1]) {
217 217
 				// case: x-x
218 218
 				if ($ranges[1] >= $fileSize) {
219
-					$ranges[1] = $fileSize-1;
219
+					$ranges[1] = $fileSize - 1;
220 220
 				}
221
-				$rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $ranges[1], 'size' => $fileSize );
221
+				$rangeArray[$ind++] = array('from' => $ranges[0], 'to' => $ranges[1], 'size' => $fileSize);
222 222
 				$minOffset = $ranges[1] + 1;
223 223
 				if ($minOffset >= $fileSize) {
224 224
 					break;
@@ -226,7 +226,7 @@  discard block
 block discarded – undo
226 226
 			}
227 227
 			elseif (is_numeric($ranges[0]) && $ranges[0] < $fileSize) {
228 228
 				// case: x-
229
-				$rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $fileSize-1, 'size' => $fileSize );
229
+				$rangeArray[$ind++] = array('from' => $ranges[0], 'to' => $fileSize - 1, 'size' => $fileSize);
230 230
 				break;
231 231
 			}
232 232
 			elseif (is_numeric($ranges[1])) {
@@ -234,7 +234,7 @@  discard block
 block discarded – undo
234 234
 				if ($ranges[1] > $fileSize) {
235 235
 					$ranges[1] = $fileSize;
236 236
 				}
237
-				$rangeArray[$ind++] = array( 'from' => $fileSize-$ranges[1], 'to' => $fileSize-1, 'size' => $fileSize );
237
+				$rangeArray[$ind++] = array('from' => $fileSize - $ranges[1], 'to' => $fileSize - 1, 'size' => $fileSize);
238 238
 				break;
239 239
 			}
240 240
 		}
@@ -248,7 +248,7 @@  discard block
 block discarded – undo
248 248
 	 * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
249 249
 	 */
250 250
 	private static function getSingleFile($view, $dir, $name, $params) {
251
-		$filename = $dir . '/' . $name;
251
+		$filename = $dir.'/'.$name;
252 252
 		OC_Util::obEnd();
253 253
 		$view->lockFile($filename, ILockingProvider::LOCK_SHARED);
254 254
 		
@@ -314,17 +314,17 @@  discard block
 block discarded – undo
314 314
 	 */
315 315
 	public static function lockFiles($view, $dir, $files) {
316 316
 		if (!is_array($files)) {
317
-			$file = $dir . '/' . $files;
317
+			$file = $dir.'/'.$files;
318 318
 			$files = [$file];
319 319
 		}
320 320
 		foreach ($files as $file) {
321
-			$file = $dir . '/' . $file;
321
+			$file = $dir.'/'.$file;
322 322
 			$view->lockFile($file, ILockingProvider::LOCK_SHARED);
323 323
 			if ($view->is_dir($file)) {
324 324
 				$contents = $view->getDirectoryContent($file);
325 325
 				$contents = array_map(function($fileInfo) use ($file) {
326 326
 					/** @var \OCP\Files\FileInfo $fileInfo */
327
-					return $file . '/' . $fileInfo->getName();
327
+					return $file.'/'.$fileInfo->getName();
328 328
 				}, $contents);
329 329
 				self::lockFiles($view, $dir, $contents);
330 330
 			}
@@ -353,8 +353,8 @@  discard block
 block discarded – undo
353 353
 
354 354
 		// default locations if not overridden by $files
355 355
 		$files = array_merge([
356
-			'.htaccess' => OC::$SERVERROOT . '/.htaccess',
357
-			'.user.ini' => OC::$SERVERROOT . '/.user.ini'
356
+			'.htaccess' => OC::$SERVERROOT.'/.htaccess',
357
+			'.user.ini' => OC::$SERVERROOT.'/.user.ini'
358 358
 		], $files);
359 359
 
360 360
 		$updateFiles = [
@@ -375,7 +375,7 @@  discard block
 block discarded – undo
375 375
 			$handle = @fopen($filename, 'r+');
376 376
 			if (!$handle) {
377 377
 				\OCP\Util::writeLog('files',
378
-					'Can\'t write upload limit to ' . $filename . '. Please check the file permissions',
378
+					'Can\'t write upload limit to '.$filename.'. Please check the file permissions',
379 379
 					\OCP\Util::WARN);
380 380
 				$success = false;
381 381
 				continue; // try to update as many files as possible
@@ -395,7 +395,7 @@  discard block
 block discarded – undo
395 395
 					$content = $newContent;
396 396
 				}
397 397
 				if ($hasReplaced === 0) {
398
-					$content .= "\n" . $setting;
398
+					$content .= "\n".$setting;
399 399
 				}
400 400
 			}
401 401
 
@@ -426,12 +426,12 @@  discard block
 block discarded – undo
426 426
 		}
427 427
 		if ($getType === self::ZIP_FILES) {
428 428
 			foreach ($files as $file) {
429
-				$file = $dir . '/' . $file;
429
+				$file = $dir.'/'.$file;
430 430
 				$view->unlockFile($file, ILockingProvider::LOCK_SHARED);
431 431
 			}
432 432
 		}
433 433
 		if ($getType === self::ZIP_DIR) {
434
-			$file = $dir . '/' . $files;
434
+			$file = $dir.'/'.$files;
435 435
 			$view->unlockFile($file, ILockingProvider::LOCK_SHARED);
436 436
 		}
437 437
 	}
Please login to merge, or discard this patch.
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.
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -338,7 +338,7 @@
 block discarded – undo
338 338
 	 *
339 339
 	 * @param int $size file size in bytes
340 340
 	 * @param array $files override '.htaccess' and '.user.ini' locations
341
-	 * @return bool|int false on failure, size on success
341
+	 * @return integer false on failure, size on success
342 342
 	 */
343 343
 	public static function setUploadLimit($size, $files = []) {
344 344
 		//don't allow user to break his config
Please login to merge, or discard this patch.
Indentation   +388 added lines, -388 removed lines patch added patch discarded remove patch
@@ -46,396 +46,396 @@
 block discarded – undo
46 46
  *
47 47
  */
48 48
 class OC_Files {
49
-	const FILE = 1;
50
-	const ZIP_FILES = 2;
51
-	const ZIP_DIR = 3;
52
-
53
-	const UPLOAD_MIN_LIMIT_BYTES = 1048576; // 1 MiB
54
-
55
-
56
-	private static $multipartBoundary = '';
57
-
58
-	/**
59
-	 * @return string
60
-	 */
61
-	private static function getBoundary() {
62
-		if (empty(self::$multipartBoundary)) {
63
-			self::$multipartBoundary = md5(mt_rand());
64
-		}
65
-		return self::$multipartBoundary;
66
-	}
67
-
68
-	/**
69
-	 * @param string $filename
70
-	 * @param string $name
71
-	 * @param array $rangeArray ('from'=>int,'to'=>int), ...
72
-	 */
73
-	private static function sendHeaders($filename, $name, array $rangeArray) {
74
-		OC_Response::setContentDispositionHeader($name, 'attachment');
75
-		header('Content-Transfer-Encoding: binary', true);
76
-		OC_Response::disableCaching();
77
-		$fileSize = \OC\Files\Filesystem::filesize($filename);
78
-		$type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename));
79
-		if ($fileSize > -1) {
80
-			if (!empty($rangeArray)) {
81
-			    header('HTTP/1.1 206 Partial Content', true);
82
-			    header('Accept-Ranges: bytes', true);
83
-			    if (count($rangeArray) > 1) {
84
-				$type = 'multipart/byteranges; boundary='.self::getBoundary();
85
-				// no Content-Length header here
86
-			    }
87
-			    else {
88
-				header(sprintf('Content-Range: bytes %d-%d/%d', $rangeArray[0]['from'], $rangeArray[0]['to'], $fileSize), true);
89
-				OC_Response::setContentLengthHeader($rangeArray[0]['to'] - $rangeArray[0]['from'] + 1);
90
-			    }
91
-			}
92
-			else {
93
-			    OC_Response::setContentLengthHeader($fileSize);
94
-			}
95
-		}
96
-		header('Content-Type: '.$type, true);
97
-	}
98
-
99
-	/**
100
-	 * return the content of a file or return a zip file containing multiple files
101
-	 *
102
-	 * @param string $dir
103
-	 * @param string $files ; separated list of files to download
104
-	 * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
105
-	 */
106
-	public static function get($dir, $files, $params = null) {
107
-
108
-		$view = \OC\Files\Filesystem::getView();
109
-		$getType = self::FILE;
110
-		$filename = $dir;
111
-		try {
112
-
113
-			if (is_array($files) && count($files) === 1) {
114
-				$files = $files[0];
115
-			}
116
-
117
-			if (!is_array($files)) {
118
-				$filename = $dir . '/' . $files;
119
-				if (!$view->is_dir($filename)) {
120
-					self::getSingleFile($view, $dir, $files, is_null($params) ? array() : $params);
121
-					return;
122
-				}
123
-			}
124
-
125
-			$name = 'download';
126
-			if (is_array($files)) {
127
-				$getType = self::ZIP_FILES;
128
-				$basename = basename($dir);
129
-				if ($basename) {
130
-					$name = $basename;
131
-				}
132
-
133
-				$filename = $dir . '/' . $name;
134
-			} else {
135
-				$filename = $dir . '/' . $files;
136
-				$getType = self::ZIP_DIR;
137
-				// downloading root ?
138
-				if ($files !== '') {
139
-					$name = $files;
140
-				}
141
-			}
142
-
143
-			$streamer = new Streamer();
144
-			OC_Util::obEnd();
145
-
146
-			self::lockFiles($view, $dir, $files);
147
-
148
-			$streamer->sendHeaders($name);
149
-			$executionTime = intval(OC::$server->getIniWrapper()->getNumeric('max_execution_time'));
150
-			if (strpos(@ini_get('disable_functions'), 'set_time_limit') === false) {
151
-				@set_time_limit(0);
152
-			}
153
-			ignore_user_abort(true);
154
-			if ($getType === self::ZIP_FILES) {
155
-				foreach ($files as $file) {
156
-					$file = $dir . '/' . $file;
157
-					if (\OC\Files\Filesystem::is_file($file)) {
158
-						$fileSize = \OC\Files\Filesystem::filesize($file);
159
-						$fileTime = \OC\Files\Filesystem::filemtime($file);
160
-						$fh = \OC\Files\Filesystem::fopen($file, 'r');
161
-						$streamer->addFileFromStream($fh, basename($file), $fileSize, $fileTime);
162
-						fclose($fh);
163
-					} elseif (\OC\Files\Filesystem::is_dir($file)) {
164
-						$streamer->addDirRecursive($file);
165
-					}
166
-				}
167
-			} elseif ($getType === self::ZIP_DIR) {
168
-				$file = $dir . '/' . $files;
169
-				$streamer->addDirRecursive($file);
170
-			}
171
-			$streamer->finalize();
172
-			set_time_limit($executionTime);
173
-			self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
174
-		} catch (\OCP\Lock\LockedException $ex) {
175
-			self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
176
-			OC::$server->getLogger()->logException($ex);
177
-			$l = \OC::$server->getL10N('core');
178
-			$hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
179
-			\OC_Template::printErrorPage($l->t('File is currently busy, please try again later'), $hint);
180
-		} catch (\OCP\Files\ForbiddenException $ex) {
181
-			self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
182
-			OC::$server->getLogger()->logException($ex);
183
-			$l = \OC::$server->getL10N('core');
184
-			\OC_Template::printErrorPage($l->t('Can\'t read file'), $ex->getMessage());
185
-		} catch (\Exception $ex) {
186
-			self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
187
-			OC::$server->getLogger()->logException($ex);
188
-			$l = \OC::$server->getL10N('core');
189
-			$hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
190
-			\OC_Template::printErrorPage($l->t('Can\'t read file'), $hint);
191
-		}
192
-	}
193
-
194
-	/**
195
-	 * @param string $rangeHeaderPos
196
-	 * @param int $fileSize
197
-	 * @return array $rangeArray ('from'=>int,'to'=>int), ...
198
-	 */
199
-	private static function parseHttpRangeHeader($rangeHeaderPos, $fileSize) {
200
-		$rArray=explode(',', $rangeHeaderPos);
201
-		$minOffset = 0;
202
-		$ind = 0;
203
-
204
-		$rangeArray = array();
205
-
206
-		foreach ($rArray as $value) {
207
-			$ranges = explode('-', $value);
208
-			if (is_numeric($ranges[0])) {
209
-				if ($ranges[0] < $minOffset) { // case: bytes=500-700,601-999
210
-					$ranges[0] = $minOffset;
211
-				}
212
-				if ($ind > 0 && $rangeArray[$ind-1]['to']+1 == $ranges[0]) { // case: bytes=500-600,601-999
213
-					$ind--;
214
-					$ranges[0] = $rangeArray[$ind]['from'];
215
-				}
216
-			}
217
-
218
-			if (is_numeric($ranges[0]) && is_numeric($ranges[1]) && $ranges[0] < $fileSize && $ranges[0] <= $ranges[1]) {
219
-				// case: x-x
220
-				if ($ranges[1] >= $fileSize) {
221
-					$ranges[1] = $fileSize-1;
222
-				}
223
-				$rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $ranges[1], 'size' => $fileSize );
224
-				$minOffset = $ranges[1] + 1;
225
-				if ($minOffset >= $fileSize) {
226
-					break;
227
-				}
228
-			}
229
-			elseif (is_numeric($ranges[0]) && $ranges[0] < $fileSize) {
230
-				// case: x-
231
-				$rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $fileSize-1, 'size' => $fileSize );
232
-				break;
233
-			}
234
-			elseif (is_numeric($ranges[1])) {
235
-				// case: -x
236
-				if ($ranges[1] > $fileSize) {
237
-					$ranges[1] = $fileSize;
238
-				}
239
-				$rangeArray[$ind++] = array( 'from' => $fileSize-$ranges[1], 'to' => $fileSize-1, 'size' => $fileSize );
240
-				break;
241
-			}
242
-		}
243
-		return $rangeArray;
244
-	}
245
-
246
-	/**
247
-	 * @param View $view
248
-	 * @param string $name
249
-	 * @param string $dir
250
-	 * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
251
-	 */
252
-	private static function getSingleFile($view, $dir, $name, $params) {
253
-		$filename = $dir . '/' . $name;
254
-		OC_Util::obEnd();
255
-		$view->lockFile($filename, ILockingProvider::LOCK_SHARED);
49
+    const FILE = 1;
50
+    const ZIP_FILES = 2;
51
+    const ZIP_DIR = 3;
52
+
53
+    const UPLOAD_MIN_LIMIT_BYTES = 1048576; // 1 MiB
54
+
55
+
56
+    private static $multipartBoundary = '';
57
+
58
+    /**
59
+     * @return string
60
+     */
61
+    private static function getBoundary() {
62
+        if (empty(self::$multipartBoundary)) {
63
+            self::$multipartBoundary = md5(mt_rand());
64
+        }
65
+        return self::$multipartBoundary;
66
+    }
67
+
68
+    /**
69
+     * @param string $filename
70
+     * @param string $name
71
+     * @param array $rangeArray ('from'=>int,'to'=>int), ...
72
+     */
73
+    private static function sendHeaders($filename, $name, array $rangeArray) {
74
+        OC_Response::setContentDispositionHeader($name, 'attachment');
75
+        header('Content-Transfer-Encoding: binary', true);
76
+        OC_Response::disableCaching();
77
+        $fileSize = \OC\Files\Filesystem::filesize($filename);
78
+        $type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename));
79
+        if ($fileSize > -1) {
80
+            if (!empty($rangeArray)) {
81
+                header('HTTP/1.1 206 Partial Content', true);
82
+                header('Accept-Ranges: bytes', true);
83
+                if (count($rangeArray) > 1) {
84
+                $type = 'multipart/byteranges; boundary='.self::getBoundary();
85
+                // no Content-Length header here
86
+                }
87
+                else {
88
+                header(sprintf('Content-Range: bytes %d-%d/%d', $rangeArray[0]['from'], $rangeArray[0]['to'], $fileSize), true);
89
+                OC_Response::setContentLengthHeader($rangeArray[0]['to'] - $rangeArray[0]['from'] + 1);
90
+                }
91
+            }
92
+            else {
93
+                OC_Response::setContentLengthHeader($fileSize);
94
+            }
95
+        }
96
+        header('Content-Type: '.$type, true);
97
+    }
98
+
99
+    /**
100
+     * return the content of a file or return a zip file containing multiple files
101
+     *
102
+     * @param string $dir
103
+     * @param string $files ; separated list of files to download
104
+     * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
105
+     */
106
+    public static function get($dir, $files, $params = null) {
107
+
108
+        $view = \OC\Files\Filesystem::getView();
109
+        $getType = self::FILE;
110
+        $filename = $dir;
111
+        try {
112
+
113
+            if (is_array($files) && count($files) === 1) {
114
+                $files = $files[0];
115
+            }
116
+
117
+            if (!is_array($files)) {
118
+                $filename = $dir . '/' . $files;
119
+                if (!$view->is_dir($filename)) {
120
+                    self::getSingleFile($view, $dir, $files, is_null($params) ? array() : $params);
121
+                    return;
122
+                }
123
+            }
124
+
125
+            $name = 'download';
126
+            if (is_array($files)) {
127
+                $getType = self::ZIP_FILES;
128
+                $basename = basename($dir);
129
+                if ($basename) {
130
+                    $name = $basename;
131
+                }
132
+
133
+                $filename = $dir . '/' . $name;
134
+            } else {
135
+                $filename = $dir . '/' . $files;
136
+                $getType = self::ZIP_DIR;
137
+                // downloading root ?
138
+                if ($files !== '') {
139
+                    $name = $files;
140
+                }
141
+            }
142
+
143
+            $streamer = new Streamer();
144
+            OC_Util::obEnd();
145
+
146
+            self::lockFiles($view, $dir, $files);
147
+
148
+            $streamer->sendHeaders($name);
149
+            $executionTime = intval(OC::$server->getIniWrapper()->getNumeric('max_execution_time'));
150
+            if (strpos(@ini_get('disable_functions'), 'set_time_limit') === false) {
151
+                @set_time_limit(0);
152
+            }
153
+            ignore_user_abort(true);
154
+            if ($getType === self::ZIP_FILES) {
155
+                foreach ($files as $file) {
156
+                    $file = $dir . '/' . $file;
157
+                    if (\OC\Files\Filesystem::is_file($file)) {
158
+                        $fileSize = \OC\Files\Filesystem::filesize($file);
159
+                        $fileTime = \OC\Files\Filesystem::filemtime($file);
160
+                        $fh = \OC\Files\Filesystem::fopen($file, 'r');
161
+                        $streamer->addFileFromStream($fh, basename($file), $fileSize, $fileTime);
162
+                        fclose($fh);
163
+                    } elseif (\OC\Files\Filesystem::is_dir($file)) {
164
+                        $streamer->addDirRecursive($file);
165
+                    }
166
+                }
167
+            } elseif ($getType === self::ZIP_DIR) {
168
+                $file = $dir . '/' . $files;
169
+                $streamer->addDirRecursive($file);
170
+            }
171
+            $streamer->finalize();
172
+            set_time_limit($executionTime);
173
+            self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
174
+        } catch (\OCP\Lock\LockedException $ex) {
175
+            self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
176
+            OC::$server->getLogger()->logException($ex);
177
+            $l = \OC::$server->getL10N('core');
178
+            $hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
179
+            \OC_Template::printErrorPage($l->t('File is currently busy, please try again later'), $hint);
180
+        } catch (\OCP\Files\ForbiddenException $ex) {
181
+            self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
182
+            OC::$server->getLogger()->logException($ex);
183
+            $l = \OC::$server->getL10N('core');
184
+            \OC_Template::printErrorPage($l->t('Can\'t read file'), $ex->getMessage());
185
+        } catch (\Exception $ex) {
186
+            self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
187
+            OC::$server->getLogger()->logException($ex);
188
+            $l = \OC::$server->getL10N('core');
189
+            $hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
190
+            \OC_Template::printErrorPage($l->t('Can\'t read file'), $hint);
191
+        }
192
+    }
193
+
194
+    /**
195
+     * @param string $rangeHeaderPos
196
+     * @param int $fileSize
197
+     * @return array $rangeArray ('from'=>int,'to'=>int), ...
198
+     */
199
+    private static function parseHttpRangeHeader($rangeHeaderPos, $fileSize) {
200
+        $rArray=explode(',', $rangeHeaderPos);
201
+        $minOffset = 0;
202
+        $ind = 0;
203
+
204
+        $rangeArray = array();
205
+
206
+        foreach ($rArray as $value) {
207
+            $ranges = explode('-', $value);
208
+            if (is_numeric($ranges[0])) {
209
+                if ($ranges[0] < $minOffset) { // case: bytes=500-700,601-999
210
+                    $ranges[0] = $minOffset;
211
+                }
212
+                if ($ind > 0 && $rangeArray[$ind-1]['to']+1 == $ranges[0]) { // case: bytes=500-600,601-999
213
+                    $ind--;
214
+                    $ranges[0] = $rangeArray[$ind]['from'];
215
+                }
216
+            }
217
+
218
+            if (is_numeric($ranges[0]) && is_numeric($ranges[1]) && $ranges[0] < $fileSize && $ranges[0] <= $ranges[1]) {
219
+                // case: x-x
220
+                if ($ranges[1] >= $fileSize) {
221
+                    $ranges[1] = $fileSize-1;
222
+                }
223
+                $rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $ranges[1], 'size' => $fileSize );
224
+                $minOffset = $ranges[1] + 1;
225
+                if ($minOffset >= $fileSize) {
226
+                    break;
227
+                }
228
+            }
229
+            elseif (is_numeric($ranges[0]) && $ranges[0] < $fileSize) {
230
+                // case: x-
231
+                $rangeArray[$ind++] = array( 'from' => $ranges[0], 'to' => $fileSize-1, 'size' => $fileSize );
232
+                break;
233
+            }
234
+            elseif (is_numeric($ranges[1])) {
235
+                // case: -x
236
+                if ($ranges[1] > $fileSize) {
237
+                    $ranges[1] = $fileSize;
238
+                }
239
+                $rangeArray[$ind++] = array( 'from' => $fileSize-$ranges[1], 'to' => $fileSize-1, 'size' => $fileSize );
240
+                break;
241
+            }
242
+        }
243
+        return $rangeArray;
244
+    }
245
+
246
+    /**
247
+     * @param View $view
248
+     * @param string $name
249
+     * @param string $dir
250
+     * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
251
+     */
252
+    private static function getSingleFile($view, $dir, $name, $params) {
253
+        $filename = $dir . '/' . $name;
254
+        OC_Util::obEnd();
255
+        $view->lockFile($filename, ILockingProvider::LOCK_SHARED);
256 256
 		
257
-		$rangeArray = array();
257
+        $rangeArray = array();
258 258
 
259
-		if (isset($params['range']) && substr($params['range'], 0, 6) === 'bytes=') {
260
-			$rangeArray = self::parseHttpRangeHeader(substr($params['range'], 6), 
261
-								 \OC\Files\Filesystem::filesize($filename));
262
-		}
259
+        if (isset($params['range']) && substr($params['range'], 0, 6) === 'bytes=') {
260
+            $rangeArray = self::parseHttpRangeHeader(substr($params['range'], 6), 
261
+                                    \OC\Files\Filesystem::filesize($filename));
262
+        }
263 263
 		
264
-		if (\OC\Files\Filesystem::isReadable($filename)) {
265
-			self::sendHeaders($filename, $name, $rangeArray);
266
-		} elseif (!\OC\Files\Filesystem::file_exists($filename)) {
267
-			header("HTTP/1.1 404 Not Found");
268
-			$tmpl = new OC_Template('', '404', 'guest');
269
-			$tmpl->printPage();
270
-			exit();
271
-		} else {
272
-			header("HTTP/1.1 403 Forbidden");
273
-			die('403 Forbidden');
274
-		}
275
-		if (isset($params['head']) && $params['head']) {
276
-			return;
277
-		}
278
-		if (!empty($rangeArray)) {
279
-			try {
280
-			    if (count($rangeArray) == 1) {
281
-				$view->readfilePart($filename, $rangeArray[0]['from'], $rangeArray[0]['to']);
282
-			    }
283
-			    else {
284
-				// check if file is seekable (if not throw UnseekableException)
285
-				// we have to check it before body contents
286
-				$view->readfilePart($filename, $rangeArray[0]['size'], $rangeArray[0]['size']);
287
-
288
-				$type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename));
289
-
290
-				foreach ($rangeArray as $range) {
291
-				    echo "\r\n--".self::getBoundary()."\r\n".
292
-				         "Content-type: ".$type."\r\n".
293
-				         "Content-range: bytes ".$range['from']."-".$range['to']."/".$range['size']."\r\n\r\n";
294
-				    $view->readfilePart($filename, $range['from'], $range['to']);
295
-				}
296
-				echo "\r\n--".self::getBoundary()."--\r\n";
297
-			    }
298
-			} catch (\OCP\Files\UnseekableException $ex) {
299
-			    // file is unseekable
300
-			    header_remove('Accept-Ranges');
301
-			    header_remove('Content-Range');
302
-			    header("HTTP/1.1 200 OK");
303
-			    self::sendHeaders($filename, $name, array());
304
-			    $view->readfile($filename);
305
-			}
306
-		}
307
-		else {
308
-		    $view->readfile($filename);
309
-		}
310
-	}
311
-
312
-	/**
313
-	 * @param View $view
314
-	 * @param string $dir
315
-	 * @param string[]|string $files
316
-	 */
317
-	public static function lockFiles($view, $dir, $files) {
318
-		if (!is_array($files)) {
319
-			$file = $dir . '/' . $files;
320
-			$files = [$file];
321
-		}
322
-		foreach ($files as $file) {
323
-			$file = $dir . '/' . $file;
324
-			$view->lockFile($file, ILockingProvider::LOCK_SHARED);
325
-			if ($view->is_dir($file)) {
326
-				$contents = $view->getDirectoryContent($file);
327
-				$contents = array_map(function($fileInfo) use ($file) {
328
-					/** @var \OCP\Files\FileInfo $fileInfo */
329
-					return $file . '/' . $fileInfo->getName();
330
-				}, $contents);
331
-				self::lockFiles($view, $dir, $contents);
332
-			}
333
-		}
334
-	}
335
-
336
-	/**
337
-	 * set the maximum upload size limit for apache hosts using .htaccess
338
-	 *
339
-	 * @param int $size file size in bytes
340
-	 * @param array $files override '.htaccess' and '.user.ini' locations
341
-	 * @return bool|int false on failure, size on success
342
-	 */
343
-	public static function setUploadLimit($size, $files = []) {
344
-		//don't allow user to break his config
345
-		$size = intval($size);
346
-		if ($size < self::UPLOAD_MIN_LIMIT_BYTES) {
347
-			return false;
348
-		}
349
-		$size = OC_Helper::phpFileSize($size);
350
-
351
-		$phpValueKeys = array(
352
-			'upload_max_filesize',
353
-			'post_max_size'
354
-		);
355
-
356
-		// default locations if not overridden by $files
357
-		$files = array_merge([
358
-			'.htaccess' => OC::$SERVERROOT . '/.htaccess',
359
-			'.user.ini' => OC::$SERVERROOT . '/.user.ini'
360
-		], $files);
361
-
362
-		$updateFiles = [
363
-			$files['.htaccess'] => [
364
-				'pattern' => '/php_value %1$s (\S)*/',
365
-				'setting' => 'php_value %1$s %2$s'
366
-			],
367
-			$files['.user.ini'] => [
368
-				'pattern' => '/%1$s=(\S)*/',
369
-				'setting' => '%1$s=%2$s'
370
-			]
371
-		];
372
-
373
-		$success = true;
374
-
375
-		foreach ($updateFiles as $filename => $patternMap) {
376
-			// suppress warnings from fopen()
377
-			$handle = @fopen($filename, 'r+');
378
-			if (!$handle) {
379
-				\OCP\Util::writeLog('files',
380
-					'Can\'t write upload limit to ' . $filename . '. Please check the file permissions',
381
-					\OCP\Util::WARN);
382
-				$success = false;
383
-				continue; // try to update as many files as possible
384
-			}
385
-
386
-			$content = '';
387
-			while (!feof($handle)) {
388
-				$content .= fread($handle, 1000);
389
-			}
390
-
391
-			foreach ($phpValueKeys as $key) {
392
-				$pattern = vsprintf($patternMap['pattern'], [$key]);
393
-				$setting = vsprintf($patternMap['setting'], [$key, $size]);
394
-				$hasReplaced = 0;
395
-				$newContent = preg_replace($pattern, $setting, $content, 2, $hasReplaced);
396
-				if ($newContent !== null) {
397
-					$content = $newContent;
398
-				}
399
-				if ($hasReplaced === 0) {
400
-					$content .= "\n" . $setting;
401
-				}
402
-			}
403
-
404
-			// write file back
405
-			ftruncate($handle, 0);
406
-			rewind($handle);
407
-			fwrite($handle, $content);
408
-
409
-			fclose($handle);
410
-		}
411
-
412
-		if ($success) {
413
-			return OC_Helper::computerFileSize($size);
414
-		}
415
-		return false;
416
-	}
417
-
418
-	/**
419
-	 * @param string $dir
420
-	 * @param $files
421
-	 * @param integer $getType
422
-	 * @param View $view
423
-	 * @param string $filename
424
-	 */
425
-	private static function unlockAllTheFiles($dir, $files, $getType, $view, $filename) {
426
-		if ($getType === self::FILE) {
427
-			$view->unlockFile($filename, ILockingProvider::LOCK_SHARED);
428
-		}
429
-		if ($getType === self::ZIP_FILES) {
430
-			foreach ($files as $file) {
431
-				$file = $dir . '/' . $file;
432
-				$view->unlockFile($file, ILockingProvider::LOCK_SHARED);
433
-			}
434
-		}
435
-		if ($getType === self::ZIP_DIR) {
436
-			$file = $dir . '/' . $files;
437
-			$view->unlockFile($file, ILockingProvider::LOCK_SHARED);
438
-		}
439
-	}
264
+        if (\OC\Files\Filesystem::isReadable($filename)) {
265
+            self::sendHeaders($filename, $name, $rangeArray);
266
+        } elseif (!\OC\Files\Filesystem::file_exists($filename)) {
267
+            header("HTTP/1.1 404 Not Found");
268
+            $tmpl = new OC_Template('', '404', 'guest');
269
+            $tmpl->printPage();
270
+            exit();
271
+        } else {
272
+            header("HTTP/1.1 403 Forbidden");
273
+            die('403 Forbidden');
274
+        }
275
+        if (isset($params['head']) && $params['head']) {
276
+            return;
277
+        }
278
+        if (!empty($rangeArray)) {
279
+            try {
280
+                if (count($rangeArray) == 1) {
281
+                $view->readfilePart($filename, $rangeArray[0]['from'], $rangeArray[0]['to']);
282
+                }
283
+                else {
284
+                // check if file is seekable (if not throw UnseekableException)
285
+                // we have to check it before body contents
286
+                $view->readfilePart($filename, $rangeArray[0]['size'], $rangeArray[0]['size']);
287
+
288
+                $type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename));
289
+
290
+                foreach ($rangeArray as $range) {
291
+                    echo "\r\n--".self::getBoundary()."\r\n".
292
+                            "Content-type: ".$type."\r\n".
293
+                            "Content-range: bytes ".$range['from']."-".$range['to']."/".$range['size']."\r\n\r\n";
294
+                    $view->readfilePart($filename, $range['from'], $range['to']);
295
+                }
296
+                echo "\r\n--".self::getBoundary()."--\r\n";
297
+                }
298
+            } catch (\OCP\Files\UnseekableException $ex) {
299
+                // file is unseekable
300
+                header_remove('Accept-Ranges');
301
+                header_remove('Content-Range');
302
+                header("HTTP/1.1 200 OK");
303
+                self::sendHeaders($filename, $name, array());
304
+                $view->readfile($filename);
305
+            }
306
+        }
307
+        else {
308
+            $view->readfile($filename);
309
+        }
310
+    }
311
+
312
+    /**
313
+     * @param View $view
314
+     * @param string $dir
315
+     * @param string[]|string $files
316
+     */
317
+    public static function lockFiles($view, $dir, $files) {
318
+        if (!is_array($files)) {
319
+            $file = $dir . '/' . $files;
320
+            $files = [$file];
321
+        }
322
+        foreach ($files as $file) {
323
+            $file = $dir . '/' . $file;
324
+            $view->lockFile($file, ILockingProvider::LOCK_SHARED);
325
+            if ($view->is_dir($file)) {
326
+                $contents = $view->getDirectoryContent($file);
327
+                $contents = array_map(function($fileInfo) use ($file) {
328
+                    /** @var \OCP\Files\FileInfo $fileInfo */
329
+                    return $file . '/' . $fileInfo->getName();
330
+                }, $contents);
331
+                self::lockFiles($view, $dir, $contents);
332
+            }
333
+        }
334
+    }
335
+
336
+    /**
337
+     * set the maximum upload size limit for apache hosts using .htaccess
338
+     *
339
+     * @param int $size file size in bytes
340
+     * @param array $files override '.htaccess' and '.user.ini' locations
341
+     * @return bool|int false on failure, size on success
342
+     */
343
+    public static function setUploadLimit($size, $files = []) {
344
+        //don't allow user to break his config
345
+        $size = intval($size);
346
+        if ($size < self::UPLOAD_MIN_LIMIT_BYTES) {
347
+            return false;
348
+        }
349
+        $size = OC_Helper::phpFileSize($size);
350
+
351
+        $phpValueKeys = array(
352
+            'upload_max_filesize',
353
+            'post_max_size'
354
+        );
355
+
356
+        // default locations if not overridden by $files
357
+        $files = array_merge([
358
+            '.htaccess' => OC::$SERVERROOT . '/.htaccess',
359
+            '.user.ini' => OC::$SERVERROOT . '/.user.ini'
360
+        ], $files);
361
+
362
+        $updateFiles = [
363
+            $files['.htaccess'] => [
364
+                'pattern' => '/php_value %1$s (\S)*/',
365
+                'setting' => 'php_value %1$s %2$s'
366
+            ],
367
+            $files['.user.ini'] => [
368
+                'pattern' => '/%1$s=(\S)*/',
369
+                'setting' => '%1$s=%2$s'
370
+            ]
371
+        ];
372
+
373
+        $success = true;
374
+
375
+        foreach ($updateFiles as $filename => $patternMap) {
376
+            // suppress warnings from fopen()
377
+            $handle = @fopen($filename, 'r+');
378
+            if (!$handle) {
379
+                \OCP\Util::writeLog('files',
380
+                    'Can\'t write upload limit to ' . $filename . '. Please check the file permissions',
381
+                    \OCP\Util::WARN);
382
+                $success = false;
383
+                continue; // try to update as many files as possible
384
+            }
385
+
386
+            $content = '';
387
+            while (!feof($handle)) {
388
+                $content .= fread($handle, 1000);
389
+            }
390
+
391
+            foreach ($phpValueKeys as $key) {
392
+                $pattern = vsprintf($patternMap['pattern'], [$key]);
393
+                $setting = vsprintf($patternMap['setting'], [$key, $size]);
394
+                $hasReplaced = 0;
395
+                $newContent = preg_replace($pattern, $setting, $content, 2, $hasReplaced);
396
+                if ($newContent !== null) {
397
+                    $content = $newContent;
398
+                }
399
+                if ($hasReplaced === 0) {
400
+                    $content .= "\n" . $setting;
401
+                }
402
+            }
403
+
404
+            // write file back
405
+            ftruncate($handle, 0);
406
+            rewind($handle);
407
+            fwrite($handle, $content);
408
+
409
+            fclose($handle);
410
+        }
411
+
412
+        if ($success) {
413
+            return OC_Helper::computerFileSize($size);
414
+        }
415
+        return false;
416
+    }
417
+
418
+    /**
419
+     * @param string $dir
420
+     * @param $files
421
+     * @param integer $getType
422
+     * @param View $view
423
+     * @param string $filename
424
+     */
425
+    private static function unlockAllTheFiles($dir, $files, $getType, $view, $filename) {
426
+        if ($getType === self::FILE) {
427
+            $view->unlockFile($filename, ILockingProvider::LOCK_SHARED);
428
+        }
429
+        if ($getType === self::ZIP_FILES) {
430
+            foreach ($files as $file) {
431
+                $file = $dir . '/' . $file;
432
+                $view->unlockFile($file, ILockingProvider::LOCK_SHARED);
433
+            }
434
+        }
435
+        if ($getType === self::ZIP_DIR) {
436
+            $file = $dir . '/' . $files;
437
+            $view->unlockFile($file, ILockingProvider::LOCK_SHARED);
438
+        }
439
+    }
440 440
 
441 441
 }
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 4 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.
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -131,7 +131,7 @@  discard block
 block discarded – undo
131 131
 	/**
132 132
 	 * Make a computer file size
133 133
 	 * @param string $str file size in human readable format
134
-	 * @return float|bool a file size in bytes
134
+	 * @return integer a file size in bytes
135 135
 	 *
136 136
 	 * Makes 2kB to 2048.
137 137
 	 *
@@ -529,7 +529,7 @@  discard block
 block discarded – undo
529 529
 	 *
530 530
 	 * @param string $path
531 531
 	 * @param \OCP\Files\FileInfo $rootInfo (optional)
532
-	 * @return array
532
+	 * @return string
533 533
 	 * @throws \OCP\Files\NotFoundException
534 534
 	 */
535 535
 	public static function getStorageInfo($path, $rootInfo = null) {
Please login to merge, or discard this patch.
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -64,7 +64,7 @@  discard block
 block discarded – undo
64 64
 		} else {
65 65
 			$url = OC::$server->getURLGenerator()->getAbsoluteURL(OC::$server->getURLGenerator()->linkTo('', 'public.php').'?service='.$service);
66 66
 		}
67
-		return $url . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
67
+		return $url.(($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
68 68
 	}
69 69
 
70 70
 	/**
@@ -114,18 +114,18 @@  discard block
 block discarded – undo
114 114
 			return "?";
115 115
 		}
116 116
 		if ($bytes < 1024) {
117
-			return $bytes . "B";
117
+			return $bytes."B";
118 118
 		}
119 119
 		$bytes = round($bytes / 1024, 1);
120 120
 		if ($bytes < 1024) {
121
-			return $bytes . "K";
121
+			return $bytes."K";
122 122
 		}
123 123
 		$bytes = round($bytes / 1024, 1);
124 124
 		if ($bytes < 1024) {
125
-			return $bytes . "M";
125
+			return $bytes."M";
126 126
 		}
127 127
 		$bytes = round($bytes / 1024, 1);
128
-		return $bytes . "G";
128
+		return $bytes."G";
129 129
 	}
130 130
 
131 131
 	/**
@@ -271,7 +271,7 @@  discard block
 block discarded – undo
271 271
 		}
272 272
 		foreach ($dirs as $dir) {
273 273
 			foreach ($exts as $ext) {
274
-				if ($check_fn("$dir/$name" . $ext))
274
+				if ($check_fn("$dir/$name".$ext))
275 275
 					return true;
276 276
 			}
277 277
 		}
@@ -342,7 +342,7 @@  discard block
 block discarded – undo
342 342
 			$ext = '';
343 343
 		}
344 344
 
345
-		$newpath = $path . '/' . $filename;
345
+		$newpath = $path.'/'.$filename;
346 346
 		if ($view->file_exists($newpath)) {
347 347
 			if (preg_match_all('/\((\d+)\)/', $name, $matches, PREG_OFFSET_CAPTURE)) {
348 348
 				//Replace the last "(number)" with "(number+1)"
@@ -358,11 +358,11 @@  discard block
 block discarded – undo
358 358
 			do {
359 359
 				if ($offset) {
360 360
 					//Replace the last "(number)" with "(number+1)"
361
-					$newname = substr_replace($name, '(' . $counter . ')', $offset, $match_length);
361
+					$newname = substr_replace($name, '('.$counter.')', $offset, $match_length);
362 362
 				} else {
363
-					$newname = $name . ' (' . $counter . ')';
363
+					$newname = $name.' ('.$counter.')';
364 364
 				}
365
-				$newpath = $path . '/' . $newname . $ext;
365
+				$newpath = $path.'/'.$newname.$ext;
366 366
 				$counter++;
367 367
 			} while ($view->file_exists($newpath));
368 368
 		}
@@ -425,7 +425,7 @@  discard block
 block discarded – undo
425 425
 	 * @return int number of bytes representing
426 426
 	 */
427 427
 	public static function maxUploadFilesize($dir, $freeSpace = null) {
428
-		if (is_null($freeSpace) || $freeSpace < 0){
428
+		if (is_null($freeSpace) || $freeSpace < 0) {
429 429
 			$freeSpace = self::freeSpace($dir);
430 430
 		}
431 431
 		return min($freeSpace, self::uploadLimit());
@@ -443,7 +443,7 @@  discard block
 block discarded – undo
443 443
 			$freeSpace = max($freeSpace, 0);
444 444
 			return $freeSpace;
445 445
 		} else {
446
-			return (INF > 0)? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
446
+			return (INF > 0) ? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
447 447
 		}
448 448
 	}
449 449
 
@@ -456,9 +456,9 @@  discard block
 block discarded – undo
456 456
 		$ini = \OC::$server->getIniWrapper();
457 457
 		$upload_max_filesize = OCP\Util::computerFileSize($ini->get('upload_max_filesize'));
458 458
 		$post_max_size = OCP\Util::computerFileSize($ini->get('post_max_size'));
459
-		if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) {
459
+		if ((int) $upload_max_filesize === 0 and (int) $post_max_size === 0) {
460 460
 			return INF;
461
-		} elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) {
461
+		} elseif ((int) $upload_max_filesize === 0 or (int) $post_max_size === 0) {
462 462
 			return max($upload_max_filesize, $post_max_size); //only the non 0 value counts
463 463
 		} else {
464 464
 			return min($upload_max_filesize, $post_max_size);
@@ -510,9 +510,9 @@  discard block
 block discarded – undo
510 510
 				if (empty($paths)) {
511 511
 					$paths = '/usr/local/bin /usr/bin /opt/bin /bin';
512 512
 				} else {
513
-					$paths = str_replace(':',' ',getenv('PATH'));
513
+					$paths = str_replace(':', ' ', getenv('PATH'));
514 514
 				}
515
-				$command = 'find ' . $paths . ' -name ' . escapeshellarg($program) . ' 2> /dev/null';
515
+				$command = 'find '.$paths.' -name '.escapeshellarg($program).' 2> /dev/null';
516 516
 				exec($command, $output, $returnCode);
517 517
 				if (count($output) > 0) {
518 518
 					$result = escapeshellcmd($output[0]);
@@ -597,7 +597,7 @@  discard block
 block discarded – undo
597 597
 		$ownerId = $storage->getOwner($path);
598 598
 		$ownerDisplayName = '';
599 599
 		$owner = \OC::$server->getUserManager()->get($ownerId);
600
-		if($owner) {
600
+		if ($owner) {
601 601
 			$ownerDisplayName = $owner->getDisplayName();
602 602
 		}
603 603
 
Please login to merge, or discard this patch.
Indentation   +603 added lines, -603 removed lines patch added patch discarded remove patch
@@ -49,607 +49,607 @@
 block discarded – undo
49 49
  * Collection of useful functions
50 50
  */
51 51
 class OC_Helper {
52
-	private static $templateManager;
53
-
54
-	/**
55
-	 * Creates an absolute url for public use
56
-	 * @param string $service id
57
-	 * @param bool $add_slash
58
-	 * @return string the url
59
-	 *
60
-	 * Returns a absolute url to the given service.
61
-	 */
62
-	public static function linkToPublic($service, $add_slash = false) {
63
-		if ($service === 'files') {
64
-			$url = OC::$server->getURLGenerator()->getAbsoluteURL('/s');
65
-		} else {
66
-			$url = OC::$server->getURLGenerator()->getAbsoluteURL(OC::$server->getURLGenerator()->linkTo('', 'public.php').'?service='.$service);
67
-		}
68
-		return $url . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
69
-	}
70
-
71
-	/**
72
-	 * Make a human file size
73
-	 * @param int $bytes file size in bytes
74
-	 * @return string a human readable file size
75
-	 *
76
-	 * Makes 2048 to 2 kB.
77
-	 */
78
-	public static function humanFileSize($bytes) {
79
-		if ($bytes < 0) {
80
-			return "?";
81
-		}
82
-		if ($bytes < 1024) {
83
-			return "$bytes B";
84
-		}
85
-		$bytes = round($bytes / 1024, 0);
86
-		if ($bytes < 1024) {
87
-			return "$bytes KB";
88
-		}
89
-		$bytes = round($bytes / 1024, 1);
90
-		if ($bytes < 1024) {
91
-			return "$bytes MB";
92
-		}
93
-		$bytes = round($bytes / 1024, 1);
94
-		if ($bytes < 1024) {
95
-			return "$bytes GB";
96
-		}
97
-		$bytes = round($bytes / 1024, 1);
98
-		if ($bytes < 1024) {
99
-			return "$bytes TB";
100
-		}
101
-
102
-		$bytes = round($bytes / 1024, 1);
103
-		return "$bytes PB";
104
-	}
105
-
106
-	/**
107
-	 * Make a php file size
108
-	 * @param int $bytes file size in bytes
109
-	 * @return string a php parseable file size
110
-	 *
111
-	 * Makes 2048 to 2k and 2^41 to 2048G
112
-	 */
113
-	public static function phpFileSize($bytes) {
114
-		if ($bytes < 0) {
115
-			return "?";
116
-		}
117
-		if ($bytes < 1024) {
118
-			return $bytes . "B";
119
-		}
120
-		$bytes = round($bytes / 1024, 1);
121
-		if ($bytes < 1024) {
122
-			return $bytes . "K";
123
-		}
124
-		$bytes = round($bytes / 1024, 1);
125
-		if ($bytes < 1024) {
126
-			return $bytes . "M";
127
-		}
128
-		$bytes = round($bytes / 1024, 1);
129
-		return $bytes . "G";
130
-	}
131
-
132
-	/**
133
-	 * Make a computer file size
134
-	 * @param string $str file size in human readable format
135
-	 * @return float|bool a file size in bytes
136
-	 *
137
-	 * Makes 2kB to 2048.
138
-	 *
139
-	 * Inspired by: http://www.php.net/manual/en/function.filesize.php#92418
140
-	 */
141
-	public static function computerFileSize($str) {
142
-		$str = strtolower($str);
143
-		if (is_numeric($str)) {
144
-			return floatval($str);
145
-		}
146
-
147
-		$bytes_array = array(
148
-			'b' => 1,
149
-			'k' => 1024,
150
-			'kb' => 1024,
151
-			'mb' => 1024 * 1024,
152
-			'm' => 1024 * 1024,
153
-			'gb' => 1024 * 1024 * 1024,
154
-			'g' => 1024 * 1024 * 1024,
155
-			'tb' => 1024 * 1024 * 1024 * 1024,
156
-			't' => 1024 * 1024 * 1024 * 1024,
157
-			'pb' => 1024 * 1024 * 1024 * 1024 * 1024,
158
-			'p' => 1024 * 1024 * 1024 * 1024 * 1024,
159
-		);
160
-
161
-		$bytes = floatval($str);
162
-
163
-		if (preg_match('#([kmgtp]?b?)$#si', $str, $matches) && !empty($bytes_array[$matches[1]])) {
164
-			$bytes *= $bytes_array[$matches[1]];
165
-		} else {
166
-			return false;
167
-		}
168
-
169
-		$bytes = round($bytes);
170
-
171
-		return $bytes;
172
-	}
173
-
174
-	/**
175
-	 * Recursive copying of folders
176
-	 * @param string $src source folder
177
-	 * @param string $dest target folder
178
-	 *
179
-	 */
180
-	static function copyr($src, $dest) {
181
-		if (is_dir($src)) {
182
-			if (!is_dir($dest)) {
183
-				mkdir($dest);
184
-			}
185
-			$files = scandir($src);
186
-			foreach ($files as $file) {
187
-				if ($file != "." && $file != "..") {
188
-					self::copyr("$src/$file", "$dest/$file");
189
-				}
190
-			}
191
-		} elseif (file_exists($src) && !\OC\Files\Filesystem::isFileBlacklisted($src)) {
192
-			copy($src, $dest);
193
-		}
194
-	}
195
-
196
-	/**
197
-	 * Recursive deletion of folders
198
-	 * @param string $dir path to the folder
199
-	 * @param bool $deleteSelf if set to false only the content of the folder will be deleted
200
-	 * @return bool
201
-	 */
202
-	static function rmdirr($dir, $deleteSelf = true) {
203
-		if (is_dir($dir)) {
204
-			$files = new RecursiveIteratorIterator(
205
-				new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
206
-				RecursiveIteratorIterator::CHILD_FIRST
207
-			);
208
-
209
-			foreach ($files as $fileInfo) {
210
-				/** @var SplFileInfo $fileInfo */
211
-				if ($fileInfo->isLink()) {
212
-					unlink($fileInfo->getPathname());
213
-				} else if ($fileInfo->isDir()) {
214
-					rmdir($fileInfo->getRealPath());
215
-				} else {
216
-					unlink($fileInfo->getRealPath());
217
-				}
218
-			}
219
-			if ($deleteSelf) {
220
-				rmdir($dir);
221
-			}
222
-		} elseif (file_exists($dir)) {
223
-			if ($deleteSelf) {
224
-				unlink($dir);
225
-			}
226
-		}
227
-		if (!$deleteSelf) {
228
-			return true;
229
-		}
230
-
231
-		return !file_exists($dir);
232
-	}
233
-
234
-	/**
235
-	 * @return \OC\Files\Type\TemplateManager
236
-	 */
237
-	static public function getFileTemplateManager() {
238
-		if (!self::$templateManager) {
239
-			self::$templateManager = new \OC\Files\Type\TemplateManager();
240
-		}
241
-		return self::$templateManager;
242
-	}
243
-
244
-	/**
245
-	 * detect if a given program is found in the search PATH
246
-	 *
247
-	 * @param string $name
248
-	 * @param bool $path
249
-	 * @internal param string $program name
250
-	 * @internal param string $optional search path, defaults to $PATH
251
-	 * @return bool    true if executable program found in path
252
-	 */
253
-	public static function canExecute($name, $path = false) {
254
-		// path defaults to PATH from environment if not set
255
-		if ($path === false) {
256
-			$path = getenv("PATH");
257
-		}
258
-		// we look for an executable file of that name
259
-		$exts = [""];
260
-		$check_fn = "is_executable";
261
-		// Default check will be done with $path directories :
262
-		$dirs = explode(PATH_SEPARATOR, $path);
263
-		// WARNING : We have to check if open_basedir is enabled :
264
-		$obd = OC::$server->getIniWrapper()->getString('open_basedir');
265
-		if ($obd != "none") {
266
-			$obd_values = explode(PATH_SEPARATOR, $obd);
267
-			if (count($obd_values) > 0 and $obd_values[0]) {
268
-				// open_basedir is in effect !
269
-				// We need to check if the program is in one of these dirs :
270
-				$dirs = $obd_values;
271
-			}
272
-		}
273
-		foreach ($dirs as $dir) {
274
-			foreach ($exts as $ext) {
275
-				if ($check_fn("$dir/$name" . $ext))
276
-					return true;
277
-			}
278
-		}
279
-		return false;
280
-	}
281
-
282
-	/**
283
-	 * copy the contents of one stream to another
284
-	 *
285
-	 * @param resource $source
286
-	 * @param resource $target
287
-	 * @return array the number of bytes copied and result
288
-	 */
289
-	public static function streamCopy($source, $target) {
290
-		if (!$source or !$target) {
291
-			return array(0, false);
292
-		}
293
-		$bufSize = 8192;
294
-		$result = true;
295
-		$count = 0;
296
-		while (!feof($source)) {
297
-			$buf = fread($source, $bufSize);
298
-			$bytesWritten = fwrite($target, $buf);
299
-			if ($bytesWritten !== false) {
300
-				$count += $bytesWritten;
301
-			}
302
-			// note: strlen is expensive so only use it when necessary,
303
-			// on the last block
304
-			if ($bytesWritten === false
305
-				|| ($bytesWritten < $bufSize && $bytesWritten < strlen($buf))
306
-			) {
307
-				// write error, could be disk full ?
308
-				$result = false;
309
-				break;
310
-			}
311
-		}
312
-		return array($count, $result);
313
-	}
314
-
315
-	/**
316
-	 * Adds a suffix to the name in case the file exists
317
-	 *
318
-	 * @param string $path
319
-	 * @param string $filename
320
-	 * @return string
321
-	 */
322
-	public static function buildNotExistingFileName($path, $filename) {
323
-		$view = \OC\Files\Filesystem::getView();
324
-		return self::buildNotExistingFileNameForView($path, $filename, $view);
325
-	}
326
-
327
-	/**
328
-	 * Adds a suffix to the name in case the file exists
329
-	 *
330
-	 * @param string $path
331
-	 * @param string $filename
332
-	 * @return string
333
-	 */
334
-	public static function buildNotExistingFileNameForView($path, $filename, \OC\Files\View $view) {
335
-		if ($path === '/') {
336
-			$path = '';
337
-		}
338
-		if ($pos = strrpos($filename, '.')) {
339
-			$name = substr($filename, 0, $pos);
340
-			$ext = substr($filename, $pos);
341
-		} else {
342
-			$name = $filename;
343
-			$ext = '';
344
-		}
345
-
346
-		$newpath = $path . '/' . $filename;
347
-		if ($view->file_exists($newpath)) {
348
-			if (preg_match_all('/\((\d+)\)/', $name, $matches, PREG_OFFSET_CAPTURE)) {
349
-				//Replace the last "(number)" with "(number+1)"
350
-				$last_match = count($matches[0]) - 1;
351
-				$counter = $matches[1][$last_match][0] + 1;
352
-				$offset = $matches[0][$last_match][1];
353
-				$match_length = strlen($matches[0][$last_match][0]);
354
-			} else {
355
-				$counter = 2;
356
-				$match_length = 0;
357
-				$offset = false;
358
-			}
359
-			do {
360
-				if ($offset) {
361
-					//Replace the last "(number)" with "(number+1)"
362
-					$newname = substr_replace($name, '(' . $counter . ')', $offset, $match_length);
363
-				} else {
364
-					$newname = $name . ' (' . $counter . ')';
365
-				}
366
-				$newpath = $path . '/' . $newname . $ext;
367
-				$counter++;
368
-			} while ($view->file_exists($newpath));
369
-		}
370
-
371
-		return $newpath;
372
-	}
373
-
374
-	/**
375
-	 * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
376
-	 *
377
-	 * @param array $input The array to work on
378
-	 * @param int $case Either MB_CASE_UPPER or MB_CASE_LOWER (default)
379
-	 * @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
380
-	 * @return array
381
-	 *
382
-	 * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
383
-	 * based on http://www.php.net/manual/en/function.array-change-key-case.php#107715
384
-	 *
385
-	 */
386
-	public static function mb_array_change_key_case($input, $case = MB_CASE_LOWER, $encoding = 'UTF-8') {
387
-		$case = ($case != MB_CASE_UPPER) ? MB_CASE_LOWER : MB_CASE_UPPER;
388
-		$ret = array();
389
-		foreach ($input as $k => $v) {
390
-			$ret[mb_convert_case($k, $case, $encoding)] = $v;
391
-		}
392
-		return $ret;
393
-	}
394
-
395
-	/**
396
-	 * performs a search in a nested array
397
-	 * @param array $haystack the array to be searched
398
-	 * @param string $needle the search string
399
-	 * @param mixed $index optional, only search this key name
400
-	 * @return mixed the key of the matching field, otherwise false
401
-	 *
402
-	 * performs a search in a nested array
403
-	 *
404
-	 * taken from http://www.php.net/manual/en/function.array-search.php#97645
405
-	 */
406
-	public static function recursiveArraySearch($haystack, $needle, $index = null) {
407
-		$aIt = new RecursiveArrayIterator($haystack);
408
-		$it = new RecursiveIteratorIterator($aIt);
409
-
410
-		while ($it->valid()) {
411
-			if (((isset($index) AND ($it->key() == $index)) OR (!isset($index))) AND ($it->current() == $needle)) {
412
-				return $aIt->key();
413
-			}
414
-
415
-			$it->next();
416
-		}
417
-
418
-		return false;
419
-	}
420
-
421
-	/**
422
-	 * calculates the maximum upload size respecting system settings, free space and user quota
423
-	 *
424
-	 * @param string $dir the current folder where the user currently operates
425
-	 * @param int $freeSpace the number of bytes free on the storage holding $dir, if not set this will be received from the storage directly
426
-	 * @return int number of bytes representing
427
-	 */
428
-	public static function maxUploadFilesize($dir, $freeSpace = null) {
429
-		if (is_null($freeSpace) || $freeSpace < 0){
430
-			$freeSpace = self::freeSpace($dir);
431
-		}
432
-		return min($freeSpace, self::uploadLimit());
433
-	}
434
-
435
-	/**
436
-	 * Calculate free space left within user quota
437
-	 *
438
-	 * @param string $dir the current folder where the user currently operates
439
-	 * @return int number of bytes representing
440
-	 */
441
-	public static function freeSpace($dir) {
442
-		$freeSpace = \OC\Files\Filesystem::free_space($dir);
443
-		if ($freeSpace < \OCP\Files\FileInfo::SPACE_UNLIMITED) {
444
-			$freeSpace = max($freeSpace, 0);
445
-			return $freeSpace;
446
-		} else {
447
-			return (INF > 0)? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
448
-		}
449
-	}
450
-
451
-	/**
452
-	 * Calculate PHP upload limit
453
-	 *
454
-	 * @return int PHP upload file size limit
455
-	 */
456
-	public static function uploadLimit() {
457
-		$ini = \OC::$server->getIniWrapper();
458
-		$upload_max_filesize = OCP\Util::computerFileSize($ini->get('upload_max_filesize'));
459
-		$post_max_size = OCP\Util::computerFileSize($ini->get('post_max_size'));
460
-		if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) {
461
-			return INF;
462
-		} elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) {
463
-			return max($upload_max_filesize, $post_max_size); //only the non 0 value counts
464
-		} else {
465
-			return min($upload_max_filesize, $post_max_size);
466
-		}
467
-	}
468
-
469
-	/**
470
-	 * Checks if a function is available
471
-	 *
472
-	 * @param string $function_name
473
-	 * @return bool
474
-	 */
475
-	public static function is_function_enabled($function_name) {
476
-		if (!function_exists($function_name)) {
477
-			return false;
478
-		}
479
-		$ini = \OC::$server->getIniWrapper();
480
-		$disabled = explode(',', $ini->get('disable_functions'));
481
-		$disabled = array_map('trim', $disabled);
482
-		if (in_array($function_name, $disabled)) {
483
-			return false;
484
-		}
485
-		$disabled = explode(',', $ini->get('suhosin.executor.func.blacklist'));
486
-		$disabled = array_map('trim', $disabled);
487
-		if (in_array($function_name, $disabled)) {
488
-			return false;
489
-		}
490
-		return true;
491
-	}
492
-
493
-	/**
494
-	 * Try to find a program
495
-	 *
496
-	 * @param string $program
497
-	 * @return null|string
498
-	 */
499
-	public static function findBinaryPath($program) {
500
-		$memcache = \OC::$server->getMemCacheFactory()->createDistributed('findBinaryPath');
501
-		if ($memcache->hasKey($program)) {
502
-			return $memcache->get($program);
503
-		}
504
-		$result = null;
505
-		if (self::is_function_enabled('exec')) {
506
-			$exeSniffer = new ExecutableFinder();
507
-			// Returns null if nothing is found
508
-			$result = $exeSniffer->find($program);
509
-			if (empty($result)) {
510
-				$paths = getenv('PATH');
511
-				if (empty($paths)) {
512
-					$paths = '/usr/local/bin /usr/bin /opt/bin /bin';
513
-				} else {
514
-					$paths = str_replace(':',' ',getenv('PATH'));
515
-				}
516
-				$command = 'find ' . $paths . ' -name ' . escapeshellarg($program) . ' 2> /dev/null';
517
-				exec($command, $output, $returnCode);
518
-				if (count($output) > 0) {
519
-					$result = escapeshellcmd($output[0]);
520
-				}
521
-			}
522
-		}
523
-		// store the value for 5 minutes
524
-		$memcache->set($program, $result, 300);
525
-		return $result;
526
-	}
527
-
528
-	/**
529
-	 * Calculate the disc space for the given path
530
-	 *
531
-	 * @param string $path
532
-	 * @param \OCP\Files\FileInfo $rootInfo (optional)
533
-	 * @return array
534
-	 * @throws \OCP\Files\NotFoundException
535
-	 */
536
-	public static function getStorageInfo($path, $rootInfo = null) {
537
-		// return storage info without adding mount points
538
-		$includeExtStorage = \OC::$server->getSystemConfig()->getValue('quota_include_external_storage', false);
539
-
540
-		if (!$rootInfo) {
541
-			$rootInfo = \OC\Files\Filesystem::getFileInfo($path, $includeExtStorage ? 'ext' : false);
542
-		}
543
-		if (!$rootInfo instanceof \OCP\Files\FileInfo) {
544
-			throw new \OCP\Files\NotFoundException();
545
-		}
546
-		$used = $rootInfo->getSize();
547
-		if ($used < 0) {
548
-			$used = 0;
549
-		}
550
-		$quota = \OCP\Files\FileInfo::SPACE_UNLIMITED;
551
-		$storage = $rootInfo->getStorage();
552
-		$sourceStorage = $storage;
553
-		if ($storage->instanceOfStorage('\OCA\Files_Sharing\SharedStorage')) {
554
-			$includeExtStorage = false;
555
-			$sourceStorage = $storage->getSourceStorage();
556
-		}
557
-		if ($includeExtStorage) {
558
-			if ($storage->instanceOfStorage('\OC\Files\Storage\Home')
559
-				|| $storage->instanceOfStorage('\OC\Files\ObjectStore\HomeObjectStoreStorage')
560
-			) {
561
-				/** @var \OC\Files\Storage\Home $storage */
562
-				$userInstance = $storage->getUser();
563
-				$user = ($userInstance === null) ? null : $userInstance->getUID();
564
-			} else {
565
-				$user = \OC::$server->getUserSession()->getUser()->getUID();
566
-			}
567
-			if ($user) {
568
-				$quota = OC_Util::getUserQuota($user);
569
-			} else {
570
-				$quota = \OCP\Files\FileInfo::SPACE_UNLIMITED;
571
-			}
572
-			if ($quota !== \OCP\Files\FileInfo::SPACE_UNLIMITED) {
573
-				// always get free space / total space from root + mount points
574
-				return self::getGlobalStorageInfo();
575
-			}
576
-		}
577
-
578
-		// TODO: need a better way to get total space from storage
579
-		if ($sourceStorage->instanceOfStorage('\OC\Files\Storage\Wrapper\Quota')) {
580
-			/** @var \OC\Files\Storage\Wrapper\Quota $storage */
581
-			$quota = $sourceStorage->getQuota();
582
-		}
583
-		$free = $sourceStorage->free_space($rootInfo->getInternalPath());
584
-		if ($free >= 0) {
585
-			$total = $free + $used;
586
-		} else {
587
-			$total = $free; //either unknown or unlimited
588
-		}
589
-		if ($total > 0) {
590
-			if ($quota > 0 && $total > $quota) {
591
-				$total = $quota;
592
-			}
593
-			// prevent division by zero or error codes (negative values)
594
-			$relative = round(($used / $total) * 10000) / 100;
595
-		} else {
596
-			$relative = 0;
597
-		}
598
-
599
-		$ownerId = $storage->getOwner($path);
600
-		$ownerDisplayName = '';
601
-		$owner = \OC::$server->getUserManager()->get($ownerId);
602
-		if($owner) {
603
-			$ownerDisplayName = $owner->getDisplayName();
604
-		}
605
-
606
-		return [
607
-			'free' => $free,
608
-			'used' => $used,
609
-			'quota' => $quota,
610
-			'total' => $total,
611
-			'relative' => $relative,
612
-			'owner' => $ownerId,
613
-			'ownerDisplayName' => $ownerDisplayName,
614
-		];
615
-	}
616
-
617
-	/**
618
-	 * Get storage info including all mount points and quota
619
-	 *
620
-	 * @return array
621
-	 */
622
-	private static function getGlobalStorageInfo() {
623
-		$quota = OC_Util::getUserQuota(\OCP\User::getUser());
624
-
625
-		$rootInfo = \OC\Files\Filesystem::getFileInfo('', 'ext');
626
-		$used = $rootInfo['size'];
627
-		if ($used < 0) {
628
-			$used = 0;
629
-		}
630
-
631
-		$total = $quota;
632
-		$free = $quota - $used;
633
-
634
-		if ($total > 0) {
635
-			if ($quota > 0 && $total > $quota) {
636
-				$total = $quota;
637
-			}
638
-			// prevent division by zero or error codes (negative values)
639
-			$relative = round(($used / $total) * 10000) / 100;
640
-		} else {
641
-			$relative = 0;
642
-		}
643
-
644
-		return array('free' => $free, 'used' => $used, 'total' => $total, 'relative' => $relative);
645
-
646
-	}
647
-
648
-	/**
649
-	 * Returns whether the config file is set manually to read-only
650
-	 * @return bool
651
-	 */
652
-	public static function isReadOnlyConfigEnabled() {
653
-		return \OC::$server->getConfig()->getSystemValue('config_is_read_only', false);
654
-	}
52
+    private static $templateManager;
53
+
54
+    /**
55
+     * Creates an absolute url for public use
56
+     * @param string $service id
57
+     * @param bool $add_slash
58
+     * @return string the url
59
+     *
60
+     * Returns a absolute url to the given service.
61
+     */
62
+    public static function linkToPublic($service, $add_slash = false) {
63
+        if ($service === 'files') {
64
+            $url = OC::$server->getURLGenerator()->getAbsoluteURL('/s');
65
+        } else {
66
+            $url = OC::$server->getURLGenerator()->getAbsoluteURL(OC::$server->getURLGenerator()->linkTo('', 'public.php').'?service='.$service);
67
+        }
68
+        return $url . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
69
+    }
70
+
71
+    /**
72
+     * Make a human file size
73
+     * @param int $bytes file size in bytes
74
+     * @return string a human readable file size
75
+     *
76
+     * Makes 2048 to 2 kB.
77
+     */
78
+    public static function humanFileSize($bytes) {
79
+        if ($bytes < 0) {
80
+            return "?";
81
+        }
82
+        if ($bytes < 1024) {
83
+            return "$bytes B";
84
+        }
85
+        $bytes = round($bytes / 1024, 0);
86
+        if ($bytes < 1024) {
87
+            return "$bytes KB";
88
+        }
89
+        $bytes = round($bytes / 1024, 1);
90
+        if ($bytes < 1024) {
91
+            return "$bytes MB";
92
+        }
93
+        $bytes = round($bytes / 1024, 1);
94
+        if ($bytes < 1024) {
95
+            return "$bytes GB";
96
+        }
97
+        $bytes = round($bytes / 1024, 1);
98
+        if ($bytes < 1024) {
99
+            return "$bytes TB";
100
+        }
101
+
102
+        $bytes = round($bytes / 1024, 1);
103
+        return "$bytes PB";
104
+    }
105
+
106
+    /**
107
+     * Make a php file size
108
+     * @param int $bytes file size in bytes
109
+     * @return string a php parseable file size
110
+     *
111
+     * Makes 2048 to 2k and 2^41 to 2048G
112
+     */
113
+    public static function phpFileSize($bytes) {
114
+        if ($bytes < 0) {
115
+            return "?";
116
+        }
117
+        if ($bytes < 1024) {
118
+            return $bytes . "B";
119
+        }
120
+        $bytes = round($bytes / 1024, 1);
121
+        if ($bytes < 1024) {
122
+            return $bytes . "K";
123
+        }
124
+        $bytes = round($bytes / 1024, 1);
125
+        if ($bytes < 1024) {
126
+            return $bytes . "M";
127
+        }
128
+        $bytes = round($bytes / 1024, 1);
129
+        return $bytes . "G";
130
+    }
131
+
132
+    /**
133
+     * Make a computer file size
134
+     * @param string $str file size in human readable format
135
+     * @return float|bool a file size in bytes
136
+     *
137
+     * Makes 2kB to 2048.
138
+     *
139
+     * Inspired by: http://www.php.net/manual/en/function.filesize.php#92418
140
+     */
141
+    public static function computerFileSize($str) {
142
+        $str = strtolower($str);
143
+        if (is_numeric($str)) {
144
+            return floatval($str);
145
+        }
146
+
147
+        $bytes_array = array(
148
+            'b' => 1,
149
+            'k' => 1024,
150
+            'kb' => 1024,
151
+            'mb' => 1024 * 1024,
152
+            'm' => 1024 * 1024,
153
+            'gb' => 1024 * 1024 * 1024,
154
+            'g' => 1024 * 1024 * 1024,
155
+            'tb' => 1024 * 1024 * 1024 * 1024,
156
+            't' => 1024 * 1024 * 1024 * 1024,
157
+            'pb' => 1024 * 1024 * 1024 * 1024 * 1024,
158
+            'p' => 1024 * 1024 * 1024 * 1024 * 1024,
159
+        );
160
+
161
+        $bytes = floatval($str);
162
+
163
+        if (preg_match('#([kmgtp]?b?)$#si', $str, $matches) && !empty($bytes_array[$matches[1]])) {
164
+            $bytes *= $bytes_array[$matches[1]];
165
+        } else {
166
+            return false;
167
+        }
168
+
169
+        $bytes = round($bytes);
170
+
171
+        return $bytes;
172
+    }
173
+
174
+    /**
175
+     * Recursive copying of folders
176
+     * @param string $src source folder
177
+     * @param string $dest target folder
178
+     *
179
+     */
180
+    static function copyr($src, $dest) {
181
+        if (is_dir($src)) {
182
+            if (!is_dir($dest)) {
183
+                mkdir($dest);
184
+            }
185
+            $files = scandir($src);
186
+            foreach ($files as $file) {
187
+                if ($file != "." && $file != "..") {
188
+                    self::copyr("$src/$file", "$dest/$file");
189
+                }
190
+            }
191
+        } elseif (file_exists($src) && !\OC\Files\Filesystem::isFileBlacklisted($src)) {
192
+            copy($src, $dest);
193
+        }
194
+    }
195
+
196
+    /**
197
+     * Recursive deletion of folders
198
+     * @param string $dir path to the folder
199
+     * @param bool $deleteSelf if set to false only the content of the folder will be deleted
200
+     * @return bool
201
+     */
202
+    static function rmdirr($dir, $deleteSelf = true) {
203
+        if (is_dir($dir)) {
204
+            $files = new RecursiveIteratorIterator(
205
+                new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
206
+                RecursiveIteratorIterator::CHILD_FIRST
207
+            );
208
+
209
+            foreach ($files as $fileInfo) {
210
+                /** @var SplFileInfo $fileInfo */
211
+                if ($fileInfo->isLink()) {
212
+                    unlink($fileInfo->getPathname());
213
+                } else if ($fileInfo->isDir()) {
214
+                    rmdir($fileInfo->getRealPath());
215
+                } else {
216
+                    unlink($fileInfo->getRealPath());
217
+                }
218
+            }
219
+            if ($deleteSelf) {
220
+                rmdir($dir);
221
+            }
222
+        } elseif (file_exists($dir)) {
223
+            if ($deleteSelf) {
224
+                unlink($dir);
225
+            }
226
+        }
227
+        if (!$deleteSelf) {
228
+            return true;
229
+        }
230
+
231
+        return !file_exists($dir);
232
+    }
233
+
234
+    /**
235
+     * @return \OC\Files\Type\TemplateManager
236
+     */
237
+    static public function getFileTemplateManager() {
238
+        if (!self::$templateManager) {
239
+            self::$templateManager = new \OC\Files\Type\TemplateManager();
240
+        }
241
+        return self::$templateManager;
242
+    }
243
+
244
+    /**
245
+     * detect if a given program is found in the search PATH
246
+     *
247
+     * @param string $name
248
+     * @param bool $path
249
+     * @internal param string $program name
250
+     * @internal param string $optional search path, defaults to $PATH
251
+     * @return bool    true if executable program found in path
252
+     */
253
+    public static function canExecute($name, $path = false) {
254
+        // path defaults to PATH from environment if not set
255
+        if ($path === false) {
256
+            $path = getenv("PATH");
257
+        }
258
+        // we look for an executable file of that name
259
+        $exts = [""];
260
+        $check_fn = "is_executable";
261
+        // Default check will be done with $path directories :
262
+        $dirs = explode(PATH_SEPARATOR, $path);
263
+        // WARNING : We have to check if open_basedir is enabled :
264
+        $obd = OC::$server->getIniWrapper()->getString('open_basedir');
265
+        if ($obd != "none") {
266
+            $obd_values = explode(PATH_SEPARATOR, $obd);
267
+            if (count($obd_values) > 0 and $obd_values[0]) {
268
+                // open_basedir is in effect !
269
+                // We need to check if the program is in one of these dirs :
270
+                $dirs = $obd_values;
271
+            }
272
+        }
273
+        foreach ($dirs as $dir) {
274
+            foreach ($exts as $ext) {
275
+                if ($check_fn("$dir/$name" . $ext))
276
+                    return true;
277
+            }
278
+        }
279
+        return false;
280
+    }
281
+
282
+    /**
283
+     * copy the contents of one stream to another
284
+     *
285
+     * @param resource $source
286
+     * @param resource $target
287
+     * @return array the number of bytes copied and result
288
+     */
289
+    public static function streamCopy($source, $target) {
290
+        if (!$source or !$target) {
291
+            return array(0, false);
292
+        }
293
+        $bufSize = 8192;
294
+        $result = true;
295
+        $count = 0;
296
+        while (!feof($source)) {
297
+            $buf = fread($source, $bufSize);
298
+            $bytesWritten = fwrite($target, $buf);
299
+            if ($bytesWritten !== false) {
300
+                $count += $bytesWritten;
301
+            }
302
+            // note: strlen is expensive so only use it when necessary,
303
+            // on the last block
304
+            if ($bytesWritten === false
305
+                || ($bytesWritten < $bufSize && $bytesWritten < strlen($buf))
306
+            ) {
307
+                // write error, could be disk full ?
308
+                $result = false;
309
+                break;
310
+            }
311
+        }
312
+        return array($count, $result);
313
+    }
314
+
315
+    /**
316
+     * Adds a suffix to the name in case the file exists
317
+     *
318
+     * @param string $path
319
+     * @param string $filename
320
+     * @return string
321
+     */
322
+    public static function buildNotExistingFileName($path, $filename) {
323
+        $view = \OC\Files\Filesystem::getView();
324
+        return self::buildNotExistingFileNameForView($path, $filename, $view);
325
+    }
326
+
327
+    /**
328
+     * Adds a suffix to the name in case the file exists
329
+     *
330
+     * @param string $path
331
+     * @param string $filename
332
+     * @return string
333
+     */
334
+    public static function buildNotExistingFileNameForView($path, $filename, \OC\Files\View $view) {
335
+        if ($path === '/') {
336
+            $path = '';
337
+        }
338
+        if ($pos = strrpos($filename, '.')) {
339
+            $name = substr($filename, 0, $pos);
340
+            $ext = substr($filename, $pos);
341
+        } else {
342
+            $name = $filename;
343
+            $ext = '';
344
+        }
345
+
346
+        $newpath = $path . '/' . $filename;
347
+        if ($view->file_exists($newpath)) {
348
+            if (preg_match_all('/\((\d+)\)/', $name, $matches, PREG_OFFSET_CAPTURE)) {
349
+                //Replace the last "(number)" with "(number+1)"
350
+                $last_match = count($matches[0]) - 1;
351
+                $counter = $matches[1][$last_match][0] + 1;
352
+                $offset = $matches[0][$last_match][1];
353
+                $match_length = strlen($matches[0][$last_match][0]);
354
+            } else {
355
+                $counter = 2;
356
+                $match_length = 0;
357
+                $offset = false;
358
+            }
359
+            do {
360
+                if ($offset) {
361
+                    //Replace the last "(number)" with "(number+1)"
362
+                    $newname = substr_replace($name, '(' . $counter . ')', $offset, $match_length);
363
+                } else {
364
+                    $newname = $name . ' (' . $counter . ')';
365
+                }
366
+                $newpath = $path . '/' . $newname . $ext;
367
+                $counter++;
368
+            } while ($view->file_exists($newpath));
369
+        }
370
+
371
+        return $newpath;
372
+    }
373
+
374
+    /**
375
+     * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
376
+     *
377
+     * @param array $input The array to work on
378
+     * @param int $case Either MB_CASE_UPPER or MB_CASE_LOWER (default)
379
+     * @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
380
+     * @return array
381
+     *
382
+     * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
383
+     * based on http://www.php.net/manual/en/function.array-change-key-case.php#107715
384
+     *
385
+     */
386
+    public static function mb_array_change_key_case($input, $case = MB_CASE_LOWER, $encoding = 'UTF-8') {
387
+        $case = ($case != MB_CASE_UPPER) ? MB_CASE_LOWER : MB_CASE_UPPER;
388
+        $ret = array();
389
+        foreach ($input as $k => $v) {
390
+            $ret[mb_convert_case($k, $case, $encoding)] = $v;
391
+        }
392
+        return $ret;
393
+    }
394
+
395
+    /**
396
+     * performs a search in a nested array
397
+     * @param array $haystack the array to be searched
398
+     * @param string $needle the search string
399
+     * @param mixed $index optional, only search this key name
400
+     * @return mixed the key of the matching field, otherwise false
401
+     *
402
+     * performs a search in a nested array
403
+     *
404
+     * taken from http://www.php.net/manual/en/function.array-search.php#97645
405
+     */
406
+    public static function recursiveArraySearch($haystack, $needle, $index = null) {
407
+        $aIt = new RecursiveArrayIterator($haystack);
408
+        $it = new RecursiveIteratorIterator($aIt);
409
+
410
+        while ($it->valid()) {
411
+            if (((isset($index) AND ($it->key() == $index)) OR (!isset($index))) AND ($it->current() == $needle)) {
412
+                return $aIt->key();
413
+            }
414
+
415
+            $it->next();
416
+        }
417
+
418
+        return false;
419
+    }
420
+
421
+    /**
422
+     * calculates the maximum upload size respecting system settings, free space and user quota
423
+     *
424
+     * @param string $dir the current folder where the user currently operates
425
+     * @param int $freeSpace the number of bytes free on the storage holding $dir, if not set this will be received from the storage directly
426
+     * @return int number of bytes representing
427
+     */
428
+    public static function maxUploadFilesize($dir, $freeSpace = null) {
429
+        if (is_null($freeSpace) || $freeSpace < 0){
430
+            $freeSpace = self::freeSpace($dir);
431
+        }
432
+        return min($freeSpace, self::uploadLimit());
433
+    }
434
+
435
+    /**
436
+     * Calculate free space left within user quota
437
+     *
438
+     * @param string $dir the current folder where the user currently operates
439
+     * @return int number of bytes representing
440
+     */
441
+    public static function freeSpace($dir) {
442
+        $freeSpace = \OC\Files\Filesystem::free_space($dir);
443
+        if ($freeSpace < \OCP\Files\FileInfo::SPACE_UNLIMITED) {
444
+            $freeSpace = max($freeSpace, 0);
445
+            return $freeSpace;
446
+        } else {
447
+            return (INF > 0)? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
448
+        }
449
+    }
450
+
451
+    /**
452
+     * Calculate PHP upload limit
453
+     *
454
+     * @return int PHP upload file size limit
455
+     */
456
+    public static function uploadLimit() {
457
+        $ini = \OC::$server->getIniWrapper();
458
+        $upload_max_filesize = OCP\Util::computerFileSize($ini->get('upload_max_filesize'));
459
+        $post_max_size = OCP\Util::computerFileSize($ini->get('post_max_size'));
460
+        if ((int)$upload_max_filesize === 0 and (int)$post_max_size === 0) {
461
+            return INF;
462
+        } elseif ((int)$upload_max_filesize === 0 or (int)$post_max_size === 0) {
463
+            return max($upload_max_filesize, $post_max_size); //only the non 0 value counts
464
+        } else {
465
+            return min($upload_max_filesize, $post_max_size);
466
+        }
467
+    }
468
+
469
+    /**
470
+     * Checks if a function is available
471
+     *
472
+     * @param string $function_name
473
+     * @return bool
474
+     */
475
+    public static function is_function_enabled($function_name) {
476
+        if (!function_exists($function_name)) {
477
+            return false;
478
+        }
479
+        $ini = \OC::$server->getIniWrapper();
480
+        $disabled = explode(',', $ini->get('disable_functions'));
481
+        $disabled = array_map('trim', $disabled);
482
+        if (in_array($function_name, $disabled)) {
483
+            return false;
484
+        }
485
+        $disabled = explode(',', $ini->get('suhosin.executor.func.blacklist'));
486
+        $disabled = array_map('trim', $disabled);
487
+        if (in_array($function_name, $disabled)) {
488
+            return false;
489
+        }
490
+        return true;
491
+    }
492
+
493
+    /**
494
+     * Try to find a program
495
+     *
496
+     * @param string $program
497
+     * @return null|string
498
+     */
499
+    public static function findBinaryPath($program) {
500
+        $memcache = \OC::$server->getMemCacheFactory()->createDistributed('findBinaryPath');
501
+        if ($memcache->hasKey($program)) {
502
+            return $memcache->get($program);
503
+        }
504
+        $result = null;
505
+        if (self::is_function_enabled('exec')) {
506
+            $exeSniffer = new ExecutableFinder();
507
+            // Returns null if nothing is found
508
+            $result = $exeSniffer->find($program);
509
+            if (empty($result)) {
510
+                $paths = getenv('PATH');
511
+                if (empty($paths)) {
512
+                    $paths = '/usr/local/bin /usr/bin /opt/bin /bin';
513
+                } else {
514
+                    $paths = str_replace(':',' ',getenv('PATH'));
515
+                }
516
+                $command = 'find ' . $paths . ' -name ' . escapeshellarg($program) . ' 2> /dev/null';
517
+                exec($command, $output, $returnCode);
518
+                if (count($output) > 0) {
519
+                    $result = escapeshellcmd($output[0]);
520
+                }
521
+            }
522
+        }
523
+        // store the value for 5 minutes
524
+        $memcache->set($program, $result, 300);
525
+        return $result;
526
+    }
527
+
528
+    /**
529
+     * Calculate the disc space for the given path
530
+     *
531
+     * @param string $path
532
+     * @param \OCP\Files\FileInfo $rootInfo (optional)
533
+     * @return array
534
+     * @throws \OCP\Files\NotFoundException
535
+     */
536
+    public static function getStorageInfo($path, $rootInfo = null) {
537
+        // return storage info without adding mount points
538
+        $includeExtStorage = \OC::$server->getSystemConfig()->getValue('quota_include_external_storage', false);
539
+
540
+        if (!$rootInfo) {
541
+            $rootInfo = \OC\Files\Filesystem::getFileInfo($path, $includeExtStorage ? 'ext' : false);
542
+        }
543
+        if (!$rootInfo instanceof \OCP\Files\FileInfo) {
544
+            throw new \OCP\Files\NotFoundException();
545
+        }
546
+        $used = $rootInfo->getSize();
547
+        if ($used < 0) {
548
+            $used = 0;
549
+        }
550
+        $quota = \OCP\Files\FileInfo::SPACE_UNLIMITED;
551
+        $storage = $rootInfo->getStorage();
552
+        $sourceStorage = $storage;
553
+        if ($storage->instanceOfStorage('\OCA\Files_Sharing\SharedStorage')) {
554
+            $includeExtStorage = false;
555
+            $sourceStorage = $storage->getSourceStorage();
556
+        }
557
+        if ($includeExtStorage) {
558
+            if ($storage->instanceOfStorage('\OC\Files\Storage\Home')
559
+                || $storage->instanceOfStorage('\OC\Files\ObjectStore\HomeObjectStoreStorage')
560
+            ) {
561
+                /** @var \OC\Files\Storage\Home $storage */
562
+                $userInstance = $storage->getUser();
563
+                $user = ($userInstance === null) ? null : $userInstance->getUID();
564
+            } else {
565
+                $user = \OC::$server->getUserSession()->getUser()->getUID();
566
+            }
567
+            if ($user) {
568
+                $quota = OC_Util::getUserQuota($user);
569
+            } else {
570
+                $quota = \OCP\Files\FileInfo::SPACE_UNLIMITED;
571
+            }
572
+            if ($quota !== \OCP\Files\FileInfo::SPACE_UNLIMITED) {
573
+                // always get free space / total space from root + mount points
574
+                return self::getGlobalStorageInfo();
575
+            }
576
+        }
577
+
578
+        // TODO: need a better way to get total space from storage
579
+        if ($sourceStorage->instanceOfStorage('\OC\Files\Storage\Wrapper\Quota')) {
580
+            /** @var \OC\Files\Storage\Wrapper\Quota $storage */
581
+            $quota = $sourceStorage->getQuota();
582
+        }
583
+        $free = $sourceStorage->free_space($rootInfo->getInternalPath());
584
+        if ($free >= 0) {
585
+            $total = $free + $used;
586
+        } else {
587
+            $total = $free; //either unknown or unlimited
588
+        }
589
+        if ($total > 0) {
590
+            if ($quota > 0 && $total > $quota) {
591
+                $total = $quota;
592
+            }
593
+            // prevent division by zero or error codes (negative values)
594
+            $relative = round(($used / $total) * 10000) / 100;
595
+        } else {
596
+            $relative = 0;
597
+        }
598
+
599
+        $ownerId = $storage->getOwner($path);
600
+        $ownerDisplayName = '';
601
+        $owner = \OC::$server->getUserManager()->get($ownerId);
602
+        if($owner) {
603
+            $ownerDisplayName = $owner->getDisplayName();
604
+        }
605
+
606
+        return [
607
+            'free' => $free,
608
+            'used' => $used,
609
+            'quota' => $quota,
610
+            'total' => $total,
611
+            'relative' => $relative,
612
+            'owner' => $ownerId,
613
+            'ownerDisplayName' => $ownerDisplayName,
614
+        ];
615
+    }
616
+
617
+    /**
618
+     * Get storage info including all mount points and quota
619
+     *
620
+     * @return array
621
+     */
622
+    private static function getGlobalStorageInfo() {
623
+        $quota = OC_Util::getUserQuota(\OCP\User::getUser());
624
+
625
+        $rootInfo = \OC\Files\Filesystem::getFileInfo('', 'ext');
626
+        $used = $rootInfo['size'];
627
+        if ($used < 0) {
628
+            $used = 0;
629
+        }
630
+
631
+        $total = $quota;
632
+        $free = $quota - $used;
633
+
634
+        if ($total > 0) {
635
+            if ($quota > 0 && $total > $quota) {
636
+                $total = $quota;
637
+            }
638
+            // prevent division by zero or error codes (negative values)
639
+            $relative = round(($used / $total) * 10000) / 100;
640
+        } else {
641
+            $relative = 0;
642
+        }
643
+
644
+        return array('free' => $free, 'used' => $used, 'total' => $total, 'relative' => $relative);
645
+
646
+    }
647
+
648
+    /**
649
+     * Returns whether the config file is set manually to read-only
650
+     * @return bool
651
+     */
652
+    public static function isReadOnlyConfigEnabled() {
653
+        return \OC::$server->getConfig()->getSystemValue('config_is_read_only', false);
654
+    }
655 655
 }
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/Settings/RemoveOrphaned.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
 	private $manager;
47 47
 
48 48
 	public function __construct(Manager $manager = null) {
49
-		if($manager !== null) {
49
+		if ($manager !== null) {
50 50
 			$this->manager = $manager;
51 51
 		} else {
52 52
 			// fix DI for Jobs
@@ -62,7 +62,7 @@  discard block
 block discarded – undo
62 62
 	 */
63 63
 	public function execute($jobList, ILogger $logger = null) {
64 64
 		// add an interval of 15 mins
65
-		$this->setInterval(15*60);
65
+		$this->setInterval(15 * 60);
66 66
 
67 67
 		$this->jobList = $jobList;
68 68
 		$this->logger = $logger;
Please login to merge, or discard this patch.
Indentation   +43 added lines, -43 removed lines patch added patch discarded remove patch
@@ -36,56 +36,56 @@
 block discarded – undo
36 36
  */
37 37
 class RemoveOrphaned extends TimedJob {
38 38
 
39
-	/** @var IJobList */
40
-	private $jobList;
39
+    /** @var IJobList */
40
+    private $jobList;
41 41
 
42
-	/** @var ILogger */
43
-	private $logger;
42
+    /** @var ILogger */
43
+    private $logger;
44 44
 
45
-	/** @var Manager */
46
-	private $manager;
45
+    /** @var Manager */
46
+    private $manager;
47 47
 
48
-	public function __construct(Manager $manager = null) {
49
-		if($manager !== null) {
50
-			$this->manager = $manager;
51
-		} else {
52
-			// fix DI for Jobs
53
-			$this->manager = \OC::$server->getSettingsManager();
54
-		}
55
-	}
48
+    public function __construct(Manager $manager = null) {
49
+        if($manager !== null) {
50
+            $this->manager = $manager;
51
+        } else {
52
+            // fix DI for Jobs
53
+            $this->manager = \OC::$server->getSettingsManager();
54
+        }
55
+    }
56 56
 
57
-	/**
58
-	 * run the job, then remove it from the job list
59
-	 *
60
-	 * @param JobList $jobList
61
-	 * @param ILogger|null $logger
62
-	 */
63
-	public function execute($jobList, ILogger $logger = null) {
64
-		// add an interval of 15 mins
65
-		$this->setInterval(15*60);
57
+    /**
58
+     * run the job, then remove it from the job list
59
+     *
60
+     * @param JobList $jobList
61
+     * @param ILogger|null $logger
62
+     */
63
+    public function execute($jobList, ILogger $logger = null) {
64
+        // add an interval of 15 mins
65
+        $this->setInterval(15*60);
66 66
 
67
-		$this->jobList = $jobList;
68
-		$this->logger = $logger;
69
-		parent::execute($jobList, $logger);
70
-	}
67
+        $this->jobList = $jobList;
68
+        $this->logger = $logger;
69
+        parent::execute($jobList, $logger);
70
+    }
71 71
 
72
-	/**
73
-	 * @param array $argument
74
-	 * @throws \Exception
75
-	 * @throws \OC\NeedsUpdateException
76
-	 */
77
-	protected function run($argument) {
78
-		try {
79
-			\OC_App::loadApps();
80
-		} catch (NeedsUpdateException $ex) {
81
-			// only run when apps are up to date
82
-			return;
83
-		}
72
+    /**
73
+     * @param array $argument
74
+     * @throws \Exception
75
+     * @throws \OC\NeedsUpdateException
76
+     */
77
+    protected function run($argument) {
78
+        try {
79
+            \OC_App::loadApps();
80
+        } catch (NeedsUpdateException $ex) {
81
+            // only run when apps are up to date
82
+            return;
83
+        }
84 84
 
85
-		$this->manager->checkForOrphanedClassNames();
85
+        $this->manager->checkForOrphanedClassNames();
86 86
 
87
-		// remove the job once executed successfully
88
-		$this->jobList->remove($this);
89
-	}
87
+        // remove the job once executed successfully
88
+        $this->jobList->remove($this);
89
+    }
90 90
 
91 91
 }
Please login to merge, or discard this patch.