You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
4.5 KiB
PHP
199 lines
4.5 KiB
PHP
<?php
|
|
|
|
use Proxy\Config;
|
|
|
|
// strip away extra parameters text/html; charset=UTF-8
|
|
function clean_content_type($content_type){
|
|
return trim(preg_replace('@;.*@', '', $content_type));
|
|
}
|
|
|
|
function is_html($content_type){
|
|
return clean_content_type($content_type) == 'text/html';
|
|
}
|
|
|
|
function in_arrayi($needle, $haystack){
|
|
return in_array(strtolower($needle), array_map('strtolower', $haystack));
|
|
}
|
|
|
|
function re_match($pattern, $string){
|
|
|
|
$quoted = preg_quote($pattern, '#');
|
|
$translated = strtr($quoted, array(
|
|
'\*' => '.*',
|
|
'\?' => '.'
|
|
));
|
|
|
|
return preg_match("#^".$translated."$#i", $string) === 1;
|
|
}
|
|
|
|
// regular array_merge does not work if arrays have numeric keys...
|
|
function array_merge_custom(){
|
|
|
|
$arr = array();
|
|
$args = func_get_args();
|
|
|
|
foreach( (array)$args as $arg){
|
|
foreach( (array)$arg as $key => $value){
|
|
$arr[$key] = $value;
|
|
}
|
|
}
|
|
|
|
return $arr;
|
|
}
|
|
|
|
// rotate each string character based on corresponding ascii values from some key
|
|
function str_rot_pass($str, $key, $decrypt = false){
|
|
|
|
// if key happens to be shorter than the data
|
|
$key_len = strlen($key);
|
|
|
|
$result = str_repeat(' ', strlen($str));
|
|
|
|
for($i=0; $i<strlen($str); $i++){
|
|
|
|
if($decrypt){
|
|
$ascii = ord($str[$i]) - ord($key[$i % $key_len]);
|
|
} else {
|
|
$ascii = ord($str[$i]) + ord($key[$i % $key_len]);
|
|
}
|
|
|
|
$result[$i] = chr($ascii);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
function app_url(){
|
|
return (!empty($_SERVER['HTTPS']) ? 'https://' : 'http://').$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
|
|
}
|
|
|
|
function render_string($str, $vars = array()){
|
|
|
|
preg_match_all('@{([a-z0-9_]+)}@s', $str, $matches, PREG_SET_ORDER);
|
|
|
|
foreach($matches as $match){
|
|
|
|
extract($vars, EXTR_PREFIX_ALL, "_var");
|
|
|
|
$var_val = ${"_var_".$match[1]};
|
|
|
|
$str = str_replace($match[0], $var_val, $str);
|
|
}
|
|
|
|
return $str;
|
|
}
|
|
|
|
function render_template($file_path, $vars = array()){
|
|
|
|
// variables to be used within that template
|
|
extract($vars);
|
|
|
|
ob_start();
|
|
|
|
if(file_exists($file_path)){
|
|
include($file_path);
|
|
} else {
|
|
die("Failed to load template: {$file_path}");
|
|
}
|
|
|
|
$contents = ob_get_contents();
|
|
ob_end_clean();
|
|
|
|
return $contents;
|
|
}
|
|
|
|
function add_http($url){
|
|
|
|
if(!preg_match('#^https?://#i', $url)){
|
|
$url = 'http://' . $url;
|
|
}
|
|
|
|
return $url;
|
|
}
|
|
|
|
function time_ms(){
|
|
return round(microtime(true) * 1000);
|
|
}
|
|
|
|
function base64_url_encode($input){
|
|
// = at the end is just padding to make the length of the str divisible by 4
|
|
return rtrim(strtr(base64_encode($input), '+/', '-_'), '=');
|
|
}
|
|
|
|
function base64_url_decode($input){
|
|
return base64_decode(str_pad(strtr($input, '-_', '+/'), strlen($input) % 4, '=', STR_PAD_RIGHT));
|
|
}
|
|
|
|
function url_encrypt($url, $key = false){
|
|
|
|
if($key){
|
|
$url = str_rot_pass($url, $key);
|
|
} else if(Config::get('encryption_key')){
|
|
$url = str_rot_pass($url, Config::get('encryption_key'));
|
|
}
|
|
|
|
return Config::get('url_mode') ? base64_url_encode($url) : rawurlencode($url);
|
|
}
|
|
|
|
function url_decrypt($url, $key = false){
|
|
|
|
$url = Config::get('url_mode') ? base64_url_decode($url) : rawurldecode($url);
|
|
|
|
if($key){
|
|
$url = str_rot_pass($url, $key, true);
|
|
} else if(Config::get('encryption_key')){
|
|
$url = str_rot_pass($url, Config::get('encryption_key'), true);
|
|
}
|
|
|
|
return $url;
|
|
}
|
|
|
|
// www.youtube.com TO proxy-app.com/index.php?q=encrypt_url(www.youtube.com)
|
|
function proxify_url($url, $base_url = ''){
|
|
|
|
$url = htmlspecialchars_decode($url);
|
|
|
|
if($base_url){
|
|
$base_url = add_http($base_url);
|
|
$url = rel2abs($url, $base_url);
|
|
}
|
|
|
|
return app_url().'?q='.url_encrypt($url);
|
|
}
|
|
|
|
function rel2abs($rel, $base)
|
|
{
|
|
if (strpos($rel, "//") === 0) {
|
|
return "http:" . $rel;
|
|
}
|
|
|
|
if($rel == ""){
|
|
return "";
|
|
}
|
|
|
|
/* return if already absolute URL */
|
|
if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
|
|
/* queries and anchors */
|
|
if ($rel[0] == '#' || $rel[0] == '?') return $base . $rel;
|
|
/* parse base URL and convert to local variables:
|
|
$scheme, $host, $path */
|
|
extract(parse_url($base));
|
|
/* remove non-directory element from path */
|
|
@$path = preg_replace('#/[^/]*$#', '', $path);
|
|
/* destroy path if relative url points to root */
|
|
if ($rel[0] == '/') $path = '';
|
|
/* dirty absolute URL */
|
|
$abs = "$host$path/$rel";
|
|
/* replace '//' or '/./' or '/foo/../' with '/' */
|
|
$re = array(
|
|
'#(/\.?/)#',
|
|
'#/(?!\.\.)[^/]+/\.\./#'
|
|
);
|
|
for ($n = 1; $n > 0; $abs = preg_replace($re, '/', $abs, -1, $n)) {
|
|
}
|
|
|
|
/* absolute URL is ready! */
|
|
return $scheme . '://' . $abs;
|
|
}
|
|
|
|
?>
|