CVE-2012-1617: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') (CWE-22)
value: Directory traversal vulnerability in combine.php in OSClass before 2.3.6 allows remote attackers to read and write arbitrary files via a .. (dot dot) in the type parameter.  NOTE: this vulnerability can be leveraged to upload arbitrary files.
CWE description: The product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.
Published: 2012-09-26T00:55Z
Repository: https://github.com/osclass/OSClass
Language: PHP
Files changed: oc-content/themes/modern/combine.php, oc-includes/osclass/gui/combine.php
Commit date: 2012-01-30 16:59:25 +0100
Commit message: show http 403 forbidden error if the type parameter is not js or css

Diff: diff --git a/oc-content/themes/modern/combine.php b/oc-content/themes/modern/combine.php
index ff8d4b62..c7716282 100644
--- a/oc-content/themes/modern/combine.php
+++ b/oc-content/themes/modern/combine.php
@@ -22,122 +22,116 @@
      * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
      * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
      * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      */
 
-
-    $cache       = true;
+    $cache    = true;
     $cachedir = '../../uploads';
-    $base = dirname(__FILE__);
+    $base     = dirname(__FILE__);
 
-    $type = $_GET['type'];
+    $type     = $_GET['type'];
     $elements = explode(',', $_GET['files']);
-    
+
     // Determine last modification date of the files
     $lastmodified = 0;
