2020-12-26 01:42:23 +08:00
< ? php
function get_global_sp_state ()
{
global $Cache ;
static $global_promotion_state ;
if ( ! $global_promotion_state ){
if ( ! $global_promotion_state = $Cache -> get_value ( 'global_promotion_state' )){
$res = mysql_query ( " SELECT * FROM torrents_state " );
$row = mysql_fetch_assoc ( $res );
$global_promotion_state = $row [ " global_sp_state " ];
$Cache -> cache_value ( 'global_promotion_state' , $global_promotion_state , 57226 );
}
}
return $global_promotion_state ;
}
// IP Validation
function validip ( $ip )
{
if ( ! ip2long ( $ip )) //IPv6
return true ;
if ( ! empty ( $ip ) && $ip == long2ip ( ip2long ( $ip )))
{
// reserved IANA IPv4 addresses
// http://www.iana.org/assignments/ipv4-address-space
$reserved_ips = array (
array ( '192.0.2.0' , '192.0.2.255' ),
array ( '192.168.0.0' , '192.168.255.255' ),
array ( '255.255.255.0' , '255.255.255.255' )
);
foreach ( $reserved_ips as $r )
{
$min = ip2long ( $r [ 0 ]);
$max = ip2long ( $r [ 1 ]);
if (( ip2long ( $ip ) >= $min ) && ( ip2long ( $ip ) <= $max )) return false ;
}
return true ;
}
else return false ;
}
function getip () {
if ( isset ( $_SERVER )) {
if ( isset ( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ]) && validip ( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ])) {
$ip = $_SERVER [ 'HTTP_X_FORWARDED_FOR' ];
} elseif ( isset ( $_SERVER [ 'HTTP_CLIENT_IP' ]) && validip ( $_SERVER [ 'HTTP_CLIENT_IP' ])) {
$ip = $_SERVER [ 'HTTP_CLIENT_IP' ];
} else {
$ip = $_SERVER [ 'REMOTE_ADDR' ];
}
} else {
if ( getenv ( 'HTTP_X_FORWARDED_FOR' ) && validip ( getenv ( 'HTTP_X_FORWARDED_FOR' ))) {
$ip = getenv ( 'HTTP_X_FORWARDED_FOR' );
} elseif ( getenv ( 'HTTP_CLIENT_IP' ) && validip ( getenv ( 'HTTP_CLIENT_IP' ))) {
$ip = getenv ( 'HTTP_CLIENT_IP' );
} else {
$ip = getenv ( 'REMOTE_ADDR' );
}
}
return $ip ;
}
function sql_query ( $query )
{
2021-01-12 21:14:02 +08:00
$begin = microtime ( true );
2020-12-26 01:42:23 +08:00
global $query_name ;
2020-12-29 21:49:37 +08:00
$result = mysql_query ( $query );
2021-01-15 22:13:46 +08:00
$end = microtime ( true );
2020-12-29 21:49:37 +08:00
$query_name [] = [
'query' => $query ,
2021-01-15 22:13:46 +08:00
'time' => sprintf ( '%.3f ms' , ( $end - $begin ) * 1000 ),
2020-12-29 21:49:37 +08:00
];
return $result ;
2020-12-26 01:42:23 +08:00
}
function sqlesc ( $value ) {
2021-01-11 22:00:46 +08:00
if ( is_null ( $value )) {
2021-01-20 20:06:48 +08:00
return 'null' ;
2021-01-11 22:00:46 +08:00
}
$value = " ' " . mysql_real_escape_string ( $value ) . " ' " ;
2020-12-26 01:42:23 +08:00
return $value ;
}
function hash_pad ( $hash ) {
return str_pad ( $hash , 20 );
}
function hash_where ( $name , $hash ) {
$shhash = preg_replace ( '/ *$/s' , " " , $hash );
return " ( $name = " . sqlesc ( $hash ) . " OR $name = " . sqlesc ( $shhash ) . " ) " ;
}
2021-01-12 21:14:02 +08:00
function strip_magic_quotes ( $arr )
{
foreach ( $arr as $k => $v )
{
if ( is_array ( $v ))
{
$arr [ $k ] = strip_magic_quotes ( $v );
} else {
$arr [ $k ] = stripslashes ( $v );
}
}
return $arr ;
}
if ( function_exists ( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc ())
{
if ( ! empty ( $_GET )) {
$_GET = strip_magic_quotes ( $_GET );
}
if ( ! empty ( $_POST )) {
$_POST = strip_magic_quotes ( $_POST );
}
if ( ! empty ( $_COOKIE )) {
$_COOKIE = strip_magic_quotes ( $_COOKIE );
}
}
function get_langfolder_list ()
{
//do not access db for speed up, or for flexibility
return array ( " en " , " chs " , " cht " , " ko " , " ja " );
}
function printLine ( $line , $exist = false )
{
echo " [ " . date ( 'Y-m-d H:i:s' ) . " ] $line <br /> " ;
if ( $exist ) {
exit ( 0 );
}
}
function dd ( $vars )
{
echo '<pre>' ;
array_map ( function ( $var ) {
var_dump ( $var );
}, func_get_args ());
echo '</pre>' ;
exit ( 0 );
}
2021-01-14 20:44:24 +08:00
function do_log ( $log , $level = 'info' )
2021-01-12 21:14:02 +08:00
{
global $TWEAK ;
2021-01-27 17:50:24 +08:00
$logging = sys_get_temp_dir () . '/nexus_' . date ( 'Y-m-d' ) . '.log' ;
if ( ! empty ( $TWEAK [ 'logging' ])) {
$logging = $TWEAK [ 'logging' ];
}
2021-01-12 21:14:02 +08:00
if ( ! empty ( $TWEAK [ 'logging' ])) {
$backtrace = debug_backtrace ( DEBUG_BACKTRACE_IGNORE_ARGS , 2 );
$content = sprintf (
2021-01-14 20:44:24 +08:00
" [%s] [%s] [%s] %s:%s %s%s%s %s%s " ,
2021-01-12 21:14:02 +08:00
date ( 'Y-m-d H:i:s' ),
2021-01-14 20:44:24 +08:00
$level ,
REQUEST_ID ,
2021-01-12 21:14:02 +08:00
$backtrace [ 0 ][ 'file' ] ? ? '' ,
$backtrace [ 0 ][ 'line' ] ? ? '' ,
$backtrace [ 1 ][ 'class' ] ? ? '' ,
$backtrace [ 1 ][ 'type' ] ? ? '' ,
$backtrace [ 1 ][ 'function' ] ? ? '' ,
$log ,
PHP_EOL
);
2021-01-27 17:50:24 +08:00
file_put_contents ( $logging , $content , FILE_APPEND );
2021-01-12 21:14:02 +08:00
}
}
/**
* get translation for given name
*
* @ author xiaomlove
* @ date 2021 / 1 / 11
* @ param null $name
* @ param null $prefix
* @ return mixed | string
*/
function __ ( $name = null , $prefix = null )
{
static $i18n ;
static $i18nWithoutPrefix ;
$userLocale = get_langfolder_cookie ();
$defaultLocale = 'en' ;
if ( is_null ( $prefix )) {
//get prefix from scripe name
$prefix = basename ( $_SERVER [ 'SCRIPT_NAME' ]);
$prefix = strstr ( $prefix , '.php' , true );
}
if ( is_null ( $i18n )) {
//get all in18 may be used, incldue user locale and default locale, and name in('_target', 'functions') (because they are common) or prefixed with given prefix
$sql = " select locale, name, translation from i18n where locale in ( " . sqlesc ( $userLocale ) . " , " . sqlesc ( $defaultLocale ) . " ) and (name in ('_target', 'functions') or name like ' { $prefix } %') " ;
$result = sql_query ( $sql );
while ( $row = mysql_fetch_assoc ( $result )) {
$i18n [ $row [ 'locale' ]][ $row [ 'name' ]] = $row [ 'translation' ];
$i18nWithoutPrefix [ $row [ 'locale' ]][ substr ( $row [ 'name' ], strpos ( $row [ 'name' ], '.' ) + 1 )] = $row [ 'translation' ];
}
}
if ( is_null ( $name )) {
return $i18nWithoutPrefix [ $userLocale ] ? ? $i18nWithoutPrefix [ $defaultLocale ] ? ? [];
}
$name = " $prefix . $name " ;
return $i18n [ $userLocale ][ $name ] ? ? $i18n [ $defaultLocale ][ $name ] ? ? '' ;
}
function config ( $key , $default = null )
{
static $configs ;
if ( is_null ( $configs )) {
//get all configuration from config file
2021-01-14 20:44:24 +08:00
$files = glob ( ROOT_PATH . 'config/*.php' );
2021-01-12 21:14:02 +08:00
foreach ( $files as $file ) {
$basename = basename ( $file );
if ( $basename == 'allconfig.php' ) {
//exclude the NexusPHP default config file
continue ;
}
$values = require $file ;
$configPrefix = strstr ( $basename , '.php' , true );
$configs [ $configPrefix ] = $values ;
}
}
return arr_get ( $configs , $key , $default );
}
/**
* get setting for given name and prefix
*
* @ date 2021 / 1 / 11
* @ param null $name
* @ return array | mixed | string
*/
2021-01-14 20:44:24 +08:00
function get_setting ( $name = null )
2021-01-12 21:14:02 +08:00
{
static $settings ;
if ( is_null ( $settings )) {
//get all settings from database
2021-01-13 02:02:00 +08:00
$sql = " select name, value from settings " ;
2021-01-12 21:14:02 +08:00
$result = sql_query ( $sql );
while ( $row = mysql_fetch_assoc ( $result )) {
2021-01-13 02:02:00 +08:00
$value = $row [ 'value' ];
2021-01-12 21:14:02 +08:00
$arr = json_decode ( $value , true );
if ( is_array ( $arr )) {
$value = $arr ;
}
2021-01-14 20:44:24 +08:00
arr_set ( $settings , $row [ 'name' ], $value );
2021-01-12 21:14:02 +08:00
}
}
2021-01-14 20:44:24 +08:00
if ( is_null ( $name )) {
return $settings ;
}
return arr_get ( $settings , $name );
2021-01-12 21:14:02 +08:00
}
2021-01-21 20:42:22 +08:00
function env ( $key = null , $default = null )
2021-01-12 21:14:02 +08:00
{
static $env ;
if ( is_null ( $env )) {
2021-01-14 20:44:24 +08:00
$envFile = ROOT_PATH . '.env' ;
2021-01-21 20:42:22 +08:00
$env = readEnvFile ( $envFile );
2021-01-12 21:14:02 +08:00
}
2021-01-21 20:42:22 +08:00
if ( is_null ( $key )) {
return $env ;
}
2021-01-12 21:14:02 +08:00
return $env [ $key ] ? ? $default ;
}
2021-01-21 20:42:22 +08:00
function readEnvFile ( $envFile )
{
if ( ! file_exists ( $envFile )) {
throw new \RuntimeException ( " env file is not exists in the root path. " );
}
$env = [];
$fp = fopen ( $envFile , 'r' );
if ( $fp === false ) {
throw new \RuntimeException ( " .env file: $envFile is not readable. " );
}
while (( $line = fgets ( $fp )) !== false ) {
$line = trim ( $line );
if ( empty ( $line )) {
continue ;
}
$pos = strpos ( $line , '=' );
if ( $pos <= 0 ) {
continue ;
}
if ( mb_substr ( $line , 0 , 1 , 'utf-8' ) == '#' ) {
continue ;
}
$lineKey = normalize_env ( mb_substr ( $line , 0 , $pos , 'utf-8' ));
$lineValue = normalize_env ( mb_substr ( $line , $pos + 1 , null , 'utf-8' ));
$env [ $lineKey ] = $lineValue ;
}
return $env ;
}
2021-01-12 21:14:02 +08:00
function normalize_env ( $value )
{
$value = trim ( $value );
$toStrip = [ '\'' , '"' ];
if ( in_array ( mb_substr ( $value , 0 , 1 , 'utf-8' ), $toStrip )) {
$value = mb_substr ( $value , 1 , null , 'utf-8' );
}
if ( in_array ( mb_substr ( $value , - 1 , null , 'utf-8' ), $toStrip )) {
$value = mb_substr ( $value , 0 , - 1 , 'utf-8' );
}
switch ( strtolower ( $value )) {
case 'true' :
return true ;
case 'false' :
return false ;
case 'null' :
return null ;
default :
return $value ;
}
}
2021-01-14 20:44:24 +08:00
/**
* Get an item from an array using " dot " notation .
*
2021-01-15 01:12:44 +08:00
* reference to Laravel
2021-01-14 20:44:24 +08:00
*
* @ date 2021 / 1 / 14
* @ param $array
* @ param $key
* @ param null $default
* @ return mixed | null
*/
2021-01-12 21:14:02 +08:00
function arr_get ( $array , $key , $default = null )
{
if ( strpos ( $key , '.' ) === false ) {
return $array [ $key ] ? ? $default ;
}
foreach ( explode ( '.' , $key ) as $segment ) {
if ( isset ( $array [ $segment ])) {
$array = $array [ $segment ];
} else {
return $default ;
}
}
return $array ;
}
2021-01-13 19:32:26 +08:00
2021-01-14 20:44:24 +08:00
/**
* From Laravel
*
* Set an array item to a given value using " dot " notation .
*
* If no key is given to the method , the entire array will be replaced .
*
* @ param array $array
* @ param string | null $key
* @ param mixed $value
* @ return array
*/
2021-01-13 19:32:26 +08:00
function arr_set ( & $array , $key , $value )
{
2021-01-14 20:44:24 +08:00
if ( is_null ( $key )) {
return $array = $value ;
}
$keys = explode ( '.' , $key );
foreach ( $keys as $i => $key ) {
if ( count ( $keys ) === 1 ) {
break ;
2021-01-14 02:27:55 +08:00
}
2021-01-14 20:44:24 +08:00
unset ( $keys [ $i ]);
// If the key doesn't exist at this depth, we will just create an empty array
// to hold the next value, allowing us to create the arrays to hold final
// values at the correct depth. Then we'll keep digging into the array.
if ( ! isset ( $array [ $key ]) || ! is_array ( $array [ $key ])) {
$array [ $key ] = [];
2021-01-14 02:27:55 +08:00
}
2021-01-14 20:44:24 +08:00
$array = & $array [ $key ];
2021-01-14 02:27:55 +08:00
}
2021-01-14 20:44:24 +08:00
$array [ array_shift ( $keys )] = $value ;
2021-01-14 02:27:55 +08:00
return $array ;
2021-01-13 19:32:26 +08:00
}
2021-01-22 01:58:28 +08:00
function getSchemaAndHttpHost ()
{
$isHttps = ! empty ( $_SERVER [ 'HTTPS' ]) && ( strtolower ( $_SERVER [ 'HTTPS' ]) !== 'off' );
$protocol = $isHttps ? 'https' : 'http' ;
$port = $_SERVER [ 'SERVER_PORT' ];
$result = " $protocol :// " . $_SERVER [ 'HTTP_HOST' ];
if ( $port != 80 ) {
$result .= " : $port " ;
}
return $result ;
}
function getBaseUrl ()
{
$url = getSchemaAndHttpHost ();
$requestUri = $_SERVER [ 'REQUEST_URI' ];
$pos = strpos ( $requestUri , '?' );
if ( $pos !== false ) {
$url .= substr ( $requestUri , 0 , $pos );
} else {
$url .= $requestUri ;
}
return $url ;
}