]> source.dussan.org Git - nextcloud-server.git/commitdiff
Added isUserAgent() method to request
authorVincent Petry <pvince81@owncloud.com>
Thu, 12 Dec 2013 10:32:56 +0000 (11:32 +0100)
committerVincent Petry <pvince81@owncloud.com>
Thu, 19 Dec 2013 17:40:22 +0000 (18:40 +0100)
- added isUserAgent() method to OC_Request which makes it possible to
  test it
- OC_Response::setContentDisposition now uses OC_Request::isUserAgent()

lib/private/request.php
lib/private/response.php
tests/lib/request.php

index b2afda3592229a2e3416a73f1f63f9a99d7ba154..d9d5ae08e283896bcb0bad374c60a9cba90e14b5 100755 (executable)
@@ -7,6 +7,11 @@
  */
 
 class OC_Request {
+
+       const USER_AGENT_IE = '/MSIE/';
+       // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent
+       const USER_AGENT_ANDROID_MOBILE_CHROME = '#Android.*Chrome/[.0-9]*#';
+
        /**
         * @brief Check overwrite condition
         * @param string $type
@@ -210,4 +215,22 @@ class OC_Request {
                        return false;
                }
        }
+
+       /**
+        * Checks whether the user agent matches a given regex
+        * @param string|array $agent agent name or array of agent names
+        * @return boolean true if at least one of the given agent matches,
+        * false otherwise
+        */
+       static public function isUserAgent($agent) {
+               if (!is_array($agent)) {
+                       $agent = array($agent);
+               }
+               foreach ($agent as $regex) {
+                       if (preg_match($regex, $_SERVER['HTTP_USER_AGENT'])) {
+                               return true;
+                       }
+               }
+               return false;
+       }
 }
index c6edda0f949a5ad07f0408077e09bb919c0bc5f0..047464373472d50e0233a4e67a0036a542fb1cfe 100644 (file)
@@ -153,8 +153,7 @@ class OC_Response {
         * @param string $type disposition type, either 'attachment' or 'inline'
         */
        static public function setContentDispositionHeader( $filename, $type = 'attachment' ) {
-               // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent
-               if ( preg_match( '/MSIE/', $_SERVER['HTTP_USER_AGENT'] ) or preg_match( '#Android.*Chrome/[.0-9]*#', $_SERVER['HTTP_USER_AGENT'] ) ) {
+               if (OC_Request::isUserAgent(array(OC_Request::USER_AGENT_IE, OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME))) {
                        header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' );
                } else {
                        header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename )
index 090cebc923146449ca22d78e3f4bf05d7d32ef0b..c6401a571445fd8d648b79909c3eb767e728d7f9 100644 (file)
@@ -70,4 +70,54 @@ class Test_Request extends PHPUnit_Framework_TestCase {
                        array('/oc/core1', '/oc/core/index.php'),
                );
        }
+
+       /**
+        * @dataProvider userAgentProvider
+        */
+       public function testUserAgent($testAgent, $userAgent, $matches) {
+               $_SERVER['HTTP_USER_AGENT'] = $testAgent;
+               $this->assertEquals($matches, OC_Request::isUserAgent($userAgent));
+       }
+
+       function userAgentProvider() {
+               return array(
+                       array(
+                               'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
+                               OC_Request::USER_AGENT_IE,
+                               true
+                       ),
+                       array(
+                               'Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Firefox/24.0',
+                               OC_Request::USER_AGENT_IE,
+                               false
+                       ),
+                       array(
+                               'Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36',
+                               OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+                               true
+                       ),
+                       array(
+                               'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
+                               OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+                               false
+                       ),
+                       // test two values
+                       array(
+                               'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
+                               array(
+                                       OC_Request::USER_AGENT_IE,
+                                       OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+                               ),
+                               true
+                       ),
+                       array(
+                               'Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36',
+                               array(
+                                       OC_Request::USER_AGENT_IE,
+                                       OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+                               ),
+                               true
+                       ),
+               );
+       }
 }