-    while (list(,$element) = each($elements)) {
-        $path = realpath($base . '/' . $element);
-    
-        if (($type == 'js' && substr($path, -3) != '.js') || 
-            ($type == 'css' && substr($path, -4) != '.css')) {
-            header ("HTTP/1.0 403 Forbidden");
-            exit;    
+    while( list(,$element) = each($elements) ) {
+        $path = realpath($base . '/' . $element) ;
+
+        if( ($type != 'js' && $type != 'css') || 
+            ($type == 'js' && substr($path, -3) != '.js') || 
+            ($type == 'css' && substr($path, -4) != '.css') ) {
+            header ("HTTP/1.0 403 Forbidden") ;
+            exit ;
         }
-    
+
         if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) {
             header ("HTTP/1.0 404 Not Found");
             exit;
         }
-        
+
         $lastmodified = max($lastmodified, filemtime($path));
     }
 
     // Send Etag hash
     $hash = $lastmodified . '-' . md5($_GET['files']);
     header ("Etag: \"" . $hash . "\"");
-    
-    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
-        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"') 
-    {
+
+    if( isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
+        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"' ) {
         // Return visit and no modifications, so do not send anything
-        header ("HTTP/1.0 304 Not Modified");
-        header ('Content-Length: 0');
-    } 
-    else 
-    {
+        header ("HTTP/1.0 304 Not Modified") ;
+        header ('Content-Length: 0') ;
+    } else {
         // First time visit or files were modified
-        if ($cache) 
-        {
+        if( $cache ) {
             // Determine supported compression method
-            $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
-            $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
-    
+            $gzip    = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') ;
+            $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') ;
+
             // Determine used compression method
-            $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
-    
+            $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none') ;
+
             // Check for buggy versions of Internet Explorer
-            if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
-                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
-                $version = floatval($matches[1]);
-                
-                if ($version < 6)
+            if( !strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
+                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches) ) {
+                $version = floatval($matches[1]) ;
+
+                if( $version < 6 ) {
                     $encoding = 'none';
-                    
-                if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) 
+                }
+                if( $version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1') ) {
                     $encoding = 'none';
+                }
             }
-            
+
             // Try the cache first to see if the combined files were already generated
-            $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');
-            
-            if (file_exists($cachedir . '/' . $cachefile)) {
-                if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {
+            $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '') ;
 
-                    if ($encoding != 'none') {
-                        header ("Content-Encoding: " . $encoding);
+            if( file_exists($cachedir . '/' . $cachefile) ) {
+                if( $fp = fopen($cachedir . '/' . $cachefile, 'rb') ) {
+                    if( $encoding != 'none' ) {
+                        header ("Content-Encoding: " . $encoding) ;
                     }
-                
-                    header ("Content-Type: text/" . $type);
-                    header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));
-        
-                    fpassthru($fp);
-                    fclose($fp);
-                    exit;
+
+                    header( "Content-Type: text/" . $type) ;
+                    header( "Content-Length: " . filesize($cachedir . '/' . $cachefile) ) ;
+
+                    fpassthru($fp) ;
+                    fclose($fp) ;
+                    exit ;
                 }
             }
         }
-    
+
         // Get contents of the files
-        $contents = '';
-        reset($elements);
-        while (list(,$element) = each($elements)) {
-            $path = realpath($base . '/' . $element);
-            $contents .= "\n\n" . file_get_contents($path);
+        $contents = '' ;
+        reset($elements) ;
+        while( list(,$element) = each($elements) ) {
+            $path      = realpath($base . '/' . $element) ;
+            $contents .= "\n\n" . file_get_contents($path) ;
         }
-    
+
         // Send Content-Type
-        header ("Content-Type: text/" . $type);
-        
-        if (isset($encoding) && $encoding != 'none') 
-        {
+        header ("Content-Type: text/" . $type) ;
+
+        if (isset($encoding) && $encoding != 'none') {
             // Send compressed contents
-            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
-            header ("Content-Encoding: " . $encoding);
-            header ('Content-Length: ' . strlen($contents));
-            echo $contents;
-        } 
-        else 
-        {
+            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE) ;
+            header( "Content-Encoding: " . $encoding ) ;
+            header( 'Content-Length: ' . strlen($contents) ) ;
+            echo $contents ;
+        } else {
             // Send regular contents
-            header ('Content-Length: ' . strlen($contents));
-            echo $contents;
+            header( 'Content-Length: ' . strlen($contents) ) ;
+            echo $contents ;
         }
 
         // Store cache
-        if ($cache) {
-            if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
-                fwrite($fp, $contents);
-                fclose($fp);
+        if( $cache ) {
+            if( $fp = fopen($cachedir . '/' . $cachefile, 'wb') ) {
+                fwrite($fp, $contents) ;
+                fclose($fp) ;
             }
         }
-    }    
-    
\ No newline at end of file
+    }
+
+?>
\ No newline at end of file
diff --git a/oc-includes/osclass/gui/combine.php b/oc-includes/osclass/gui/combine.php
index ff8d4b62..c7716282 100644
--- a/oc-includes/osclass/gui/combine.php
+++ b/oc-includes/osclass/gui/combine.php
@@ -22,122 +22,116 @@
      * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
      * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
      * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      */
 
-
-    $cache       = true;
+    $cache    = true;
     $cachedir = '../../uploads';
-    $base = dirname(__FILE__);
+    $base     = dirname(__FILE__);
 
-    $type = $_GET['type'];
+    $type     = $_GET['type'];
     $elements = explode(',', $_GET['files']);
-    
+
     // Determine last modification date of the files
     $lastmodified = 0;
-    while (list(,$element) = each($elements)) {
-        $path = realpath($base . '/' . $element);
-    
-        if (($type == 'js' && substr($path, -3) != '.js') || 
-            ($type == 'css' && substr($path, -4) != '.css')) {
-            header ("HTTP/1.0 403 Forbidden");
-            exit;    
+    while( list(,$element) = each($elements) ) {
+        $path = realpath($base . '/' . $element) ;
+
+        if( ($type != 'js' && $type != 'css') || 
+            ($type == 'js' && substr($path, -3) != '.js') || 
+            ($type == 'css' && substr($path, -4) != '.css') ) {
+            header ("HTTP/1.0 403 Forbidden") ;
+            exit ;
         }
-    
+
         if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) {
             header ("HTTP/1.0 404 Not Found");
             exit;
         }
-        
+
         $lastmodified = max($lastmodified, filemtime($path));
     }
 
     // Send Etag hash
     $hash = $lastmodified . '-' . md5($_GET['files']);
     header ("Etag: \"" . $hash . "\"");
-    
-    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
-        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"') 
-    {
+
+    if( isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
+        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"' ) {
         // Return visit and no modifications, so do not send anything
-        header ("HTTP/1.0 304 Not Modified");
-        header ('Content-Length: 0');
-    } 
-    else 
-    {
+        header ("HTTP/1.0 304 Not Modified") ;
+        header ('Content-Length: 0') ;
+    } else {
         // First time visit or files were modified
-        if ($cache) 
-        {
+        if( $cache ) {
             // Determine supported compression method
-            $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
-            $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
-    
+            $gzip    = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') ;
+            $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') ;
+
             // Determine used compression method
-            $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
-    
+            $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none') ;
+
             // Check for buggy versions of Internet Explorer
-            if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
-                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
-                $version = floatval($matches[1]);
-                
-                if ($version < 6)
+            if( !strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
+                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches) ) {
+                $version = floatval($matches[1]) ;
+
+                if( $version < 6 ) {
                     $encoding = 'none';
-                    
-                if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) 
+                }
+                if( $version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1') ) {
                     $encoding = 'none';
+                }
             }
-            
+
             // Try the cache first to see if the combined files were already generated
-            $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');
-            
-            if (file_exists($cachedir . '/' . $cachefile)) {
-                if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {
+            $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '') ;
 
-                    if ($encoding != 'none') {
-                        header ("Content-Encoding: " . $encoding);
+            if( file_exists($cachedir . '/' . $cachefile) ) {
+                if( $fp = fopen($cachedir . '/' . $cachefile, 'rb') ) {
+                    if( $encoding != 'none' ) {
+                        header ("Content-Encoding: " . $encoding) ;
                     }
-                
-                    header ("Content-Type: text/" . $type);
-                    header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));
-        
-                    fpassthru($fp);
-                    fclose($fp);
-                    exit;
+
+                    header( "Content-Type: text/" . $type) ;
+                    header( "Content-Length: " . filesize($cachedir . '/' . $cachefile) ) ;
+
+                    fpassthru($fp) ;
+                    fclose($fp) ;
+                    exit ;
                 }
             }
         }
-    
+
         // Get contents of the files
-        $contents = '';
-        reset($elements);
-        while (list(,$element) = each($elements)) {
-            $path = realpath($base . '/' . $element);
-            $contents .= "\n\n" . file_get_contents($path);
+        $contents = '' ;
+        reset($elements) ;
+        while( list(,$element) = each($elements) ) {
+            $path      = realpath($base . '/' . $element) ;
+            $contents .= "\n\n" . file_get_contents($path) ;
         }
-    
+
         // Send Content-Type
-        header ("Content-Type: text/" . $type);
-        
-        if (isset($encoding) && $encoding != 'none') 
-        {
+        header ("Content-Type: text/" . $type) ;
+
+        if (isset($encoding) && $encoding != 'none') {
             // Send compressed contents
-            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
-            header ("Content-Encoding: " . $encoding);
-            header ('Content-Length: ' . strlen($contents));
-            echo $contents;
-        } 
-        else 
-        {
+            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE) ;
+            header( "Content-Encoding: " . $encoding ) ;
+            header( 'Content-Length: ' . strlen($contents) ) ;
+            echo $contents ;
+        } else {
             // Send regular contents
-            header ('Content-Length: ' . strlen($contents));
-            echo $contents;
+            header( 'Content-Length: ' . strlen($contents) ) ;
+            echo $contents ;
         }
 
         // Store cache
-        if ($cache) {
-            if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
-                fwrite($fp, $contents);
-                fclose($fp);
+        if( $cache ) {
+            if( $fp = fopen($cachedir . '/' . $cachefile, 'wb') ) {
+                fwrite($fp, $contents) ;
+                fclose($fp) ;
             }
         }
-    }    
-    
\ No newline at end of file
+    }
+
+?>
\ No newline at end of file

Vulnerable code: 
    $cache       = true;
    $base = dirname(__FILE__);
    $type = $_GET['type'];
    
    while (list(,$element) = each($elements)) {
        $path = realpath($base . '/' . $element);
    
        if (($type == 'js' && substr($path, -3) != '.js') || 
            ($type == 'css' && substr($path, -4) != '.css')) {
            header ("HTTP/1.0 403 Forbidden");
            exit;    
    
        
    
    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"') 
    {
        header ("HTTP/1.0 304 Not Modified");
        header ('Content-Length: 0');
    } 
    else 
    {
        if ($cache) 
        {
            $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
            $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
    
            $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
    
            if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                $version = floatval($matches[1]);
                
                if ($version < 6)
                    
                if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) 
            
            $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');
            
            if (file_exists($cachedir . '/' . $cachefile)) {
                if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {
                    if ($encoding != 'none') {
                        header ("Content-Encoding: " . $encoding);
                
                    header ("Content-Type: text/" . $type);
                    header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));
        
                    fpassthru($fp);
                    fclose($fp);
                    exit;
    
        $contents = '';
        reset($elements);
        while (list(,$element) = each($elements)) {
            $path = realpath($base . '/' . $element);
            $contents .= "\n\n" . file_get_contents($path);
    
        header ("Content-Type: text/" . $type);
        
        if (isset($encoding) && $encoding != 'none') 
        {
            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
            header ("Content-Encoding: " . $encoding);
            header ('Content-Length: ' . strlen($contents));
            echo $contents;
        } 
        else 
        {
            header ('Content-Length: ' . strlen($contents));
            echo $contents;
        if ($cache) {
            if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
                fwrite($fp, $contents);
                fclose($fp);
    }    
    

    $cache       = true;
    $base = dirname(__FILE__);
    $type = $_GET['type'];
    
    while (list(,$element) = each($elements)) {
        $path = realpath($base . '/' . $element);
    
        if (($type == 'js' && substr($path, -3) != '.js') || 
            ($type == 'css' && substr($path, -4) != '.css')) {
            header ("HTTP/1.0 403 Forbidden");
            exit;    
    
        
    
    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"') 
    {
        header ("HTTP/1.0 304 Not Modified");
        header ('Content-Length: 0');
    } 
    else 
    {
        if ($cache) 
        {
            $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
            $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
    
            $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
    
            if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                $version = floatval($matches[1]);
                
                if ($version < 6)
                    
                if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) 
            
            $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');
            
            if (file_exists($cachedir . '/' . $cachefile)) {
                if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {
                    if ($encoding != 'none') {
                        header ("Content-Encoding: " . $encoding);
                
                    header ("Content-Type: text/" . $type);
                    header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));
        
                    fpassthru($fp);
                    fclose($fp);
                    exit;
    
        $contents = '';
        reset($elements);
        while (list(,$element) = each($elements)) {
            $path = realpath($base . '/' . $element);
            $contents .= "\n\n" . file_get_contents($path);
    
        header ("Content-Type: text/" . $type);
        
        if (isset($encoding) && $encoding != 'none') 
        {
            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
            header ("Content-Encoding: " . $encoding);
            header ('Content-Length: ' . strlen($contents));
            echo $contents;
        } 
        else 
        {
            header ('Content-Length: ' . strlen($contents));
            echo $contents;
        if ($cache) {
            if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
                fwrite($fp, $contents);
                fclose($fp);
    }    
    
Fixed code:     $cache    = true;
    $base     = dirname(__FILE__);
    $type     = $_GET['type'];

    while( list(,$element) = each($elements) ) {
        $path = realpath($base . '/' . $element) ;

        if( ($type != 'js' && $type != 'css') || 
            ($type == 'js' && substr($path, -3) != '.js') || 
            ($type == 'css' && substr($path, -4) != '.css') ) {
            header ("HTTP/1.0 403 Forbidden") ;
            exit ;



    if( isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"' ) {
        header ("HTTP/1.0 304 Not Modified") ;
        header ('Content-Length: 0') ;
    } else {
        if( $cache ) {
            $gzip    = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') ;
            $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') ;

            $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none') ;

            if( !strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches) ) {
                $version = floatval($matches[1]) ;

                if( $version < 6 ) {
                }
                if( $version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1') ) {
                }

            $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '') ;
            if( file_exists($cachedir . '/' . $cachefile) ) {
                if( $fp = fopen($cachedir . '/' . $cachefile, 'rb') ) {
                    if( $encoding != 'none' ) {
                        header ("Content-Encoding: " . $encoding) ;

                    header( "Content-Type: text/" . $type) ;
                    header( "Content-Length: " . filesize($cachedir . '/' . $cachefile) ) ;

                    fpassthru($fp) ;
                    fclose($fp) ;
                    exit ;

        $contents = '' ;
        reset($elements) ;
        while( list(,$element) = each($elements) ) {
            $path      = realpath($base . '/' . $element) ;
            $contents .= "\n\n" . file_get_contents($path) ;

        header ("Content-Type: text/" . $type) ;

        if (isset($encoding) && $encoding != 'none') {
            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE) ;
            header( "Content-Encoding: " . $encoding ) ;
            header( 'Content-Length: ' . strlen($contents) ) ;
            echo $contents ;
        } else {
            header( 'Content-Length: ' . strlen($contents) ) ;
            echo $contents ;
        if( $cache ) {
            if( $fp = fopen($cachedir . '/' . $cachefile, 'wb') ) {
                fwrite($fp, $contents) ;
                fclose($fp) ;
    }

?>
    $cache    = true;
    $base     = dirname(__FILE__);
    $type     = $_GET['type'];

    while( list(,$element) = each($elements) ) {
        $path = realpath($base . '/' . $element) ;

        if( ($type != 'js' && $type != 'css') || 
            ($type == 'js' && substr($path, -3) != '.js') || 
            ($type == 'css' && substr($path, -4) != '.css') ) {
            header ("HTTP/1.0 403 Forbidden") ;
            exit ;



    if( isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"' ) {
        header ("HTTP/1.0 304 Not Modified") ;
        header ('Content-Length: 0') ;
    } else {
        if( $cache ) {
            $gzip    = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') ;
            $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') ;

            $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none') ;

            if( !strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches) ) {
                $version = floatval($matches[1]) ;

                if( $version < 6 ) {
                }
                if( $version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1') ) {
                }

            $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '') ;
            if( file_exists($cachedir . '/' . $cachefile) ) {
                if( $fp = fopen($cachedir . '/' . $cachefile, 'rb') ) {
                    if( $encoding != 'none' ) {
                        header ("Content-Encoding: " . $encoding) ;

                    header( "Content-Type: text/" . $type) ;
                    header( "Content-Length: " . filesize($cachedir . '/' . $cachefile) ) ;

                    fpassthru($fp) ;
                    fclose($fp) ;
                    exit ;

        $contents = '' ;
        reset($elements) ;
        while( list(,$element) = each($elements) ) {
            $path      = realpath($base . '/' . $element) ;
            $contents .= "\n\n" . file_get_contents($path) ;

        header ("Content-Type: text/" . $type) ;

        if (isset($encoding) && $encoding != 'none') {
            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE) ;
            header( "Content-Encoding: " . $encoding ) ;
            header( 'Content-Length: ' . strlen($contents) ) ;
            echo $contents ;
        } else {
            header( 'Content-Length: ' . strlen($contents) ) ;
            echo $contents ;
        if( $cache ) {
            if( $fp = fopen($cachedir . '/' . $cachefile, 'wb') ) {
                fwrite($fp, $contents) ;
                fclose($fp) ;
    }

?>