2013-08-04 18:58:31 +00:00
< ? php
/**
* poche , a read it later open source system
*
* @ category poche
* @ author Nicolas Lœuillet < support @ inthepoche . com >
* @ copyright 2013
* @ license http :// www . wtfpl . net / see COPYING file
*/
class Tools
{
public static function initPhp ()
{
define ( 'START_TIME' , microtime ( true ));
if ( phpversion () < 5 ) {
die ( _ ( 'Oops, it seems you don\'t have PHP 5.' ));
}
error_reporting ( E_ALL );
function stripslashesDeep ( $value ) {
return is_array ( $value )
? array_map ( 'stripslashesDeep' , $value )
: stripslashes ( $value );
}
if ( get_magic_quotes_gpc ()) {
$_POST = array_map ( 'stripslashesDeep' , $_POST );
$_GET = array_map ( 'stripslashesDeep' , $_GET );
$_COOKIE = array_map ( 'stripslashesDeep' , $_COOKIE );
}
ob_start ();
register_shutdown_function ( 'ob_end_flush' );
}
public static function getPocheUrl ()
{
$https = ( ! empty ( $_SERVER [ 'HTTPS' ])
&& ( strtolower ( $_SERVER [ 'HTTPS' ]) == 'on' ))
|| ( isset ( $_SERVER [ " SERVER_PORT " ])
2013-10-07 10:30:40 +00:00
&& $_SERVER [ " SERVER_PORT " ] == '443' ) // HTTPS detection.
2013-10-07 10:47:13 +00:00
|| ( isset ( $_SERVER [ " SERVER_PORT " ]) //Custom HTTPS port detection
&& $_SERVER [ " SERVER_PORT " ] == SSL_PORT );
2013-10-07 10:30:40 +00:00
2013-08-04 18:58:31 +00:00
$serverport = ( ! isset ( $_SERVER [ " SERVER_PORT " ])
|| $_SERVER [ " SERVER_PORT " ] == '80'
|| ( $https && $_SERVER [ " SERVER_PORT " ] == '443' )
2013-10-07 10:47:13 +00:00
|| ( $https && $_SERVER [ " SERVER_PORT " ] == SSL_PORT ) //Custom HTTPS port detection
2013-08-04 18:58:31 +00:00
? '' : ':' . $_SERVER [ " SERVER_PORT " ]);
$scriptname = str_replace ( '/index.php' , '/' , $_SERVER [ " SCRIPT_NAME " ]);
2013-11-05 09:13:55 +00:00
if ( ! isset ( $_SERVER [ " HTTP_HOST " ])) {
2013-08-04 18:58:31 +00:00
return $scriptname ;
}
return 'http' . ( $https ? 's' : '' ) . '://'
2013-11-05 09:13:55 +00:00
. $_SERVER [ " HTTP_HOST " ] . $serverport . $scriptname ;
2013-08-04 18:58:31 +00:00
}
public static function redirect ( $url = '' )
{
if ( $url === '' ) {
$url = ( empty ( $_SERVER [ 'HTTP_REFERER' ]) ? '?' : $_SERVER [ 'HTTP_REFERER' ]);
if ( isset ( $_POST [ 'returnurl' ])) {
$url = $_POST [ 'returnurl' ];
}
}
# prevent loop
if ( empty ( $url ) || parse_url ( $url , PHP_URL_QUERY ) === $_SERVER [ 'QUERY_STRING' ]) {
$url = Tools :: getPocheUrl ();
}
if ( substr ( $url , 0 , 1 ) !== '?' ) {
$ref = Tools :: getPocheUrl ();
if ( substr ( $url , 0 , strlen ( $ref )) !== $ref ) {
$url = $ref ;
}
}
2013-08-07 12:24:07 +00:00
self :: logm ( 'redirect to ' . $url );
2013-08-04 18:58:31 +00:00
header ( 'Location: ' . $url );
exit ();
}
public static function getTplFile ( $view )
{
2013-09-20 08:21:39 +00:00
$default_tpl = 'home.twig' ;
switch ( $view ) {
2013-08-04 18:58:31 +00:00
case 'install' :
$tpl_file = 'install.twig' ;
break ;
case 'import' ;
$tpl_file = 'import.twig' ;
break ;
case 'export' :
$tpl_file = 'export.twig' ;
break ;
case 'config' :
$tpl_file = 'config.twig' ;
break ;
case 'view' :
$tpl_file = 'view.twig' ;
break ;
2013-09-20 08:21:39 +00:00
case 'login' :
$tpl_file = 'login.twig' ;
break ;
case 'error' :
$tpl_file = 'error.twig' ;
break ;
2013-08-04 18:58:31 +00:00
default :
2013-09-20 08:21:39 +00:00
$tpl_file = $default_tpl ;
break ;
2013-08-04 18:58:31 +00:00
}
2013-09-20 08:21:39 +00:00
2013-08-04 18:58:31 +00:00
return $tpl_file ;
}
public static function getFile ( $url )
{
$timeout = 15 ;
$useragent = " Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0 " ;
if ( in_array ( 'curl' , get_loaded_extensions ())) {
# Fetch feed from URL
$curl = curl_init ();
curl_setopt ( $curl , CURLOPT_URL , $url );
curl_setopt ( $curl , CURLOPT_TIMEOUT , $timeout );
2013-11-13 14:17:34 +00:00
if ( ! ini_get ( 'open_basedir' ) && ! ini_get ( 'safe_mode' )) {
curl_setopt ( $curl , CURLOPT_FOLLOWLOCATION , true );
}
2013-08-04 18:58:31 +00:00
curl_setopt ( $curl , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $curl , CURLOPT_HEADER , false );
# for ssl, do not verified certificate
curl_setopt ( $curl , CURLOPT_SSL_VERIFYPEER , FALSE );
curl_setopt ( $curl , CURLOPT_AUTOREFERER , TRUE );
# FeedBurner requires a proper USER-AGENT...
curl_setopt ( $curl , CURL_HTTP_VERSION_1_1 , true );
curl_setopt ( $curl , CURLOPT_ENCODING , " gzip, deflate " );
curl_setopt ( $curl , CURLOPT_USERAGENT , $useragent );
$data = curl_exec ( $curl );
$httpcode = curl_getinfo ( $curl , CURLINFO_HTTP_CODE );
$httpcodeOK = isset ( $httpcode ) and ( $httpcode == 200 or $httpcode == 301 );
curl_close ( $curl );
} else {
# create http context and add timeout and user-agent
$context = stream_context_create (
array (
'http' => array (
'timeout' => $timeout ,
'header' => " User-Agent: " . $useragent ,
'follow_location' => true
),
'ssl' => array (
'verify_peer' => false ,
'allow_self_signed' => true
)
)
);
# only download page lesser than 4MB
$data = @ file_get_contents ( $url , false , $context , - 1 , 4000000 );
if ( isset ( $http_response_header ) and isset ( $http_response_header [ 0 ])) {
$httpcodeOK = isset ( $http_response_header ) and isset ( $http_response_header [ 0 ]) and (( strpos ( $http_response_header [ 0 ], '200 OK' ) !== FALSE ) or ( strpos ( $http_response_header [ 0 ], '301 Moved Permanently' ) !== FALSE ));
}
}
# if response is not empty and response is OK
if ( isset ( $data ) and isset ( $httpcodeOK ) and $httpcodeOK ) {
# take charset of page and get it
preg_match ( '#<meta .*charset=.*>#Usi' , $data , $meta );
# if meta tag is found
if ( ! empty ( $meta [ 0 ])) {
preg_match ( '#charset="?(.*)"#si' , $meta [ 0 ], $encoding );
# if charset is found set it otherwise, set it to utf-8
$html_charset = ( ! empty ( $encoding [ 1 ])) ? strtolower ( $encoding [ 1 ]) : 'utf-8' ;
2013-08-08 19:13:37 +00:00
if ( empty ( $encoding [ 1 ])) $encoding [ 1 ] = 'utf-8' ;
2013-08-04 18:58:31 +00:00
} else {
$html_charset = 'utf-8' ;
$encoding [ 1 ] = '' ;
}
# replace charset of url to charset of page
$data = str_replace ( 'charset=' . $encoding [ 1 ], 'charset=' . $html_charset , $data );
return $data ;
}
else {
return FALSE ;
}
}
public static function renderJson ( $data )
{
header ( 'Cache-Control: no-cache, must-revalidate' );
header ( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' );
header ( 'Content-type: application/json; charset=UTF-8' );
echo json_encode ( $data );
exit ();
}
public static function logm ( $message )
{
if ( DEBUG_POCHE ) {
$t = strval ( date ( 'Y/m/d_H:i:s' )) . ' - ' . $_SERVER [ " REMOTE_ADDR " ] . ' - ' . strval ( $message ) . " \n " ;
2013-08-05 19:56:32 +00:00
file_put_contents ( CACHE . '/log.txt' , $t , FILE_APPEND );
2013-08-07 12:24:07 +00:00
error_log ( 'DEBUG POCHE : ' . $message );
2013-08-04 18:58:31 +00:00
}
}
public static function encodeString ( $string )
{
return sha1 ( $string . SALT );
}
2013-08-04 20:35:08 +00:00
2013-08-05 08:32:15 +00:00
public static function checkVar ( $var , $default = '' )
2013-08-04 20:35:08 +00:00
{
2013-08-05 08:32:15 +00:00
return (( isset ( $_REQUEST [ " $var " ])) ? htmlentities ( $_REQUEST [ " $var " ]) : $default );
2013-08-04 20:35:08 +00:00
}
2013-08-05 13:54:37 +00:00
public static function getDomain ( $url )
{
2013-08-25 06:01:18 +00:00
return parse_url ( $url , PHP_URL_HOST );
2013-08-05 13:54:37 +00:00
}
2013-08-09 06:25:16 +00:00
public static function getReadingTime ( $text ) {
$word = str_word_count ( strip_tags ( $text ));
$minutes = floor ( $word / 200 );
$seconds = floor ( $word % 200 / ( 200 / 60 ));
$time = array ( 'minutes' => $minutes , 'seconds' => $seconds );
return $minutes ;
}
2013-08-16 18:19:31 +00:00
2013-08-26 20:25:03 +00:00
public static function getDocLanguage ( $userlanguage ) {
$lang = explode ( '.' , $userlanguage );
return str_replace ( '_' , '-' , $lang [ 0 ]);
}
2013-12-12 08:42:19 +00:00
public static function status ( $status_code )
{
if ( strpos ( php_sapi_name (), 'apache' ) !== false ) {
header ( 'HTTP/1.0 ' . $status_code );
}
else {
header ( 'Status: ' . $status_code );
}
}
public static function download_db () {
header ( 'Content-Disposition: attachment; filename="poche.sqlite.gz"' );
self :: status ( 200 );
header ( 'Content-Transfer-Encoding: binary' );
header ( 'Content-Type: application/octet-stream' );
echo gzencode ( file_get_contents ( STORAGE_SQLITE ));
exit ;
}
2013-10-07 10:30:40 +00:00
}