forked from friendica/friendica-addons
341 lines
8 KiB
PHP
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');
|
|
|
|
?>
|