2013-04-04 19:09:34 +00:00
< ? php
2013-04-21 16:42:20 +00:00
/**
* 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
*/
2013-04-04 19:09:34 +00:00
2013-04-12 11:13:21 +00:00
/**
* Permet de générer l ' URL de poche pour le bookmarklet
*/
2013-04-15 07:38:41 +00:00
function get_poche_url ()
2013-04-12 11:13:21 +00:00
{
$protocol = " http " ;
if ( isset ( $_SERVER [ 'HTTPS' ])) {
2013-04-18 06:15:34 +00:00
if ( $_SERVER [ 'HTTPS' ] != " off " && $_SERVER [ 'HTTPS' ] != " " ) {
2013-04-12 11:13:21 +00:00
$protocol = " https " ;
}
}
2013-04-04 19:09:34 +00:00
2013-04-12 11:13:21 +00:00
return $protocol . " :// " . $_SERVER [ 'HTTP_HOST' ] . $_SERVER [ 'REQUEST_URI' ];
2013-04-04 19:09:34 +00:00
}
2013-05-31 20:55:52 +00:00
function encode_string ( $string )
{
return sha1 ( $string . SALT );
}
2013-04-04 19:09:34 +00:00
// function define to retrieve url content
2013-04-17 13:11:57 +00:00
function get_external_file ( $url )
2013-04-12 11:13:21 +00:00
{
2013-04-17 13:11:57 +00:00
$timeout = 15 ;
2013-04-04 19:09:34 +00:00
// spoofing FireFox 18.0
$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 );
curl_setopt ( $curl , CURLOPT_FOLLOWLOCATION , true );
curl_setopt ( $curl , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $curl , CURLOPT_HEADER , false );
2013-04-23 13:25:12 +00:00
// FOR SSL do not verified certificate
2013-04-23 12:22:19 +00:00
curl_setopt ( $curl , CURLOPT_SSL_VERIFYPEER , FALSE );
2013-04-23 13:25:12 +00:00
curl_setopt ( $curl , CURLOPT_AUTOREFERER , TRUE );
2013-04-23 12:22:19 +00:00
2013-04-04 19:09:34 +00: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
2013-04-23 12:22:19 +00:00
$context = stream_context_create ( array (
2013-04-23 13:25:12 +00:00
'http' => array ( 'timeout' => $timeout ,
'header' => " User-Agent: " . $useragent , /*spoot Mozilla Firefox*/
'follow_location' => true ),
// FOR SSL do not verified certificate
'ssl' => array ( 'verify_peer' => false ,
'allow_self_signed' => true )
)
);
2013-04-04 19:09:34 +00:00
// only download page lesser than 4MB
$data = @ file_get_contents ( $url , false , $context , - 1 , 4000000 ); // We download at most 4 MB from source.
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 ])) {
// retrieve encoding in $enc
preg_match ( '#charset="?(.*)"#si' , $meta [ 0 ], $enc );
// if charset is found set it otherwise, set it to utf-8
$html_charset = ( ! empty ( $enc [ 1 ])) ? strtolower ( $enc [ 1 ]) : 'utf-8' ;
} else {
$html_charset = 'utf-8' ;
$enc [ 1 ] = '' ;
}
// replace charset of url to charset of page
$data = str_replace ( 'charset=' . $enc [ 1 ], 'charset=' . $html_charset , $data );
return $data ;
}
else {
return FALSE ;
}
2013-04-15 07:04:23 +00:00
}
2013-04-15 07:38:41 +00:00
/**
* Préparation de l ' URL avec récupération du contenu avant insertion en base
*/
2013-04-18 08:15:46 +00:00
function prepare_url ( $url )
2013-04-15 07:04:23 +00:00
{
$parametres = array ();
2013-04-18 13:39:34 +00:00
$url = html_entity_decode ( trim ( $url ));
2013-04-15 07:04:23 +00:00
// We remove the annoying parameters added by FeedBurner and GoogleFeedProxy (?utm_source=...)
// from shaarli, by sebsauvage
$i = strpos ( $url , '&utm_source=' ); if ( $i !== false ) $url = substr ( $url , 0 , $i );
$i = strpos ( $url , '?utm_source=' ); if ( $i !== false ) $url = substr ( $url , 0 , $i );
$i = strpos ( $url , '#xtor=RSS-' ); if ( $i !== false ) $url = substr ( $url , 0 , $i );
2013-04-18 13:39:34 +00:00
$title = $url ;
2013-04-23 13:25:12 +00:00
$html = Encoding :: toUTF8 ( get_external_file ( $url , 15 ));
// If get_external_file if not able to retrieve HTTPS content try the same URL with HTTP protocol
if ( ! preg_match ( '!^https?://!i' , $url ) && ( ! isset ( $html ) || strlen ( $html ) <= 0 )) {
$url = 'http://' . $url ;
$html = Encoding :: toUTF8 ( get_external_file ( $url , 15 ));
}
2013-04-15 07:04:23 +00:00
2013-04-23 14:03:52 +00:00
if ( function_exists ( 'tidy_parse_string' )) {
$tidy = tidy_parse_string ( $html , array (), 'UTF8' );
$tidy -> cleanRepair ();
$html = $tidy -> value ;
}
2013-04-15 07:04:23 +00:00
if ( isset ( $html ) and strlen ( $html ) > 0 )
{
$r = new Readability ( $html , $url );
2013-04-23 13:25:12 +00:00
2013-04-18 08:15:46 +00:00
$r -> convertLinksToFootnotes = CONVERT_LINKS_FOOTNOTES ;
2013-04-23 13:25:12 +00:00
$r -> revertForcedParagraphElements = REVERT_FORCED_PARAGRAPH_ELEMENTS ;
2013-04-23 12:22:19 +00:00
2013-04-15 07:04:23 +00:00
if ( $r -> init ())
{
2013-04-17 13:11:57 +00:00
$content = $r -> articleContent -> innerHTML ;
$parametres [ 'title' ] = $r -> articleTitle -> innerHTML ;
2013-04-18 07:43:08 +00:00
$parametres [ 'content' ] = $content ;
2013-04-17 13:11:57 +00:00
return $parametres ;
2013-04-15 07:04:23 +00:00
}
}
2013-04-17 13:11:57 +00:00
return FALSE ;
}
/**
* On modifie les URLS des images dans le corps de l ' article
*/
function filtre_picture ( $content , $url , $id )
{
$matches = array ();
preg_match_all ( '#<\s*(img)[^>]+src="([^"]*)"[^>]*>#Si' , $content , $matches , PREG_SET_ORDER );
foreach ( $matches as $i => $link )
{
$link [ 1 ] = trim ( $link [ 1 ]);
if ( ! preg_match ( '#^(([a-z]+://)|(\#))#' , $link [ 1 ]) )
{
$absolute_path = get_absolute_link ( $link [ 2 ], $url );
$filename = basename ( parse_url ( $absolute_path , PHP_URL_PATH ));
$directory = create_assets_directory ( $id );
$fullpath = $directory . '/' . $filename ;
download_pictures ( $absolute_path , $fullpath );
$content = str_replace ( $matches [ $i ][ 2 ], $fullpath , $content );
}
}
return $content ;
}
/**
* Retourne le lien absolu
*/
function get_absolute_link ( $relative_link , $url )
{
/* return if already absolute URL */
if ( parse_url ( $relative_link , PHP_URL_SCHEME ) != '' ) return $relative_link ;
/* queries and anchors */
if ( $relative_link [ 0 ] == '#' || $relative_link [ 0 ] == '?' ) return $url . $relative_link ;
/* parse base URL and convert to local variables :
$scheme , $host , $path */
extract ( parse_url ( $url ));
/* remove non-directory element from path */
$path = preg_replace ( '#/[^/]*$#' , '' , $path );
/* destroy path if relative url points to root */
if ( $relative_link [ 0 ] == '/' ) $path = '' ;
/* dirty absolute URL */
$abs = $host . $path . '/' . $relative_link ;
/* 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 ;
}
/**
* Téléchargement des images
*/
function download_pictures ( $absolute_path , $fullpath )
{
$rawdata = get_external_file ( $absolute_path );
2013-04-15 07:04:23 +00:00
2013-04-17 13:11:57 +00:00
if ( file_exists ( $fullpath )) {
unlink ( $fullpath );
}
$fp = fopen ( $fullpath , 'x' );
fwrite ( $fp , $rawdata );
fclose ( $fp );
}
/**
* Crée un répertoire de médias pour l ' article
*/
function create_assets_directory ( $id )
{
$assets_path = ABS_PATH ;
if ( ! is_dir ( $assets_path )) {
mkdir ( $assets_path , 0705 );
}
$article_directory = $assets_path . $id ;
if ( ! is_dir ( $article_directory )) {
mkdir ( $article_directory , 0705 );
}
return $article_directory ;
}
/**
* Suppression du répertoire d ' images
*/
function remove_directory ( $directory )
{
if ( is_dir ( $directory )) {
$files = array_diff ( scandir ( $directory ), array ( '.' , '..' ));
foreach ( $files as $file ) {
2013-04-18 06:13:11 +00:00
( is_dir ( " $directory / $file " )) ? remove_directory ( " $directory / $file " ) : unlink ( " $directory / $file " );
2013-04-17 13:11:57 +00:00
}
return rmdir ( $directory );
}
2013-04-15 07:58:34 +00:00
}
2013-04-19 09:41:12 +00:00
function display_view ( $view , $id = 0 , $full_head = 'yes' )
{
2013-04-21 17:32:19 +00:00
global $tpl , $store , $msg ;
2013-04-19 09:41:12 +00:00
switch ( $view )
{
2013-04-21 16:09:25 +00:00
case 'export' :
$entries = $store -> retrieveAll ();
2013-04-21 16:42:20 +00:00
$tpl -> assign ( 'export' , myTool :: renderJson ( $entries ));
2013-04-21 16:09:25 +00:00
$tpl -> draw ( 'export' );
logm ( 'export view' );
break ;
2013-04-21 11:11:14 +00:00
case 'config' :
$tpl -> assign ( 'load_all_js' , 0 );
$tpl -> draw ( 'head' );
$tpl -> draw ( 'home' );
$tpl -> draw ( 'config' );
$tpl -> draw ( 'js' );
$tpl -> draw ( 'footer' );
logm ( 'config view' );
2013-04-21 16:09:25 +00:00
break ;
2013-04-19 09:41:12 +00:00
case 'view' :
2013-04-19 13:46:04 +00:00
$entry = $store -> retrieveOneById ( $id );
2013-04-19 09:41:12 +00:00
if ( $entry != NULL ) {
2013-04-19 13:46:04 +00:00
$tpl -> assign ( 'id' , $entry [ 'id' ]);
$tpl -> assign ( 'url' , $entry [ 'url' ]);
$tpl -> assign ( 'title' , $entry [ 'title' ]);
2013-04-23 14:03:52 +00:00
$content = $entry [ 'content' ];
if ( function_exists ( 'tidy_parse_string' )) {
$tidy = tidy_parse_string ( $content , array ( 'indent' => true , 'show-body-only' => true ), 'UTF8' );
$tidy -> cleanRepair ();
$content = $tidy -> value ;
}
$tpl -> assign ( 'content' , $content );
2013-04-19 13:46:04 +00:00
$tpl -> assign ( 'is_fav' , $entry [ 'is_fav' ]);
$tpl -> assign ( 'is_read' , $entry [ 'is_read' ]);
2013-04-19 09:41:12 +00:00
$tpl -> assign ( 'load_all_js' , 0 );
$tpl -> draw ( 'view' );
}
else {
logm ( 'error in view call : entry is NULL' );
}
logm ( 'view link #' . $id );
break ;
default : # home view
2013-04-19 13:46:04 +00:00
$entries = $store -> getEntriesByView ( $view );
2013-04-19 09:41:12 +00:00
$tpl -> assign ( 'entries' , $entries );
if ( $full_head == 'yes' ) {
$tpl -> assign ( 'load_all_js' , 1 );
$tpl -> draw ( 'head' );
$tpl -> draw ( 'home' );
}
$tpl -> draw ( 'entries' );
if ( $full_head == 'yes' ) {
$tpl -> draw ( 'js' );
$tpl -> draw ( 'footer' );
}
break ;
}
}
2013-04-15 07:58:34 +00:00
/**
* Appel d ' une action ( mark as fav , archive , delete )
*/
2013-04-18 13:39:34 +00:00
function action_to_do ( $action , $url , $id = 0 )
2013-04-15 07:58:34 +00:00
{
2013-04-21 17:32:19 +00:00
global $store , $msg ;
2013-04-15 07:58:34 +00:00
switch ( $action )
{
case 'add' :
if ( $url == '' )
continue ;
2013-04-21 16:42:20 +00:00
if ( MyTool :: isUrl ( $url )) {
if ( $parametres_url = prepare_url ( $url )) {
2013-04-23 07:38:57 +00:00
if ( $store -> add ( $url , $parametres_url [ 'title' ], $parametres_url [ 'content' ])) {
$last_id = $store -> getLastId ();
if ( DOWNLOAD_PICTURES ) {
$content = filtre_picture ( $parametres_url [ 'content' ], $url , $last_id );
}
$msg -> add ( 's' , 'the link has been added successfully' );
2013-04-21 16:42:20 +00:00
}
2013-04-23 07:38:57 +00:00
else {
$msg -> add ( 'e' , 'error during insertion : the link wasn\'t added' );
}
}
else {
$msg -> add ( 'e' , 'error during url preparation : the link wasn\'t added' );
logm ( 'error during url preparation' );
2013-04-19 13:46:04 +00:00
}
2013-04-17 13:11:57 +00:00
}
2013-04-21 16:42:20 +00:00
else {
2013-04-23 07:38:57 +00:00
$msg -> add ( 'e' , 'error during url preparation : the link is not valid' );
2013-04-21 16:42:20 +00:00
logm ( $url . ' is not a valid url' );
}
2013-04-17 13:11:57 +00:00
2013-04-17 12:01:37 +00:00
logm ( 'add link ' . $url );
2013-04-15 07:58:34 +00:00
break ;
case 'delete' :
2013-04-23 07:38:57 +00:00
if ( $store -> deleteById ( $id )) {
remove_directory ( ABS_PATH . $id );
$msg -> add ( 's' , 'the link has been deleted successfully' );
logm ( 'delete link #' . $id );
}
else {
$msg -> add ( 'e' , 'the link wasn\'t deleted' );
logm ( 'error : can\'t delete link #' . $id );
}
2013-04-15 07:58:34 +00:00
break ;
2013-04-16 09:52:25 +00:00
case 'toggle_fav' :
2013-04-19 13:46:04 +00:00
$store -> favoriteById ( $id );
2013-04-18 13:39:34 +00:00
logm ( 'mark as favorite link #' . $id );
2013-04-16 09:52:25 +00:00
break ;
case 'toggle_archive' :
2013-04-19 13:46:04 +00:00
$store -> archiveById ( $id );
2013-04-18 13:39:34 +00:00
logm ( 'archive link #' . $id );
2013-04-16 09:52:25 +00:00
break ;
2013-04-15 07:58:34 +00:00
default :
break ;
}
2013-04-15 12:09:58 +00:00
}
2013-04-17 11:38:12 +00:00
function logm ( $message )
{
$t = strval ( date ( 'Y/m/d_H:i:s' )) . ' - ' . $_SERVER [ " REMOTE_ADDR " ] . ' - ' . strval ( $message ) . " \n " ;
2013-04-17 12:01:37 +00:00
file_put_contents ( './log.txt' , $t , FILE_APPEND );
2013-04-23 13:09:54 +00:00
}