@@ -31,81 +31,81 @@ |
||
31 | 31 | */ |
32 | 32 | |
33 | 33 | class OC_Response { |
34 | - /** |
|
35 | - * Sets the content disposition header (with possible workarounds) |
|
36 | - * @param string $filename file name |
|
37 | - * @param string $type disposition type, either 'attachment' or 'inline' |
|
38 | - */ |
|
39 | - static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { |
|
40 | - if (\OC::$server->getRequest()->isUserAgent( |
|
41 | - [ |
|
42 | - \OC\AppFramework\Http\Request::USER_AGENT_IE, |
|
43 | - \OC\AppFramework\Http\Request::USER_AGENT_ANDROID_MOBILE_CHROME, |
|
44 | - \OC\AppFramework\Http\Request::USER_AGENT_FREEBOX, |
|
45 | - ])) { |
|
46 | - header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' ); |
|
47 | - } else { |
|
48 | - header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename ) |
|
49 | - . '; filename="' . rawurlencode( $filename ) . '"' ); |
|
50 | - } |
|
51 | - } |
|
34 | + /** |
|
35 | + * Sets the content disposition header (with possible workarounds) |
|
36 | + * @param string $filename file name |
|
37 | + * @param string $type disposition type, either 'attachment' or 'inline' |
|
38 | + */ |
|
39 | + static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { |
|
40 | + if (\OC::$server->getRequest()->isUserAgent( |
|
41 | + [ |
|
42 | + \OC\AppFramework\Http\Request::USER_AGENT_IE, |
|
43 | + \OC\AppFramework\Http\Request::USER_AGENT_ANDROID_MOBILE_CHROME, |
|
44 | + \OC\AppFramework\Http\Request::USER_AGENT_FREEBOX, |
|
45 | + ])) { |
|
46 | + header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' ); |
|
47 | + } else { |
|
48 | + header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename ) |
|
49 | + . '; filename="' . rawurlencode( $filename ) . '"' ); |
|
50 | + } |
|
51 | + } |
|
52 | 52 | |
53 | - /** |
|
54 | - * Sets the content length header (with possible workarounds) |
|
55 | - * @param string|int|float $length Length to be sent |
|
56 | - */ |
|
57 | - static public function setContentLengthHeader($length) { |
|
58 | - if (PHP_INT_SIZE === 4) { |
|
59 | - if ($length > PHP_INT_MAX && stripos(PHP_SAPI, 'apache') === 0) { |
|
60 | - // Apache PHP SAPI casts Content-Length headers to PHP integers. |
|
61 | - // This enforces a limit of PHP_INT_MAX (2147483647 on 32-bit |
|
62 | - // platforms). So, if the length is greater than PHP_INT_MAX, |
|
63 | - // we just do not send a Content-Length header to prevent |
|
64 | - // bodies from being received incompletely. |
|
65 | - return; |
|
66 | - } |
|
67 | - // Convert signed integer or float to unsigned base-10 string. |
|
68 | - $lfh = new \OC\LargeFileHelper; |
|
69 | - $length = $lfh->formatUnsignedInteger($length); |
|
70 | - } |
|
71 | - header('Content-Length: '.$length); |
|
72 | - } |
|
53 | + /** |
|
54 | + * Sets the content length header (with possible workarounds) |
|
55 | + * @param string|int|float $length Length to be sent |
|
56 | + */ |
|
57 | + static public function setContentLengthHeader($length) { |
|
58 | + if (PHP_INT_SIZE === 4) { |
|
59 | + if ($length > PHP_INT_MAX && stripos(PHP_SAPI, 'apache') === 0) { |
|
60 | + // Apache PHP SAPI casts Content-Length headers to PHP integers. |
|
61 | + // This enforces a limit of PHP_INT_MAX (2147483647 on 32-bit |
|
62 | + // platforms). So, if the length is greater than PHP_INT_MAX, |
|
63 | + // we just do not send a Content-Length header to prevent |
|
64 | + // bodies from being received incompletely. |
|
65 | + return; |
|
66 | + } |
|
67 | + // Convert signed integer or float to unsigned base-10 string. |
|
68 | + $lfh = new \OC\LargeFileHelper; |
|
69 | + $length = $lfh->formatUnsignedInteger($length); |
|
70 | + } |
|
71 | + header('Content-Length: '.$length); |
|
72 | + } |
|
73 | 73 | |
74 | - /** |
|
75 | - * This function adds some security related headers to all requests served via base.php |
|
76 | - * The implementation of this function has to happen here to ensure that all third-party |
|
77 | - * components (e.g. SabreDAV) also benefit from this headers. |
|
78 | - */ |
|
79 | - public static function addSecurityHeaders() { |
|
80 | - /** |
|
81 | - * FIXME: Content Security Policy for legacy ownCloud components. This |
|
82 | - * can be removed once \OCP\AppFramework\Http\Response from the AppFramework |
|
83 | - * is used everywhere. |
|
84 | - * @see \OCP\AppFramework\Http\Response::getHeaders |
|
85 | - */ |
|
86 | - $policy = 'default-src \'self\'; ' |
|
87 | - . 'script-src \'self\' \'nonce-'.\OC::$server->getContentSecurityPolicyNonceManager()->getNonce().'\'; ' |
|
88 | - . 'style-src \'self\' \'unsafe-inline\'; ' |
|
89 | - . 'frame-src *; ' |
|
90 | - . 'img-src * data: blob:; ' |
|
91 | - . 'font-src \'self\' data:; ' |
|
92 | - . 'media-src *; ' |
|
93 | - . 'connect-src *; ' |
|
94 | - . 'object-src \'none\'; ' |
|
95 | - . 'base-uri \'self\'; '; |
|
96 | - header('Content-Security-Policy:' . $policy); |
|
97 | - header('X-Frame-Options: SAMEORIGIN'); // Disallow iFraming from other domains |
|
74 | + /** |
|
75 | + * This function adds some security related headers to all requests served via base.php |
|
76 | + * The implementation of this function has to happen here to ensure that all third-party |
|
77 | + * components (e.g. SabreDAV) also benefit from this headers. |
|
78 | + */ |
|
79 | + public static function addSecurityHeaders() { |
|
80 | + /** |
|
81 | + * FIXME: Content Security Policy for legacy ownCloud components. This |
|
82 | + * can be removed once \OCP\AppFramework\Http\Response from the AppFramework |
|
83 | + * is used everywhere. |
|
84 | + * @see \OCP\AppFramework\Http\Response::getHeaders |
|
85 | + */ |
|
86 | + $policy = 'default-src \'self\'; ' |
|
87 | + . 'script-src \'self\' \'nonce-'.\OC::$server->getContentSecurityPolicyNonceManager()->getNonce().'\'; ' |
|
88 | + . 'style-src \'self\' \'unsafe-inline\'; ' |
|
89 | + . 'frame-src *; ' |
|
90 | + . 'img-src * data: blob:; ' |
|
91 | + . 'font-src \'self\' data:; ' |
|
92 | + . 'media-src *; ' |
|
93 | + . 'connect-src *; ' |
|
94 | + . 'object-src \'none\'; ' |
|
95 | + . 'base-uri \'self\'; '; |
|
96 | + header('Content-Security-Policy:' . $policy); |
|
97 | + header('X-Frame-Options: SAMEORIGIN'); // Disallow iFraming from other domains |
|
98 | 98 | |
99 | - // Send fallback headers for installations that don't have the possibility to send |
|
100 | - // custom headers on the webserver side |
|
101 | - if(getenv('modHeadersAvailable') !== 'true') { |
|
102 | - header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters |
|
103 | - header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE |
|
104 | - header('X-Robots-Tag: none'); // https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag |
|
105 | - header('X-Download-Options: noopen'); // https://msdn.microsoft.com/en-us/library/jj542450(v=vs.85).aspx |
|
106 | - header('X-Permitted-Cross-Domain-Policies: none'); // https://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html |
|
107 | - header('Referrer-Policy: no-referrer'); // https://www.w3.org/TR/referrer-policy/ |
|
108 | - } |
|
109 | - } |
|
99 | + // Send fallback headers for installations that don't have the possibility to send |
|
100 | + // custom headers on the webserver side |
|
101 | + if(getenv('modHeadersAvailable') !== 'true') { |
|
102 | + header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters |
|
103 | + header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE |
|
104 | + header('X-Robots-Tag: none'); // https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag |
|
105 | + header('X-Download-Options: noopen'); // https://msdn.microsoft.com/en-us/library/jj542450(v=vs.85).aspx |
|
106 | + header('X-Permitted-Cross-Domain-Policies: none'); // https://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html |
|
107 | + header('Referrer-Policy: no-referrer'); // https://www.w3.org/TR/referrer-policy/ |
|
108 | + } |
|
109 | + } |
|
110 | 110 | |
111 | 111 | } |