friendica-addons/jappixmini/jappix/php/get.php
2012-04-18 01:12:24 +02:00

341 lines
8 KiB
PHP

<?php
/*
Jappix - An open social platform
This is the file get script
-------------------------------------------------
License: AGPL
Author: Vanaryon
Last revision: 03/12/11
*/
// PHP base
define('JAPPIX_BASE', '..');
// We get the needed files
require_once('./functions.php');
require_once('./functions-get.php');
require_once('./read-main.php');
require_once('./read-hosts.php');
// Hide PHP errors
hideErrors();
// Get some parameters
$is_developer = isDeveloper();
$has_compression = hasCompression();
if($is_developer) {
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
}
// Else, we put a far away cache date (1 year)
else {
$expires = 31536000;
header('Pragma: public');
header('Cache-Control: maxage='.$expires);
header('Expires: '.gmdate('D, d M Y H:i:s', (time() + $expires)).' GMT');
}
// Initialize the vars
$type = '';
$file = '';
// Read the type var
if(isset($_GET['t']) && !empty($_GET['t']) && preg_match('/^(css|js|img|snd|store)$/', $_GET['t']))
$type = $_GET['t'];
// Read the files var
if(isset($_GET['f']) && !empty($_GET['f']) && isSafe($_GET['f']))
$file = $_GET['f'];
// Read the group var (only for text files)
if(isset($_GET['g']) && !empty($_GET['g']) && preg_match('/^(\S+)\.xml$/', $_GET['g']) && preg_match('/^(css|js)$/', $type) && isSafe($_GET['g']) && file_exists('../xml/'.$_GET['g'])) {
$xml_data = file_get_contents('../xml/'.$_GET['g']);
// Any data?
if($xml_data) {
$xml_read = new SimpleXMLElement($xml_data);
$xml_parse = $xml_read->$type;
// Files were added to the list before (with file var)?
if($file)
$file .= '~'.$xml_parse;
else
$file = $xml_parse;
}
}
// We check if the data was submitted
if($file && $type) {
// We define some stuffs
$dir = '../'.$type.'/';
$path = $dir.$file;
// Define the real type if this is a "store" file
if($type == 'store') {
// Extract the file extension
switch(getFileExt($file)) {
// CSS file
case 'css':
$type = 'css';
break;
// JS file
case 'js':
$type = 'js';
break;
// Audio file
case 'ogg':
case 'oga':
$type = 'snd';
break;
// Image file
case 'png':
case 'jpg':
case 'jpeg':
case 'gif':
case 'bmp':
$type = 'img';
break;
}
}
// JS and CSS special stuffs
if(($type == 'css') || ($type == 'js')) {
// Compression var
if($has_compression)
$cache_encoding = 'deflate';
else
$cache_encoding = 'plain';
// Get the vars
$version = getVersion();
$hash = genHash($version);
$cache_hash = md5($path.$hash.staticLocation()).'_'.$cache_encoding;
// Check if the browser supports DEFLATE
$deflate_support = false;
if(isset($_SERVER['HTTP_ACCEPT_ENCODING']) && substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && hasCompression() && !$is_developer)
$deflate_support = true;
// Internationalization
if($type == 'js') {
if(isset($_GET['l']) && !empty($_GET['l']) && !preg_match('/\.\.\//', $_GET['l']) && is_dir('../lang/'.$_GET['l']))
$locale = $_GET['l'];
else
$locale = 'en';
}
else
$locale = '';
// Define the cache lang name
if($locale)
$cache_lang = $cache_hash.'_'.$locale;
else
$cache_lang = $cache_hash;
}
// Explode the file string
if(strpos($file, '~') != false)
$array = explode('~', $file);
else
$array = array($file);
// Define the reading vars
$continue = true;
$loop_files = true;
// Check the cache exists for text files (avoid the heavy file_exists loop!)
if(!$is_developer && (($type == 'css') || ($type == 'js')) && hasCache($cache_lang))
$loop_files = false;
// Check if the all the file(s) exist(s)
if($loop_files) {
foreach($array as $current) {
// Stop the loop if a file is missing
if(!file_exists($dir.$current)) {
$continue = false;
break;
}
}
}
// We can read the file(s)
if($continue) {
// We get the file MIME type
$mime = strtolower(preg_replace('/(^)(.+)(\.)(.+)($)/i', '$4', $file));
// We set up a known MIME type (and some other headers)
if(($type == 'css') || ($type == 'js')) {
// DEFLATE header
if($deflate_support)
header('Content-Encoding: deflate');
// MIME header
if($type == 'css')
header('Content-Type: text/css; charset=utf-8');
else if($type == 'js')
header('Content-Type: application/javascript; charset=utf-8');
}
else if($mime == 'png')
header('Content-Type: image/png');
else if($mime == 'gif')
header('Content-Type: image/gif');
else if(($mime == 'jpg') || ($mime == 'jpeg'))
header('Content-Type: image/jpeg');
else if($mime == 'bmp')
header('Content-Type: image/bmp');
else if(($mime == 'oga') || ($mime == 'ogg'))
header('Content-Type: audio/ogg');
// Catch the file MIME type
else
header('Content-Type: '.getFileMIME($path));
// Read the text file(s) (CSS & JS)
if(($type == 'css') || ($type == 'js')) {
// If there's a cache file, read it
if(hasCache($cache_lang) && !$is_developer) {
$cache_read = readCache($cache_lang);
if($deflate_support || !$has_compression)
echo $cache_read;
else
echo gzinflate($cache_read);
}
// Else, we generate the cache
else {
// First try to read the cache reference
if(hasCache($cache_hash) && !$is_developer) {
// Read the reference
$cache_reference = readCache($cache_hash);
// Filter the cache reference
if($has_compression)
$output = gzinflate($cache_reference);
else
$output = $cache_reference;
}
// No cache reference, we should generate it
else {
// Initialize the loop
$looped = '';
// Add the content of the current file
foreach($array as $current)
$looped .= rmBOM(file_get_contents($dir.$current))."\n";
// Filter the CSS
if($type == 'css') {
// Apply the CSS logos
$looped = setLogos($looped, $array);
// Apply the CSS background
$looped = setBackground($looped);
// Set the Get API paths
$looped = setPath($looped, $hash, HOST_STATIC, $type, '');
}
// Optimize the code rendering
if($type == 'css') {
// Can minify the CSS
if($has_compression && !$is_developer)
$output = compressCSS($looped);
else
$output = $looped;
}
else {
// Can minify the JS (sloooooow!)
if($has_compression && !$is_developer) {
require_once('./jsmin.php');
$output = JSMin::minify($looped);
}
else
$output = $looped;
}
// Generate the reference cache
if($has_compression)
$final = gzdeflate($output, 9);
else
$final = $output;
// Write it!
genCache($final, $is_developer, $cache_hash);
}
// Filter the JS
if($type == 'js') {
// Set the JS locales
$output = setLocales($output, $locale);
// Set the JS configuration
$output = setConfiguration($output, $locale, $version, uploadMaxSize());
// Set the Get API paths
$output = setPath($output, $hash, HOST_STATIC, $type, $locale);
// Translate the JS script
require_once('./gettext.php');
includeTranslation($locale, 'main');
$output = setTranslation($output);
// Generate the cache
if($has_compression)
$final = gzdeflate($output, 9);
else
$final = $output;
// Write it!
genCache($final, $is_developer, $cache_lang);
}
// Output a well-encoded string
if($deflate_support || !$has_compression)
echo $final;
else
echo gzinflate($final);
}
}
// Read the binary file (PNG, OGA and others)
else
readfile($path);
exit;
}
// The file was not found
header('Status: 404 Not Found', true, 404);
exit('HTTP/1.1 404 Not Found');
}
// The request is not correct
header('Status: 400 Bad Request', true, 400);
exit('HTTP/1.1 400 Bad Request');
?>