2013-08-04 20:58:31 +02:00
< ? php
/**
2014-01-28 10:36:04 +01:00
* wallabag , self hostable application allowing you to not miss any content anymore
2013-08-04 20:58:31 +02:00
*
2014-01-28 10:36:04 +01:00
* @ category wallabag
* @ author Nicolas Lœuillet < nicolas @ loeuillet . org >
2013-08-04 20:58:31 +02:00
* @ copyright 2013
* @ license http :// www . wtfpl . net / see COPYING file
*/
2014-04-02 19:55:19 +02:00
2013-08-04 20:58:31 +02:00
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 12:30:40 +02:00
&& $_SERVER [ " SERVER_PORT " ] == '443' ) // HTTPS detection.
2014-04-02 19:55:19 +02:00
|| ( isset ( $_SERVER [ " SERVER_PORT " ]) //Custom HTTPS port detection
2014-02-03 12:46:09 +01:00
&& $_SERVER [ " SERVER_PORT " ] == SSL_PORT )
|| ( isset ( $_SERVER [ 'HTTP_X_FORWARDED_PROTO' ])
&& $_SERVER [ 'HTTP_X_FORWARDED_PROTO' ] == 'https' );
2013-10-07 12:30:40 +02:00
2013-08-04 20:58:31 +02:00
$serverport = ( ! isset ( $_SERVER [ " SERVER_PORT " ])
|| $_SERVER [ " SERVER_PORT " ] == '80'
|| ( $https && $_SERVER [ " SERVER_PORT " ] == '443' )
2013-10-07 12:47:13 +02:00
|| ( $https && $_SERVER [ " SERVER_PORT " ] == SSL_PORT ) //Custom HTTPS port detection
2013-08-04 20:58:31 +02:00
? '' : ':' . $_SERVER [ " SERVER_PORT " ]);
$scriptname = str_replace ( '/index.php' , '/' , $_SERVER [ " SCRIPT_NAME " ]);
2013-11-05 10:13:55 +01:00
if ( ! isset ( $_SERVER [ " HTTP_HOST " ])) {
2013-08-04 20:58:31 +02:00
return $scriptname ;
}
2014-04-07 15:44:05 +02:00
$host = ( isset ( $_SERVER [ 'HTTP_X_FORWARDED_HOST' ]) ? $_SERVER [ 'HTTP_X_FORWARDED_HOST' ] : ( isset ( $_SERVER [ 'HTTP_HOST' ]) ? $_SERVER [ 'HTTP_HOST' ] : $_SERVER [ 'SERVER_NAME' ]));
2013-08-04 20:58:31 +02:00
return 'http' . ( $https ? 's' : '' ) . '://'
2014-04-07 15:44:05 +02:00
. $host . $serverport . $scriptname ;
2013-08-04 20:58:31 +02: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 14:24:07 +02:00
self :: logm ( 'redirect to ' . $url );
2013-08-04 20:58:31 +02:00
header ( 'Location: ' . $url );
exit ();
}
public static function getTplFile ( $view )
{
2013-12-06 14:07:00 +01:00
$views = array (
'install' , 'import' , 'export' , 'config' , 'tags' ,
2014-02-20 18:28:39 +01:00
'edit-tags' , 'view' , 'login' , 'error'
2013-12-06 14:07:00 +01:00
);
if ( in_array ( $view , $views )) {
return $view . '.twig' ;
2013-08-04 20:58:31 +02:00
}
2013-12-06 14:07:00 +01:00
return 'home.twig' ;
2013-08-04 20:58:31 +02:00
}
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 15:17:34 +01:00
if ( ! ini_get ( 'open_basedir' ) && ! ini_get ( 'safe_mode' )) {
curl_setopt ( $curl , CURLOPT_FOLLOWLOCATION , true );
}
2013-08-04 20:58:31 +02: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
2014-04-02 19:55:19 +02:00
$data = @ file_get_contents ( $url , false , $context , - 1 , 4000000 );
2013-08-04 20:58:31 +02:00
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 21:13:37 +02:00
if ( empty ( $encoding [ 1 ])) $encoding [ 1 ] = 'utf-8' ;
2013-08-04 20:58:31 +02: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 )
{
2014-02-28 21:49:38 +01:00
if ( DEBUG_POCHE && php_sapi_name () != 'cli' ) {
2013-08-04 20:58:31 +02:00
$t = strval ( date ( 'Y/m/d_H:i:s' )) . ' - ' . $_SERVER [ " REMOTE_ADDR " ] . ' - ' . strval ( $message ) . " \n " ;
2013-08-05 21:56:32 +02:00
file_put_contents ( CACHE . '/log.txt' , $t , FILE_APPEND );
2013-08-07 14:24:07 +02:00
error_log ( 'DEBUG POCHE : ' . $message );
2013-08-04 20:58:31 +02:00
}
}
2014-04-02 19:55:19 +02:00
public static function encodeString ( $string )
2013-08-04 20:58:31 +02:00
{
return sha1 ( $string . SALT );
}
2013-08-04 22:35:08 +02:00
2013-08-05 10:32:15 +02:00
public static function checkVar ( $var , $default = '' )
2013-08-04 22:35:08 +02:00
{
2013-08-05 10:32:15 +02:00
return (( isset ( $_REQUEST [ " $var " ])) ? htmlentities ( $_REQUEST [ " $var " ]) : $default );
2013-08-04 22:35:08 +02:00
}
2013-08-05 15:54:37 +02:00
public static function getDomain ( $url )
{
2013-08-25 08:01:18 +02:00
return parse_url ( $url , PHP_URL_HOST );
2013-08-05 15:54:37 +02:00
}
2013-08-09 08:25:16 +02: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 20:19:31 +02:00
2013-08-26 22:25:03 +02:00
public static function getDocLanguage ( $userlanguage ) {
$lang = explode ( '.' , $userlanguage );
return str_replace ( '_' , '-' , $lang [ 0 ]);
}
2013-12-12 09:42:19 +01: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 ;
}
2014-02-28 21:49:38 +01:00
public static function getPageContent ( Url $url )
{
// Saving and clearing context
$REAL = array ();
foreach ( $GLOBALS as $key => $value ) {
if ( $key != 'GLOBALS' && $key != '_SESSION' && $key != 'HTTP_SESSION_VARS' ) {
$GLOBALS [ $key ] = array ();
$REAL [ $key ] = $value ;
}
}
// Saving and clearing session
2014-03-07 11:54:08 +01:00
if ( isset ( $_SESSION ) ) {
$REAL_SESSION = array ();
foreach ( $_SESSION as $key => $value ) {
$REAL_SESSION [ $key ] = $value ;
unset ( $_SESSION [ $key ]);
}
2014-02-28 21:49:38 +01:00
}
// Running code in different context
$scope = function () {
extract ( func_get_arg ( 1 ) );
$_GET = $_REQUEST = array (
" url " => $url -> getUrl (),
" max " => 5 ,
" links " => " preserve " ,
" exc " => " " ,
" format " => " json " ,
" submit " => " Create Feed "
);
ob_start ();
require func_get_arg ( 0 );
2014-03-07 11:54:08 +01:00
$json = ob_get_contents ();
ob_end_clean ();
2014-02-28 21:49:38 +01:00
return $json ;
};
$json = $scope ( " inc/3rdparty/makefulltextfeed.php " , array ( " url " => $url ) );
// Clearing and restoring context
foreach ( $GLOBALS as $key => $value ) {
if ( $key != " GLOBALS " && $key != " _SESSION " ) {
unset ( $GLOBALS [ $key ]);
}
}
foreach ( $REAL as $key => $value ) {
$GLOBALS [ $key ] = $value ;
}
// Clearing and restoring session
2014-03-07 11:54:08 +01:00
if ( isset ( $REAL_SESSION ) ) {
foreach ( $_SESSION as $key => $value ) {
unset ( $_SESSION [ $key ]);
}
foreach ( $REAL_SESSION as $key => $value ) {
$_SESSION [ $key ] = $value ;
}
2014-02-28 21:49:38 +01:00
}
2014-03-07 11:54:08 +01:00
2014-02-28 21:49:38 +01:00
return json_decode ( $json , true );
}
2014-03-10 15:28:47 +01:00
/**
* Returns whether we handle an AJAX ( XMLHttpRequest ) request .
* @ return boolean whether we handle an AJAX ( XMLHttpRequest ) request .
*/
public static function isAjaxRequest ()
{
return isset ( $_SERVER [ 'HTTP_X_REQUESTED_WITH' ]) && $_SERVER [ 'HTTP_X_REQUESTED_WITH' ] === 'XMLHttpRequest' ;
}
2013-10-07 12:30:40 +02:00
}