2015-01-27 13:08:02 +01:00
< ? php
namespace Wallabag\CoreBundle\Helper ;
final class Tools
{
/**
* Download a file ( typically , for downloading pictures on web server )
*
* @ param $url
* @ return bool | mixed | string
*/
public static function getFile ( $url )
{
$timeout = 15 ;
$useragent = " Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0 " ;
2015-01-31 19:09:34 +01:00
if ( in_array ( 'curl' , get_loaded_extensions ())) {
2015-01-27 13:08:02 +01:00
# Fetch feed from URL
$curl = curl_init ();
curl_setopt ( $curl , CURLOPT_URL , $url );
curl_setopt ( $curl , CURLOPT_TIMEOUT , $timeout );
if ( ! ini_get ( 'open_basedir' ) && ! ini_get ( 'safe_mode' )) {
curl_setopt ( $curl , CURLOPT_FOLLOWLOCATION , true );
}
curl_setopt ( $curl , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $curl , CURLOPT_HEADER , false );
# for ssl, do not verified certificate
2015-01-31 19:09:34 +01:00
curl_setopt ( $curl , CURLOPT_SSL_VERIFYPEER , false );
curl_setopt ( $curl , CURLOPT_AUTOREFERER , true );
2015-01-27 13:08:02 +01:00
# 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 ,
2015-01-31 19:09:34 +01:00
'header' => " User-Agent: " . $useragent ,
'follow_location' => true ,
2015-01-27 13:08:02 +01:00
),
'ssl' => array (
'verify_peer' => false ,
2015-01-31 19:09:34 +01:00
'allow_self_signed' => true ,
),
2015-01-27 13:08:02 +01:00
)
);
# 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 ])) {
2015-01-31 19:09:34 +01:00
$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 ));
2015-01-27 13:08:02 +01:00
}
}
# 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' ;
2015-01-31 19:09:34 +01:00
if ( empty ( $encoding [ 1 ])) {
$encoding [ 1 ] = 'utf-8' ;
}
2015-01-27 13:08:02 +01:00
} else {
$html_charset = 'utf-8' ;
$encoding [ 1 ] = '' ;
}
# replace charset of url to charset of page
2015-01-31 19:09:34 +01:00
$data = str_replace ( 'charset=' . $encoding [ 1 ], 'charset=' . $html_charset , $data );
2015-01-27 13:08:02 +01:00
return $data ;
2015-01-31 19:09:34 +01:00
} else {
return false ;
2015-01-27 13:08:02 +01:00
}
}
/**
* Encode a URL by using a salt
*
* @ param $string
* @ return string
*/
public static function encodeString ( $string )
{
2015-01-31 19:09:34 +01:00
return sha1 ( $string . SALT );
2015-01-27 13:08:02 +01:00
}
public static function generateToken ()
{
if ( ini_get ( 'open_basedir' ) === '' ) {
if ( strtoupper ( substr ( PHP_OS , 0 , 3 )) === 'WIN' ) {
// alternative to /dev/urandom for Windows
$token = substr ( base64_encode ( uniqid ( mt_rand (), true )), 0 , 20 );
} else {
$token = substr ( base64_encode ( file_get_contents ( '/dev/urandom' , false , null , 0 , 20 )), 0 , 15 );
}
2015-01-31 19:09:34 +01:00
} else {
2015-01-27 13:08:02 +01:00
$token = substr ( base64_encode ( uniqid ( mt_rand (), true )), 0 , 20 );
}
return str_replace ( '+' , '' , $token );
}
}