2006-08-19 07:04:45 +00:00
< ? php
2012-08-23 19:28:32 +00:00
define ( 'EXPECTED_CONFIG_VERSION' , 26 );
2013-07-31 06:30:14 +00:00
define ( 'SCHEMA_VERSION' , 122 );
2012-07-10 11:24:04 +00:00
2013-03-27 05:40:07 +00:00
define ( 'LABEL_BASE_INDEX' , - 1024 );
2013-03-27 12:14:27 +00:00
define ( 'PLUGIN_FEED_BASE_INDEX' , - 128 );
2013-03-27 05:40:07 +00:00
2013-04-29 09:03:28 +00:00
define ( 'COOKIE_LIFETIME_LONG' , 86400 * 365 );
2012-08-21 10:09:51 +00:00
$fetch_last_error = false ;
2013-03-30 11:10:53 +00:00
$fetch_last_error_code = false ;
2013-04-09 22:59:48 +00:00
$fetch_last_content_type = false ;
2013-04-18 07:35:58 +00:00
$fetch_curl_used = false ;
2012-08-21 10:09:51 +00:00
2012-07-31 12:49:54 +00:00
mb_internal_encoding ( " UTF-8 " );
2010-11-07 15:14:48 +00:00
date_default_timezone_set ( 'UTC' );
2010-11-10 20:59:23 +00:00
if ( defined ( 'E_DEPRECATED' )) {
error_reporting ( E_ALL & ~ E_NOTICE & ~ E_DEPRECATED );
} else {
error_reporting ( E_ALL & ~ E_NOTICE );
}
2005-11-23 18:08:01 +00:00
2005-08-21 15:35:22 +00:00
require_once 'config.php' ;
2007-03-05 09:24:13 +00:00
2013-04-01 15:32:05 +00:00
/**
* Define a constant if not already defined
*
* @ param string $name The constant name .
* @ param mixed $value The constant value .
* @ access public
* @ return boolean True if defined successfully or not .
*/
function define_default ( $name , $value ) {
defined ( $name ) or define ( $name , $value );
}
2013-04-02 18:29:10 +00:00
///// Some defaults that you can override in config.php //////
define_default ( 'FEED_FETCH_TIMEOUT' , 45 );
// How may seconds to wait for response when requesting feed from a site
define_default ( 'FEED_FETCH_NO_CACHE_TIMEOUT' , 15 );
// How may seconds to wait for response when requesting feed from a
// site when that feed wasn't cached before
define_default ( 'FILE_FETCH_TIMEOUT' , 45 );
// Default timeout when fetching files from remote sites
define_default ( 'FILE_FETCH_CONNECT_TIMEOUT' , 15 );
// How many seconds to wait for initial response from website when
// fetching files from remote sites
2013-04-01 15:32:05 +00:00
2008-04-21 04:53:19 +00:00
if ( DB_TYPE == " pgsql " ) {
define ( 'SUBSTRING_FOR_DATE' , 'SUBSTRING_FOR_DATE' );
} else {
define ( 'SUBSTRING_FOR_DATE' , 'SUBSTRING' );
}
2008-01-26 12:19:44 +00:00
/**
* Return available translations names .
2011-03-17 16:05:28 +00:00
*
2008-01-26 12:19:44 +00:00
* @ access public
* @ return array A array of available translations .
*/
2007-08-11 14:25:51 +00:00
function get_translations () {
2007-08-11 15:40:27 +00:00
$tr = array (
2011-03-17 16:05:28 +00:00
" auto " => " Detect automatically " ,
2009-11-22 20:18:54 +00:00
" ca_CA " => " Català " ,
2013-03-19 13:39:08 +00:00
" cs_CZ " => " Česky " ,
2007-08-11 15:40:27 +00:00
" en_US " => " English " ,
2009-11-09 11:07:24 +00:00
" es_ES " => " Español " ,
2009-04-26 12:42:33 +00:00
" de_DE " => " Deutsch " ,
2007-08-11 15:40:27 +00:00
" fr_FR " => " Français " ,
2008-02-26 07:57:09 +00:00
" hu_HU " => " Magyar (Hungarian) " ,
2008-11-02 16:42:39 +00:00
" it_IT " => " Italiano " ,
2008-09-25 03:56:59 +00:00
" ja_JP " => " 日本語 (Japanese) " ,
2013-03-18 21:13:30 +00:00
" lv_LV " => " Latviešu " ,
2008-04-08 05:13:57 +00:00
" nb_NO " => " Norwegian bokmål " ,
2013-03-23 05:21:57 +00:00
" nl_NL " => " Dutch " ,
2012-10-06 14:27:53 +00:00
" pl_PL " => " Polski " ,
2013-04-01 15:10:26 +00:00
" ru_RU " => " Русский " ,
2007-10-26 07:19:54 +00:00
" pt_BR " => " Portuguese/Brazil " ,
2013-04-01 11:51:04 +00:00
" zh_CN " => " Simplified Chinese " ,
2013-04-01 17:35:00 +00:00
" sv_SE " => " Svenska " ,
2013-04-01 11:51:04 +00:00
" fi_FI " => " Suomi " );
2007-08-11 14:25:51 +00:00
return $tr ;
}
2011-03-18 16:25:06 +00:00
require_once " lib/accept-to-gettext.php " ;
require_once " lib/gettext/gettext.inc " ;
2007-03-06 10:33:06 +00:00
2013-07-31 06:30:14 +00:00
require_once " lib/languagedetect/LanguageDetect.php " ;
2013-01-22 18:32:17 +00:00
2011-03-18 16:25:06 +00:00
function startup_gettext () {
2011-03-17 16:05:28 +00:00
2011-03-18 16:25:06 +00:00
# Get locale from Accept-Language header
$lang = al2gt ( array_keys ( get_translations ()), " text/html " );
2007-08-10 16:16:43 +00:00
2011-03-18 16:25:06 +00:00
if ( defined ( '_TRANSLATION_OVERRIDE_DEFAULT' )) {
$lang = _TRANSLATION_OVERRIDE_DEFAULT ;
}
2007-08-10 16:16:43 +00:00
2013-04-30 05:34:24 +00:00
if ( $_SESSION [ " uid " ] && get_schema_version () >= 120 ) {
$pref_lang = get_pref ( " USER_LANGUAGE " , $_SESSION [ " uid " ]);
2013-04-27 13:12:48 +00:00
2013-06-06 18:54:47 +00:00
if ( $pref_lang && $pref_lang != 'auto' ) {
2013-04-29 11:54:23 +00:00
$lang = $pref_lang ;
}
2011-03-18 16:25:06 +00:00
}
2008-12-16 07:13:09 +00:00
2011-03-18 16:25:06 +00:00
if ( $lang ) {
if ( defined ( 'LC_MESSAGES' )) {
_setlocale ( LC_MESSAGES , $lang );
} else if ( defined ( 'LC_ALL' )) {
_setlocale ( LC_ALL , $lang );
2007-05-19 04:46:29 +00:00
}
2007-03-06 10:33:06 +00:00
2013-03-21 19:47:44 +00:00
_bindtextdomain ( " messages " , " locale " );
2007-05-19 05:13:35 +00:00
2011-03-18 16:25:06 +00:00
_textdomain ( " messages " );
_bind_textdomain_codeset ( " messages " , " UTF-8 " );
2007-05-19 05:13:35 +00:00
}
2011-03-18 16:25:06 +00:00
}
2005-11-16 17:22:13 +00:00
require_once 'db-prefs.php' ;
2006-03-31 05:24:22 +00:00
require_once 'version.php' ;
2013-01-22 18:32:17 +00:00
require_once 'ccache.php' ;
require_once 'labels.php' ;
2005-08-21 15:35:22 +00:00
2013-02-23 14:37:40 +00:00
define ( 'SELF_USER_AGENT' , 'Tiny Tiny RSS/' . VERSION . ' (http://tt-rss.org/)' );
2010-11-17 09:52:17 +00:00
ini_set ( 'user_agent' , SELF_USER_AGENT );
2011-04-01 05:36:29 +00:00
require_once 'lib/pubsubhubbub/publisher.php' ;
2012-06-05 17:52:21 +00:00
2011-08-04 15:38:25 +00:00
$schema_version = false ;
2008-01-26 05:33:59 +00:00
/**
* Print a timestamped debug message .
2011-03-17 16:05:28 +00:00
*
2008-01-26 05:33:59 +00:00
* @ param string $msg The debug message .
* @ return void
*/
2013-04-19 09:42:40 +00:00
function _debug ( $msg , $show = true ) {
2013-04-19 09:24:51 +00:00
2007-03-08 17:36:42 +00:00
$ts = strftime ( " %H:%M:%S " , time ());
2008-02-26 11:46:05 +00:00
if ( function_exists ( 'posix_getpid' )) {
$ts = " $ts / " . posix_getpid ();
}
2013-03-21 10:56:04 +00:00
2013-04-19 09:42:40 +00:00
if ( $show && ! ( defined ( 'QUIET' ) && QUIET )) {
2013-03-21 10:56:04 +00:00
print " [ $ts ] $msg\n " ;
}
if ( defined ( 'LOGFILE' )) {
$fp = fopen ( LOGFILE , 'a+' );
if ( $fp ) {
fputs ( $fp , " [ $ts ] $msg\n " );
fclose ( $fp );
}
}
2008-01-26 05:33:59 +00:00
} // function _debug
2007-03-08 17:36:42 +00:00
2008-01-26 12:19:44 +00:00
/**
* Purge a feed old posts .
2011-03-17 16:05:28 +00:00
*
2008-01-26 12:19:44 +00:00
* @ param mixed $link A database connection .
* @ param mixed $feed_id The id of the purged feed .
* @ param mixed $purge_interval Olderness of purged posts .
* @ param boolean $debug Set to True to enable the debug . False by default .
* @ access public
* @ return void
*/
2013-04-17 14:34:18 +00:00
function purge_feed ( $feed_id , $purge_interval , $debug = false ) {
2006-02-27 08:41:17 +00:00
2013-04-17 14:34:18 +00:00
if ( ! $purge_interval ) $purge_interval = feed_purge_interval ( $feed_id );
2011-03-17 16:05:28 +00:00
2006-02-27 08:41:17 +00:00
$rows = - 1 ;
2005-11-19 05:48:02 +00:00
2013-04-17 12:23:15 +00:00
$result = db_query (
2007-11-15 05:41:53 +00:00
" SELECT owner_uid FROM ttrss_feeds WHERE id = ' $feed_id ' " );
$owner_uid = false ;
if ( db_num_rows ( $result ) == 1 ) {
$owner_uid = db_fetch_result ( $result , 0 , " owner_uid " );
}
2009-01-22 07:22:57 +00:00
if ( $purge_interval == - 1 || ! $purge_interval ) {
if ( $owner_uid ) {
2013-04-17 14:34:18 +00:00
ccache_update ( $feed_id , $owner_uid );
2009-01-22 07:22:57 +00:00
}
return ;
}
2007-11-15 05:41:53 +00:00
if ( ! $owner_uid ) return ;
2009-01-20 12:35:59 +00:00
if ( FORCE_ARTICLE_PURGE == 0 ) {
2013-04-17 14:34:18 +00:00
$purge_unread = get_pref ( " PURGE_UNREAD_ARTICLES " ,
2009-01-20 12:35:59 +00:00
$owner_uid , false );
} else {
$purge_unread = true ;
$purge_interval = FORCE_ARTICLE_PURGE ;
}
2007-11-15 05:41:53 +00:00
if ( ! $purge_unread ) $query_limit = " unread = false AND " ;
2005-11-18 12:21:16 +00:00
if ( DB_TYPE == " pgsql " ) {
2013-04-17 12:23:15 +00:00
$pg_version = get_pgsql_version ();
2006-03-31 04:19:45 +00:00
if ( preg_match ( " /^7 \ ./ " , $pg_version ) || preg_match ( " /^8 \ .0/ " , $pg_version )) {
2006-03-29 03:43:21 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " DELETE FROM ttrss_user_entries WHERE
2011-03-17 16:05:28 +00:00
ttrss_entries . id = ref_id AND
marked = false AND
feed_id = '$feed_id' AND
2007-11-15 05:41:53 +00:00
$query_limit
2010-10-27 08:05:20 +00:00
ttrss_entries . date_updated < NOW () - INTERVAL '$purge_interval days' " );
2006-03-29 03:43:21 +00:00
} else {
2013-04-17 14:34:18 +00:00
$result = db_query ( " DELETE FROM ttrss_user_entries
2011-03-17 16:05:28 +00:00
USING ttrss_entries
WHERE ttrss_entries . id = ref_id AND
marked = false AND
feed_id = '$feed_id' AND
2007-11-15 05:41:53 +00:00
$query_limit
2010-10-27 08:05:20 +00:00
ttrss_entries . date_updated < NOW () - INTERVAL '$purge_interval days' " );
2006-03-29 03:43:21 +00:00
}
2006-02-27 08:41:17 +00:00
2005-11-18 12:21:16 +00:00
} else {
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
/* $result = db_query ( " DELETE FROM ttrss_user_entries WHERE
2005-11-18 12:21:16 +00:00
marked = false AND feed_id = '$feed_id' AND
2011-03-17 16:05:28 +00:00
( SELECT date_updated FROM ttrss_entries WHERE
2006-03-21 05:28:10 +00:00
id = ref_id ) < DATE_SUB ( NOW (), INTERVAL $purge_interval DAY ) " ); */
2013-04-17 14:34:18 +00:00
$result = db_query ( " DELETE FROM ttrss_user_entries
2011-03-17 16:05:28 +00:00
USING ttrss_user_entries , ttrss_entries
WHERE ttrss_entries . id = ref_id AND
marked = false AND
feed_id = '$feed_id' AND
2007-11-15 05:41:53 +00:00
$query_limit
2010-10-27 08:05:20 +00:00
ttrss_entries . date_updated < DATE_SUB ( NOW (), INTERVAL $purge_interval DAY ) " );
2006-02-27 08:41:17 +00:00
}
2013-04-17 18:24:07 +00:00
$rows = db_affected_rows ( $result );
2013-04-18 07:35:58 +00:00
2013-04-17 14:34:18 +00:00
ccache_update ( $feed_id , $owner_uid );
2009-01-17 16:11:53 +00:00
2006-02-27 08:41:17 +00:00
if ( $debug ) {
2007-03-08 17:36:42 +00:00
_debug ( " Purged feed $feed_id ( $purge_interval ): deleted $rows articles " );
2005-11-18 12:21:16 +00:00
}
2013-02-26 12:16:04 +00:00
return $rows ;
2008-01-26 12:19:44 +00:00
} // function purge_feed
2005-11-18 12:21:16 +00:00
2013-04-17 14:34:18 +00:00
function feed_purge_interval ( $feed_id ) {
2007-11-15 05:41:53 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT purge_interval, owner_uid FROM ttrss_feeds
2007-11-15 05:41:53 +00:00
WHERE id = '$feed_id' " );
if ( db_num_rows ( $result ) == 1 ) {
$purge_interval = db_fetch_result ( $result , 0 , " purge_interval " );
$owner_uid = db_fetch_result ( $result , 0 , " owner_uid " );
2013-04-17 12:23:15 +00:00
if ( $purge_interval == 0 ) $purge_interval = get_pref (
2009-01-20 12:52:27 +00:00
'PURGE_OLD_DAYS' , $owner_uid );
2007-11-15 05:41:53 +00:00
return $purge_interval ;
} else {
return - 1 ;
}
}
2013-04-17 14:34:18 +00:00
function purge_orphans ( $do_output = false ) {
2010-10-03 08:19:09 +00:00
2005-11-19 10:32:59 +00:00
// purge orphaned posts in main content table
2013-04-17 14:34:18 +00:00
$result = db_query ( " DELETE FROM ttrss_entries WHERE
2005-11-19 10:32:59 +00:00
( SELECT COUNT ( int_id ) FROM ttrss_user_entries WHERE ref_id = id ) = 0 " );
2010-10-03 08:19:09 +00:00
if ( $do_output ) {
2013-04-17 14:34:18 +00:00
$rows = db_affected_rows ( $result );
2010-10-03 08:19:09 +00:00
_debug ( " Purged $rows orphaned posts. " );
}
2005-08-25 13:04:57 +00:00
}
2013-04-17 14:34:18 +00:00
function get_feed_update_interval ( $feed_id ) {
$result = db_query ( " SELECT owner_uid, update_interval FROM
2007-08-25 16:24:18 +00:00
ttrss_feeds WHERE id = '$feed_id' " );
if ( db_num_rows ( $result ) == 1 ) {
$update_interval = db_fetch_result ( $result , 0 , " update_interval " );
$owner_uid = db_fetch_result ( $result , 0 , " owner_uid " );
if ( $update_interval != 0 ) {
return $update_interval ;
} else {
2013-04-17 14:34:18 +00:00
return get_pref ( 'DEFAULT_UPDATE_INTERVAL' , $owner_uid , false );
2007-08-25 16:24:18 +00:00
}
} else {
return - 1 ;
}
}
2013-03-30 11:10:53 +00:00
function fetch_file_contents ( $url , $type = false , $login = false , $pass = false , $post_query = false , $timeout = false , $timestamp = 0 ) {
2011-03-17 16:05:28 +00:00
2012-08-21 10:09:51 +00:00
global $fetch_last_error ;
2013-03-30 11:10:53 +00:00
global $fetch_last_error_code ;
2013-04-09 22:59:48 +00:00
global $fetch_last_content_type ;
2013-04-18 07:35:58 +00:00
global $fetch_curl_used ;
2013-04-07 04:43:51 +00:00
2013-04-06 09:05:11 +00:00
$url = str_replace ( ' ' , '%20' , $url );
2012-08-21 10:09:51 +00:00
2013-04-18 07:35:58 +00:00
if ( ! defined ( 'NO_CURL' ) && function_exists ( 'curl_init' )) {
$fetch_curl_used = true ;
2013-03-20 05:15:59 +00:00
2013-04-16 16:40:14 +00:00
if ( ini_get ( " safe_mode " ) || ini_get ( " open_basedir " )) {
2013-05-29 18:50:27 +00:00
$new_url = geturl ( $url );
if ( ! $new_url ) {
// geturl has already populated $fetch_last_error
return false ;
}
$ch = curl_init ( $new_url );
2013-03-20 05:15:59 +00:00
} else {
$ch = curl_init ( $url );
}
2010-04-22 06:10:49 +00:00
2013-04-24 09:21:40 +00:00
if ( $timestamp && ! $post_query ) {
2013-03-30 11:10:53 +00:00
curl_setopt ( $ch , CURLOPT_HTTPHEADER ,
array ( " If-Modified-Since: " . gmdate ( 'D, d M Y H:i:s \G\M\T' , $timestamp )));
}
2013-04-01 12:08:21 +00:00
curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT , $timeout ? $timeout : FILE_FETCH_CONNECT_TIMEOUT );
curl_setopt ( $ch , CURLOPT_TIMEOUT , $timeout ? $timeout : FILE_FETCH_TIMEOUT );
2013-04-16 16:40:14 +00:00
curl_setopt ( $ch , CURLOPT_FOLLOWLOCATION , ! ini_get ( " safe_mode " ) && ! ini_get ( " open_basedir " ));
2010-04-22 06:10:49 +00:00
curl_setopt ( $ch , CURLOPT_MAXREDIRS , 20 );
curl_setopt ( $ch , CURLOPT_BINARYTRANSFER , true );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
2011-03-17 16:05:28 +00:00
curl_setopt ( $ch , CURLOPT_SSL_VERIFYPEER , false );
2011-03-18 16:27:48 +00:00
curl_setopt ( $ch , CURLOPT_HTTPAUTH , CURLAUTH_ANY );
2011-06-30 05:32:01 +00:00
curl_setopt ( $ch , CURLOPT_USERAGENT , SELF_USER_AGENT );
2013-04-18 07:35:58 +00:00
curl_setopt ( $ch , CURLOPT_ENCODING , " " );
2013-02-23 14:45:16 +00:00
curl_setopt ( $ch , CURLOPT_REFERER , $url );
2011-03-17 16:05:28 +00:00
2011-04-20 11:21:00 +00:00
if ( $post_query ) {
curl_setopt ( $ch , CURLOPT_POST , true );
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $post_query );
}
2013-07-20 19:30:40 +00:00
if (( OPENSSL_VERSION_NUMBER >= 0x0090808f ) && ( OPENSSL_VERSION_NUMBER < 0x10000000 )) {
2013-07-20 20:24:55 +00:00
curl_setopt ( $ch , CURLOPT_SSLVERSION , 3 );
2013-07-20 19:30:40 +00:00
}
2011-03-17 16:05:28 +00:00
if ( $login && $pass )
curl_setopt ( $ch , CURLOPT_USERPWD , " $login : $pass " );
2010-04-22 06:10:49 +00:00
2010-11-10 10:14:44 +00:00
$contents = @ curl_exec ( $ch );
2011-11-09 14:28:45 +00:00
2013-02-23 14:45:16 +00:00
if ( curl_errno ( $ch ) === 23 || curl_errno ( $ch ) === 61 ) {
curl_setopt ( $ch , CURLOPT_ENCODING , 'none' );
$contents = @ curl_exec ( $ch );
2013-02-23 14:37:40 +00:00
}
2010-04-22 06:10:49 +00:00
if ( $contents === false ) {
2013-02-23 14:37:40 +00:00
$fetch_last_error = curl_errno ( $ch ) . " " . curl_error ( $ch );
2010-04-22 06:10:49 +00:00
curl_close ( $ch );
return false ;
2006-08-28 03:49:08 +00:00
}
2011-03-17 16:05:28 +00:00
$http_code = curl_getinfo ( $ch , CURLINFO_HTTP_CODE );
2013-04-09 22:59:48 +00:00
$fetch_last_content_type = curl_getinfo ( $ch , CURLINFO_CONTENT_TYPE );
2006-08-28 03:49:08 +00:00
2013-03-30 11:10:53 +00:00
$fetch_last_error_code = $http_code ;
2013-04-09 22:59:48 +00:00
if ( $http_code != 200 || $type && strpos ( $fetch_last_content_type , " $type " ) === false ) {
2013-02-23 14:37:40 +00:00
if ( curl_errno ( $ch ) != 0 ) {
$fetch_last_error = curl_errno ( $ch ) . " " . curl_error ( $ch );
} else {
$fetch_last_error = " HTTP Code: $http_code " ;
}
curl_close ( $ch );
2010-04-22 06:10:49 +00:00
return false ;
}
2006-08-28 03:49:08 +00:00
2013-02-23 14:37:40 +00:00
curl_close ( $ch );
2010-04-22 06:10:49 +00:00
return $contents ;
2006-08-28 03:49:08 +00:00
} else {
2013-04-18 07:35:58 +00:00
$fetch_curl_used = false ;
2013-03-27 08:21:26 +00:00
if ( $login && $pass ){
2011-03-17 16:05:28 +00:00
$url_parts = array ();
preg_match ( " /(^[^:]*): \ / \ /(.*)/ " , $url , $url_parts );
2013-03-27 08:21:26 +00:00
$pass = urlencode ( $pass );
2011-03-17 16:05:28 +00:00
if ( $url_parts [ 1 ] && $url_parts [ 2 ]) {
$url = $url_parts [ 1 ] . " :// $login : $pass @ " . $url_parts [ 2 ];
}
}
2013-04-19 14:08:24 +00:00
if ( ! $post_query && $timestamp ) {
$context = stream_context_create ( array (
'http' => array (
'method' => 'GET' ,
'header' => " If-Modified-Since: " . gmdate ( " D, d M Y H:i:s \\ G \\ M \\ T \r \n " , $timestamp )
)));
} else {
$context = NULL ;
}
2013-04-19 14:13:21 +00:00
$old_error = error_get_last ();
2013-04-19 14:08:24 +00:00
$data = @ file_get_contents ( $url , false , $context );
2012-08-21 10:09:51 +00:00
2013-04-09 22:59:48 +00:00
$fetch_last_content_type = false ; // reset if no type was sent from server
2013-04-24 06:45:44 +00:00
if ( isset ( $http_response_header ) && is_array ( $http_response_header )) {
2013-04-19 05:48:09 +00:00
foreach ( $http_response_header as $h ) {
if ( substr ( strtolower ( $h ), 0 , 13 ) == 'content-type:' ) {
$fetch_last_content_type = substr ( $h , 14 );
// don't abort here b/c there might be more than one
// e.g. if we were being redirected -- last one is the right one
}
2013-04-19 14:08:24 +00:00
if ( substr ( strtolower ( $h ), 0 , 7 ) == 'http/1.' ) {
$fetch_last_error_code = ( int ) substr ( $h , 9 , 3 );
}
2013-04-09 22:59:48 +00:00
}
}
2013-04-19 14:13:21 +00:00
if ( ! $data ) {
2012-08-21 10:09:51 +00:00
$error = error_get_last ();
2013-04-19 14:13:21 +00:00
if ( $error [ 'message' ] != $old_error [ 'message' ]) {
$fetch_last_error = $error [ " message " ];
} else {
$fetch_last_error = " HTTP Code: $fetch_last_error_code " ;
}
2012-08-21 10:09:51 +00:00
}
return $data ;
2006-08-28 03:49:08 +00:00
}
}
2005-08-25 06:46:24 +00:00
2008-01-26 12:19:44 +00:00
/**
* Try to determine the favicon URL for a feed .
* adapted from wordpress favicon plugin by Jeff Minard ( http :// thecodepro . com / )
* http :// dev . wp - plugins . org / file / favatars / trunk / favatars . php
2011-03-17 16:05:28 +00:00
*
2008-01-26 12:19:44 +00:00
* @ param string $url A feed or page URL
* @ access public
* @ return mixed The favicon URL , or false if none was found .
*/
2012-05-17 18:58:08 +00:00
function get_favicon_url ( $url ) {
2006-08-20 10:28:08 +00:00
2012-05-17 18:58:08 +00:00
$favicon_url = false ;
2010-11-11 13:10:39 +00:00
2006-08-28 03:49:08 +00:00
if ( $html = @ fetch_file_contents ( $url )) {
2005-08-25 06:46:24 +00:00
2010-11-11 13:10:39 +00:00
libxml_use_internal_errors ( true );
2006-08-20 10:27:25 +00:00
2010-11-11 13:10:39 +00:00
$doc = new DOMDocument ();
$doc -> loadHTML ( $html );
$xpath = new DOMXPath ( $doc );
2005-11-18 12:02:38 +00:00
2011-03-24 10:41:25 +00:00
$base = $xpath -> query ( '/html/head/base' );
foreach ( $base as $b ) {
$url = $b -> getAttribute ( " href " );
break ;
}
2012-05-17 18:58:08 +00:00
$entries = $xpath -> query ( '/html/head/link[@rel="shortcut icon" or @rel="icon"]' );
2010-11-11 13:10:39 +00:00
if ( count ( $entries ) > 0 ) {
foreach ( $entries as $entry ) {
2012-05-17 18:58:08 +00:00
$favicon_url = rewrite_relative_url ( $url , $entry -> getAttribute ( " href " ));
break ;
2010-11-11 13:10:39 +00:00
}
2011-03-17 16:05:28 +00:00
}
2006-08-28 03:49:08 +00:00
}
2006-08-20 10:27:25 +00:00
2012-05-17 18:58:08 +00:00
if ( ! $favicon_url )
$favicon_url = rewrite_relative_url ( $url , " /favicon.ico " );
return $favicon_url ;
} // function get_favicon_url
2013-04-17 12:23:15 +00:00
function check_feed_favicon ( $site_url , $feed ) {
2012-05-15 08:06:52 +00:00
# print "FAVICON [$site_url]: $favicon_url\n";
2006-08-28 03:49:08 +00:00
2012-05-17 18:58:08 +00:00
$icon_file = ICONS_DIR . " / $feed .ico " ;
if ( ! file_exists ( $icon_file )) {
$favicon_url = get_favicon_url ( $site_url );
if ( $favicon_url ) {
// Limiting to "image" type misses those served with text/plain
$contents = fetch_file_contents ( $favicon_url ); // , "image");
if ( $contents ) {
// Crude image type matching.
// Patterns gleaned from the file(1) source code.
if ( preg_match ( '/^\x00\x00\x01\x00/' , $contents )) {
// 0 string \000\000\001\000 MS Windows icon resource
//error_log("check_feed_favicon: favicon_url=$favicon_url isa MS Windows icon resource");
}
elseif ( preg_match ( '/^GIF8/' , $contents )) {
// 0 string GIF8 GIF image data
//error_log("check_feed_favicon: favicon_url=$favicon_url isa GIF image");
}
elseif ( preg_match ( '/^\x89PNG\x0d\x0a\x1a\x0a/' , $contents )) {
// 0 string \x89PNG\x0d\x0a\x1a\x0a PNG image data
//error_log("check_feed_favicon: favicon_url=$favicon_url isa PNG image");
}
elseif ( preg_match ( '/^\xff\xd8/' , $contents )) {
// 0 beshort 0xffd8 JPEG image data
//error_log("check_feed_favicon: favicon_url=$favicon_url isa JPG image");
}
else {
//error_log("check_feed_favicon: favicon_url=$favicon_url isa UNKNOWN type");
$contents = " " ;
}
}
if ( $contents ) {
$fp = @ fopen ( $icon_file , " w " );
if ( $fp ) {
fwrite ( $fp , $contents );
fclose ( $fp );
chmod ( $icon_file , 0644 );
}
}
}
2013-04-15 10:28:52 +00:00
return $icon_file ;
2005-08-25 06:46:24 +00:00
}
}
2013-04-15 10:54:17 +00:00
2005-09-05 06:04:02 +00:00
function print_select ( $id , $default , $values , $attributes = " " ) {
2006-05-20 11:39:22 +00:00
print " <select name= \" $id\ " id = \ " $id\ " $attributes > " ;
2005-09-03 07:22:29 +00:00
foreach ( $values as $v ) {
if ( $v == $default )
2010-11-20 19:11:34 +00:00
$sel = " selected= \" 1 \" " ;
2005-09-03 07:22:29 +00:00
else
$sel = " " ;
2011-03-17 16:05:28 +00:00
2013-03-19 05:02:40 +00:00
$v = trim ( $v );
2010-11-20 19:11:34 +00:00
print " <option value= \" $v\ " $sel > $v </ option > " ;
2005-09-03 07:22:29 +00:00
}
print " </select> " ;
}
2005-08-21 15:35:22 +00:00
2006-05-20 11:39:22 +00:00
function print_select_hash ( $id , $default , $values , $attributes = " " ) {
print " <select name= \" $id\ " id = '$id' $attributes > " ;
2006-05-20 09:41:47 +00:00
foreach ( array_keys ( $values ) as $v ) {
if ( $v == $default )
2008-09-21 13:39:02 +00:00
$sel = 'selected="selected"' ;
2006-05-20 09:41:47 +00:00
else
$sel = " " ;
2011-03-17 16:05:28 +00:00
2013-03-19 05:02:40 +00:00
$v = trim ( $v );
2006-05-20 09:41:47 +00:00
print " <option $sel value= \" $v\ " > " . $values[$v] . " </ option > " ;
}
print " </select> " ;
}
2007-08-15 02:49:55 +00:00
function print_radio ( $id , $default , $true_is , $values , $attributes = " " ) {
2005-11-17 05:26:54 +00:00
foreach ( $values as $v ) {
2011-03-17 16:05:28 +00:00
2005-11-17 05:26:54 +00:00
if ( $v == $default )
2005-11-17 05:34:52 +00:00
$sel = " checked " ;
2005-11-17 05:26:54 +00:00
else
2005-11-17 05:34:52 +00:00
$sel = " " ;
2007-08-15 02:49:55 +00:00
if ( $v == $true_is ) {
2005-11-17 05:34:52 +00:00
$sel .= " value= \" 1 \" " ;
} else {
$sel .= " value= \" 0 \" " ;
}
2011-03-17 16:05:28 +00:00
print " <input class= \" noborder \" dojoType= \" dijit.form.RadioButton \"
2006-02-25 04:47:55 +00:00
type = \ " radio \" $sel $attributes name= \" $id\ " >& nbsp ; $v & nbsp ; " ;
2005-11-17 05:26:54 +00:00
}
}
2013-04-17 14:34:18 +00:00
function initialize_user_prefs ( $uid , $profile = false ) {
2005-11-18 05:17:17 +00:00
2013-04-17 14:34:18 +00:00
$uid = db_escape_string ( $uid );
2005-11-18 05:17:17 +00:00
2010-01-13 15:31:51 +00:00
if ( ! $profile ) {
$profile = " NULL " ;
2010-01-13 18:30:17 +00:00
$profile_qpart = " AND profile IS NULL " ;
2010-01-13 15:31:51 +00:00
} else {
2010-01-13 18:30:17 +00:00
$profile_qpart = " AND profile = ' $profile ' " ;
2010-01-13 15:31:51 +00:00
}
2013-04-17 12:23:15 +00:00
if ( get_schema_version () < 63 ) $profile_qpart = " " ;
2010-01-13 18:30:17 +00:00
2013-04-17 14:34:18 +00:00
db_query ( " BEGIN " );
2005-11-18 05:17:17 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT pref_name,def_value FROM ttrss_prefs " );
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
$u_result = db_query ( " SELECT pref_name
2010-01-13 18:30:17 +00:00
FROM ttrss_user_prefs WHERE owner_uid = '$uid' $profile_qpart " );
2005-11-18 05:17:17 +00:00
$active_prefs = array ();
while ( $line = db_fetch_assoc ( $u_result )) {
2011-03-17 16:05:28 +00:00
array_push ( $active_prefs , $line [ " pref_name " ]);
2005-11-18 05:17:17 +00:00
}
while ( $line = db_fetch_assoc ( $result )) {
if ( array_search ( $line [ " pref_name " ], $active_prefs ) === FALSE ) {
// print "adding " . $line["pref_name"] . "<br>";
2013-04-17 14:34:18 +00:00
$line [ " def_value " ] = db_escape_string ( $line [ " def_value " ]);
$line [ " pref_name " ] = db_escape_string ( $line [ " pref_name " ]);
2013-03-29 04:51:05 +00:00
2013-04-17 12:23:15 +00:00
if ( get_schema_version () < 63 ) {
2013-04-17 14:34:18 +00:00
db_query ( " INSERT INTO ttrss_user_prefs
2011-03-17 16:05:28 +00:00
( owner_uid , pref_name , value ) VALUES
2010-01-13 18:30:17 +00:00
( '$uid' , '".$line["pref_name"]."' , '".$line["def_value"]."' ) " );
} else {
2013-04-17 14:34:18 +00:00
db_query ( " INSERT INTO ttrss_user_prefs
2011-03-17 16:05:28 +00:00
( owner_uid , pref_name , value , profile ) VALUES
2010-01-13 18:30:17 +00:00
( '$uid' , '".$line["pref_name"]."' , '".$line["def_value"]."' , $profile ) " );
}
2005-11-18 05:17:17 +00:00
}
}
2013-04-17 14:34:18 +00:00
db_query ( " COMMIT " );
2005-11-18 05:17:17 +00:00
}
2006-05-16 07:33:51 +00:00
2011-03-28 05:45:23 +00:00
function get_ssl_certificate_id () {
if ( $_SERVER [ " REDIRECT_SSL_CLIENT_M_SERIAL " ]) {
return sha1 ( $_SERVER [ " REDIRECT_SSL_CLIENT_M_SERIAL " ] .
$_SERVER [ " REDIRECT_SSL_CLIENT_V_START " ] .
$_SERVER [ " REDIRECT_SSL_CLIENT_V_END " ] .
$_SERVER [ " REDIRECT_SSL_CLIENT_S_DN " ]);
}
return " " ;
}
2013-04-17 14:34:18 +00:00
function authenticate_user ( $login , $password , $check_only = false ) {
2005-11-18 06:21:24 +00:00
2006-05-23 05:45:13 +00:00
if ( ! SINGLE_USER_MODE ) {
2012-08-16 11:30:35 +00:00
$user_id = false ;
2012-12-27 11:14:44 +00:00
2013-04-18 08:27:34 +00:00
foreach ( PluginHost :: getInstance () -> get_hooks ( PluginHost :: HOOK_AUTH_USER ) as $plugin ) {
2012-12-27 11:14:44 +00:00
$user_id = ( int ) $plugin -> authenticate ( $login , $password );
if ( $user_id ) {
$_SESSION [ " auth_module " ] = strtolower ( get_class ( $plugin ));
break ;
}
2006-10-01 04:05:12 +00:00
}
2012-08-16 11:30:35 +00:00
if ( $user_id && ! $check_only ) {
2013-03-30 06:48:19 +00:00
@ session_start ();
2012-08-16 11:30:35 +00:00
$_SESSION [ " uid " ] = $user_id ;
2013-04-24 12:57:24 +00:00
$_SESSION [ " version " ] = VERSION_STATIC ;
2012-08-16 11:30:35 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT login,access_level,pwd_hash FROM ttrss_users
2012-08-16 11:30:35 +00:00
WHERE id = '$user_id' " );
2011-03-17 16:05:28 +00:00
2006-05-23 05:45:13 +00:00
$_SESSION [ " name " ] = db_fetch_result ( $result , 0 , " login " );
$_SESSION [ " access_level " ] = db_fetch_result ( $result , 0 , " access_level " );
2011-12-26 08:02:52 +00:00
$_SESSION [ " csrf_token " ] = sha1 ( uniqid ( rand (), true ));
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_users SET last_login = NOW() WHERE id = " .
2006-05-23 05:45:13 +00:00
$_SESSION [ " uid " ]);
2011-03-17 16:05:28 +00:00
2006-05-23 05:45:13 +00:00
$_SESSION [ " ip_address " ] = $_SERVER [ " REMOTE_ADDR " ];
2013-04-01 14:22:07 +00:00
$_SESSION [ " user_agent " ] = sha1 ( $_SERVER [ 'HTTP_USER_AGENT' ]);
2007-09-12 03:56:22 +00:00
$_SESSION [ " pwd_hash " ] = db_fetch_result ( $result , 0 , " pwd_hash " );
2010-09-13 12:00:05 +00:00
$_SESSION [ " last_version_check " ] = time ();
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
initialize_user_prefs ( $_SESSION [ " uid " ]);
2011-03-17 16:05:28 +00:00
2006-05-23 05:45:13 +00:00
return true ;
}
2011-03-17 16:05:28 +00:00
2006-05-23 05:45:13 +00:00
return false ;
2005-11-26 06:48:37 +00:00
2006-05-23 05:45:13 +00:00
} else {
2005-11-26 06:48:37 +00:00
2006-05-23 05:45:13 +00:00
$_SESSION [ " uid " ] = 1 ;
$_SESSION [ " name " ] = " admin " ;
2012-03-20 05:23:54 +00:00
$_SESSION [ " access_level " ] = 10 ;
2012-04-04 04:37:34 +00:00
2012-08-16 11:30:35 +00:00
$_SESSION [ " hide_hello " ] = true ;
$_SESSION [ " hide_logout " ] = true ;
2012-08-16 14:21:35 +00:00
$_SESSION [ " auth_module " ] = false ;
2012-04-04 04:37:34 +00:00
if ( ! $_SESSION [ " csrf_token " ]) {
$_SESSION [ " csrf_token " ] = sha1 ( uniqid ( rand (), true ));
}
2005-11-23 13:52:02 +00:00
2006-06-16 12:23:26 +00:00
$_SESSION [ " ip_address " ] = $_SERVER [ " REMOTE_ADDR " ];
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
initialize_user_prefs ( $_SESSION [ " uid " ]);
2011-03-17 16:05:28 +00:00
2005-11-18 06:21:24 +00:00
return true ;
}
}
2005-11-18 09:00:18 +00:00
function make_password ( $length = 8 ) {
2012-01-25 06:47:32 +00:00
$password = " " ;
$possible = " 0123456789abcdfghjkmnpqrstvwxyzABCDFGHJKMNPQRSTVWXYZ " ;
$i = 0 ;
while ( $i < $length ) {
$char = substr ( $possible , mt_rand ( 0 , strlen ( $possible ) - 1 ), 1 );
if ( ! strstr ( $password , $char )) {
$password .= $char ;
$i ++ ;
}
}
return $password ;
2005-11-18 09:00:18 +00:00
}
// this is called after user is created to initialize default feeds, labels
// or whatever else
2011-03-17 16:05:28 +00:00
2005-11-18 09:00:18 +00:00
// user preferences are checked on every login, not here
2013-04-17 14:34:18 +00:00
function initialize_user ( $uid ) {
2005-11-18 09:00:18 +00:00
2013-04-17 14:34:18 +00:00
db_query ( " insert into ttrss_feeds (owner_uid,title,feed_url)
2005-11-23 17:10:58 +00:00
values ( '$uid' , 'Tiny Tiny RSS: New Releases' ,
2009-01-17 06:57:33 +00:00
'http://tt-rss.org/releases.rss' ) " );
2005-11-23 14:25:42 +00:00
2013-04-17 14:34:18 +00:00
db_query ( " insert into ttrss_feeds (owner_uid,title,feed_url)
2007-03-02 14:41:57 +00:00
values ( '$uid' , 'Tiny Tiny RSS: Forum' ,
2010-11-05 15:48:55 +00:00
'http://tt-rss.org/forum/rss.php' ) " );
2005-11-23 14:25:42 +00:00
}
2005-11-18 09:00:18 +00:00
2005-11-20 11:19:20 +00:00
function logout_user () {
2006-03-04 10:58:25 +00:00
session_destroy ();
if ( isset ( $_COOKIE [ session_name ()])) {
setcookie ( session_name (), '' , time () - 42000 , '/' );
}
2005-11-20 11:19:20 +00:00
}
2011-12-26 08:02:52 +00:00
function validate_csrf ( $csrf_token ) {
return $csrf_token == $_SESSION [ 'csrf_token' ];
}
2013-04-17 14:34:18 +00:00
function load_user_plugins ( $owner_uid ) {
2012-12-24 20:45:10 +00:00
if ( $owner_uid ) {
2013-04-17 14:34:18 +00:00
$plugins = get_pref ( " _ENABLED_PLUGINS " , $owner_uid );
2012-12-24 20:45:10 +00:00
2013-04-18 08:27:34 +00:00
PluginHost :: getInstance () -> load ( $plugins , PluginHost :: KIND_USER , $owner_uid );
2012-12-27 16:28:06 +00:00
2013-04-17 12:23:15 +00:00
if ( get_schema_version () > 100 ) {
2013-04-18 08:27:34 +00:00
PluginHost :: getInstance () -> load_data ();
2012-12-27 16:28:06 +00:00
}
2012-12-24 20:45:10 +00:00
}
}
2013-04-17 12:23:15 +00:00
function login_sequence () {
2012-09-10 15:01:06 +00:00
if ( SINGLE_USER_MODE ) {
2013-03-28 05:13:30 +00:00
@ session_start ();
2013-04-17 14:34:18 +00:00
authenticate_user ( " admin " , null );
load_user_plugins ( $_SESSION [ " uid " ]);
2012-09-10 15:01:06 +00:00
} else {
2013-04-17 12:23:15 +00:00
if ( ! validate_session ()) $_SESSION [ " uid " ] = false ;
2013-04-03 15:23:43 +00:00
if ( ! $_SESSION [ " uid " ]) {
2012-09-10 15:01:06 +00:00
2013-04-17 14:34:18 +00:00
if ( AUTH_AUTO_LOGIN && authenticate_user ( null , null )) {
$_SESSION [ " ref_schema_version " ] = get_schema_version ( true );
2012-09-10 15:01:06 +00:00
} else {
2013-04-17 14:34:18 +00:00
authenticate_user ( null , null , true );
2012-09-10 15:01:06 +00:00
}
2013-04-03 15:23:43 +00:00
if ( ! $_SESSION [ " uid " ]) {
@ session_destroy ();
setcookie ( session_name (), '' , time () - 42000 , '/' );
2013-04-04 11:33:14 +00:00
2013-04-17 12:23:15 +00:00
render_login_form ();
2013-04-03 15:23:43 +00:00
exit ;
}
2013-04-03 15:16:59 +00:00
2012-09-10 15:01:06 +00:00
} else {
/* bump login timestamp */
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_users SET last_login = NOW() WHERE id = " .
2012-09-10 15:01:06 +00:00
$_SESSION [ " uid " ]);
2013-03-22 08:37:42 +00:00
$_SESSION [ " last_login_update " ] = time ();
2007-03-01 09:43:54 +00:00
}
2012-12-24 20:45:10 +00:00
if ( $_SESSION [ " uid " ]) {
2013-04-29 11:54:23 +00:00
startup_gettext ();
2013-04-17 14:34:18 +00:00
load_user_plugins ( $_SESSION [ " uid " ]);
2013-03-22 06:24:30 +00:00
/* cleanup ccache */
2013-04-17 14:34:18 +00:00
db_query ( " DELETE FROM ttrss_counters_cache WHERE owner_uid = " .
2013-03-22 06:24:30 +00:00
$_SESSION [ " uid " ] . " AND
( SELECT COUNT ( id ) FROM ttrss_feeds WHERE
ttrss_feeds . id = feed_id ) = 0 " );
2013-04-17 14:34:18 +00:00
db_query ( " DELETE FROM ttrss_cat_counters_cache WHERE owner_uid = " .
2013-03-22 06:24:30 +00:00
$_SESSION [ " uid " ] . " AND
( SELECT COUNT ( id ) FROM ttrss_feed_categories WHERE
ttrss_feed_categories . id = feed_id ) = 0 " );
2012-12-24 20:45:10 +00:00
}
2013-03-22 06:24:30 +00:00
2005-11-20 11:19:20 +00:00
}
2012-11-22 11:33:29 +00:00
}
2005-11-24 07:25:09 +00:00
2010-11-25 09:05:48 +00:00
function truncate_string ( $str , $max_len , $suffix = '…' ) {
2005-12-31 05:38:40 +00:00
if ( mb_strlen ( $str , " utf-8 " ) > $max_len - 3 ) {
2010-11-25 09:05:48 +00:00
return mb_substr ( $str , 0 , $max_len , " utf-8 " ) . $suffix ;
2005-11-24 07:25:09 +00:00
} else {
return $str ;
}
}
2005-11-26 06:40:47 +00:00
2011-03-05 07:02:49 +00:00
function convert_timestamp ( $timestamp , $source_tz , $dest_tz ) {
try {
$source_tz = new DateTimeZone ( $source_tz );
} catch ( Exception $e ) {
$source_tz = new DateTimeZone ( 'UTC' );
}
try {
$dest_tz = new DateTimeZone ( $dest_tz );
} catch ( Exception $e ) {
$dest_tz = new DateTimeZone ( 'UTC' );
}
$dt = new DateTime ( date ( 'Y-m-d H:i:s' , $timestamp ), $source_tz );
return $dt -> format ( 'U' ) + $dest_tz -> getOffset ( $dt );
}
2013-04-17 14:34:18 +00:00
function make_local_datetime ( $timestamp , $long , $owner_uid = false ,
2010-11-07 15:14:48 +00:00
$no_smart_dt = false ) {
if ( ! $owner_uid ) $owner_uid = $_SESSION [ 'uid' ];
if ( ! $timestamp ) $timestamp = '1970-01-01 0:00' ;
2011-08-04 15:38:25 +00:00
global $utc_tz ;
2013-04-26 04:50:22 +00:00
global $user_tz ;
if ( ! $utc_tz ) $utc_tz = new DateTimeZone ( 'UTC' );
2010-11-07 15:14:48 +00:00
2013-04-25 14:42:48 +00:00
$timestamp = substr ( $timestamp , 0 , 19 );
2011-08-04 15:38:25 +00:00
# We store date in UTC internally
$dt = new DateTime ( $timestamp , $utc_tz );
2013-04-26 04:50:22 +00:00
$user_tz_string = get_pref ( 'USER_TIMEZONE' , $owner_uid );
2011-08-04 15:38:25 +00:00
2013-04-26 06:31:57 +00:00
if ( $user_tz_string != 'Automatic' ) {
2010-11-07 15:14:48 +00:00
2013-04-26 06:31:57 +00:00
try {
if ( ! $user_tz ) $user_tz = new DateTimeZone ( $user_tz_string );
} catch ( Exception $e ) {
$user_tz = $utc_tz ;
}
$tz_offset = $user_tz -> getOffset ( $dt );
} else {
2013-04-26 06:48:00 +00:00
$tz_offset = ( int ) - $_SESSION [ " clientTzOffset " ];
2013-04-26 06:31:57 +00:00
}
2013-04-26 04:50:22 +00:00
2011-08-04 15:38:25 +00:00
$user_timestamp = $dt -> format ( 'U' ) + $tz_offset ;
2010-11-07 15:14:48 +00:00
2011-03-28 08:17:40 +00:00
if ( ! $no_smart_dt ) {
2013-04-17 14:34:18 +00:00
return smart_date_time ( $user_timestamp ,
2011-08-04 15:38:25 +00:00
$tz_offset , $owner_uid );
2010-11-07 15:14:48 +00:00
} else {
if ( $long )
2013-04-17 14:34:18 +00:00
$format = get_pref ( 'LONG_DATE_FORMAT' , $owner_uid );
2010-11-07 15:14:48 +00:00
else
2013-04-17 14:34:18 +00:00
$format = get_pref ( 'SHORT_DATE_FORMAT' , $owner_uid );
2010-11-07 15:14:48 +00:00
return date ( $format , $user_timestamp );
}
}
2013-04-17 14:34:18 +00:00
function smart_date_time ( $timestamp , $tz_offset = 0 , $owner_uid = false ) {
2010-11-07 21:31:43 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ 'uid' ];
if ( date ( " Y.m.d " , $timestamp ) == date ( " Y.m.d " , time () + $tz_offset )) {
2005-11-28 07:43:03 +00:00
return date ( " G:i " , $timestamp );
2010-11-07 21:31:43 +00:00
} else if ( date ( " Y " , $timestamp ) == date ( " Y " , time () + $tz_offset )) {
2013-04-17 14:34:18 +00:00
$format = get_pref ( 'SHORT_DATE_FORMAT' , $owner_uid );
2010-11-07 21:31:43 +00:00
return date ( $format , $timestamp );
2005-11-28 07:43:03 +00:00
} else {
2013-04-17 14:34:18 +00:00
$format = get_pref ( 'LONG_DATE_FORMAT' , $owner_uid );
2010-11-07 21:31:43 +00:00
return date ( $format , $timestamp );
2005-11-28 07:43:03 +00:00
}
}
2005-12-30 04:11:48 +00:00
function sql_bool_to_bool ( $s ) {
2013-03-17 17:04:16 +00:00
if ( $s == " t " || $s == " 1 " || strtolower ( $s ) == " true " ) {
2005-12-30 04:11:48 +00:00
return true ;
} else {
return false ;
}
}
2011-03-17 16:05:28 +00:00
2009-02-07 10:40:43 +00:00
function bool_to_sql_bool ( $s ) {
if ( $s ) {
return " true " ;
} else {
return " false " ;
}
}
2005-12-30 04:11:48 +00:00
2011-04-19 09:20:59 +00:00
// Session caching removed due to causing wrong redirects to upgrade
// script when get_schema_version() is called on an obsolete session
// created on a previous schema version.
2013-04-17 14:34:18 +00:00
function get_schema_version ( $nocache = false ) {
2011-08-04 15:38:25 +00:00
global $schema_version ;
2013-04-24 10:54:59 +00:00
if ( ! $schema_version && ! $nocache ) {
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT schema_version FROM ttrss_version " );
2010-01-13 19:03:42 +00:00
$version = db_fetch_result ( $result , 0 , " schema_version " );
2011-08-04 15:38:25 +00:00
$schema_version = $version ;
2010-01-13 19:03:42 +00:00
return $version ;
2011-08-04 15:38:25 +00:00
} else {
return $schema_version ;
}
2010-01-13 18:25:44 +00:00
}
2013-04-17 12:23:15 +00:00
function sanity_check () {
2011-12-11 19:10:51 +00:00
require_once 'errors.php' ;
2011-03-18 14:39:23 +00:00
2005-12-22 12:51:12 +00:00
$error_code = 0 ;
2013-04-17 14:34:18 +00:00
$schema_version = get_schema_version ( true );
2005-12-22 12:51:12 +00:00
if ( $schema_version != SCHEMA_VERSION ) {
$error_code = 5 ;
}
2006-08-13 04:46:40 +00:00
if ( DB_TYPE == " mysql " ) {
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT true " , false );
2006-08-13 04:46:40 +00:00
if ( db_num_rows ( $result ) != 1 ) {
$error_code = 10 ;
}
}
2013-04-17 14:34:18 +00:00
if ( db_escape_string ( " testTEST " ) != " testTEST " ) {
2008-11-10 05:29:19 +00:00
$error_code = 12 ;
}
2011-03-18 14:39:23 +00:00
return array ( " code " => $error_code , " message " => $ERRORS [ $error_code ]);
2005-12-22 12:51:12 +00:00
}
2006-02-13 13:08:23 +00:00
function file_is_locked ( $filename ) {
2013-05-29 03:46:14 +00:00
if ( file_exists ( LOCK_DIRECTORY . " / $filename " )) {
if ( function_exists ( 'flock' )) {
$fp = @ fopen ( LOCK_DIRECTORY . " / $filename " , " r " );
if ( $fp ) {
if ( flock ( $fp , LOCK_EX | LOCK_NB )) {
flock ( $fp , LOCK_UN );
fclose ( $fp );
return false ;
}
2007-09-25 03:23:29 +00:00
fclose ( $fp );
2013-05-29 03:46:14 +00:00
return true ;
} else {
2007-09-25 03:23:29 +00:00
return false ;
}
2006-02-13 13:08:23 +00:00
}
2013-05-29 03:46:14 +00:00
return true ; // consider the file always locked and skip the test
} else {
return false ;
2006-02-13 13:08:23 +00:00
}
}
2013-05-29 03:46:14 +00:00
2006-02-12 07:21:52 +00:00
function make_lockfile ( $filename ) {
2008-01-17 05:33:52 +00:00
$fp = fopen ( LOCK_DIRECTORY . " / $filename " , " w " );
2006-02-12 07:21:52 +00:00
2013-02-25 17:28:51 +00:00
if ( $fp && flock ( $fp , LOCK_EX | LOCK_NB )) {
2013-06-07 05:39:12 +00:00
$stat_h = fstat ( $fp );
$stat_f = stat ( LOCK_DIRECTORY . " / $filename " );
2013-06-11 08:55:47 +00:00
if ( strtoupper ( substr ( PHP_OS , 0 , 3 )) !== 'WIN' ) {
if ( $stat_h [ " ino " ] != $stat_f [ " ino " ] ||
$stat_h [ " dev " ] != $stat_f [ " dev " ]) {
return false ;
}
2013-06-07 05:39:12 +00:00
}
2010-02-09 14:05:02 +00:00
if ( function_exists ( 'posix_getpid' )) {
fwrite ( $fp , posix_getpid () . " \n " );
}
2006-02-12 07:21:52 +00:00
return $fp ;
} else {
return false ;
}
}
2007-07-16 12:22:13 +00:00
function make_stampfile ( $filename ) {
2008-01-17 05:33:52 +00:00
$fp = fopen ( LOCK_DIRECTORY . " / $filename " , " w " );
2007-07-16 12:22:13 +00:00
2007-07-16 13:05:29 +00:00
if ( flock ( $fp , LOCK_EX | LOCK_NB )) {
2007-07-16 12:22:13 +00:00
fwrite ( $fp , time () . " \n " );
2007-07-16 13:05:29 +00:00
flock ( $fp , LOCK_UN );
2007-07-16 12:22:13 +00:00
fclose ( $fp );
return true ;
} else {
return false ;
}
}
2006-03-21 07:09:18 +00:00
function sql_random_function () {
2013-03-15 15:54:18 +00:00
if ( DB_TYPE == " mysql " ) {
2006-03-21 07:09:18 +00:00
return " RAND() " ;
} else {
return " RANDOM() " ;
}
}
2013-04-17 14:34:18 +00:00
function catchup_feed ( $feed , $cat_view , $owner_uid = false , $max_id = false , $mode = 'all' ) {
2009-03-21 20:11:58 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ 'uid' ];
2006-08-01 07:54:46 +00:00
2011-08-31 11:25:42 +00:00
//if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) {
2009-12-29 20:35:31 +00:00
2013-03-31 08:37:42 +00:00
// Todo: all this interval stuff needs some generic generator function
$date_qpart = " false " ;
switch ( $mode ) {
case " 1day " :
if ( DB_TYPE == " pgsql " ) {
2013-03-31 08:41:28 +00:00
$date_qpart = " date_entered < NOW() - INTERVAL '1 day' " ;
2013-03-31 08:37:42 +00:00
} else {
2013-03-31 08:45:19 +00:00
$date_qpart = " date_entered < DATE_SUB(NOW(), INTERVAL 1 DAY) " ;
2013-03-31 08:37:42 +00:00
}
break ;
case " 1week " :
if ( DB_TYPE == " pgsql " ) {
2013-03-31 08:41:28 +00:00
$date_qpart = " date_entered < NOW() - INTERVAL '1 week' " ;
2013-03-31 08:37:42 +00:00
} else {
2013-03-31 08:41:28 +00:00
$date_qpart = " date_entered < DATE_SUB(NOW(), INTERVAL 1 WEEK) " ;
2013-03-31 08:37:42 +00:00
}
break ;
2013-07-22 11:21:30 +00:00
case " 2week " :
2013-03-31 08:37:42 +00:00
if ( DB_TYPE == " pgsql " ) {
2013-03-31 08:41:28 +00:00
$date_qpart = " date_entered < NOW() - INTERVAL '2 week' " ;
2013-03-31 08:37:42 +00:00
} else {
2013-03-31 08:41:28 +00:00
$date_qpart = " date_entered < DATE_SUB(NOW(), INTERVAL 2 WEEK) " ;
2013-03-31 08:37:42 +00:00
}
break ;
default :
$date_qpart = " true " ;
}
2011-08-31 11:25:42 +00:00
if ( is_numeric ( $feed )) {
2006-03-27 03:21:08 +00:00
if ( $cat_view ) {
2009-01-28 10:09:05 +00:00
if ( $feed >= 0 ) {
2009-01-28 10:08:01 +00:00
if ( $feed > 0 ) {
2013-04-17 14:34:18 +00:00
$children = getChildCategories ( $feed , $owner_uid );
2012-10-17 16:00:36 +00:00
array_push ( $children , $feed );
$children = join ( " , " , $children );
$cat_qpart = " cat_id IN ( $children ) " ;
2009-01-28 10:08:01 +00:00
} else {
$cat_qpart = " cat_id IS NULL " ;
}
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2013-03-31 08:37:42 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
AND owner_uid = $owner_uid AND unread = true AND feed_id IN
( SELECT id FROM ttrss_feeds WHERE $cat_qpart ) AND $date_qpart ) as tmp ) " );
2006-03-27 03:21:08 +00:00
2009-01-28 10:08:01 +00:00
} else if ( $feed == - 2 ) {
2006-03-27 03:21:08 +00:00
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2011-03-17 16:05:28 +00:00
SET unread = false , last_read = NOW () WHERE ( SELECT COUNT ( * )
FROM ttrss_user_labels2 WHERE article_id = ref_id ) > 0
2013-03-31 08:37:42 +00:00
AND unread = true AND $date_qpart AND owner_uid = $owner_uid " );
2006-03-27 03:21:08 +00:00
}
} else if ( $feed > 0 ) {
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2013-03-31 08:37:42 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
AND owner_uid = $owner_uid AND unread = true AND feed_id = $feed AND $date_qpart ) as tmp ) " );
2011-03-17 16:05:28 +00:00
2013-03-27 05:40:07 +00:00
} else if ( $feed < 0 && $feed > LABEL_BASE_INDEX ) { // special, like starred
2006-03-27 03:21:08 +00:00
if ( $feed == - 1 ) {
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2013-03-31 08:37:42 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
AND owner_uid = $owner_uid AND unread = true AND marked = true AND $date_qpart ) as tmp ) " );
2006-03-27 03:21:08 +00:00
}
2007-08-09 12:45:30 +00:00
if ( $feed == - 2 ) {
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2013-03-31 08:37:42 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
AND owner_uid = $owner_uid AND unread = true AND published = true AND $date_qpart ) as tmp ) " );
2007-08-09 12:45:30 +00:00
}
2007-08-23 07:23:27 +00:00
if ( $feed == - 3 ) {
2013-04-17 14:34:18 +00:00
$intl = get_pref ( " FRESH_ARTICLE_MAX_AGE " );
2007-08-23 08:05:40 +00:00
2007-08-23 07:23:27 +00:00
if ( DB_TYPE == " pgsql " ) {
2013-04-03 09:48:50 +00:00
$match_part = " date_entered > NOW() - INTERVAL ' $intl hour' " ;
2007-08-23 07:23:27 +00:00
} else {
2013-04-03 09:48:50 +00:00
$match_part = " date_entered > DATE_SUB(NOW(),
2007-08-23 08:05:40 +00:00
INTERVAL $intl HOUR ) " ;
2007-08-23 07:23:27 +00:00
}
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2013-03-31 08:37:42 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
2013-04-03 09:48:50 +00:00
AND owner_uid = $owner_uid AND unread = true AND $date_qpart AND $match_part ) as tmp ) " );
2007-08-23 07:23:27 +00:00
}
2009-01-19 03:28:25 +00:00
if ( $feed == - 4 ) {
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2013-03-31 08:37:42 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
AND owner_uid = $owner_uid AND unread = true AND $date_qpart ) as tmp ) " );
2009-01-19 03:28:25 +00:00
}
2013-03-27 05:40:07 +00:00
} else if ( $feed < LABEL_BASE_INDEX ) { // label
2006-03-27 03:21:08 +00:00
2013-03-27 05:40:07 +00:00
$label_id = feed_to_label_id ( $feed );
2006-03-27 03:21:08 +00:00
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2013-03-31 08:37:42 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT ttrss_entries . id FROM ttrss_entries , ttrss_user_entries , ttrss_user_labels2 WHERE ref_id = id
AND label_id = '$label_id' AND ref_id = article_id
AND owner_uid = $owner_uid AND unread = true AND $date_qpart ) as tmp ) " );
2006-03-27 03:21:08 +00:00
}
2009-01-16 14:07:22 +00:00
2013-04-17 14:34:18 +00:00
ccache_update ( $feed , $owner_uid , $cat_view );
2009-01-16 14:07:22 +00:00
2006-03-27 03:21:08 +00:00
} else { // tag
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2013-03-31 08:37:42 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT ttrss_entries . id FROM ttrss_entries , ttrss_user_entries , ttrss_tags WHERE ref_id = ttrss_entries . id
AND post_int_id = int_id AND tag_name = '$feed'
AND ttrss_user_entries . owner_uid = $owner_uid AND unread = true AND $date_qpart ) as tmp ) " );
2006-03-27 03:21:08 +00:00
}
}
2013-04-17 12:23:15 +00:00
function getAllCounters () {
$data = getGlobalCounters ();
2011-03-17 16:05:28 +00:00
2013-04-17 12:23:15 +00:00
$data = array_merge ( $data , getVirtCounters ());
$data = array_merge ( $data , getLabelCounters ());
2013-05-07 07:35:10 +00:00
$data = array_merge ( $data , getFeedCounters ());
2013-04-17 12:23:15 +00:00
$data = array_merge ( $data , getCategoryCounters ());
2010-11-04 19:38:03 +00:00
return $data ;
2011-03-17 16:05:28 +00:00
}
2006-03-27 03:43:26 +00:00
2013-04-17 14:34:18 +00:00
function getCategoryTitle ( $cat_id ) {
2011-12-13 12:23:31 +00:00
if ( $cat_id == - 1 ) {
return __ ( " Special " );
} else if ( $cat_id == - 2 ) {
return __ ( " Labels " );
} else {
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT title FROM ttrss_feed_categories WHERE
2011-12-13 12:23:31 +00:00
id = '$cat_id' " );
if ( db_num_rows ( $result ) == 1 ) {
return db_fetch_result ( $result , 0 , " title " );
} else {
2012-10-06 13:47:19 +00:00
return __ ( " Uncategorized " );
2011-12-13 12:23:31 +00:00
}
}
}
2013-04-17 12:23:15 +00:00
function getCategoryCounters () {
2010-11-04 19:38:03 +00:00
$ret_arr = array ();
2007-08-13 04:57:19 +00:00
2010-11-04 19:38:03 +00:00
/* Labels category */
2007-08-13 04:57:19 +00:00
2010-11-05 13:38:55 +00:00
$cv = array ( " id " => - 2 , " kind " => " cat " ,
2013-04-17 14:34:18 +00:00
" counter " => getCategoryUnread ( - 2 ));
2007-08-13 04:57:19 +00:00
2010-11-04 19:38:03 +00:00
array_push ( $ret_arr , $cv );
2007-08-13 04:57:19 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT id AS cat_id, value AS unread,
2012-08-13 15:52:34 +00:00
( SELECT COUNT ( id ) FROM ttrss_feed_categories AS c2
WHERE c2 . parent_cat = ttrss_feed_categories . id ) AS num_children
2011-03-17 16:05:28 +00:00
FROM ttrss_feed_categories , ttrss_cat_counters_cache
WHERE ttrss_cat_counters_cache . feed_id = id AND
2012-08-15 15:34:50 +00:00
ttrss_cat_counters_cache . owner_uid = ttrss_feed_categories . owner_uid AND
2009-01-16 16:52:39 +00:00
ttrss_feed_categories . owner_uid = " . $_SESSION["uid"] );
2006-03-27 03:43:26 +00:00
while ( $line = db_fetch_assoc ( $result )) {
2009-12-29 20:35:31 +00:00
$line [ " cat_id " ] = ( int ) $line [ " cat_id " ];
2009-01-16 13:11:19 +00:00
2012-08-13 15:52:34 +00:00
if ( $line [ " num_children " ] > 0 ) {
2013-04-17 14:34:18 +00:00
$child_counter = getCategoryChildrenUnread ( $line [ " cat_id " ], $_SESSION [ " uid " ]);
2012-08-13 15:52:34 +00:00
} else {
$child_counter = 0 ;
}
2010-11-05 13:38:55 +00:00
$cv = array ( " id " => $line [ " cat_id " ], " kind " => " cat " ,
2012-10-11 08:46:33 +00:00
" counter " => $line [ " unread " ] + $child_counter );
2010-11-04 19:38:03 +00:00
array_push ( $ret_arr , $cv );
2006-03-27 03:43:26 +00:00
}
2009-01-16 16:41:21 +00:00
/* Special case: NULL category doesn't actually exist in the DB */
2010-11-05 15:03:26 +00:00
$cv = array ( " id " => 0 , " kind " => " cat " ,
2013-04-17 14:34:18 +00:00
" counter " => ( int ) ccache_find ( 0 , $_SESSION [ " uid " ], true ));
2009-01-16 16:41:21 +00:00
2010-11-04 19:38:03 +00:00
array_push ( $ret_arr , $cv );
return $ret_arr ;
2006-03-27 03:43:26 +00:00
}
2012-08-13 15:52:34 +00:00
// only accepts real cats (>= 0)
2013-04-17 14:34:18 +00:00
function getCategoryChildrenUnread ( $cat , $owner_uid = false ) {
2012-08-13 15:52:34 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT id FROM ttrss_feed_categories WHERE parent_cat = ' $cat '
2012-08-13 15:52:34 +00:00
AND owner_uid = $owner_uid " );
$unread = 0 ;
while ( $line = db_fetch_assoc ( $result )) {
2013-04-17 14:34:18 +00:00
$unread += getCategoryUnread ( $line [ " id " ], $owner_uid );
$unread += getCategoryChildrenUnread ( $line [ " id " ], $owner_uid );
2012-08-13 15:52:34 +00:00
}
return $unread ;
}
2013-04-17 14:34:18 +00:00
function getCategoryUnread ( $cat , $owner_uid = false ) {
2009-01-17 06:57:33 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2006-07-21 09:50:21 +00:00
2007-08-13 04:57:19 +00:00
if ( $cat >= 0 ) {
2006-07-31 11:35:50 +00:00
2007-08-13 04:57:19 +00:00
if ( $cat != 0 ) {
$cat_query = " cat_id = ' $cat ' " ;
} else {
$cat_query = " cat_id IS NULL " ;
}
2007-08-25 03:34:33 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT id FROM ttrss_feeds WHERE $cat_query
2009-01-17 06:57:33 +00:00
AND owner_uid = " . $owner_uid );
2011-03-17 16:05:28 +00:00
2007-08-13 04:57:19 +00:00
$cat_feeds = array ();
while ( $line = db_fetch_assoc ( $result )) {
array_push ( $cat_feeds , " feed_id = " . $line [ " id " ]);
}
2011-03-17 16:05:28 +00:00
2007-08-13 04:57:19 +00:00
if ( count ( $cat_feeds ) == 0 ) return 0 ;
2011-03-17 16:05:28 +00:00
2007-08-13 04:57:19 +00:00
$match_part = implode ( " OR " , $cat_feeds );
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT COUNT(int_id) AS unread
2012-07-09 09:02:42 +00:00
FROM ttrss_user_entries
WHERE unread = true AND ( $match_part )
AND owner_uid = " . $owner_uid );
2011-03-17 16:05:28 +00:00
2007-08-13 04:57:19 +00:00
$unread = 0 ;
2011-03-17 16:05:28 +00:00
2007-08-13 04:57:19 +00:00
# this needs to be rewritten
while ( $line = db_fetch_assoc ( $result )) {
$unread += $line [ " unread " ];
}
2011-03-17 16:05:28 +00:00
2007-08-13 04:57:19 +00:00
return $unread ;
} else if ( $cat == - 1 ) {
2013-05-07 07:35:10 +00:00
return getFeedUnread ( - 1 ) + getFeedUnread ( - 2 ) + getFeedUnread ( - 3 ) + getFeedUnread ( 0 );
2007-08-13 04:57:19 +00:00
} else if ( $cat == - 2 ) {
2006-07-21 09:50:21 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( "
2011-03-17 16:05:28 +00:00
SELECT COUNT ( unread ) AS unread FROM
2012-07-09 09:02:42 +00:00
ttrss_user_entries , ttrss_user_labels2
WHERE article_id = ref_id AND unread = true
2009-01-18 14:16:31 +00:00
AND ttrss_user_entries . owner_uid = '$owner_uid' " );
2009-01-18 08:28:42 +00:00
2009-01-18 14:16:31 +00:00
$unread = db_fetch_result ( $result , 0 , " unread " );
2006-07-21 09:50:21 +00:00
2009-01-18 14:16:31 +00:00
return $unread ;
2006-07-21 09:50:21 +00:00
2011-03-17 16:05:28 +00:00
}
2006-07-21 09:50:21 +00:00
}
2013-04-17 14:34:18 +00:00
function getFeedUnread ( $feed , $is_cat = false ) {
return getFeedArticles ( $feed , $is_cat , true , $_SESSION [ " uid " ]);
2008-05-20 06:37:33 +00:00
}
2013-04-17 14:34:18 +00:00
function getLabelUnread ( $label_id , $owner_uid = false ) {
2009-01-18 08:28:42 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT COUNT(ref_id) AS unread FROM ttrss_user_entries, ttrss_user_labels2
2012-07-09 16:39:42 +00:00
WHERE owner_uid = '$owner_uid' AND unread = true AND label_id = '$label_id' AND article_id = ref_id " );
2009-01-18 08:28:42 +00:00
if ( db_num_rows ( $result ) != 0 ) {
return db_fetch_result ( $result , 0 , " unread " );
} else {
return 0 ;
}
}
2013-04-17 14:34:18 +00:00
function getFeedArticles ( $feed , $is_cat = false , $unread_only = false ,
2009-01-16 12:06:58 +00:00
$owner_uid = false ) {
2009-12-29 20:35:31 +00:00
$n_feed = ( int ) $feed ;
2012-07-09 09:02:42 +00:00
$need_entries = false ;
2006-07-21 09:50:21 +00:00
2009-01-16 12:06:58 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2008-05-20 06:37:33 +00:00
if ( $unread_only ) {
$unread_qpart = " unread = true " ;
} else {
$unread_qpart = " true " ;
}
2006-07-21 09:50:21 +00:00
if ( $is_cat ) {
2013-04-17 14:34:18 +00:00
return getCategoryUnread ( $n_feed , $owner_uid );
2012-08-27 06:08:11 +00:00
} else if ( $n_feed == - 6 ) {
return 0 ;
} else if ( $feed != " 0 " && $n_feed == 0 ) {
2009-12-29 19:57:52 +00:00
2013-04-17 14:34:18 +00:00
$feed = db_escape_string ( $feed );
2010-08-31 07:30:28 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT SUM((SELECT COUNT(int_id)
2011-03-17 16:05:28 +00:00
FROM ttrss_user_entries , ttrss_entries WHERE int_id = post_int_id
2012-07-09 09:02:42 +00:00
AND ref_id = id AND $unread_qpart )) AS count FROM ttrss_tags
2009-12-29 19:57:52 +00:00
WHERE owner_uid = $owner_uid AND tag_name = '$feed' " );
return db_fetch_result ( $result , 0 , " count " );
2006-07-21 09:50:21 +00:00
} else if ( $n_feed == - 1 ) {
2006-03-27 03:43:26 +00:00
$match_part = " marked = true " ;
2007-08-09 12:45:30 +00:00
} else if ( $n_feed == - 2 ) {
$match_part = " published = true " ;
2007-08-23 07:23:27 +00:00
} else if ( $n_feed == - 3 ) {
2010-11-27 09:22:28 +00:00
$match_part = " unread = true AND score >= 0 " ;
2007-08-23 07:23:27 +00:00
2013-04-17 14:34:18 +00:00
$intl = get_pref ( " FRESH_ARTICLE_MAX_AGE " , $owner_uid );
2007-08-23 08:05:40 +00:00
2007-08-23 07:23:27 +00:00
if ( DB_TYPE == " pgsql " ) {
2011-03-17 16:05:28 +00:00
$match_part .= " AND updated > NOW() - INTERVAL ' $intl hour' " ;
2007-08-23 07:23:27 +00:00
} else {
2008-05-17 14:54:55 +00:00
$match_part .= " AND updated > DATE_SUB(NOW(), INTERVAL $intl HOUR) " ;
2007-08-23 07:23:27 +00:00
}
2012-07-09 09:02:42 +00:00
$need_entries = true ;
2009-01-18 14:16:31 +00:00
} else if ( $n_feed == - 4 ) {
$match_part = " true " ;
2009-12-28 14:23:01 +00:00
} else if ( $n_feed >= 0 ) {
2006-07-25 05:02:42 +00:00
2010-11-10 09:05:55 +00:00
if ( $n_feed != 0 ) {
$match_part = " feed_id = ' $n_feed ' " ;
2006-07-25 05:02:42 +00:00
} else {
2010-11-10 09:05:55 +00:00
$match_part = " feed_id IS NULL " ;
2006-07-25 05:02:42 +00:00
}
2010-11-10 09:05:55 +00:00
2013-03-27 05:40:07 +00:00
} else if ( $feed < LABEL_BASE_INDEX ) {
2006-08-16 13:13:33 +00:00
2013-03-27 05:40:07 +00:00
$label_id = feed_to_label_id ( $feed );
2006-03-27 03:43:26 +00:00
2013-04-17 14:34:18 +00:00
return getLabelUnread ( $label_id , $owner_uid );
2006-03-27 03:43:26 +00:00
}
if ( $match_part ) {
2009-12-28 14:23:01 +00:00
2012-07-09 09:02:42 +00:00
if ( $need_entries ) {
2009-12-28 14:23:01 +00:00
$from_qpart = " ttrss_user_entries,ttrss_entries " ;
2012-07-09 09:02:42 +00:00
$from_where = " ttrss_entries.id = ttrss_user_entries.ref_id AND " ;
} else {
$from_qpart = " ttrss_user_entries " ;
2009-12-28 14:23:01 +00:00
}
2011-03-17 16:05:28 +00:00
$query = " SELECT count(int_id) AS unread
2009-12-28 14:23:01 +00:00
FROM $from_qpart WHERE
2012-07-09 09:02:42 +00:00
$unread_qpart AND $from_where ( $match_part ) AND ttrss_user_entries . owner_uid = $owner_uid " ;
//echo "[$feed/$query]\n";
2009-12-28 15:43:16 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( $query );
2011-03-17 16:05:28 +00:00
2006-03-27 03:43:26 +00:00
} else {
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT COUNT(post_int_id) AS unread
2011-03-17 16:05:28 +00:00
FROM ttrss_tags , ttrss_user_entries , ttrss_entries
WHERE tag_name = '$feed' AND post_int_id = int_id AND ref_id = ttrss_entries . id
2012-07-09 09:02:42 +00:00
AND $unread_qpart AND ttrss_tags . owner_uid = " . $owner_uid );
2006-03-27 03:43:26 +00:00
}
2011-03-17 16:05:28 +00:00
2006-03-27 03:43:26 +00:00
$unread = db_fetch_result ( $result , 0 , " unread " );
2006-08-16 09:05:24 +00:00
2006-03-27 03:43:26 +00:00
return $unread ;
}
2013-04-17 14:34:18 +00:00
function getGlobalUnread ( $user_id = false ) {
2006-08-20 03:35:47 +00:00
if ( ! $user_id ) {
$user_id = $_SESSION [ " uid " ];
}
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT SUM(value) AS c_id FROM ttrss_counters_cache
2009-01-16 13:11:19 +00:00
WHERE owner_uid = '$user_id' AND feed_id > 0 " );
2011-03-17 16:05:28 +00:00
$c_id = db_fetch_result ( $result , 0 , " c_id " );
2009-01-16 13:11:19 +00:00
2006-03-27 03:43:26 +00:00
return $c_id ;
}
2013-04-17 14:34:18 +00:00
function getGlobalCounters ( $global_unread = - 1 ) {
2010-11-04 19:38:03 +00:00
$ret_arr = array ();
2011-03-17 16:05:28 +00:00
if ( $global_unread == - 1 ) {
2013-04-17 12:23:15 +00:00
$global_unread = getGlobalUnread ();
2006-03-27 03:43:26 +00:00
}
2010-11-04 19:38:03 +00:00
2011-03-17 16:05:28 +00:00
$cv = array ( " id " => " global-unread " ,
2012-10-11 08:50:13 +00:00
" counter " => ( int ) $global_unread );
2010-11-04 19:38:03 +00:00
array_push ( $ret_arr , $cv );
2006-08-13 09:45:30 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT COUNT(id) AS fn FROM
2006-08-13 09:45:30 +00:00
ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"] );
$subscribed_feeds = db_fetch_result ( $result , 0 , " fn " );
2011-03-17 16:05:28 +00:00
$cv = array ( " id " => " subscribed-feeds " ,
2012-10-11 08:50:13 +00:00
" counter " => ( int ) $subscribed_feeds );
2006-08-13 09:45:30 +00:00
2010-11-04 19:38:03 +00:00
array_push ( $ret_arr , $cv );
return $ret_arr ;
2006-03-27 03:43:26 +00:00
}
2013-04-17 12:23:15 +00:00
function getVirtCounters () {
2006-03-27 03:43:26 +00:00
2006-06-19 08:59:24 +00:00
$ret_arr = array ();
2008-05-20 06:37:33 +00:00
2009-12-28 14:23:01 +00:00
for ( $i = 0 ; $i >= - 4 ; $i -- ) {
2008-05-20 06:37:33 +00:00
2013-04-17 14:34:18 +00:00
$count = getFeedUnread ( $i );
2010-11-04 19:38:03 +00:00
2013-05-15 21:08:04 +00:00
if ( $i == 0 || $i == - 1 || $i == - 2 )
$auxctr = getFeedArticles ( $i , false );
else
$auxctr = 0 ;
2010-11-04 19:38:03 +00:00
$cv = array ( " id " => $i ,
2013-05-15 21:08:04 +00:00
" counter " => ( int ) $count ,
" auxcounter " => $auxctr );
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
// if (get_pref('EXTENDED_FEEDLIST'))
// $cv["xmsg"] = getFeedArticles($i)." ".__("total");
2008-05-20 06:37:33 +00:00
2010-11-04 19:38:03 +00:00
array_push ( $ret_arr , $cv );
2011-03-17 16:05:28 +00:00
}
2009-12-30 07:07:00 +00:00
2013-04-18 08:27:34 +00:00
$feeds = PluginHost :: getInstance () -> get_feeds ( - 1 );
2013-03-27 12:14:27 +00:00
2013-04-18 08:27:34 +00:00
if ( is_array ( $feeds )) {
foreach ( $feeds as $feed ) {
$cv = array ( " id " => PluginHost :: pfeed_to_feed_id ( $feed [ 'id' ]),
" counter " => $feed [ 'sender' ] -> get_unread ( $feed [ 'id' ]));
2013-07-11 09:48:39 +00:00
if ( method_exists ( $feed [ 'sender' ], 'get_total' ))
$cv [ " auxcounter " ] = $feed [ 'sender' ] -> get_total ( $feed [ 'id' ]);
array_push ( $ret_arr , $cv );
2013-03-27 12:14:27 +00:00
}
}
2009-12-30 07:07:00 +00:00
return $ret_arr ;
}
2013-04-17 14:34:18 +00:00
function getLabelCounters ( $descriptions = false ) {
2010-11-04 19:38:03 +00:00
$ret_arr = array ();
2009-12-30 07:07:00 +00:00
2010-01-15 14:34:17 +00:00
$owner_uid = $_SESSION [ " uid " ];
2008-05-20 06:37:33 +00:00
2013-05-24 06:57:47 +00:00
$result = db_query ( " SELECT id,caption,COUNT(u1.unread) AS unread,COUNT(u2.unread) AS total
2013-02-27 11:05:38 +00:00
FROM ttrss_labels2 LEFT JOIN ttrss_user_labels2 ON
( ttrss_labels2 . id = label_id )
2013-05-24 06:57:47 +00:00
LEFT JOIN ttrss_user_entries AS u1 ON ( u1 . ref_id = article_id AND u1 . unread = true
AND u1 . owner_uid = $owner_uid )
LEFT JOIN ttrss_user_entries AS u2 ON ( u2 . ref_id = article_id AND u2 . unread = false
AND u2 . owner_uid = $owner_uid )
2013-03-05 11:36:25 +00:00
WHERE ttrss_labels2 . owner_uid = $owner_uid GROUP BY ttrss_labels2 . id ,
ttrss_labels2 . caption " );
2011-03-17 16:05:28 +00:00
2010-01-15 14:34:17 +00:00
while ( $line = db_fetch_assoc ( $result )) {
2007-08-23 07:23:27 +00:00
2013-03-27 05:40:07 +00:00
$id = label_to_feed_id ( $line [ " id " ]);
2007-08-09 12:45:30 +00:00
2010-11-04 19:38:03 +00:00
$cv = array ( " id " => $id ,
2013-05-24 06:57:47 +00:00
" counter " => ( int ) $line [ " unread " ],
" auxcounter " => ( int ) $line [ " total " ]);
2010-11-05 13:32:52 +00:00
if ( $descriptions )
2013-05-24 06:57:47 +00:00
$cv [ " description " ] = $line [ " caption " ];
2006-06-19 08:59:24 +00:00
2010-11-04 19:38:03 +00:00
array_push ( $ret_arr , $cv );
2010-01-15 14:34:17 +00:00
}
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
return $ret_arr ;
2006-03-27 03:43:26 +00:00
}
2013-04-17 14:34:18 +00:00
function getFeedCounters ( $active_feed = false ) {
2006-03-27 03:43:26 +00:00
2010-11-04 19:38:03 +00:00
$ret_arr = array ();
2013-04-01 09:02:25 +00:00
$query = " SELECT ttrss_feeds.id,
2009-01-16 13:11:19 +00:00
ttrss_feeds . title ,
2011-03-17 16:05:28 +00:00
" .SUBSTRING_FOR_DATE. " ( ttrss_feeds . last_updated , 1 , 19 ) AS last_updated ,
2009-01-16 16:37:07 +00:00
last_error , value AS count
FROM ttrss_feeds , ttrss_counters_cache
2011-03-17 16:05:28 +00:00
WHERE ttrss_feeds . owner_uid = " . $_SESSION["uid"] . "
2012-08-15 15:34:50 +00:00
AND ttrss_counters_cache . owner_uid = ttrss_feeds . owner_uid
2009-01-16 16:46:17 +00:00
AND ttrss_counters_cache . feed_id = id " ;
2006-03-27 03:43:26 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( $query );
2006-03-27 03:43:26 +00:00
$fctrs_modified = false ;
while ( $line = db_fetch_assoc ( $result )) {
2011-03-17 16:05:28 +00:00
2006-03-27 03:43:26 +00:00
$id = $line [ " id " ];
2009-01-16 16:37:07 +00:00
$count = $line [ " count " ];
2006-03-27 03:43:26 +00:00
$last_error = htmlspecialchars ( $line [ " last_error " ]);
2006-03-28 06:12:45 +00:00
2013-04-17 14:34:18 +00:00
$last_updated = make_local_datetime ( $line [ 'last_updated' ], false );
2006-03-28 06:12:45 +00:00
2008-10-26 16:53:46 +00:00
$has_img = feed_has_icon ( $id );
2006-03-27 03:43:26 +00:00
2010-11-13 15:48:56 +00:00
if ( date ( 'Y' ) - date ( 'Y' , strtotime ( $line [ 'last_updated' ])) > 2 )
$last_updated = '' ;
2010-11-04 19:38:03 +00:00
$cv = array ( " id " => $id ,
2010-11-05 07:43:19 +00:00
" updated " => $last_updated ,
2012-10-11 08:50:13 +00:00
" counter " => ( int ) $count ,
2010-11-04 19:38:03 +00:00
" has_img " => ( int ) $has_img );
2006-03-27 03:43:26 +00:00
2010-11-04 19:38:03 +00:00
if ( $last_error )
$cv [ " error " ] = $last_error ;
2007-08-25 07:38:18 +00:00
2013-04-17 14:34:18 +00:00
// if (get_pref('EXTENDED_FEEDLIST'))
// $cv["xmsg"] = getFeedArticles($id)." ".__("total");
2008-05-20 06:37:33 +00:00
2010-11-04 19:38:03 +00:00
if ( $active_feed && $id == $active_feed )
2010-11-12 19:17:57 +00:00
$cv [ " title " ] = truncate_string ( $line [ " title " ], 30 );
2010-11-04 19:38:03 +00:00
array_push ( $ret_arr , $cv );
2006-03-27 03:43:26 +00:00
}
2010-11-04 19:38:03 +00:00
return $ret_arr ;
2006-03-27 03:43:26 +00:00
}
2013-04-17 12:23:15 +00:00
function get_pgsql_version () {
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT version() AS version " );
2011-07-31 02:31:40 +00:00
$version = explode ( " " , db_fetch_result ( $result , 0 , " version " ));
2006-03-31 04:19:45 +00:00
return $version [ 1 ];
}
2010-11-07 12:38:15 +00:00
/**
2012-08-21 10:09:51 +00:00
* @ return array ( code => Status code , message => error message if available )
*
2010-11-07 12:38:15 +00:00
* 0 - OK , Feed already exists
* 1 - OK , Feed added
* 2 - Invalid URL
2010-11-09 07:09:10 +00:00
* 3 - URL content is HTML , no feeds available
* 4 - URL content is HTML which contains multiple feeds .
* Here you should call extractfeedurls in rpc - backend
* to get all possible feeds .
2010-11-10 10:27:44 +00:00
* 5 - Couldn ' t download the URL content .
2013-04-19 09:17:28 +00:00
* 6 - Content is an invalid XML .
2010-11-07 12:38:15 +00:00
*/
2013-04-17 14:34:18 +00:00
function subscribe_to_feed ( $url , $cat_id = 0 ,
2013-03-24 10:28:43 +00:00
$auth_login = '' , $auth_pass = '' ) {
2006-09-16 09:54:02 +00:00
2012-08-21 10:09:51 +00:00
global $fetch_last_error ;
2011-12-13 12:06:25 +00:00
require_once " include/rssfuncs.php " ;
2010-11-07 14:45:50 +00:00
$url = fix_url ( $url );
2010-11-20 13:23:23 +00:00
2012-08-21 10:09:51 +00:00
if ( ! $url || ! validate_feed_url ( $url )) return array ( " code " => 2 );
2010-01-13 09:48:49 +00:00
2012-09-23 09:38:58 +00:00
$contents = @ fetch_file_contents ( $url , false , $auth_login , $auth_pass );
if ( ! $contents ) {
2012-09-07 06:23:46 +00:00
return array ( " code " => 5 , " message " => $fetch_last_error );
2012-09-23 09:38:58 +00:00
}
if ( is_html ( $contents )) {
$feedUrls = get_feeds_from_html ( $url , $contents );
2012-09-07 06:23:46 +00:00
if ( count ( $feedUrls ) == 0 ) {
return array ( " code " => 3 );
} else if ( count ( $feedUrls ) > 1 ) {
2012-09-23 09:38:58 +00:00
return array ( " code " => 4 , " feeds " => $feedUrls );
2010-11-09 07:03:27 +00:00
}
2012-09-07 06:23:46 +00:00
//use feed url as new URL
$url = key ( $feedUrls );
}
2010-11-09 07:03:27 +00:00
2013-04-19 21:38:06 +00:00
/* libxml_use_internal_errors ( true );
2013-04-19 09:17:28 +00:00
$doc = new DOMDocument ();
2013-04-19 21:38:06 +00:00
$doc -> loadXML ( $contents );
2013-04-19 09:17:28 +00:00
$error = libxml_get_last_error ();
libxml_clear_errors ();
if ( $error ) {
$error_message = format_libxml_error ( $error );
return array ( " code " => 6 , " message " => $error_message );
2013-04-19 21:38:06 +00:00
} */
2013-04-19 09:17:28 +00:00
2006-05-16 07:33:51 +00:00
if ( $cat_id == " 0 " || ! $cat_id ) {
$cat_qpart = " NULL " ;
} else {
$cat_qpart = " ' $cat_id ' " ;
}
2011-03-17 16:05:28 +00:00
2013-04-17 12:23:15 +00:00
$result = db_query (
2011-03-17 16:05:28 +00:00
" SELECT id FROM ttrss_feeds
2010-01-13 09:48:49 +00:00
WHERE feed_url = '$url' AND owner_uid = " . $_SESSION["uid"] );
2011-03-17 16:05:28 +00:00
2013-04-13 14:24:27 +00:00
if ( strlen ( FEED_CRYPT_KEY ) > 0 ) {
require_once " crypt.php " ;
$auth_pass = substr ( encrypt_string ( $auth_pass ), 0 , 250 );
$auth_pass_encrypted = 'true' ;
} else {
$auth_pass_encrypted = 'false' ;
}
2013-04-17 14:34:18 +00:00
$auth_pass = db_escape_string ( $auth_pass );
2013-04-13 14:58:09 +00:00
2006-05-16 07:33:51 +00:00
if ( db_num_rows ( $result ) == 0 ) {
2013-04-17 12:23:15 +00:00
$result = db_query (
2011-03-17 16:05:28 +00:00
" INSERT INTO ttrss_feeds
2013-04-13 14:24:27 +00:00
( owner_uid , feed_url , title , cat_id , auth_login , auth_pass , update_method , auth_pass_encrypted )
2011-03-17 16:05:28 +00:00
VALUES ( '".$_SESSION["uid"]."' , '$url' ,
2013-04-13 14:24:27 +00:00
'[Unknown]' , $cat_qpart , '$auth_login' , '$auth_pass' , 0 , $auth_pass_encrypted ) " );
2011-03-17 16:05:28 +00:00
2013-04-17 12:23:15 +00:00
$result = db_query (
2011-03-17 16:05:28 +00:00
" SELECT id FROM ttrss_feeds WHERE feed_url = ' $url '
2007-04-25 15:00:08 +00:00
AND owner_uid = " . $_SESSION["uid"] );
2011-03-17 16:05:28 +00:00
2006-05-16 07:33:51 +00:00
$feed_id = db_fetch_result ( $result , 0 , " id " );
2011-03-17 16:05:28 +00:00
2006-05-16 07:33:51 +00:00
if ( $feed_id ) {
2013-05-08 15:22:33 +00:00
update_rss_feed ( $feed_id , true );
2006-05-16 07:33:51 +00:00
}
2012-08-21 10:09:51 +00:00
return array ( " code " => 1 );
2006-05-16 07:33:51 +00:00
} else {
2012-08-21 10:09:51 +00:00
return array ( " code " => 0 );
2006-05-16 07:33:51 +00:00
}
}
2013-04-17 14:34:18 +00:00
function print_feed_select ( $id , $default_id = " " ,
2012-08-26 08:36:08 +00:00
$attributes = " " , $include_all_feeds = true ,
$root_id = false , $nest_level = 0 ) {
if ( ! $root_id ) {
print " <select id= \" $id\ " name = \ " $id\ " $attributes > " ;
if ( $include_all_feeds ) {
$is_selected = ( " 0 " == $default_id ) ? " selected= \" 1 \" " : " " ;
print " <option $is_selected value= \" 0 \" > " . __ ( 'All feeds' ) . " </option> " ;
}
2006-05-20 09:41:47 +00:00
}
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
if ( get_pref ( 'ENABLE_FEED_CATS' )) {
2006-05-20 09:41:47 +00:00
2012-08-26 08:36:08 +00:00
if ( $root_id )
$parent_qpart = " parent_cat = ' $root_id ' " ;
else
$parent_qpart = " parent_cat IS NULL " ;
2006-05-20 09:41:47 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT id,title,
2012-08-26 08:36:08 +00:00
( SELECT COUNT ( id ) FROM ttrss_feed_categories AS c2 WHERE
c2 . parent_cat = ttrss_feed_categories . id ) AS num_children
FROM ttrss_feed_categories
WHERE owner_uid = " . $_SESSION["uid"] . " AND $parent_qpart ORDER BY title " );
while ( $line = db_fetch_assoc ( $result )) {
for ( $i = 0 ; $i < $nest_level ; $i ++ )
$line [ " title " ] = " - " . $line [ " title " ];
$is_selected = ( " CAT: " . $line [ " id " ] == $default_id ) ? " selected= \" 1 \" " : " " ;
printf ( " <option $is_selected value='CAT:%d'>%s</option> " ,
$line [ " id " ], htmlspecialchars ( $line [ " title " ]));
if ( $line [ " num_children " ] > 0 )
2013-04-17 14:34:18 +00:00
print_feed_select ( $id , $default_id , $attributes ,
2012-08-26 08:36:08 +00:00
$include_all_feeds , $line [ " id " ], $nest_level + 1 );
2013-04-17 14:34:18 +00:00
$feed_result = db_query ( " SELECT id,title FROM ttrss_feeds
2012-08-26 08:36:08 +00:00
WHERE cat_id = '".$line["id"]."' AND owner_uid = " . $_SESSION["uid"] . " ORDER BY title " );
while ( $fline = db_fetch_assoc ( $feed_result )) {
$is_selected = ( $fline [ " id " ] == $default_id ) ? " selected= \" 1 \" " : " " ;
$fline [ " title " ] = " + " . $fline [ " title " ];
for ( $i = 0 ; $i < $nest_level ; $i ++ )
$fline [ " title " ] = " - " . $fline [ " title " ];
printf ( " <option $is_selected value='%d'>%s</option> " ,
$fline [ " id " ], htmlspecialchars ( $fline [ " title " ]));
}
2006-05-20 09:41:47 +00:00
}
2009-10-08 08:36:38 +00:00
2012-08-26 08:36:08 +00:00
if ( ! $root_id ) {
2013-05-07 07:35:10 +00:00
$default_is_cat = ( $default_id == " CAT:0 " );
$is_selected = $default_is_cat ? " selected= \" 1 \" " : " " ;
2012-08-26 08:36:08 +00:00
printf ( " <option $is_selected value='CAT:0'>%s</option> " ,
__ ( " Uncategorized " ));
2013-04-17 14:34:18 +00:00
$feed_result = db_query ( " SELECT id,title FROM ttrss_feeds
2012-08-26 08:36:08 +00:00
WHERE cat_id IS NULL AND owner_uid = " . $_SESSION["uid"] . " ORDER BY title " );
while ( $fline = db_fetch_assoc ( $feed_result )) {
$is_selected = ( $fline [ " id " ] == $default_id && ! $default_is_cat ) ? " selected= \" 1 \" " : " " ;
$fline [ " title " ] = " + " . $fline [ " title " ];
for ( $i = 0 ; $i < $nest_level ; $i ++ )
$fline [ " title " ] = " - " . $fline [ " title " ];
printf ( " <option $is_selected value='%d'>%s</option> " ,
$fline [ " id " ], htmlspecialchars ( $fline [ " title " ]));
}
}
2009-10-08 08:36:38 +00:00
2012-08-26 08:36:08 +00:00
} else {
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT id,title FROM ttrss_feeds
2012-08-26 08:36:08 +00:00
WHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title " );
while ( $line = db_fetch_assoc ( $result )) {
$is_selected = ( $line [ " id " ] == $default_id ) ? " selected= \" 1 \" " : " " ;
printf ( " <option $is_selected value='%d'>%s</option> " ,
$line [ " id " ], htmlspecialchars ( $line [ " title " ]));
}
2006-05-20 09:41:47 +00:00
}
2011-03-17 16:05:28 +00:00
2012-08-26 08:36:08 +00:00
if ( ! $root_id ) {
print " </select> " ;
}
2006-05-20 09:41:47 +00:00
}
2013-04-17 14:34:18 +00:00
function print_feed_cat_select ( $id , $default_id ,
2012-08-14 19:18:40 +00:00
$attributes , $include_all_cats = true , $root_id = false , $nest_level = 0 ) {
2011-03-17 16:05:28 +00:00
2012-08-14 19:18:40 +00:00
if ( ! $root_id ) {
print " <select id= \" $id\ " name = \ " $id\ " default = \ " $default_id\ " onchange = \ " catSelectOnChange(this) \" $attributes > " ;
}
2006-05-20 09:41:47 +00:00
2012-08-14 19:18:40 +00:00
if ( $root_id )
$parent_qpart = " parent_cat = ' $root_id ' " ;
else
$parent_qpart = " parent_cat IS NULL " ;
2006-05-20 09:41:47 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT id,title,
2012-08-14 19:18:40 +00:00
( SELECT COUNT ( id ) FROM ttrss_feed_categories AS c2 WHERE
c2 . parent_cat = ttrss_feed_categories . id ) AS num_children
FROM ttrss_feed_categories
WHERE owner_uid = " . $_SESSION["uid"] . " AND $parent_qpart ORDER BY title " );
2006-05-20 09:41:47 +00:00
2012-08-14 19:18:40 +00:00
while ( $line = db_fetch_assoc ( $result )) {
if ( $line [ " id " ] == $default_id ) {
$is_selected = " selected= \" 1 \" " ;
} else {
$is_selected = " " ;
}
2006-05-20 09:41:47 +00:00
2012-08-14 19:18:40 +00:00
for ( $i = 0 ; $i < $nest_level ; $i ++ )
$line [ " title " ] = " - " . $line [ " title " ];
2010-11-09 10:28:10 +00:00
2012-08-14 19:18:40 +00:00
if ( $line [ " title " ])
printf ( " <option $is_selected value='%d'>%s</option> " ,
$line [ " id " ], htmlspecialchars ( $line [ " title " ]));
2006-05-20 09:41:47 +00:00
2012-08-14 19:18:40 +00:00
if ( $line [ " num_children " ] > 0 )
2013-04-17 14:34:18 +00:00
print_feed_cat_select ( $id , $default_id , $attributes ,
2012-08-14 19:18:40 +00:00
$include_all_cats , $line [ " id " ], $nest_level + 1 );
}
2010-11-07 20:30:05 +00:00
2012-08-14 19:18:40 +00:00
if ( ! $root_id ) {
if ( $include_all_cats ) {
if ( db_num_rows ( $result ) > 0 ) {
print " <option disabled= \" 1 \" >--------</option> " ;
}
2012-08-16 09:36:02 +00:00
if ( $default_id == 0 ) {
$is_selected = " selected= \" 1 \" " ;
} else {
$is_selected = " " ;
}
print " <option $is_selected value= \" 0 \" > " . __ ( 'Uncategorized' ) . " </option> " ;
2012-08-14 19:18:40 +00:00
}
print " </select> " ;
}
}
2011-03-17 16:05:28 +00:00
2006-05-20 11:16:16 +00:00
function checkbox_to_sql_bool ( $val ) {
return ( $val == " on " ) ? " true " : " false " ;
}
2006-05-21 04:28:51 +00:00
2013-04-17 14:34:18 +00:00
function getFeedCatTitle ( $id ) {
2006-05-21 04:28:51 +00:00
if ( $id == - 1 ) {
2007-03-05 08:45:38 +00:00
return __ ( " Special " );
2013-03-27 05:40:07 +00:00
} else if ( $id < LABEL_BASE_INDEX ) {
2007-03-05 08:45:38 +00:00
return __ ( " Labels " );
2006-05-21 04:28:51 +00:00
} else if ( $id > 0 ) {
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT ttrss_feed_categories.title
2006-05-21 04:28:51 +00:00
FROM ttrss_feeds , ttrss_feed_categories WHERE ttrss_feeds . id = '$id' AND
cat_id = ttrss_feed_categories . id " );
if ( db_num_rows ( $result ) == 1 ) {
return db_fetch_result ( $result , 0 , " title " );
} else {
2007-03-05 08:45:38 +00:00
return __ ( " Uncategorized " );
2006-05-21 04:28:51 +00:00
}
} else {
return " getFeedCatTitle( $id ) failed " ;
}
}
2012-09-03 09:13:16 +00:00
function getFeedIcon ( $id ) {
2009-12-21 10:42:02 +00:00
switch ( $id ) {
2009-12-28 18:42:04 +00:00
case 0 :
return " images/archive.png " ;
break ;
2009-12-21 10:42:02 +00:00
case - 1 :
2013-07-10 09:09:12 +00:00
return " images/star.png " ;
2009-12-21 10:42:02 +00:00
break ;
case - 2 :
2013-07-10 09:09:12 +00:00
return " images/feed.png " ;
2009-12-21 10:42:02 +00:00
break ;
case - 3 :
return " images/fresh.png " ;
break ;
case - 4 :
2013-07-10 09:09:12 +00:00
return " images/folder.png " ;
2009-12-21 10:42:02 +00:00
break ;
2012-08-27 06:08:11 +00:00
case - 6 :
2013-07-10 09:09:12 +00:00
return " images/time.png " ;
2012-08-27 06:08:11 +00:00
break ;
2009-12-21 10:42:02 +00:00
default :
2013-03-27 05:40:07 +00:00
if ( $id < LABEL_BASE_INDEX ) {
2009-12-28 18:42:04 +00:00
return " images/label.png " ;
} else {
2011-03-17 16:05:28 +00:00
if ( file_exists ( ICONS_DIR . " / $id .ico " ))
2010-11-20 12:30:45 +00:00
return ICONS_URL . " / $id .ico " ;
2009-12-28 18:42:04 +00:00
}
2009-12-21 10:42:02 +00:00
break ;
}
2013-04-17 05:09:51 +00:00
return false ;
2009-12-21 10:42:02 +00:00
}
2013-04-17 14:34:18 +00:00
function getFeedTitle ( $id , $cat = false ) {
2012-09-01 19:33:56 +00:00
if ( $cat ) {
2013-04-17 14:34:18 +00:00
return getCategoryTitle ( $id );
2012-09-01 19:33:56 +00:00
} else if ( $id == - 1 ) {
2007-03-05 08:45:38 +00:00
return __ ( " Starred articles " );
2007-08-09 13:09:34 +00:00
} else if ( $id == - 2 ) {
return __ ( " Published articles " );
2007-08-23 07:23:27 +00:00
} else if ( $id == - 3 ) {
return __ ( " Fresh articles " );
2009-01-18 14:16:31 +00:00
} else if ( $id == - 4 ) {
return __ ( " All articles " );
2010-01-11 11:46:23 +00:00
} else if ( $id === 0 || $id === " 0 " ) {
2009-12-28 14:23:01 +00:00
return __ ( " Archived articles " );
2012-08-27 06:08:11 +00:00
} else if ( $id == - 6 ) {
return __ ( " Recently read " );
2013-03-27 05:40:07 +00:00
} else if ( $id < LABEL_BASE_INDEX ) {
$label_id = feed_to_label_id ( $id );
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT caption FROM ttrss_labels2 WHERE id = ' $label_id ' " );
2006-05-21 04:28:51 +00:00
if ( db_num_rows ( $result ) == 1 ) {
2009-01-18 08:28:42 +00:00
return db_fetch_result ( $result , 0 , " caption " );
2006-05-21 04:28:51 +00:00
} else {
return " Unknown label ( $label_id ) " ;
}
2011-08-11 22:51:00 +00:00
} else if ( is_numeric ( $id ) && $id > 0 ) {
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT title FROM ttrss_feeds WHERE id = ' $id ' " );
2006-05-21 04:28:51 +00:00
if ( db_num_rows ( $result ) == 1 ) {
return db_fetch_result ( $result , 0 , " title " );
} else {
return " Unknown feed ( $id ) " ;
}
} else {
2009-12-29 20:35:31 +00:00
return $id ;
2006-05-21 04:28:51 +00:00
}
}
2006-05-23 05:07:38 +00:00
2013-04-17 12:23:15 +00:00
function make_init_params () {
2010-11-05 13:16:30 +00:00
$params = array ();
2006-06-05 08:33:19 +00:00
2010-11-05 13:16:30 +00:00
foreach ( array ( " ON_CATCHUP_SHOW_NEXT_FEED " , " HIDE_READ_FEEDS " ,
" ENABLE_FEED_CATS " , " FEEDS_SORT_BY_UNREAD " , " CONFIRM_FEED_CATCHUP " ,
2013-04-02 11:32:47 +00:00
" CDM_AUTO_CATCHUP " , " FRESH_ARTICLE_MAX_AGE " ,
2010-11-29 10:02:44 +00:00
" HIDE_READ_SHOWS_SPECIAL " , " COMBINED_DISPLAY_MODE " ) as $param ) {
2007-03-26 05:23:15 +00:00
2013-04-17 14:34:18 +00:00
$params [ strtolower ( $param )] = ( int ) get_pref ( $param );
2010-11-05 13:16:30 +00:00
}
2007-03-26 05:23:15 +00:00
2010-11-10 11:23:26 +00:00
$params [ " icons_url " ] = ICONS_URL ;
$params [ " cookie_lifetime " ] = SESSION_COOKIE_LIFETIME ;
2013-04-17 14:34:18 +00:00
$params [ " default_view_mode " ] = get_pref ( " _DEFAULT_VIEW_MODE " );
$params [ " default_view_limit " ] = ( int ) get_pref ( " _DEFAULT_VIEW_LIMIT " );
$params [ " default_view_order_by " ] = get_pref ( " _DEFAULT_VIEW_ORDER_BY " );
2010-11-10 11:23:26 +00:00
$params [ " bw_limit " ] = ( int ) $_SESSION [ " bw_limit " ];
2013-03-27 06:27:04 +00:00
$params [ " label_base_index " ] = ( int ) LABEL_BASE_INDEX ;
2009-02-10 08:31:53 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT MAX(id) AS mid, COUNT(*) AS nf FROM
2009-02-02 12:24:32 +00:00
ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"] );
2010-11-23 10:03:36 +00:00
$max_feed_id = db_fetch_result ( $result , 0 , " mid " );
$num_feeds = db_fetch_result ( $result , 0 , " nf " );
2009-02-02 12:24:32 +00:00
2010-11-23 10:03:36 +00:00
$params [ " max_feed_id " ] = ( int ) $max_feed_id ;
2010-11-10 11:23:26 +00:00
$params [ " num_feeds " ] = ( int ) $num_feeds ;
2010-11-23 10:03:36 +00:00
2013-04-17 12:23:15 +00:00
$params [ " hotkeys " ] = get_hotkeys_map ();
2009-02-02 12:24:32 +00:00
2011-12-26 08:02:52 +00:00
$params [ " csrf_token " ] = $_SESSION [ " csrf_token " ];
2013-02-20 10:40:13 +00:00
$params [ " widescreen " ] = ( int ) $_COOKIE [ " ttrss_widescreen " ];
2011-12-26 08:02:52 +00:00
2013-01-22 16:07:34 +00:00
$params [ 'simple_update' ] = defined ( 'SIMPLE_UPDATE_MODE' ) && SIMPLE_UPDATE_MODE ;
2013-01-22 15:49:47 +00:00
2010-11-05 13:25:33 +00:00
return $params ;
2006-05-23 05:34:50 +00:00
}
2006-05-23 08:59:00 +00:00
2013-04-17 12:23:15 +00:00
function get_hotkeys_info () {
2012-12-28 11:42:02 +00:00
$hotkeys = array (
__ ( " Navigation " ) => array (
" next_feed " => __ ( " Open next feed " ),
" prev_feed " => __ ( " Open previous feed " ),
" next_article " => __ ( " Open next article " ),
" prev_article " => __ ( " Open previous article " ),
2013-02-27 18:48:43 +00:00
" next_article_noscroll " => __ ( " Open next article (don't scroll long articles) " ),
" prev_article_noscroll " => __ ( " Open previous article (don't scroll long articles) " ),
2013-04-06 01:47:40 +00:00
" next_article_noexpand " => __ ( " Move to next article (don't expand or mark read) " ),
" prev_article_noexpand " => __ ( " Move to previous article (don't expand or mark read) " ),
2012-12-28 11:42:02 +00:00
" search_dialog " => __ ( " Show search dialog " )),
__ ( " Article " ) => array (
" toggle_mark " => __ ( " Toggle starred " ),
" toggle_publ " => __ ( " Toggle published " ),
" toggle_unread " => __ ( " Toggle unread " ),
" edit_tags " => __ ( " Edit tags " ),
" dismiss_selected " => __ ( " Dismiss selected " ),
" dismiss_read " => __ ( " Dismiss read " ),
" open_in_new_window " => __ ( " Open in new window " ),
" catchup_below " => __ ( " Mark below as read " ),
" catchup_above " => __ ( " Mark above as read " ),
" article_scroll_down " => __ ( " Scroll down " ),
" article_scroll_up " => __ ( " Scroll up " ),
" select_article_cursor " => __ ( " Select article under cursor " ),
2013-01-05 12:56:49 +00:00
" email_article " => __ ( " Email article " ),
2013-03-20 06:21:14 +00:00
" close_article " => __ ( " Close/collapse article " ),
2013-04-06 01:47:40 +00:00
" toggle_expand " => __ ( " Toggle article expansion (combined mode) " ),
2013-03-21 12:57:36 +00:00
" toggle_widescreen " => __ ( " Toggle widescreen mode " ),
" toggle_embed_original " => __ ( " Toggle embed original " )),
2012-12-28 11:42:02 +00:00
__ ( " Article selection " ) => array (
" select_all " => __ ( " Select all articles " ),
" select_unread " => __ ( " Select unread " ),
" select_marked " => __ ( " Select starred " ),
" select_published " => __ ( " Select published " ),
" select_invert " => __ ( " Invert selection " ),
" select_none " => __ ( " Deselect everything " )),
__ ( " Feed " ) => array (
" feed_refresh " => __ ( " Refresh current feed " ),
" feed_unhide_read " => __ ( " Un/hide read feeds " ),
" feed_subscribe " => __ ( " Subscribe to feed " ),
" feed_edit " => __ ( " Edit feed " ),
" feed_catchup " => __ ( " Mark as read " ),
" feed_reverse " => __ ( " Reverse headlines " ),
2012-12-30 09:40:59 +00:00
" feed_debug_update " => __ ( " Debug feed update " ),
2012-12-28 11:42:02 +00:00
" catchup_all " => __ ( " Mark all feeds as read " ),
2013-03-12 05:52:45 +00:00
" cat_toggle_collapse " => __ ( " Un/collapse current category " ),
2013-03-30 10:28:13 +00:00
" toggle_combined_mode " => __ ( " Toggle combined mode " ),
" toggle_cdm_expanded " => __ ( " Toggle auto expand in combined mode " )),
2012-12-28 11:42:02 +00:00
__ ( " Go to " ) => array (
" goto_all " => __ ( " All articles " ),
" goto_fresh " => __ ( " Fresh " ),
" goto_marked " => __ ( " Starred " ),
" goto_published " => __ ( " Published " ),
" goto_tagcloud " => __ ( " Tag cloud " ),
" goto_prefs " => __ ( " Preferences " )),
__ ( " Other " ) => array (
" create_label " => __ ( " Create label " ),
" create_filter " => __ ( " Create filter " ),
" collapse_sidebar " => __ ( " Un/collapse sidebar " ),
" help_dialog " => __ ( " Show help dialog " ))
);
2013-04-18 08:27:34 +00:00
foreach ( PluginHost :: getInstance () -> get_hooks ( PluginHost :: HOOK_HOTKEY_INFO ) as $plugin ) {
2013-04-02 07:05:17 +00:00
$hotkeys = $plugin -> hook_hotkey_info ( $hotkeys );
}
2012-12-28 11:42:02 +00:00
return $hotkeys ;
}
2013-04-17 12:23:15 +00:00
function get_hotkeys_map () {
2012-12-27 18:30:11 +00:00
$hotkeys = array (
2012-12-28 06:46:53 +00:00
// "navigation" => array(
" k " => " next_feed " ,
" j " => " prev_feed " ,
" n " => " next_article " ,
" p " => " prev_article " ,
2013-01-22 08:52:52 +00:00
" (38)|up " => " prev_article " ,
" (40)|down " => " next_article " ,
2013-02-28 16:21:06 +00:00
// "^(38)|Ctrl-up" => "prev_article_noscroll",
// "^(40)|Ctrl-down" => "next_article_noscroll",
2013-01-22 08:52:52 +00:00
" (191)|/ " => " search_dialog " ,
2012-12-28 06:46:53 +00:00
// "article" => array(
" s " => " toggle_mark " ,
2013-03-18 16:59:48 +00:00
" *s " => " toggle_publ " ,
2012-12-28 06:46:53 +00:00
" u " => " toggle_unread " ,
2013-03-18 16:59:48 +00:00
" *t " => " edit_tags " ,
" *d " => " dismiss_selected " ,
" *x " => " dismiss_read " ,
2012-12-28 06:46:53 +00:00
" o " => " open_in_new_window " ,
" c p " => " catchup_below " ,
" c n " => " catchup_above " ,
2013-03-18 16:59:48 +00:00
" *n " => " article_scroll_down " ,
" *p " => " article_scroll_up " ,
2013-03-19 15:13:56 +00:00
" *(38)|Shift+up " => " article_scroll_up " ,
" *(40)|Shift+down " => " article_scroll_down " ,
2013-03-18 16:59:48 +00:00
" a *w " => " toggle_widescreen " ,
2013-03-21 12:57:36 +00:00
" a e " => " toggle_embed_original " ,
2012-12-28 06:46:53 +00:00
" e " => " email_article " ,
2013-01-23 09:39:36 +00:00
" a q " => " close_article " ,
2012-12-28 06:46:53 +00:00
// "article_selection" => array(
" a a " => " select_all " ,
" a u " => " select_unread " ,
2013-03-18 16:59:48 +00:00
" a *u " => " select_marked " ,
2012-12-28 06:46:53 +00:00
" a p " => " select_published " ,
" a i " => " select_invert " ,
" a n " => " select_none " ,
// "feed" => array(
" f r " => " feed_refresh " ,
" f a " => " feed_unhide_read " ,
" f s " => " feed_subscribe " ,
" f e " => " feed_edit " ,
" f q " => " feed_catchup " ,
" f x " => " feed_reverse " ,
2013-03-18 16:59:48 +00:00
" f *d " => " feed_debug_update " ,
" f *c " => " toggle_combined_mode " ,
2013-03-30 10:28:13 +00:00
" f c " => " toggle_cdm_expanded " ,
2013-03-18 16:59:48 +00:00
" *q " => " catchup_all " ,
2012-12-28 06:46:53 +00:00
" x " => " cat_toggle_collapse " ,
// "goto" => array(
" g a " => " goto_all " ,
" g f " => " goto_fresh " ,
" g s " => " goto_marked " ,
" g p " => " goto_published " ,
" g t " => " goto_tagcloud " ,
2013-03-18 16:59:48 +00:00
" g *p " => " goto_prefs " ,
2012-12-28 06:46:53 +00:00
// "other" => array(
2013-01-22 09:00:20 +00:00
" (9)|Tab " => " select_article_cursor " , // tab
2012-12-28 06:46:53 +00:00
" c l " => " create_label " ,
" c f " => " create_filter " ,
" c s " => " collapse_sidebar " ,
2013-01-22 09:00:20 +00:00
" ^(191)|Ctrl+/ " => " help_dialog " ,
2012-12-27 18:30:11 +00:00
);
2013-04-17 14:34:18 +00:00
if ( get_pref ( 'COMBINED_DISPLAY_MODE' )) {
2013-02-28 16:21:06 +00:00
$hotkeys [ " ^(38)|Ctrl-up " ] = " prev_article_noscroll " ;
$hotkeys [ " ^(40)|Ctrl-down " ] = " next_article_noscroll " ;
}
2013-04-18 08:27:34 +00:00
foreach ( PluginHost :: getInstance () -> get_hooks ( PluginHost :: HOOK_HOTKEY_MAP ) as $plugin ) {
2012-12-28 06:46:53 +00:00
$hotkeys = $plugin -> hook_hotkey_map ( $hotkeys );
}
$prefixes = array ();
foreach ( array_keys ( $hotkeys ) as $hotkey ) {
$pair = explode ( " " , $hotkey , 2 );
if ( count ( $pair ) > 1 && ! in_array ( $pair [ 0 ], $prefixes )) {
array_push ( $prefixes , $pair [ 0 ]);
}
}
return array ( $prefixes , $hotkeys );
2012-12-27 18:30:11 +00:00
}
2013-04-17 12:23:15 +00:00
function make_runtime_info () {
2010-11-23 10:03:36 +00:00
$data = array ();
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT MAX(id) AS mid, COUNT(*) AS nf FROM
2009-02-02 12:24:32 +00:00
ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"] );
2010-11-23 10:03:36 +00:00
$max_feed_id = db_fetch_result ( $result , 0 , " mid " );
$num_feeds = db_fetch_result ( $result , 0 , " nf " );
2009-02-02 12:24:32 +00:00
2010-11-23 10:03:36 +00:00
$data [ " max_feed_id " ] = ( int ) $max_feed_id ;
$data [ " num_feeds " ] = ( int ) $num_feeds ;
2010-11-10 11:23:26 +00:00
2013-04-17 12:23:15 +00:00
$data [ 'last_article_id' ] = getLastArticleId ();
2013-04-17 14:34:18 +00:00
$data [ 'cdm_expanded' ] = get_pref ( 'CDM_EXPANDED' );
2010-11-10 18:56:28 +00:00
2013-03-21 14:01:42 +00:00
$data [ 'dep_ts' ] = calculate_dep_timestamp ();
2013-03-25 12:07:39 +00:00
$data [ 'reload_on_ts_change' ] = ! defined ( '_NO_RELOAD_ON_TS_CHANGE' );
2013-03-21 14:01:42 +00:00
2011-04-12 15:33:12 +00:00
if ( file_exists ( LOCK_DIRECTORY . " /update_daemon.lock " )) {
2010-11-10 11:23:26 +00:00
$data [ 'daemon_is_running' ] = ( int ) file_is_locked ( " update_daemon.lock " );
2007-07-16 13:05:29 +00:00
2007-10-04 05:44:13 +00:00
if ( time () - $_SESSION [ " daemon_stamp_check " ] > 30 ) {
2007-07-16 13:05:29 +00:00
2010-11-10 10:14:44 +00:00
$stamp = ( int ) @ file_get_contents ( LOCK_DIRECTORY . " /update_daemon.stamp " );
2007-09-30 03:13:27 +00:00
2007-07-16 13:05:29 +00:00
if ( $stamp ) {
2007-10-04 05:44:13 +00:00
$stamp_delta = time () - $stamp ;
if ( $stamp_delta > 1800 ) {
2007-09-28 03:06:44 +00:00
$stamp_check = 0 ;
2007-07-16 13:05:29 +00:00
} else {
2007-09-28 03:06:44 +00:00
$stamp_check = 1 ;
$_SESSION [ " daemon_stamp_check " ] = time ();
2007-07-16 13:05:29 +00:00
}
2010-11-10 11:23:26 +00:00
$data [ 'daemon_stamp_ok' ] = $stamp_check ;
2007-09-28 03:06:44 +00:00
2007-07-16 13:05:29 +00:00
$stamp_fmt = date ( " Y.m.d, G:i " , $stamp );
2010-11-10 11:23:26 +00:00
$data [ 'daemon_stamp' ] = $stamp_fmt ;
2007-07-16 13:05:29 +00:00
}
}
2006-05-23 09:08:16 +00:00
}
2007-07-16 13:05:29 +00:00
2010-11-23 07:30:36 +00:00
if ( $_SESSION [ " last_version_check " ] + 86400 + rand ( - 1000 , 1000 ) < time ()) {
2013-04-17 12:23:15 +00:00
$new_version_details = @ check_for_update ();
2007-01-27 11:32:59 +00:00
2010-11-23 07:30:36 +00:00
$data [ 'new_version_available' ] = ( int ) ( $new_version_details != false );
2007-01-27 11:32:59 +00:00
$_SESSION [ " last_version_check " ] = time ();
2012-08-23 16:23:19 +00:00
$_SESSION [ " version_data " ] = $new_version_details ;
2007-01-27 11:32:59 +00:00
}
2010-11-10 11:23:26 +00:00
return $data ;
2006-05-23 08:59:00 +00:00
}
2006-06-19 08:59:24 +00:00
2013-04-17 14:34:18 +00:00
function search_to_sql ( $search ) {
2006-06-19 08:59:24 +00:00
2006-08-01 07:54:46 +00:00
$search_query_part = " " ;
2006-07-31 07:50:34 +00:00
2011-07-31 02:31:40 +00:00
$keywords = explode ( " " , $search );
2006-08-01 07:54:46 +00:00
$query_keywords = array ();
2013-07-31 10:53:34 +00:00
$search_words = array ();
2006-07-31 07:50:34 +00:00
2011-03-05 07:02:49 +00:00
foreach ( $keywords as $k ) {
if ( strpos ( $k , " - " ) === 0 ) {
$k = substr ( $k , 1 );
$not = " NOT " ;
} else {
$not = " " ;
2006-08-01 07:54:46 +00:00
}
2006-07-31 07:50:34 +00:00
2011-07-31 02:31:40 +00:00
$commandpair = explode ( " : " , mb_strtolower ( $k ), 2 );
2011-04-19 11:41:44 +00:00
2013-04-04 12:52:25 +00:00
switch ( $commandpair [ 0 ]) {
case " title " :
if ( $commandpair [ 1 ]) {
array_push ( $query_keywords , " ( $not (LOWER(ttrss_entries.title) LIKE '% " .
2013-04-17 14:34:18 +00:00
db_escape_string ( mb_strtolower ( $commandpair [ 1 ])) . " %')) " );
2013-04-09 12:30:45 +00:00
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER('% $k %')
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( '%$k%' )) " );
2013-07-31 10:53:34 +00:00
array_push ( $search_words , $k );
2013-04-04 12:52:25 +00:00
}
break ;
case " author " :
if ( $commandpair [ 1 ]) {
array_push ( $query_keywords , " ( $not (LOWER(author) LIKE '% " .
2013-04-17 14:34:18 +00:00
db_escape_string ( mb_strtolower ( $commandpair [ 1 ])) . " %')) " );
2013-04-09 12:30:45 +00:00
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER('% $k %')
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( '%$k%' )) " );
2013-07-31 10:53:34 +00:00
array_push ( $search_words , $k );
2013-04-04 12:52:25 +00:00
}
break ;
case " note " :
if ( $commandpair [ 1 ]) {
if ( $commandpair [ 1 ] == " true " )
array_push ( $query_keywords , " ( $not (note IS NOT NULL AND note != '')) " );
else if ( $commandpair [ 1 ] == " false " )
array_push ( $query_keywords , " ( $not (note IS NULL OR note = '')) " );
else
array_push ( $query_keywords , " ( $not (LOWER(note) LIKE '% " .
2013-04-17 14:34:18 +00:00
db_escape_string ( mb_strtolower ( $commandpair [ 1 ])) . " %')) " );
2013-04-09 12:30:45 +00:00
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER('% $k %')
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( '%$k%' )) " );
2013-07-31 10:53:34 +00:00
if ( ! $not ) array_push ( $search_words , $k );
2013-04-04 12:52:25 +00:00
}
break ;
case " star " :
2011-04-19 11:41:44 +00:00
2013-04-04 12:52:25 +00:00
if ( $commandpair [ 1 ]) {
if ( $commandpair [ 1 ] == " true " )
array_push ( $query_keywords , " ( $not (marked = true)) " );
else
array_push ( $query_keywords , " ( $not (marked = false)) " );
2013-04-09 12:30:45 +00:00
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER('% $k %')
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( '%$k%' )) " );
2013-07-31 10:53:34 +00:00
if ( ! $not ) array_push ( $search_words , $k );
2013-04-04 12:52:25 +00:00
}
break ;
case " pub " :
if ( $commandpair [ 1 ]) {
if ( $commandpair [ 1 ] == " true " )
array_push ( $query_keywords , " ( $not (published = true)) " );
else
array_push ( $query_keywords , " ( $not (published = false)) " );
2011-04-19 11:41:44 +00:00
2013-04-09 12:30:45 +00:00
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER('% $k %')
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( '%$k%' )) " );
2013-07-31 10:53:34 +00:00
if ( ! $not ) array_push ( $search_words , $k );
2013-04-04 12:52:25 +00:00
}
break ;
default :
if ( strpos ( $k , " @ " ) === 0 ) {
2006-07-31 07:50:34 +00:00
2013-04-17 14:34:18 +00:00
$user_tz_string = get_pref ( 'USER_TIMEZONE' , $_SESSION [ 'uid' ]);
2013-04-04 12:52:25 +00:00
$orig_ts = strtotime ( substr ( $k , 1 ));
$k = date ( " Y-m-d " , convert_timestamp ( $orig_ts , $user_tz_string , 'UTC' ));
2011-03-17 16:05:28 +00:00
2013-04-04 12:52:25 +00:00
//$k = date("Y-m-d", strtotime(substr($k, 1)));
2011-04-19 11:41:44 +00:00
2013-04-04 12:52:25 +00:00
array_push ( $query_keywords , " ( " . SUBSTRING_FOR_DATE . " (updated,1,LENGTH(' $k ')) $not = ' $k ') " );
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER('% $k %')
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( '%$k%' )) " );
2013-07-31 10:53:34 +00:00
if ( ! $not ) array_push ( $search_words , $k );
2013-04-04 12:52:25 +00:00
}
2006-08-01 07:54:46 +00:00
}
}
$search_query_part = implode ( " AND " , $query_keywords );
2013-07-31 10:53:34 +00:00
return array ( $search_query_part , $search_words );
2006-08-01 07:54:46 +00:00
}
2013-04-17 14:34:18 +00:00
function getParentCategories ( $cat , $owner_uid ) {
2012-10-09 15:09:50 +00:00
$rv = array ();
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT parent_cat FROM ttrss_feed_categories
2012-10-09 15:09:50 +00:00
WHERE id = '$cat' AND parent_cat IS NOT NULL AND owner_uid = $owner_uid " );
while ( $line = db_fetch_assoc ( $result )) {
array_push ( $rv , $line [ " parent_cat " ]);
2013-04-17 14:34:18 +00:00
$rv = array_merge ( $rv , getParentCategories ( $line [ " parent_cat " ], $owner_uid ));
2012-10-09 15:09:50 +00:00
}
return $rv ;
}
2013-04-17 14:34:18 +00:00
function getChildCategories ( $cat , $owner_uid ) {
2012-08-13 16:53:45 +00:00
$rv = array ();
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT id FROM ttrss_feed_categories
2012-08-13 16:53:45 +00:00
WHERE parent_cat = '$cat' AND owner_uid = $owner_uid " );
while ( $line = db_fetch_assoc ( $result )) {
array_push ( $rv , $line [ " id " ]);
2013-04-17 14:34:18 +00:00
$rv = array_merge ( $rv , getChildCategories ( $line [ " id " ], $owner_uid ));
2012-08-13 16:53:45 +00:00
}
return $rv ;
}
2011-08-11 22:51:00 +00:00
2013-07-11 09:48:39 +00:00
function queryFeedHeadlines ( $feed , $limit , $view_mode , $cat_view , $search , $search_mode , $override_order = false , $offset = 0 , $owner_uid = 0 , $filter = false , $since_id = 0 , $include_children = false , $ignore_vfeed_group = false , $override_strategy = false , $override_vfeed = false ) {
2007-08-09 13:36:32 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2007-01-19 08:52:05 +00:00
2010-11-05 14:16:29 +00:00
$ext_tables_part = " " ;
2013-07-31 10:53:34 +00:00
$search_words = array ();
2010-11-05 14:16:29 +00:00
2006-08-01 07:54:46 +00:00
if ( $search ) {
2010-11-12 18:44:19 +00:00
if ( SPHINX_ENABLED ) {
$ids = join ( " , " , @ sphinx_search ( $search , 0 , 500 ));
2011-03-17 16:05:28 +00:00
if ( $ids )
2010-11-12 18:44:19 +00:00
$search_query_part = " ref_id IN ( $ids ) AND " ;
else
$search_query_part = " ref_id = -1 AND " ;
} else {
2013-07-31 10:53:34 +00:00
list ( $search_query_part , $search_words ) = search_to_sql ( $search );
2010-11-12 18:44:19 +00:00
$search_query_part .= " AND " ;
2011-03-17 16:05:28 +00:00
}
2006-07-31 07:50:34 +00:00
2006-06-19 08:59:24 +00:00
} else {
$search_query_part = " " ;
}
2011-04-18 09:04:24 +00:00
if ( $filter ) {
2012-09-03 11:05:43 +00:00
if ( DB_TYPE == " pgsql " ) {
$query_strategy_part .= " AND updated > NOW() - INTERVAL '14 days' " ;
} else {
$query_strategy_part .= " AND updated > DATE_SUB(NOW(), INTERVAL 14 DAY) " ;
}
$override_order = " updated DESC " ;
2013-04-17 14:34:18 +00:00
$filter_query_part = filter_to_sql ( $filter , $owner_uid );
2012-10-23 12:58:07 +00:00
// Try to check if SQL regexp implementation chokes on a valid regexp
2013-05-19 05:54:48 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT true AS true_val FROM ttrss_entries,
2013-05-19 05:54:48 +00:00
ttrss_user_entries , ttrss_feeds
2012-10-23 12:58:07 +00:00
WHERE $filter_query_part LIMIT 1 " , false);
2013-02-20 05:34:00 +00:00
if ( $result ) {
$test = db_fetch_result ( $result , 0 , " true_val " );
2012-10-23 12:58:07 +00:00
2013-02-20 05:34:00 +00:00
if ( ! $test ) {
$filter_query_part = " false AND " ;
} else {
$filter_query_part .= " AND " ;
}
2012-10-23 12:58:07 +00:00
} else {
2013-02-20 05:34:00 +00:00
$filter_query_part = " false AND " ;
2012-10-23 12:58:07 +00:00
}
2011-04-18 09:04:24 +00:00
} else {
$filter_query_part = " " ;
}
2011-09-09 08:11:56 +00:00
if ( $since_id ) {
$since_id_part = " ttrss_entries.id > $since_id AND " ;
} else {
$since_id_part = " " ;
}
2006-06-19 08:59:24 +00:00
$view_query_part = " " ;
2011-03-17 16:05:28 +00:00
2013-03-29 05:46:38 +00:00
if ( $view_mode == " adaptive " ) {
2006-06-19 08:59:24 +00:00
if ( $search ) {
$view_query_part = " " ;
} else if ( $feed != - 1 ) {
2012-08-13 16:53:45 +00:00
2013-04-17 14:34:18 +00:00
$unread = getFeedUnread ( $feed , $cat_view );
2013-03-25 17:33:06 +00:00
2013-03-25 18:41:22 +00:00
if ( $cat_view && $feed > 0 && $include_children )
2013-04-17 14:34:18 +00:00
$unread += getCategoryChildrenUnread ( $feed );
2013-03-25 17:33:06 +00:00
2013-03-25 18:41:22 +00:00
if ( $unread > 0 )
$view_query_part = " unread = true AND " ;
2013-03-25 17:33:06 +00:00
2006-06-19 08:59:24 +00:00
}
}
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
if ( $view_mode == " marked " ) {
$view_query_part = " marked = true AND " ;
}
2010-11-03 21:24:18 +00:00
2013-03-27 17:35:16 +00:00
if ( $view_mode == " has_note " ) {
$view_query_part = " (note IS NOT NULL AND note != '') AND " ;
}
2010-11-03 21:24:18 +00:00
if ( $view_mode == " published " ) {
$view_query_part = " published = true AND " ;
}
2013-03-26 10:47:54 +00:00
if ( $view_mode == " unread " && $feed != - 6 ) {
2006-06-19 08:59:24 +00:00
$view_query_part = " unread = true AND " ;
}
2009-01-19 03:52:33 +00:00
2006-06-19 08:59:24 +00:00
if ( $limit > 0 ) {
$limit_query_part = " LIMIT " . $limit ;
2011-03-17 16:05:28 +00:00
}
2006-06-19 08:59:24 +00:00
2012-09-09 12:05:59 +00:00
$allow_archived = false ;
2006-06-19 08:59:24 +00:00
$vfeed_query_part = " " ;
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
// override query strategy and enable feed display when searching globally
if ( $search && $search_mode == " all_feeds " ) {
2012-09-24 08:01:42 +00:00
$query_strategy_part = " true " ;
2011-03-17 16:05:28 +00:00
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
2009-12-29 20:35:31 +00:00
/* tags */
2012-09-02 10:11:28 +00:00
} else if ( ! is_numeric ( $feed )) {
2012-09-24 08:01:42 +00:00
$query_strategy_part = " true " ;
2006-06-19 08:59:24 +00:00
$vfeed_query_part = " (SELECT title FROM ttrss_feeds WHERE
id = feed_id ) as feed_title , " ;
2012-09-24 08:01:42 +00:00
} else if ( $search && $search_mode == " this_cat " ) {
2011-03-17 16:05:28 +00:00
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
2006-08-01 04:13:48 +00:00
2012-09-24 08:01:42 +00:00
if ( $feed > 0 ) {
if ( $include_children ) {
2013-04-17 14:34:18 +00:00
$subcats = getChildCategories ( $feed , $owner_uid );
2012-09-24 08:01:42 +00:00
array_push ( $subcats , $feed );
$cats_qpart = join ( " , " , $subcats );
} else {
$cats_qpart = $feed ;
2006-06-19 08:59:24 +00:00
}
2011-03-17 16:05:28 +00:00
2012-09-24 08:01:42 +00:00
$query_strategy_part = " ttrss_feeds.cat_id IN ( $cats_qpart ) " ;
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
} else {
2012-09-24 08:01:42 +00:00
$query_strategy_part = " ttrss_feeds.cat_id IS NULL " ;
2006-06-19 08:59:24 +00:00
}
2011-03-17 16:05:28 +00:00
2009-12-28 14:23:01 +00:00
} else if ( $feed > 0 ) {
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
if ( $cat_view ) {
2006-08-01 13:18:05 +00:00
2006-06-19 08:59:24 +00:00
if ( $feed > 0 ) {
2012-08-13 17:25:46 +00:00
if ( $include_children ) {
# sub-cats
2013-04-17 14:34:18 +00:00
$subcats = getChildCategories ( $feed , $owner_uid );
2012-08-13 17:25:46 +00:00
2012-09-24 08:01:42 +00:00
array_push ( $subcats , $feed );
$query_strategy_part = " cat_id IN ( " .
2012-08-13 17:25:46 +00:00
implode ( " , " , $subcats ) . " ) " ;
2012-09-24 08:01:42 +00:00
2012-08-13 16:53:45 +00:00
} else {
2012-08-13 17:25:46 +00:00
$query_strategy_part = " cat_id = ' $feed ' " ;
2012-08-13 16:53:45 +00:00
}
2006-06-19 08:59:24 +00:00
} else {
$query_strategy_part = " cat_id IS NULL " ;
}
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
2006-08-01 13:18:05 +00:00
2011-03-17 16:05:28 +00:00
} else {
2010-11-10 09:05:55 +00:00
$query_strategy_part = " feed_id = ' $feed ' " ;
2006-06-19 08:59:24 +00:00
}
2010-09-09 18:08:17 +00:00
} else if ( $feed == 0 && ! $cat_view ) { // archive virtual feed
2009-12-28 14:23:01 +00:00
$query_strategy_part = " feed_id IS NULL " ;
2012-09-09 12:05:59 +00:00
$allow_archived = true ;
2010-09-09 18:08:17 +00:00
} else if ( $feed == 0 && $cat_view ) { // uncategorized
2012-05-31 14:48:42 +00:00
$query_strategy_part = " cat_id IS NULL AND feed_id IS NOT NULL " ;
2010-09-09 18:08:17 +00:00
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
2006-06-19 08:59:24 +00:00
} else if ( $feed == - 1 ) { // starred virtual feed
$query_strategy_part = " marked = true " ;
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
2012-10-15 06:14:54 +00:00
$allow_archived = true ;
2013-03-26 05:02:23 +00:00
if ( ! $override_order ) {
2013-03-28 16:44:43 +00:00
$override_order = " last_marked DESC, date_entered DESC, updated DESC " ;
2013-03-26 05:02:23 +00:00
}
2013-03-17 11:32:44 +00:00
2009-01-18 18:03:07 +00:00
} else if ( $feed == - 2 ) { // published virtual feed OR labels category
if ( ! $cat_view ) {
$query_strategy_part = " published = true " ;
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
2012-09-09 12:05:59 +00:00
$allow_archived = true ;
2012-09-10 06:27:51 +00:00
2013-03-26 05:02:23 +00:00
if ( ! $override_order ) {
2013-03-28 16:44:43 +00:00
$override_order = " last_published DESC, date_entered DESC, updated DESC " ;
2013-03-26 05:02:23 +00:00
}
2009-01-18 18:03:07 +00:00
} else {
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
$ext_tables_part = " ,ttrss_labels2,ttrss_user_labels2 " ;
2011-03-17 16:05:28 +00:00
2009-01-18 18:03:07 +00:00
$query_strategy_part = " ttrss_labels2.id = ttrss_user_labels2.label_id AND
ttrss_user_labels2 . article_id = ref_id " ;
}
2012-08-27 06:08:11 +00:00
} else if ( $feed == - 6 ) { // recently read
2012-08-27 06:14:07 +00:00
$query_strategy_part = " unread = false AND last_read IS NOT NULL " ;
2012-08-27 06:08:11 +00:00
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
2012-10-15 06:14:54 +00:00
$allow_archived = true ;
2012-09-10 06:27:51 +00:00
if ( ! $override_order ) $override_order = " last_read DESC " ;
2013-07-11 09:48:39 +00:00
/* } else if ( $feed == - 7 ) { // shared
$query_strategy_part = " uuid != '' " ;
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
$allow_archived = true ; */
2007-08-23 07:23:27 +00:00
} else if ( $feed == - 3 ) { // fresh virtual feed
2010-11-27 09:22:28 +00:00
$query_strategy_part = " unread = true AND score >= 0 " ;
2007-08-23 07:23:27 +00:00
2013-04-17 14:34:18 +00:00
$intl = get_pref ( " FRESH_ARTICLE_MAX_AGE " , $owner_uid );
2007-08-23 08:05:40 +00:00
2007-08-23 07:23:27 +00:00
if ( DB_TYPE == " pgsql " ) {
2013-03-27 09:34:04 +00:00
$query_strategy_part .= " AND date_entered > NOW() - INTERVAL ' $intl hour' " ;
2007-08-23 07:23:27 +00:00
} else {
2013-03-27 09:34:04 +00:00
$query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL $intl HOUR) " ;
2007-08-23 07:23:27 +00:00
}
2009-01-18 14:16:31 +00:00
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
} else if ( $feed == - 4 ) { // all articles virtual feed
2013-04-04 05:01:17 +00:00
$allow_archived = true ;
2009-01-18 14:16:31 +00:00
$query_strategy_part = " true " ;
2007-08-09 12:45:30 +00:00
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
2013-03-27 05:40:07 +00:00
} else if ( $feed <= LABEL_BASE_INDEX ) { // labels
$label_id = feed_to_label_id ( $feed );
2007-05-15 05:59:22 +00:00
2009-01-18 08:28:42 +00:00
$query_strategy_part = " label_id = ' $label_id ' AND
ttrss_labels2 . id = ttrss_user_labels2 . label_id AND
ttrss_user_labels2 . article_id = ref_id " ;
2007-05-15 05:59:22 +00:00
2006-06-19 08:59:24 +00:00
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
2009-01-18 08:28:42 +00:00
$ext_tables_part = " ,ttrss_labels2,ttrss_user_labels2 " ;
2012-10-15 06:14:54 +00:00
$allow_archived = true ;
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
} else {
2012-10-15 06:14:54 +00:00
$query_strategy_part = " true " ;
2006-06-19 08:59:24 +00:00
}
2006-08-01 04:52:32 +00:00
2013-04-03 12:06:54 +00:00
$order_by = " score DESC, date_entered DESC, updated DESC " ;
2006-08-01 05:04:31 +00:00
2013-03-25 18:45:40 +00:00
if ( $view_mode == " unread_first " ) {
2013-03-25 19:01:40 +00:00
$order_by = " unread DESC, $order_by " ;
2013-03-25 18:45:40 +00:00
}
2006-08-01 05:04:31 +00:00
if ( $override_order ) {
$order_by = $override_order ;
}
2011-03-17 16:05:28 +00:00
2013-07-11 09:48:39 +00:00
if ( $override_strategy ) {
$query_strategy_part = $override_strategy ;
}
if ( $override_vfeed ) {
$vfeed_query_part = $override_vfeed ;
}
2006-06-19 08:59:24 +00:00
$feed_title = " " ;
2009-12-29 20:35:31 +00:00
if ( $search ) {
2012-09-24 08:01:42 +00:00
$feed_title = T_sprintf ( " Search results: %s " , $search );
2009-12-29 20:35:31 +00:00
} else {
2006-06-19 08:59:24 +00:00
if ( $cat_view ) {
2013-04-17 14:34:18 +00:00
$feed_title = getCategoryTitle ( $feed );
2006-06-19 08:59:24 +00:00
} else {
2011-08-11 22:51:00 +00:00
if ( is_numeric ( $feed ) && $feed > 0 ) {
2013-04-25 12:27:33 +00:00
$result = db_query ( " SELECT title,site_url,last_error,last_updated
2009-12-29 20:35:31 +00:00
FROM ttrss_feeds WHERE id = '$feed' AND owner_uid = $owner_uid " );
2011-03-17 16:05:28 +00:00
2009-12-29 20:35:31 +00:00
$feed_title = db_fetch_result ( $result , 0 , " title " );
$feed_site_url = db_fetch_result ( $result , 0 , " site_url " );
$last_error = db_fetch_result ( $result , 0 , " last_error " );
2013-04-25 12:27:33 +00:00
$last_updated = db_fetch_result ( $result , 0 , " last_updated " );
2009-12-29 20:35:31 +00:00
} else {
2013-04-17 14:34:18 +00:00
$feed_title = getFeedTitle ( $feed );
2011-03-17 16:05:28 +00:00
}
2006-08-01 07:54:46 +00:00
}
2006-06-19 08:59:24 +00:00
}
2013-07-07 17:57:06 +00:00
2013-07-10 12:55:55 +00:00
$content_query_part = " content, content AS content_preview, " ;
2007-10-30 10:25:46 +00:00
2012-09-02 10:11:28 +00:00
if ( is_numeric ( $feed )) {
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
if ( $feed >= 0 ) {
$feed_kind = " Feeds " ;
} else {
$feed_kind = " Labels " ;
}
2011-03-17 16:05:28 +00:00
2007-02-21 07:17:46 +00:00
if ( $limit_query_part ) {
$offset_query_part = " OFFSET $offset " ;
}
2012-10-27 20:41:51 +00:00
// proper override_order applied above
2013-04-17 14:34:18 +00:00
if ( $vfeed_query_part && ! $ignore_vfeed_group && get_pref ( 'VFEED_GROUP_BY_FEED' , $owner_uid )) {
2008-04-30 00:36:00 +00:00
if ( ! $override_order ) {
2011-03-17 16:05:28 +00:00
$order_by = " ttrss_feeds.title, $order_by " ;
2012-10-27 20:41:51 +00:00
} else {
$order_by = " ttrss_feeds.title, $override_order " ;
2008-04-30 03:37:56 +00:00
}
2008-04-30 00:36:00 +00:00
}
2012-09-09 12:05:59 +00:00
if ( ! $allow_archived ) {
2009-12-28 14:23:01 +00:00
$from_qpart = " ttrss_entries,ttrss_user_entries,ttrss_feeds $ext_tables_part " ;
2010-01-11 12:54:14 +00:00
$feed_check_qpart = " ttrss_user_entries.feed_id = ttrss_feeds.id AND " ;
2009-12-28 14:23:01 +00:00
} else {
2012-10-15 06:14:54 +00:00
$from_qpart = " ttrss_entries $ext_tables_part ,ttrss_user_entries
2009-12-28 14:23:01 +00:00
LEFT JOIN ttrss_feeds ON ( feed_id = ttrss_feeds . id ) " ;
}
2013-04-15 11:17:12 +00:00
if ( $vfeed_query_part )
$vfeed_query_part .= " favicon_avg_color, " ;
2011-03-17 16:05:28 +00:00
$query = " SELECT DISTINCT
2010-10-27 08:10:14 +00:00
date_entered ,
2006-09-26 06:44:05 +00:00
guid ,
2006-06-19 08:59:24 +00:00
ttrss_entries . id , ttrss_entries . title ,
2007-05-18 04:16:33 +00:00
updated ,
2011-11-11 08:27:10 +00:00
label_cache ,
tag_cache ,
2011-11-11 08:50:34 +00:00
always_display_enclosures ,
2011-11-14 07:55:57 +00:00
site_url ,
2009-03-21 20:11:58 +00:00
note ,
2011-11-14 07:51:12 +00:00
num_comments ,
comments ,
2011-11-27 08:08:39 +00:00
int_id ,
2013-07-11 12:20:24 +00:00
uuid ,
2013-07-31 06:30:14 +00:00
lang ,
2013-03-19 18:41:10 +00:00
hide_images ,
2009-12-28 17:46:11 +00:00
unread , feed_id , marked , published , link , last_read , orig_feed_id ,
2013-03-17 11:32:44 +00:00
last_marked , last_published ,
2006-06-19 08:59:24 +00:00
$vfeed_query_part
$content_query_part
2008-04-30 07:20:33 +00:00
author , score
2006-06-19 08:59:24 +00:00
FROM
2009-12-28 14:23:01 +00:00
$from_qpart
2006-06-19 08:59:24 +00:00
WHERE
2009-12-28 14:23:01 +00:00
$feed_check_qpart
2006-06-19 08:59:24 +00:00
ttrss_user_entries . ref_id = ttrss_entries . id AND
2007-08-09 13:36:32 +00:00
ttrss_user_entries . owner_uid = '$owner_uid' AND
2006-06-19 08:59:24 +00:00
$search_query_part
2011-04-18 09:04:24 +00:00
$filter_query_part
2006-06-19 08:59:24 +00:00
$view_query_part
2011-09-09 08:11:56 +00:00
$since_id_part
2006-06-19 08:59:24 +00:00
$query_strategy_part ORDER BY $order_by
2007-02-21 07:17:46 +00:00
$limit_query_part $offset_query_part " ;
2008-09-18 03:20:11 +00:00
2009-12-29 15:49:27 +00:00
if ( $_REQUEST [ " debug " ]) print $query ;
2008-09-18 03:20:11 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( $query );
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
} else {
// browsing by tag
2011-03-17 16:05:28 +00:00
2011-08-11 22:51:00 +00:00
$select_qpart = " SELECT DISTINCT " .
" date_entered, " .
" guid, " .
" note, " .
" ttrss_entries.id as id, " .
" title, " .
" updated, " .
" unread, " .
" feed_id, " .
" orig_feed_id, " .
" marked, " .
2011-11-14 07:55:57 +00:00
" num_comments, " .
" comments, " .
2011-11-11 08:50:34 +00:00
" tag_cache, " .
" label_cache, " .
2011-08-11 22:51:00 +00:00
" link, " .
2013-07-31 06:30:14 +00:00
" lang, " .
2013-07-11 12:20:24 +00:00
" uuid, " .
2011-08-11 22:51:00 +00:00
" last_read, " .
2013-03-21 08:12:01 +00:00
" (SELECT hide_images FROM ttrss_feeds WHERE id = feed_id) AS hide_images, " .
2013-03-17 11:32:44 +00:00
" last_marked, last_published, " .
2011-09-09 08:11:56 +00:00
$since_id_part .
2011-08-11 22:51:00 +00:00
$vfeed_query_part .
$content_query_part .
" score " ;
2006-06-19 08:59:24 +00:00
$feed_kind = " Tags " ;
2011-08-11 22:51:00 +00:00
$all_tags = explode ( " , " , $feed );
if ( $search_mode == 'any' ) {
$tag_sql = " tag_name in ( " . implode ( " , " , array_map ( " db_quote " , $all_tags )) . " ) " ;
$from_qpart = " FROM ttrss_entries,ttrss_user_entries,ttrss_tags " ;
$where_qpart = " WHERE " .
" ref_id = ttrss_entries.id AND " .
" ttrss_user_entries.owner_uid = $owner_uid AND " .
" post_int_id = int_id AND $tag_sql AND " .
$view_query_part .
$search_query_part .
$query_strategy_part . " ORDER BY $order_by " .
$limit_query_part ;
2011-03-17 16:05:28 +00:00
2011-08-11 22:51:00 +00:00
} else {
$i = 1 ;
$sub_selects = array ();
$sub_ands = array ();
foreach ( $all_tags as $term ) {
array_push ( $sub_selects , " (SELECT post_int_id from ttrss_tags WHERE tag_name = " . db_quote ( $term ) . " AND owner_uid = $owner_uid ) as A $i " );
$i ++ ;
}
if ( $i > 2 ) {
$x = 1 ;
$y = 2 ;
do {
array_push ( $sub_ands , " A $x .post_int_id = A $y .post_int_id " );
$x ++ ;
$y ++ ;
} while ( $y < $i );
}
array_push ( $sub_ands , " A1.post_int_id = ttrss_user_entries.int_id and ttrss_user_entries.owner_uid = $owner_uid " );
array_push ( $sub_ands , " ttrss_user_entries.ref_id = ttrss_entries.id " );
$from_qpart = " FROM " . implode ( " , " , $sub_selects ) . " , ttrss_user_entries, ttrss_entries " ;
$where_qpart = " WHERE " . implode ( " AND " , $sub_ands );
}
// error_log("TAG SQL: " . $tag_sql);
// $tag_sql = "tag_name = '$feed'"; DEFAULT way
// error_log("[". $select_qpart . "][" . $from_qpart . "][" .$where_qpart . "]");
2013-04-17 14:34:18 +00:00
$result = db_query ( $select_qpart . $from_qpart . $where_qpart );
2006-06-19 08:59:24 +00:00
}
2013-07-31 10:53:34 +00:00
return array ( $result , $feed_title , $feed_site_url , $last_error , $last_updated , $search_words );
2011-03-17 16:05:28 +00:00
2006-06-19 08:59:24 +00:00
}
2013-07-31 10:53:34 +00:00
function sanitize ( $str , $force_remove_images = false , $owner = false , $site_url = false , $highlight_words = false ) {
2009-11-22 19:56:05 +00:00
if ( ! $owner ) $owner = $_SESSION [ " uid " ];
2010-11-11 06:52:19 +00:00
$res = trim ( $str ); if ( ! $res ) return '' ;
2010-11-30 15:35:24 +00:00
if ( strpos ( $res , " href= " ) === false )
$res = rewrite_urls ( $res );
2010-11-26 10:13:09 +00:00
2010-11-10 20:24:00 +00:00
$charset_hack = ' < head >
< meta http - equiv = " Content-Type " content = " text/html; charset=utf-8 " />
</ head > ' ;
2010-11-11 06:52:19 +00:00
$res = trim ( $res ); if ( ! $res ) return '' ;
2010-11-10 20:24:00 +00:00
libxml_use_internal_errors ( true );
$doc = new DOMDocument ();
$doc -> loadHTML ( $charset_hack . $res );
$xpath = new DOMXPath ( $doc );
2011-03-17 16:05:28 +00:00
2010-11-10 20:24:00 +00:00
$entries = $xpath -> query ( '(//a[@href]|//img[@src])' );
foreach ( $entries as $entry ) {
if ( $site_url ) {
2013-06-27 15:18:23 +00:00
if ( $entry -> hasAttribute ( 'href' ))
2010-11-10 20:24:00 +00:00
$entry -> setAttribute ( 'href' ,
rewrite_relative_url ( $site_url , $entry -> getAttribute ( 'href' )));
2011-03-17 16:05:28 +00:00
2013-03-19 05:25:36 +00:00
if ( $entry -> hasAttribute ( 'src' )) {
$src = rewrite_relative_url ( $site_url , $entry -> getAttribute ( 'src' ));
$cached_filename = CACHE_DIR . '/images/' . sha1 ( $src ) . '.png' ;
if ( file_exists ( $cached_filename )) {
$src = SELF_URL_PATH . '/image.php?hash=' . sha1 ( $src );
}
$entry -> setAttribute ( 'src' , $src );
}
2013-03-19 18:41:10 +00:00
if ( $entry -> nodeName == 'img' ) {
2013-04-17 14:34:18 +00:00
if (( $owner && get_pref ( " STRIP_IMAGES " , $owner )) ||
2013-03-28 06:49:47 +00:00
$force_remove_images || $_SESSION [ " bw_limit " ]) {
2013-03-19 18:41:10 +00:00
$p = $doc -> createElement ( 'p' );
$a = $doc -> createElement ( 'a' );
$a -> setAttribute ( 'href' , $entry -> getAttribute ( 'src' ));
$a -> appendChild ( new DOMText ( $entry -> getAttribute ( 'src' )));
$a -> setAttribute ( 'target' , '_blank' );
$p -> appendChild ( $a );
$entry -> parentNode -> replaceChild ( $p , $entry );
}
}
2010-11-10 20:24:00 +00:00
}
2010-11-11 12:54:30 +00:00
if ( strtolower ( $entry -> nodeName ) == " a " ) {
2010-11-21 18:50:11 +00:00
$entry -> setAttribute ( " target " , " _blank " );
2010-11-11 12:54:30 +00:00
}
2008-08-01 03:38:17 +00:00
}
2011-03-17 16:05:28 +00:00
2013-03-19 07:13:57 +00:00
$entries = $xpath -> query ( '//iframe' );
foreach ( $entries as $entry ) {
2013-03-20 18:18:56 +00:00
$entry -> setAttribute ( 'sandbox' , 'allow-scripts' );
2013-03-19 07:13:57 +00:00
}
2008-08-01 03:38:17 +00:00
Added other allowed elements to sanitize()
The following html elements are now kept when sanitizing entries: aside, bdi, bdo, caption, col, colgroup, figure, figcaption, mark, ruby, rp, rt, samp, time. Most of them are new in HTML5. Based on the list at https://developer.mozilla.org/en-US/docs/HTML/HTML5/HTML5_element_list
2013-04-05 12:56:14 +00:00
$allowed_elements = array ( 'a' , 'address' , 'audio' , 'article' , 'aside' ,
'b' , 'bdi' , 'bdo' , 'big' , 'blockquote' , 'body' , 'br' ,
'caption' , 'cite' , 'center' , 'code' , 'col' , 'colgroup' ,
'data' , 'dd' , 'del' , 'details' , 'div' , 'dl' , 'font' ,
'dt' , 'em' , 'footer' , 'figure' , 'figcaption' ,
'h1' , 'h2' , 'h3' , 'h4' , 'h5' , 'h6' , 'header' , 'html' , 'i' ,
'img' , 'ins' , 'kbd' , 'li' , 'main' , 'mark' , 'nav' , 'noscript' ,
2013-04-08 09:02:01 +00:00
'ol' , 'p' , 'pre' , 'q' , 'ruby' , 'rp' , 'rt' , 's' , 'samp' , 'section' ,
'small' , 'source' , 'span' , 'strike' , 'strong' , 'sub' , 'summary' ,
Added other allowed elements to sanitize()
The following html elements are now kept when sanitizing entries: aside, bdi, bdo, caption, col, colgroup, figure, figcaption, mark, ruby, rp, rt, samp, time. Most of them are new in HTML5. Based on the list at https://developer.mozilla.org/en-US/docs/HTML/HTML5/HTML5_element_list
2013-04-05 12:56:14 +00:00
'sup' , 'table' , 'tbody' , 'td' , 'tfoot' , 'th' , 'thead' , 'time' ,
2013-03-27 10:44:29 +00:00
'tr' , 'track' , 'tt' , 'u' , 'ul' , 'var' , 'wbr' , 'video' );
if ( $_SESSION [ 'hasSandbox' ]) $allowed_elements [] = 'iframe' ;
$disallowed_attributes = array ( 'id' , 'style' , 'class' );
2013-04-18 08:27:34 +00:00
foreach ( PluginHost :: getInstance () -> get_hooks ( PluginHost :: HOOK_SANITIZE ) as $plugin ) {
$retval = $plugin -> hook_sanitize ( $doc , $site_url , $allowed_elements , $disallowed_attributes );
if ( is_array ( $retval )) {
$doc = $retval [ 0 ];
$allowed_elements = $retval [ 1 ];
$disallowed_attributes = $retval [ 2 ];
} else {
$doc = $retval ;
2013-03-19 14:58:42 +00:00
}
}
2013-03-18 20:00:13 +00:00
$doc -> removeChild ( $doc -> firstChild ); //remove doctype
2013-03-27 10:44:29 +00:00
$doc = strip_harmful_tags ( $doc , $allowed_elements , $disallowed_attributes );
2013-07-31 10:53:34 +00:00
if ( $highlight_words ) {
foreach ( $highlight_words as $word ) {
$elements = $xpath -> query ( '//*[contains(.,"' . $word . '")]' );
foreach ( $elements as $element ) {
foreach ( $element -> childNodes as $child ) {
if ( ! $child instanceof DomText ) continue ;
$fragment = $doc -> createDocumentFragment ();
$text = $child -> textContent ;
$stubs = array ();
while (( $pos = stripos ( $text , $word )) !== false ) {
$fragment -> appendChild ( new DomText ( substr ( $text , 0 , $pos )));
$word = substr ( $text , $pos , strlen ( $word ));
$highlight = $doc -> createElement ( 'span' );
$highlight -> appendChild ( new DomText ( $word ));
$highlight -> setAttribute ( 'class' , 'highlight' );
$fragment -> appendChild ( $highlight );
$text = substr ( $text , $pos + strlen ( $word ));
}
if ( ! empty ( $text )) $fragment -> appendChild ( new DomText ( $text ));
$element -> replaceChild ( $fragment , $child );
}
}
}
}
2013-03-18 20:00:13 +00:00
$res = $doc -> saveHTML ();
2013-07-31 10:53:34 +00:00
2013-03-19 07:13:57 +00:00
return $res ;
}
2013-03-17 11:53:42 +00:00
2013-03-27 10:44:29 +00:00
function strip_harmful_tags ( $doc , $allowed_elements , $disallowed_attributes ) {
2013-04-25 20:02:13 +00:00
$xpath = new DOMXPath ( $doc );
$entries = $xpath -> query ( '//*' );
2013-03-17 11:53:42 +00:00
2013-03-19 07:13:57 +00:00
foreach ( $entries as $entry ) {
if ( ! in_array ( $entry -> nodeName , $allowed_elements )) {
$entry -> parentNode -> removeChild ( $entry );
}
if ( $entry -> hasAttributes ()) {
2013-03-25 05:17:14 +00:00
$attrs_to_remove = array ();
foreach ( $entry -> attributes as $attr ) {
2013-03-19 07:13:57 +00:00
if ( strpos ( $attr -> nodeName , 'on' ) === 0 ) {
2013-03-25 05:17:14 +00:00
array_push ( $attrs_to_remove , $attr );
2013-03-19 07:13:57 +00:00
}
if ( in_array ( $attr -> nodeName , $disallowed_attributes )) {
2013-03-25 05:17:14 +00:00
array_push ( $attrs_to_remove , $attr );
2013-03-19 07:13:57 +00:00
}
}
2013-03-25 05:17:14 +00:00
foreach ( $attrs_to_remove as $attr ) {
$entry -> removeAttributeNode ( $attr );
}
2013-03-19 07:13:57 +00:00
}
}
return $doc ;
2006-08-05 12:07:21 +00:00
}
2006-08-20 04:27:48 +00:00
2013-04-17 12:23:15 +00:00
function check_for_update () {
2010-11-23 07:30:36 +00:00
if ( CHECK_FOR_NEW_VERSION && $_SESSION [ 'access_level' ] >= 10 ) {
2013-03-16 11:10:29 +00:00
$version_url = " http://tt-rss.org/version.php?ver= " . VERSION .
" &iid= " . sha1 ( SELF_URL_PATH );
2006-08-20 04:27:48 +00:00
2010-11-23 07:30:36 +00:00
$version_data = @ fetch_file_contents ( $version_url );
2006-08-20 04:27:48 +00:00
2010-11-23 07:30:36 +00:00
if ( $version_data ) {
$version_data = json_decode ( $version_data , true );
2011-03-17 16:05:28 +00:00
if ( $version_data && $version_data [ 'version' ]) {
2013-05-08 15:21:17 +00:00
if ( version_compare ( VERSION_STATIC , $version_data [ 'version' ]) == - 1 ) {
2010-11-25 11:57:32 +00:00
return $version_data ;
2010-11-23 07:30:36 +00:00
}
}
2007-08-23 12:46:53 +00:00
}
2006-08-20 04:27:48 +00:00
}
2010-11-23 07:30:36 +00:00
return false ;
2006-08-20 04:27:48 +00:00
}
2006-09-19 04:14:27 +00:00
2013-04-17 14:34:18 +00:00
function catchupArticlesById ( $ids , $cmode , $owner_uid = false ) {
2007-10-29 15:41:46 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2010-03-24 10:28:20 +00:00
if ( count ( $ids ) == 0 ) return ;
2006-09-19 04:14:27 +00:00
$tmp_ids = array ();
foreach ( $ids as $id ) {
array_push ( $tmp_ids , " ref_id = ' $id ' " );
}
$ids_qpart = join ( " OR " , $tmp_ids );
if ( $cmode == 0 ) {
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries SET
2006-09-19 04:14:27 +00:00
unread = false , last_read = NOW ()
2007-10-29 15:41:46 +00:00
WHERE ( $ids_qpart ) AND owner_uid = $owner_uid " );
2006-09-19 04:14:27 +00:00
} else if ( $cmode == 1 ) {
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries SET
2006-09-19 04:14:27 +00:00
unread = true
2007-10-29 15:41:46 +00:00
WHERE ( $ids_qpart ) AND owner_uid = $owner_uid " );
2006-09-19 04:14:27 +00:00
} else {
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries SET
2006-09-19 04:14:27 +00:00
unread = NOT unread , last_read = NOW ()
2007-10-29 15:41:46 +00:00
WHERE ( $ids_qpart ) AND owner_uid = $owner_uid " );
2006-09-19 04:14:27 +00:00
}
2009-01-16 15:02:47 +00:00
/* update ccache */
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT DISTINCT feed_id FROM ttrss_user_entries
2009-01-16 15:02:47 +00:00
WHERE ( $ids_qpart ) AND owner_uid = $owner_uid " );
while ( $line = db_fetch_assoc ( $result )) {
2013-04-17 14:34:18 +00:00
ccache_update ( $line [ " feed_id " ], $owner_uid );
2009-01-16 15:02:47 +00:00
}
2006-09-19 04:14:27 +00:00
}
2013-04-17 14:34:18 +00:00
function get_article_tags ( $id , $owner_uid = 0 , $tag_cache = false ) {
2006-12-07 07:48:00 +00:00
2013-04-17 14:34:18 +00:00
$a_id = db_escape_string ( $id );
2006-12-07 07:48:00 +00:00
2007-08-09 16:34:53 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2011-03-17 16:05:28 +00:00
$query = " SELECT DISTINCT tag_name,
2007-05-20 01:53:11 +00:00
owner_uid as owner FROM
2006-12-07 07:48:00 +00:00
ttrss_tags WHERE post_int_id = ( SELECT int_id FROM ttrss_user_entries WHERE
2010-01-18 10:55:28 +00:00
ref_id = '$a_id' AND owner_uid = '$owner_uid' LIMIT 1 ) ORDER BY tag_name " ;
2006-12-07 07:48:00 +00:00
2011-03-17 16:05:28 +00:00
$tags = array ();
2010-01-18 10:55:28 +00:00
2012-07-06 10:37:03 +00:00
/* check cache first */
2010-11-09 19:41:13 +00:00
2012-07-06 10:37:03 +00:00
if ( $tag_cache === false ) {
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT tag_cache FROM ttrss_user_entries
2012-07-06 10:37:03 +00:00
WHERE ref_id = '$id' AND owner_uid = $owner_uid " );
2010-11-09 19:41:13 +00:00
2012-07-06 10:37:03 +00:00
$tag_cache = db_fetch_result ( $result , 0 , " tag_cache " );
}
2010-01-18 10:55:28 +00:00
2012-07-06 10:37:03 +00:00
if ( $tag_cache ) {
$tags = explode ( " , " , $tag_cache );
} else {
2010-11-09 19:41:13 +00:00
2012-07-06 10:37:03 +00:00
/* do it the hard way */
2010-11-09 19:41:13 +00:00
2013-04-17 14:34:18 +00:00
$tmp_result = db_query ( $query );
2010-11-09 19:41:13 +00:00
2012-07-06 10:37:03 +00:00
while ( $tmp_line = db_fetch_assoc ( $tmp_result )) {
array_push ( $tags , $tmp_line [ " tag_name " ]);
}
2010-11-09 19:41:13 +00:00
2012-07-06 10:37:03 +00:00
/* update the cache */
2010-11-09 19:41:13 +00:00
2013-04-17 14:34:18 +00:00
$tags_str = db_escape_string ( join ( " , " , $tags ));
2010-01-18 10:55:28 +00:00
2013-04-17 14:34:18 +00:00
db_query ( " UPDATE ttrss_user_entries
2012-07-06 10:37:03 +00:00
SET tag_cache = '$tags_str' WHERE ref_id = '$id'
AND owner_uid = $owner_uid " );
2006-12-07 07:48:00 +00:00
}
return $tags ;
}
2006-12-07 09:27:34 +00:00
function trim_array ( $array ) {
$tmp = $array ;
2011-12-11 14:21:34 +00:00
array_walk ( $tmp , 'trim' );
2006-12-07 09:27:34 +00:00
return $tmp ;
}
2006-12-25 07:53:57 +00:00
function tag_is_valid ( $tag ) {
2007-02-20 08:33:17 +00:00
if ( $tag == '' ) return false ;
if ( preg_match ( " /^[0-9]* $ / " , $tag )) return false ;
2009-06-01 07:29:13 +00:00
if ( mb_strlen ( $tag ) > 250 ) return false ;
2007-02-20 08:33:17 +00:00
2008-11-22 06:20:45 +00:00
if ( function_exists ( 'iconv' )) {
$tag = iconv ( " utf-8 " , " utf-8 " , $tag );
}
2007-02-20 08:33:17 +00:00
if ( ! $tag ) return false ;
return true ;
2006-12-25 07:53:57 +00:00
}
2013-04-17 12:23:15 +00:00
function render_login_form () {
2013-04-12 10:14:11 +00:00
header ( 'Cache-Control: public' );
2013-03-21 19:47:44 +00:00
require_once " login_form.php " ;
2012-09-10 15:01:06 +00:00
exit ;
2007-03-01 09:43:54 +00:00
}
2007-03-02 21:10:11 +00:00
function format_warning ( $msg , $id = " " ) {
2010-01-14 20:09:23 +00:00
global $link ;
2011-03-17 16:05:28 +00:00
return " <div class= \" warning \" id= \" $id\ " >
2013-07-10 09:09:12 +00:00
< span >< img src = \ " images/alert.png \" ></span><span> $msg </span></div> " ;
2007-03-02 19:16:45 +00:00
}
2011-01-15 21:40:47 +00:00
function format_notice ( $msg , $id = " " ) {
2010-01-14 20:09:23 +00:00
global $link ;
2011-03-17 16:05:28 +00:00
return " <div class= \" notice \" id= \" $id\ " >
2013-07-10 09:09:12 +00:00
< span >< img src = \ " images/information.png \" ></span><span> $msg </span></div> " ;
2007-03-02 19:16:45 +00:00
}
2011-01-15 21:40:47 +00:00
function format_error ( $msg , $id = " " ) {
2010-01-14 20:09:23 +00:00
global $link ;
2011-03-17 16:05:28 +00:00
return " <div class= \" error \" id= \" $id\ " >
2013-07-10 09:09:12 +00:00
< span >< img src = \ " images/alert.png \" ></span><span> $msg </span></div> " ;
2007-05-05 11:03:42 +00:00
}
2007-03-05 12:50:46 +00:00
function print_notice ( $msg ) {
return print format_notice ( $msg );
}
function print_warning ( $msg ) {
return print format_warning ( $msg );
}
2007-05-05 11:03:42 +00:00
function print_error ( $msg ) {
return print format_error ( $msg );
}
2007-03-05 12:50:46 +00:00
function T_sprintf () {
$args = func_get_args ();
return vsprintf ( __ ( array_shift ( $args )), $args );
}
2013-04-17 14:34:18 +00:00
function format_inline_player ( $url , $ctype ) {
2009-10-06 08:58:57 +00:00
$entry = " " ;
2013-03-20 05:00:21 +00:00
$url = htmlspecialchars ( $url );
2011-03-17 16:05:28 +00:00
if ( strpos ( $ctype , " audio/ " ) === 0 ) {
2010-11-30 09:40:23 +00:00
if ( $_SESSION [ " hasAudio " ] && ( strpos ( $ctype , " ogg " ) !== false ||
2013-04-16 11:44:38 +00:00
$_SESSION [ " hasMp3 " ])) {
2010-11-30 09:40:23 +00:00
2013-06-14 05:46:27 +00:00
$entry .= " <audio preload= \" none \" controls>
2013-01-15 07:23:27 +00:00
< source type = \ " $ctype\ " src = \ " $url\ " ></ source >
2011-03-17 16:05:28 +00:00
</ audio > " ;
2010-11-30 09:40:23 +00:00
} else {
2011-03-17 16:05:28 +00:00
$entry .= " <object type= \" application/x-shockwave-flash \"
2011-04-18 09:54:46 +00:00
data = \ " lib/button/musicplayer.swf?song_url= $url\ "
2011-03-17 16:05:28 +00:00
width = \ " 17 \" height= \" 17 \" style='float : left; margin-right : 5px;'>
< param name = \ " movie \"
2011-04-18 09:54:46 +00:00
value = \ " lib/button/musicplayer.swf?song_url= $url\ " />
2011-03-17 16:05:28 +00:00
</ object > " ;
2010-11-30 09:40:23 +00:00
}
2013-01-15 07:23:27 +00:00
2013-03-20 05:00:21 +00:00
if ( $entry ) $entry .= " <a target= \" _blank \"
href = \ " $url\ " > " . basename( $url ) . " </ a > " ;
2013-01-15 07:23:27 +00:00
return $entry ;
2009-10-06 08:58:57 +00:00
}
2013-01-15 07:23:27 +00:00
return " " ;
/* $filename = substr ( $url , strrpos ( $url , " / " ) + 1 );
2010-11-30 09:40:23 +00:00
$entry .= " <a target= \" _blank \" href= \" " . htmlspecialchars ( $url ) . " \" > " .
2013-01-15 07:23:27 +00:00
$filename . " ( " . $ctype . " ) " . " </a> " ; */
2010-11-30 09:40:23 +00:00
2009-10-06 08:58:57 +00:00
}
2013-04-17 14:34:18 +00:00
function format_article ( $id , $mark_as_read = true , $zoom_mode = false , $owner_uid = false ) {
2012-06-07 06:09:07 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2007-05-15 05:59:22 +00:00
2011-03-18 09:46:22 +00:00
$rv = array ();
$rv [ 'id' ] = $id ;
2007-05-17 12:42:14 +00:00
/* we can figure out feed_id from article id anyway , why do we
2013-04-17 14:34:18 +00:00
* pass feed_id here ? let ' s ignore the argument : ( */
2007-05-17 12:42:14 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT feed_id FROM ttrss_user_entries
2007-05-17 12:42:14 +00:00
WHERE ref_id = '$id' " );
2009-12-28 14:23:01 +00:00
$feed_id = ( int ) db_fetch_result ( $result , 0 , " feed_id " );
2007-05-17 12:42:14 +00:00
2011-03-18 09:46:22 +00:00
$rv [ 'feed_id' ] = $feed_id ;
//if (!$zoom_mode) { print "<article id='$id'><![CDATA["; };
2007-05-15 05:59:22 +00:00
if ( $mark_as_read ) {
2013-04-17 14:34:18 +00:00
$result = db_query ( " UPDATE ttrss_user_entries
2011-03-17 16:05:28 +00:00
SET unread = false , last_read = NOW ()
2012-06-07 06:09:07 +00:00
WHERE ref_id = '$id' AND owner_uid = $owner_uid " );
2009-01-16 13:11:19 +00:00
2013-04-17 14:34:18 +00:00
ccache_update ( $feed_id , $owner_uid );
2007-05-15 05:59:22 +00:00
}
2013-07-31 06:30:14 +00:00
$result = db_query ( " SELECT id,title,link,content,feed_id,comments,int_id,lang,
2008-04-21 04:53:19 +00:00
" .SUBSTRING_FOR_DATE. " ( updated , 1 , 16 ) as updated ,
2010-11-10 20:24:00 +00:00
( SELECT site_url FROM ttrss_feeds WHERE id = feed_id ) as site_url ,
2013-03-21 11:37:08 +00:00
( SELECT hide_images FROM ttrss_feeds WHERE id = feed_id ) as hide_images ,
2013-04-07 23:28:03 +00:00
( SELECT always_display_enclosures FROM ttrss_feeds WHERE id = feed_id ) as always_display_enclosures ,
2007-05-15 05:59:22 +00:00
num_comments ,
2011-11-11 08:27:10 +00:00
tag_cache ,
2009-03-21 20:11:58 +00:00
author ,
2009-12-28 17:25:16 +00:00
orig_feed_id ,
2013-07-10 12:55:55 +00:00
note
2007-05-15 05:59:22 +00:00
FROM ttrss_entries , ttrss_user_entries
2012-06-07 06:09:07 +00:00
WHERE id = '$id' AND ref_id = id AND owner_uid = $owner_uid " );
2007-05-15 05:59:22 +00:00
if ( $result ) {
$line = db_fetch_assoc ( $result );
2013-02-23 12:01:51 +00:00
$tag_cache = $line [ " tag_cache " ];
2013-04-17 14:34:18 +00:00
$line [ " tags " ] = get_article_tags ( $id , $owner_uid , $line [ " tag_cache " ]);
2013-02-23 12:01:51 +00:00
unset ( $line [ " tag_cache " ]);
2013-06-03 06:31:45 +00:00
$line [ " content " ] = sanitize ( $line [ " content " ],
sql_bool_to_bool ( $line [ 'hide_images' ]),
$owner_uid , $line [ " site_url " ]);
2013-02-23 12:01:51 +00:00
2013-04-18 08:27:34 +00:00
foreach ( PluginHost :: getInstance () -> get_hooks ( PluginHost :: HOOK_RENDER_ARTICLE ) as $p ) {
2013-02-23 12:01:51 +00:00
$line = $p -> hook_render_article ( $line );
}
2010-11-10 20:24:00 +00:00
2007-05-15 05:59:22 +00:00
$num_comments = $line [ " num_comments " ];
$entry_comments = " " ;
if ( $num_comments > 0 ) {
if ( $line [ " comments " ]) {
2012-10-21 21:22:44 +00:00
$comments_url = htmlspecialchars ( $line [ " comments " ]);
2007-05-15 05:59:22 +00:00
} else {
2012-10-21 21:22:44 +00:00
$comments_url = htmlspecialchars ( $line [ " link " ]);
2007-05-15 05:59:22 +00:00
}
2010-01-13 07:11:13 +00:00
$entry_comments = " <a target='_blank' href= \" $comments_url\ " > $num_comments comments </ a > " ;
2007-05-15 05:59:22 +00:00
} else {
if ( $line [ " comments " ] && $line [ " link " ] != $line [ " comments " ]) {
2012-10-21 21:22:44 +00:00
$entry_comments = " <a target='_blank' href= \" " . htmlspecialchars ( $line [ " comments " ]) . " \" >comments</a> " ;
2011-03-17 16:05:28 +00:00
}
2007-05-15 05:59:22 +00:00
}
2008-09-05 07:36:57 +00:00
if ( $zoom_mode ) {
header ( " Content-Type: text/html " );
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " <html><head>
2008-10-21 12:03:08 +00:00
< meta http - equiv = \ " Content-Type \" content= \" text/html; charset=utf-8 \" />
2008-09-05 07:36:57 +00:00
< title > Tiny Tiny RSS - " . $line["title"] . " </ title >
2013-05-19 17:22:01 +00:00
< link rel = \ " stylesheet \" type= \" text/css \" href= \" css/tt-rss.css \" >
2013-07-11 18:14:48 +00:00
< script type = \ " text/javascript \" >
function openSelectedAttachment ( elem ) {
try {
var url = elem [ elem . selectedIndex ] . value ;
if ( url ) {
window . open ( url );
elem . selectedIndex = 0 ;
}
} catch ( e ) {
exception_error ( \ " openSelectedAttachment \" , e);
}
}
</ script >
2013-03-24 16:22:16 +00:00
</ head >< body id = \ " ttrssZoom \" > " ;
2008-09-05 07:36:57 +00:00
}
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " <div class= \" postReply \" id= \" POST- $id\ " > " ;
2010-11-19 18:20:59 +00:00
2013-02-06 14:24:02 +00:00
$rv [ 'content' ] .= " <div class= \" postHeader \" id= \" POSTHDR- $id\ " > " ;
2007-05-15 05:59:22 +00:00
$entry_author = $line [ " author " ];
if ( $entry_author ) {
2008-02-07 16:11:34 +00:00
$entry_author = __ ( " - " ) . $entry_author ;
2007-05-15 05:59:22 +00:00
}
2013-04-17 14:34:18 +00:00
$parsed_updated = make_local_datetime ( $line [ " updated " ], true ,
2012-06-07 06:09:07 +00:00
$owner_uid , true );
2010-11-07 15:14:48 +00:00
2013-07-30 21:22:13 +00:00
if ( ! $zoom_mode )
$rv [ 'content' ] .= " <div class= \" postDate \" > $parsed_updated </div> " ;
2007-05-15 05:59:22 +00:00
if ( $line [ " link " ]) {
2012-09-15 14:07:01 +00:00
$rv [ 'content' ] .= " <div class='postTitle'><a target='_blank'
2013-03-23 06:49:50 +00:00
title = \ " " . htmlspecialchars ( $line [ 'title' ]) . " \"
2011-03-17 16:05:28 +00:00
href = \ " " .
2012-10-21 21:19:06 +00:00
htmlspecialchars ( $line [ " link " ]) . " \" > " .
2013-03-22 08:42:48 +00:00
$line [ " title " ] . " </a> " .
" <span class='author'> $entry_author </span></div> " ;
2007-05-15 05:59:22 +00:00
} else {
2012-09-15 14:07:01 +00:00
$rv [ 'content' ] .= " <div class='postTitle'> " . $line [ " title " ] . " $entry_author </div> " ;
2007-05-15 05:59:22 +00:00
}
2013-07-30 21:22:13 +00:00
if ( $zoom_mode )
$rv [ 'content' ] .= " <div class= \" postDate \" > $parsed_updated </div> " ;
2013-02-23 12:01:51 +00:00
$tags_str = format_tags_string ( $line [ " tags " ], $id );
$tags_str_full = join ( " , " , $line [ " tags " ]);
2011-04-19 10:54:27 +00:00
if ( ! $tags_str_full ) $tags_str_full = __ ( " no tags " );
2007-08-10 16:53:05 +00:00
2007-05-15 05:59:22 +00:00
if ( ! $entry_comments ) $entry_comments = " " ; # placeholder
2012-06-14 16:47:30 +00:00
$rv [ 'content' ] .= " <div class='postTags' style='float : right'>
2013-03-20 21:59:08 +00:00
< img src = 'images/tag.png'
2010-01-14 16:02:45 +00:00
class = 'tagsPic' alt = 'Tags' title = 'Tags' >& nbsp ; " ;
2008-09-05 07:36:57 +00:00
if ( ! $zoom_mode ) {
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " <span id= \" ATSTR- $id\ " > $tags_str </ span >
2011-03-17 16:05:28 +00:00
< a title = \ " " . __ ( 'Edit tags for this article' ) . " \"
2010-11-05 21:47:02 +00:00
href = \ " # \" onclick= \" editArticleTags( $id , $feed_id ) \" >(+)</a> " ;
2008-10-22 07:54:38 +00:00
2011-04-19 10:54:27 +00:00
$rv [ 'content' ] .= " <div dojoType= \" dijit.Tooltip \"
id = \ " ATSTRTIP- $id\ " connectId = \ " ATSTR- $id\ "
position = \ " below \" > $tags_str_full </div> " ;
2013-04-18 08:27:34 +00:00
foreach ( PluginHost :: getInstance () -> get_hooks ( PluginHost :: HOOK_ARTICLE_BUTTON ) as $p ) {
2012-12-23 10:52:18 +00:00
$rv [ 'content' ] .= $p -> hook_article_button ( $line );
2010-11-25 09:05:48 +00:00
}
2009-12-15 10:36:53 +00:00
} else {
$tags_str = strip_tags ( $tags_str );
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " <span id= \" ATSTR- $id\ " > $tags_str </ span > " ;
2008-09-05 07:36:57 +00:00
}
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " </div> " ;
2013-04-09 12:46:56 +00:00
$rv [ 'content' ] .= " <div clear='both'> " ;
2013-04-18 08:27:34 +00:00
foreach ( PluginHost :: getInstance () -> get_hooks ( PluginHost :: HOOK_ARTICLE_LEFT_BUTTON ) as $p ) {
2013-04-09 12:46:56 +00:00
$rv [ 'content' ] .= $p -> hook_article_left_button ( $line );
}
$rv [ 'content' ] .= " $entry_comments </div> " ;
2007-05-15 05:59:22 +00:00
2009-12-28 17:25:16 +00:00
if ( $line [ " orig_feed_id " ]) {
2013-04-17 14:34:18 +00:00
$tmp_result = db_query ( " SELECT * FROM ttrss_archived_feeds
2009-12-28 17:25:16 +00:00
WHERE id = " . $line["orig_feed_id"] );
if ( db_num_rows ( $tmp_result ) != 0 ) {
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " <div clear='both'> " ;
$rv [ 'content' ] .= __ ( " Originally from: " );
2009-12-28 17:25:16 +00:00
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " " ;
2009-12-28 17:25:16 +00:00
$tmp_line = db_fetch_assoc ( $tmp_result );
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " <a target='_blank'
2009-12-28 17:25:16 +00:00
href = ' " . htmlspecialchars($tmp_line[' site_url ']) . "' > " .
$tmp_line [ 'title' ] . " </a> " ;
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " " ;
2009-12-28 17:25:16 +00:00
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " <a target='_blank' href=' " . htmlspecialchars ( $tmp_line [ 'feed_url' ]) . " '> " ;
2012-12-25 10:01:33 +00:00
$rv [ 'content' ] .= " <img title=' " . __ ( 'Feed URL' ) . " 'class='tinyFeedIcon' src='images/pub_set.svg'></a> " ;
2009-12-28 17:25:16 +00:00
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " </div> " ;
2009-12-28 17:25:16 +00:00
}
}
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " </div> " ;
2007-05-15 05:59:22 +00:00
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " <div id= \" POSTNOTE- $id\ " > " ;
2009-03-21 20:11:58 +00:00
if ( $line [ 'note' ]) {
2013-01-23 08:22:07 +00:00
$rv [ 'content' ] .= format_article_note ( $id , $line [ 'note' ], ! $zoom_mode );
2009-03-21 20:11:58 +00:00
}
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " </div> " ;
2009-03-21 20:11:58 +00:00
2013-07-31 07:57:11 +00:00
if ( ! $line [ 'lang' ]) $line [ 'lang' ] = 'en' ;
2013-07-31 06:30:14 +00:00
$rv [ 'content' ] .= " <div class= \" postContent \" lang= \" " . $line [ 'lang' ] . " \" > " ;
2010-11-29 17:25:51 +00:00
2013-02-23 12:01:51 +00:00
$rv [ 'content' ] .= $line [ " content " ];
2013-04-17 14:34:18 +00:00
$rv [ 'content' ] .= format_article_enclosures ( $id ,
2013-04-07 23:28:03 +00:00
sql_bool_to_bool ( $line [ " always_display_enclosures " ]),
$line [ " content " ],
sql_bool_to_bool ( $line [ " hide_images " ]));
2007-11-17 12:13:08 +00:00
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " </div> " ;
2010-11-09 17:57:23 +00:00
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " </div> " ;
2007-05-15 05:59:22 +00:00
}
2011-03-18 09:46:22 +00:00
if ( $zoom_mode ) {
$rv [ 'content' ] .= "
2013-03-24 16:22:16 +00:00
< div class = 'footer' >
2010-01-12 13:19:53 +00:00
< button onclick = \ " return window.close() \" > " .
__ ( " Close this window " ) . " </button></div> " ;
2011-03-18 09:46:22 +00:00
$rv [ 'content' ] .= " </body></html> " ;
2008-09-05 07:36:57 +00:00
}
2007-05-15 05:59:22 +00:00
2011-03-18 09:46:22 +00:00
return $rv ;
2007-05-15 05:59:22 +00:00
}
2011-12-13 12:23:31 +00:00
function print_checkpoint ( $n , $s ) {
2013-02-27 18:16:58 +00:00
$ts = microtime ( true );
2013-05-02 06:09:01 +00:00
echo sprintf ( " <!-- CP[ $n ] %.4f seconds --> \n " , $ts - $s );
2011-12-13 12:23:31 +00:00
return $ts ;
}
2007-05-15 05:59:22 +00:00
2011-12-13 12:23:31 +00:00
function sanitize_tag ( $tag ) {
$tag = trim ( $tag );
2007-11-21 10:34:06 +00:00
2011-12-13 12:23:31 +00:00
$tag = mb_strtolower ( $tag , 'utf-8' );
2011-03-18 09:55:45 +00:00
2011-12-13 12:23:31 +00:00
$tag = preg_replace ( '/[\'\"\+\>\<]/' , " " , $tag );
2007-05-18 04:16:33 +00:00
2011-12-13 12:23:31 +00:00
// $tag = str_replace('"', "", $tag);
// $tag = str_replace("+", " ", $tag);
$tag = str_replace ( " technorati tag: " , " " , $tag );
2007-05-15 07:37:10 +00:00
2011-12-13 12:23:31 +00:00
return $tag ;
}
2007-05-15 05:59:22 +00:00
2011-12-13 12:23:31 +00:00
function get_self_url_prefix () {
2012-12-09 09:32:09 +00:00
if ( strrpos ( SELF_URL_PATH , " / " ) === strlen ( SELF_URL_PATH ) - 1 ) {
return substr ( SELF_URL_PATH , 0 , strlen ( SELF_URL_PATH ) - 1 );
} else {
return SELF_URL_PATH ;
}
2011-12-13 12:23:31 +00:00
}
2008-05-17 04:26:56 +00:00
2008-01-26 05:33:59 +00:00
/**
* Compute the Mozilla Firefox feed adding URL from server HOST and REQUEST_URI .
*
* @ return string The Mozilla Firefox feed adding URL .
*/
function add_feed_url () {
2011-04-01 16:14:49 +00:00
//$url_path = ($_SERVER['HTTPS'] != "on" ? 'http://' : 'https://') . $_SERVER["HTTP_HOST"] . parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$url_path = get_self_url_prefix () .
2012-09-10 15:01:06 +00:00
" /public.php?op=subscribe&feed_url=%s " ;
2007-08-31 00:55:33 +00:00
return $url_path ;
2008-01-26 05:33:59 +00:00
} // function add_feed_url
2012-01-22 07:48:08 +00:00
function encrypt_password ( $pass , $salt = '' , $mode2 = false ) {
if ( $salt && $mode2 ) {
return " MODE2: " . hash ( 'sha256' , $salt . $pass );
} else if ( $salt ) {
return " SHA1X: " . sha1 ( " $salt : $pass " );
2007-09-12 03:56:22 +00:00
} else {
return " SHA1: " . sha1 ( $pass );
}
2008-01-26 05:33:59 +00:00
} // function encrypt_password
2013-04-17 14:34:18 +00:00
function load_filters ( $feed_id , $owner_uid , $action_id = false ) {
2008-04-30 10:12:41 +00:00
$filters = array ();
2013-04-17 14:34:18 +00:00
$cat_id = ( int ) getFeedCategory ( $feed_id );
2008-04-30 10:12:41 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT * FROM ttrss_filters2 WHERE
2013-03-31 12:14:42 +00:00
owner_uid = $owner_uid AND enabled = true ORDER BY order_id , title " );
2011-03-17 16:05:28 +00:00
2012-10-09 15:09:50 +00:00
$check_cats = join ( " , " , array_merge (
2013-04-17 14:34:18 +00:00
getParentCategories ( $cat_id , $owner_uid ),
2012-10-09 15:09:50 +00:00
array ( $cat_id )));
2012-07-06 10:37:03 +00:00
while ( $line = db_fetch_assoc ( $result )) {
2012-08-30 14:50:56 +00:00
$filter_id = $line [ " id " ];
2013-04-17 14:34:18 +00:00
$result2 = db_query ( " SELECT
2013-03-25 15:46:43 +00:00
r . reg_exp , r . inverse , r . feed_id , r . cat_id , r . cat_filter , t . name AS type_name
2012-08-30 14:50:56 +00:00
FROM ttrss_filters2_rules AS r ,
ttrss_filter_types AS t
WHERE
2012-10-09 15:09:50 +00:00
( cat_id IS NULL OR cat_id IN ( $check_cats )) AND
2012-08-30 14:50:56 +00:00
( feed_id IS NULL OR feed_id = '$feed_id' ) AND
filter_type = t . id AND filter_id = '$filter_id' " );
$rules = array ();
$actions = array ();
2011-12-27 08:52:33 +00:00
2012-08-30 14:50:56 +00:00
while ( $rule_line = db_fetch_assoc ( $result2 )) {
# print_r($rule_line);
2011-03-17 16:05:28 +00:00
2012-08-30 14:50:56 +00:00
$rule = array ();
$rule [ " reg_exp " ] = $rule_line [ " reg_exp " ];
$rule [ " type " ] = $rule_line [ " type_name " ];
2013-03-25 15:46:43 +00:00
$rule [ " inverse " ] = sql_bool_to_bool ( $rule_line [ " inverse " ]);
2012-08-30 14:50:56 +00:00
array_push ( $rules , $rule );
}
2013-04-17 14:34:18 +00:00
$result2 = db_query ( " SELECT a.action_param,t.name AS type_name
2012-08-30 14:50:56 +00:00
FROM ttrss_filters2_actions AS a ,
ttrss_filter_actions AS t
WHERE
action_id = t . id AND filter_id = '$filter_id' " );
while ( $action_line = db_fetch_assoc ( $result2 )) {
# print_r($action_line);
$action = array ();
$action [ " type " ] = $action_line [ " type_name " ];
$action [ " param " ] = $action_line [ " action_param " ];
array_push ( $actions , $action );
2012-07-06 10:37:03 +00:00
}
2010-01-20 09:29:28 +00:00
2012-08-30 14:50:56 +00:00
$filter = array ();
$filter [ " match_any_rule " ] = sql_bool_to_bool ( $line [ " match_any_rule " ]);
2013-03-25 15:46:43 +00:00
$filter [ " inverse " ] = sql_bool_to_bool ( $line [ " inverse " ]);
2012-08-30 14:50:56 +00:00
$filter [ " rules " ] = $rules ;
$filter [ " actions " ] = $actions ;
if ( count ( $rules ) > 0 && count ( $actions ) > 0 ) {
array_push ( $filters , $filter );
}
}
2012-07-06 10:37:03 +00:00
return $filters ;
2008-04-30 10:12:41 +00:00
}
2008-05-05 06:27:29 +00:00
function get_score_pic ( $score ) {
2011-03-17 16:05:28 +00:00
if ( $score > 100 ) {
return " score_high.png " ;
} else if ( $score > 0 ) {
2010-01-14 20:09:23 +00:00
return " score_half_high.png " ;
2008-08-11 07:09:25 +00:00
} else if ( $score < - 100 ) {
2010-01-14 20:09:23 +00:00
return " score_low.png " ;
2008-08-11 07:09:25 +00:00
} else if ( $score < 0 ) {
2010-01-14 20:09:23 +00:00
return " score_half_low.png " ;
2011-03-17 16:05:28 +00:00
} else {
2010-01-14 20:09:23 +00:00
return " score_neutral.png " ;
2008-05-05 06:27:29 +00:00
}
}
2008-05-16 05:17:49 +00:00
2008-10-26 16:53:46 +00:00
function feed_has_icon ( $id ) {
return is_file ( ICONS_DIR . " / $id .ico " ) && filesize ( ICONS_DIR . " / $id .ico " ) > 0 ;
}
2008-11-10 05:29:19 +00:00
2013-04-17 12:23:15 +00:00
function init_plugins () {
2013-04-18 08:27:34 +00:00
PluginHost :: getInstance () -> load ( PLUGINS , PluginHost :: KIND_ALL );
2012-12-23 10:52:18 +00:00
2013-04-17 10:23:35 +00:00
return true ;
2008-11-10 05:29:19 +00:00
}
2009-01-16 09:47:12 +00:00
2009-01-23 13:20:05 +00:00
function format_tags_string ( $tags , $id ) {
2013-05-02 06:20:56 +00:00
if ( ! is_array ( $tags ) || count ( $tags ) == 0 ) {
return __ ( " no tags " );
} else {
$maxtags = min ( 5 , count ( $tags ));
2009-01-23 13:20:05 +00:00
2013-05-02 06:20:56 +00:00
for ( $i = 0 ; $i < $maxtags ; $i ++ ) {
2013-05-31 17:37:14 +00:00
$tags_str .= " <a class= \" tag \" href= \" # \" onclick= \" viewfeed(' " . $tags [ $i ] . " ') \" > " . $tags [ $i ] . " </a>, " ;
2009-01-23 13:20:05 +00:00
}
2013-05-02 06:20:56 +00:00
$tags_str = mb_substr ( $tags_str , 0 , mb_strlen ( $tags_str ) - 2 );
2009-01-23 13:20:05 +00:00
2013-05-02 06:20:56 +00:00
if ( count ( $tags ) > $maxtags )
$tags_str .= " , … " ;
2009-01-23 13:20:05 +00:00
2013-05-02 06:20:56 +00:00
return $tags_str ;
2009-01-23 13:20:05 +00:00
}
}
2009-01-26 10:07:53 +00:00
function format_article_labels ( $labels , $id ) {
2013-04-27 08:20:45 +00:00
if ( ! is_array ( $labels )) return '' ;
2013-04-15 21:02:42 +00:00
2009-01-26 10:07:53 +00:00
$labels_str = " " ;
foreach ( $labels as $l ) {
2011-03-17 16:05:28 +00:00
$labels_str .= sprintf ( " <span class='hlLabelRef'
2009-01-26 10:07:53 +00:00
style = 'color : %s; background-color : %s' >% s </ span > " ,
$l [ 2 ], $l [ 3 ], $l [ 1 ]);
}
return $labels_str ;
}
2009-03-21 20:11:58 +00:00
2013-01-23 08:22:07 +00:00
function format_article_note ( $id , $note , $allow_edit = true ) {
2009-03-21 20:11:58 +00:00
2011-04-19 09:20:59 +00:00
$str = " <div class='articleNote' onclick= \" editArticleNote( $id ) \" >
< div class = 'noteEdit' onclick = \ " editArticleNote( $id ) \" > " .
2013-01-23 08:22:07 +00:00
( $allow_edit ? __ ( '(edit note)' ) : " " ) . " </div> $note </div> " ;
2009-03-21 20:11:58 +00:00
return $str ;
}
2009-12-24 12:36:02 +00:00
2009-12-28 09:04:21 +00:00
2013-04-17 14:34:18 +00:00
function get_feed_category ( $feed_cat , $parent_cat_id = false ) {
2012-08-15 11:03:40 +00:00
if ( $parent_cat_id ) {
$parent_qpart = " parent_cat = ' $parent_cat_id ' " ;
$parent_insert = " ' $parent_cat_id ' " ;
} else {
$parent_qpart = " parent_cat IS NULL " ;
$parent_insert = " NULL " ;
}
2013-04-17 12:23:15 +00:00
$result = db_query (
2012-08-15 11:03:40 +00:00
" SELECT id FROM ttrss_feed_categories
WHERE $parent_qpart AND title = '$feed_cat' AND owner_uid = " . $_SESSION["uid"] );
if ( db_num_rows ( $result ) == 0 ) {
return false ;
} else {
return db_fetch_result ( $result , 0 , " id " );
}
}
2013-04-17 14:34:18 +00:00
function add_feed_category ( $feed_cat , $parent_cat_id = false ) {
2010-11-09 10:28:10 +00:00
if ( ! $feed_cat ) return false ;
2013-04-17 14:34:18 +00:00
db_query ( " BEGIN " );
2010-11-07 20:30:05 +00:00
2012-08-15 11:03:40 +00:00
if ( $parent_cat_id ) {
$parent_qpart = " parent_cat = ' $parent_cat_id ' " ;
$parent_insert = " ' $parent_cat_id ' " ;
} else {
$parent_qpart = " parent_cat IS NULL " ;
$parent_insert = " NULL " ;
}
2013-04-02 05:03:35 +00:00
$feed_cat = mb_substr ( $feed_cat , 0 , 250 );
2013-04-17 12:23:15 +00:00
$result = db_query (
2010-11-07 20:30:05 +00:00
" SELECT id FROM ttrss_feed_categories
2012-08-15 11:03:40 +00:00
WHERE $parent_qpart AND title = '$feed_cat' AND owner_uid = " . $_SESSION["uid"] );
2010-11-07 20:30:05 +00:00
if ( db_num_rows ( $result ) == 0 ) {
2011-03-17 16:05:28 +00:00
2013-04-17 12:23:15 +00:00
$result = db_query (
2012-08-15 11:03:40 +00:00
" INSERT INTO ttrss_feed_categories (owner_uid,title,parent_cat)
VALUES ( '".$_SESSION["uid"]."' , '$feed_cat' , $parent_insert ) " );
2010-11-07 20:30:05 +00:00
2013-04-17 14:34:18 +00:00
db_query ( " COMMIT " );
2010-11-07 20:30:05 +00:00
return true ;
}
return false ;
2011-03-17 16:05:28 +00:00
}
2010-11-07 20:30:05 +00:00
2013-04-17 14:34:18 +00:00
function getArticleFeed ( $id ) {
$result = db_query ( " SELECT feed_id FROM ttrss_user_entries
2009-12-29 13:19:53 +00:00
WHERE ref_id = '$id' AND owner_uid = " . $_SESSION["uid"] );
2009-12-29 13:10:40 +00:00
if ( db_num_rows ( $result ) != 0 ) {
return db_fetch_result ( $result , 0 , " feed_id " );
} else {
return 0 ;
}
}
2010-01-13 09:48:49 +00:00
2010-11-07 12:14:08 +00:00
/**
* Fixes incomplete URLs by prepending " http:// " .
2010-11-07 14:45:50 +00:00
* Also replaces feed :// with http :// , and
* prepends a trailing slash if the url is a domain name only .
2010-11-07 12:14:08 +00:00
*
* @ param string $url Possibly incomplete URL
*
* @ return string Fixed URL .
*/
function fix_url ( $url ) {
if ( strpos ( $url , '://' ) === false ) {
$url = 'http://' . $url ;
2010-11-07 14:45:50 +00:00
} else if ( substr ( $url , 0 , 5 ) == 'feed:' ) {
$url = 'http:' . substr ( $url , 5 );
}
//prepend slash if the URL has no slash in it
// "http://www.example" -> "http://www.example/"
2010-11-10 21:18:41 +00:00
if ( strpos ( $url , '/' , strpos ( $url , ':' ) + 3 ) === false ) {
2010-11-07 14:45:50 +00:00
$url .= '/' ;
2010-11-07 12:14:08 +00:00
}
2010-11-20 13:23:23 +00:00
if ( $url != " http:/// " )
return $url ;
else
return '' ;
2010-11-07 12:14:08 +00:00
}
2010-01-13 09:48:49 +00:00
function validate_feed_url ( $url ) {
$parts = parse_url ( $url );
return ( $parts [ 'scheme' ] == 'http' || $parts [ 'scheme' ] == 'feed' || $parts [ 'scheme' ] == 'https' );
}
2010-01-13 15:31:51 +00:00
2013-04-17 14:34:18 +00:00
function get_article_enclosures ( $id ) {
2010-01-17 17:08:23 +00:00
2011-03-17 16:05:28 +00:00
$query = " SELECT * FROM ttrss_enclosures
2010-01-17 17:08:23 +00:00
WHERE post_id = '$id' AND content_url != '' " ;
$rv = array ();
2013-04-17 14:34:18 +00:00
$result = db_query ( $query );
2010-01-17 17:08:23 +00:00
2012-07-06 10:37:03 +00:00
if ( db_num_rows ( $result ) > 0 ) {
while ( $line = db_fetch_assoc ( $result )) {
array_push ( $rv , $line );
2010-01-17 17:08:23 +00:00
}
}
return $rv ;
}
2013-04-17 14:34:18 +00:00
function save_email_address ( $email ) {
2010-11-05 21:47:02 +00:00
// FIXME: implement persistent storage of emails
2011-03-17 16:05:28 +00:00
if ( ! $_SESSION [ 'stored_emails' ])
2010-11-05 21:47:02 +00:00
$_SESSION [ 'stored_emails' ] = array ();
if ( ! in_array ( $email , $_SESSION [ 'stored_emails' ]))
array_push ( $_SESSION [ 'stored_emails' ], $email );
}
2010-11-08 10:11:56 +00:00
2013-04-17 14:34:18 +00:00
function get_feed_access_key ( $feed_id , $is_cat , $owner_uid = false ) {
2010-11-08 10:11:56 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
$sql_is_cat = bool_to_sql_bool ( $is_cat );
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT access_key FROM ttrss_access_keys
2011-03-17 16:05:28 +00:00
WHERE feed_id = '$feed_id' AND is_cat = $sql_is_cat
2010-11-08 10:11:56 +00:00
AND owner_uid = " . $owner_uid );
if ( db_num_rows ( $result ) == 1 ) {
return db_fetch_result ( $result , 0 , " access_key " );
} else {
2013-04-17 14:34:18 +00:00
$key = db_escape_string ( sha1 ( uniqid ( rand (), true )));
2010-11-08 10:11:56 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " INSERT INTO ttrss_access_keys
2010-11-08 10:11:56 +00:00
( access_key , feed_id , is_cat , owner_uid )
VALUES ( '$key' , '$feed_id' , $sql_is_cat , '$owner_uid' ) " );
return $key ;
}
return false ;
}
2010-11-07 14:45:50 +00:00
2012-09-23 09:38:58 +00:00
function get_feeds_from_html ( $url , $content )
2010-11-07 14:45:50 +00:00
{
$url = fix_url ( $url );
$baseUrl = substr ( $url , 0 , strrpos ( $url , '/' ) + 1 );
2010-11-10 10:14:44 +00:00
libxml_use_internal_errors ( true );
2010-11-07 14:45:50 +00:00
$doc = new DOMDocument ();
2011-03-17 16:05:28 +00:00
$doc -> loadHTML ( $content );
2010-11-07 14:45:50 +00:00
$xpath = new DOMXPath ( $doc );
$entries = $xpath -> query ( '/html/head/link[@rel="alternate"]' );
$feedUrls = array ();
foreach ( $entries as $entry ) {
if ( $entry -> hasAttribute ( 'href' )) {
$title = $entry -> getAttribute ( 'title' );
if ( $title == '' ) {
$title = $entry -> getAttribute ( 'type' );
}
2010-11-10 22:13:34 +00:00
$feedUrl = rewrite_relative_url (
$baseUrl , $entry -> getAttribute ( 'href' )
);
2010-11-07 14:45:50 +00:00
$feedUrls [ $feedUrl ] = $title ;
}
}
return $feedUrls ;
}
2012-09-23 09:38:58 +00:00
function is_html ( $content ) {
2012-11-01 08:47:37 +00:00
return preg_match ( " /<html|DOCTYPE html/i " , substr ( $content , 0 , 20 )) !== 0 ;
2012-09-23 09:38:58 +00:00
}
2010-11-07 13:43:15 +00:00
2012-09-23 09:38:58 +00:00
function url_is_html ( $url , $login = false , $pass = false ) {
return is_html ( fetch_file_contents ( $url , false , $login , $pass ));
2010-11-07 13:43:15 +00:00
}
2010-11-09 15:10:22 +00:00
2013-04-17 14:34:18 +00:00
function print_label_select ( $name , $value , $attributes = " " ) {
2010-11-09 15:10:22 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT caption FROM ttrss_labels2
2010-11-09 15:10:22 +00:00
WHERE owner_uid = '".$_SESSION["uid"]."' ORDER BY caption " );
2011-03-17 16:05:28 +00:00
print " <select default= \" $value\ " name = \ " " . htmlspecialchars ( $name ) .
2010-11-20 11:10:26 +00:00
" \" $attributes onchange= \" labelSelectOnChange(this) \" > " ;
2010-11-09 15:10:22 +00:00
while ( $line = db_fetch_assoc ( $result )) {
$issel = ( $line [ " caption " ] == $value ) ? " selected= \" 1 \" " : " " ;
2010-11-20 11:10:26 +00:00
print " <option value= \" " . htmlspecialchars ( $line [ " caption " ]) . " \"
$issel > " . htmlspecialchars( $line["caption"] ) . " </ option > " ;
2010-11-09 15:10:22 +00:00
}
2010-11-20 11:10:26 +00:00
# print "<option value=\"ADD_LABEL\">" .__("Add label...") . "</option>";
2010-11-09 15:10:22 +00:00
print " </select> " ;
}
2013-04-17 14:34:18 +00:00
function format_article_enclosures ( $id , $always_display_enclosures ,
2013-03-21 11:37:08 +00:00
$article_content , $hide_images = false ) {
2010-11-09 17:57:23 +00:00
2013-04-17 14:34:18 +00:00
$result = get_article_enclosures ( $id );
2011-03-18 09:46:22 +00:00
$rv = '' ;
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
if ( count ( $result ) > 0 ) {
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
$entries_html = array ();
$entries = array ();
2013-01-15 07:23:27 +00:00
$entries_inline = array ();
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
foreach ( $result as $line ) {
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
$url = $line [ " content_url " ];
$ctype = $line [ " content_type " ];
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
if ( ! $ctype ) $ctype = __ ( " unknown type " );
2011-03-17 16:05:28 +00:00
2012-07-09 16:48:34 +00:00
$filename = substr ( $url , strrpos ( $url , " / " ) + 1 );
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
$player = format_inline_player ( $url , $ctype );
2013-01-15 07:23:27 +00:00
if ( $player ) array_push ( $entries_inline , $player );
2011-03-17 16:05:28 +00:00
2010-11-30 09:40:23 +00:00
# $entry .= " <a target=\"_blank\" href=\"" . htmlspecialchars($url) . "\">" .
# $filename . " (" . $ctype . ")" . "</a>";
2011-03-17 16:05:28 +00:00
2012-07-09 16:48:34 +00:00
$entry = " <div onclick= \" window.open(' " . htmlspecialchars ( $url ) . " ') \"
dojoType = \ " dijit.MenuItem \" > $filename ( $ctype )</div> " ;
2010-11-09 17:57:23 +00:00
array_push ( $entries_html , $entry );
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
$entry = array ();
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
$entry [ " type " ] = $ctype ;
$entry [ " filename " ] = $filename ;
$entry [ " url " ] = $url ;
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
array_push ( $entries , $entry );
}
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
if ( $_SESSION [ 'uid' ] && ! get_pref ( " STRIP_IMAGES " ) && ! $_SESSION [ " bw_limit " ]) {
2010-11-09 17:57:23 +00:00
if ( $always_display_enclosures ||
! preg_match ( " /<img/i " , $article_content )) {
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
foreach ( $entries as $entry ) {
2011-03-17 16:05:28 +00:00
2010-11-09 17:57:23 +00:00
if ( preg_match ( " /image/ " , $entry [ " type " ]) ||
preg_match ( " / \ .(jpg|png|gif|bmp)/i " , $entry [ " filename " ])) {
2011-03-17 16:05:28 +00:00
2013-03-21 11:37:08 +00:00
if ( ! $hide_images ) {
$rv .= " <p><img
alt = \ " " . htmlspecialchars ( $entry [ " filename " ]) . " \"
src = \ " " . htmlspecialchars ( $entry [ " url " ]) . " \" /></p> " ;
} else {
$rv .= " <p><a target= \" _blank \"
href = \ " " . htmlspecialchars ( $entry [ " url " ]) . " \"
> " .htmlspecialchars( $entry["url"] ) . " </ a ></ p > " ;
2012-07-09 16:48:34 +00:00
2013-03-21 11:37:08 +00:00
}
2010-11-09 17:57:23 +00:00
}
}
}
}
2011-03-17 16:05:28 +00:00
2013-01-15 07:23:27 +00:00
if ( count ( $entries_inline ) > 0 ) {
$rv .= " <hr clear='both'/> " ;
foreach ( $entries_inline as $entry ) { $rv .= $entry ; };
$rv .= " <hr clear='both'/> " ;
}
2013-03-28 14:52:55 +00:00
$rv .= " <select class= \" attachments \" onchange= \" openSelectedAttachment(this) \" > " .
2013-03-28 06:56:29 +00:00
" <option value=''> " . __ ( 'Attachments' ) . " </option> " ;
2011-03-17 16:05:28 +00:00
2013-03-28 06:56:29 +00:00
foreach ( $entries as $entry ) {
$rv .= " <option value= \" " . htmlspecialchars ( $entry [ " url " ]) . " \" > " . htmlspecialchars ( $entry [ " filename " ]) . " </option> " ;
2011-03-17 16:05:28 +00:00
2013-03-28 06:56:29 +00:00
};
$rv .= " </select> " ;
2010-11-09 17:57:23 +00:00
}
2011-03-18 09:46:22 +00:00
return $rv ;
2010-11-09 17:57:23 +00:00
}
2013-04-17 12:23:15 +00:00
function getLastArticleId () {
2013-04-17 14:34:18 +00:00
$result = db_query ( " SELECT MAX(ref_id) AS id FROM ttrss_user_entries
2010-11-10 18:56:28 +00:00
WHERE owner_uid = " . $_SESSION["uid"] );
if ( db_num_rows ( $result ) == 1 ) {
return db_fetch_result ( $result , 0 , " id " );
} else {
return - 1 ;
}
}
2010-11-10 20:24:00 +00:00
function build_url ( $parts ) {
return $parts [ 'scheme' ] . " :// " . $parts [ 'host' ] . $parts [ 'path' ];
}
2010-11-10 22:09:03 +00:00
/**
* Converts a ( possibly ) relative URL to a absolute one .
*
* @ param string $url Base URL ( i . e . from where the document is )
* @ param string $rel_url Possibly relative URL in the document
*
* @ return string Absolute URL
*/
2010-11-10 20:24:00 +00:00
function rewrite_relative_url ( $url , $rel_url ) {
2013-07-07 07:23:59 +00:00
if ( strpos ( $rel_url , " : " ) !== false ) {
2012-03-11 08:36:08 +00:00
return $rel_url ;
} else if ( strpos ( $rel_url , " :// " ) !== false ) {
2010-11-10 20:24:00 +00:00
return $rel_url ;
2012-07-22 16:26:29 +00:00
} else if ( strpos ( $rel_url , " // " ) === 0 ) {
# protocol-relative URL (rare but they exist)
return $rel_url ;
2011-03-17 16:05:28 +00:00
} else if ( strpos ( $rel_url , " / " ) === 0 )
2010-11-10 20:24:00 +00:00
{
$parts = parse_url ( $url );
$parts [ 'path' ] = $rel_url ;
return build_url ( $parts );
} else {
$parts = parse_url ( $url );
2010-11-10 22:09:03 +00:00
if ( ! isset ( $parts [ 'path' ])) {
$parts [ 'path' ] = '/' ;
}
$dir = $parts [ 'path' ];
if ( substr ( $dir , - 1 ) !== '/' ) {
$dir = dirname ( $parts [ 'path' ]);
$dir !== '/' && $dir .= '/' ;
}
$parts [ 'path' ] = $dir . $rel_url ;
2010-11-10 20:24:00 +00:00
return build_url ( $parts );
}
}
2010-11-12 18:44:19 +00:00
function sphinx_search ( $query , $offset = 0 , $limit = 30 ) {
2013-07-14 19:29:25 +00:00
require_once 'lib/sphinxapi.php' ;
2011-12-11 19:10:51 +00:00
2010-11-12 18:44:19 +00:00
$sphinxClient = new SphinxClient ();
2013-04-16 12:41:32 +00:00
$sphinxpair = explode ( " : " , SPHINX_SERVER , 2 );
2013-05-31 05:52:43 +00:00
$sphinxClient -> SetServer ( $sphinxpair [ 0 ], ( int ) $sphinxpair [ 1 ]);
2010-11-12 18:44:19 +00:00
$sphinxClient -> SetConnectTimeout ( 1 );
2011-03-17 16:05:28 +00:00
$sphinxClient -> SetFieldWeights ( array ( 'title' => 70 , 'content' => 30 ,
2010-11-12 18:44:19 +00:00
'feed_title' => 20 ));
$sphinxClient -> SetMatchMode ( SPH_MATCH_EXTENDED2 );
$sphinxClient -> SetRankingMode ( SPH_RANK_PROXIMITY_BM25 );
$sphinxClient -> SetLimits ( $offset , $limit , 1000 );
$sphinxClient -> SetArrayResult ( false );
$sphinxClient -> SetFilter ( 'owner_uid' , array ( $_SESSION [ 'uid' ]));
2011-03-17 16:05:28 +00:00
2010-11-12 18:44:19 +00:00
$result = $sphinxClient -> Query ( $query , SPHINX_INDEX );
$ids = array ();
if ( is_array ( $result [ 'matches' ])) {
foreach ( array_keys ( $result [ 'matches' ]) as $int_id ) {
$ref_id = $result [ 'matches' ][ $int_id ][ 'attrs' ][ 'ref_id' ];
array_push ( $ids , $ref_id );
}
}
return $ids ;
}
2013-04-17 14:34:18 +00:00
function cleanup_tags ( $days = 14 , $limit = 1000 ) {
2010-11-13 16:59:42 +00:00
if ( DB_TYPE == " pgsql " ) {
$interval_query = " date_updated < NOW() - INTERVAL ' $days days' " ;
} else if ( DB_TYPE == " mysql " ) {
$interval_query = " date_updated < DATE_SUB(NOW(), INTERVAL $days DAY) " ;
}
2010-11-13 17:12:19 +00:00
$tags_deleted = 0 ;
2010-11-13 16:59:42 +00:00
2010-11-13 17:12:19 +00:00
while ( $limit > 0 ) {
$limit_part = 500 ;
2011-03-17 16:05:28 +00:00
$query = " SELECT ttrss_tags.id AS id
FROM ttrss_tags , ttrss_user_entries , ttrss_entries
2010-11-13 17:12:19 +00:00
WHERE post_int_id = int_id AND $interval_query AND
ref_id = ttrss_entries . id AND tag_cache != '' LIMIT $limit_part " ;
2011-03-17 16:05:28 +00:00
2013-04-17 14:34:18 +00:00
$result = db_query ( $query );
2010-11-13 17:12:19 +00:00
$ids = array ();
while ( $line = db_fetch_assoc ( $result )) {
array_push ( $ids , $line [ 'id' ]);
}
if ( count ( $ids ) > 0 ) {
$ids = join ( " , " , $ids );
2013-04-17 14:34:18 +00:00
$tmp_result = db_query ( " DELETE FROM ttrss_tags WHERE id IN ( $ids ) " );
$tags_deleted += db_affected_rows ( $tmp_result );
2010-11-13 17:12:19 +00:00
} else {
break ;
}
$limit -= $limit_part ;
}
return $tags_deleted ;
2010-11-13 16:59:42 +00:00
}
2013-04-17 12:23:15 +00:00
function print_user_stylesheet () {
2013-04-17 14:34:18 +00:00
$value = get_pref ( 'USER_STYLESHEET' );
2010-11-24 16:23:24 +00:00
if ( $value ) {
print " <style type= \" text/css \" > " ;
2010-12-28 06:11:49 +00:00
print str_replace ( " <br/> " , " \n " , $value );
2010-11-24 16:23:24 +00:00
print " </style> " ;
}
}
2012-01-16 11:31:01 +00:00
function rewrite_urls ( $html ) {
libxml_use_internal_errors ( true );
$charset_hack = ' < head >
< meta http - equiv = " Content-Type " content = " text/html; charset=utf-8 " />
</ head > ' ;
$doc = new DOMDocument ();
$doc -> loadHTML ( $charset_hack . $html );
$xpath = new DOMXPath ( $doc );
$entries = $xpath -> query ( '//*/text()' );
foreach ( $entries as $entry ) {
if ( strstr ( $entry -> wholeText , " :// " ) !== false ) {
$text = preg_replace ( " /((?<!=.)((http|https|ftp)+): \ / \ /[^ ,!]+)/i " ,
" <a target= \" _blank \" href= \" \\ 1 \" > \\ 1</a> " , $entry -> wholeText );
if ( $text != $entry -> wholeText ) {
$cdoc = new DOMDocument ();
$cdoc -> loadHTML ( $charset_hack . $text );
foreach ( $cdoc -> childNodes as $cnode ) {
$cnode = $doc -> importNode ( $cnode , true );
if ( $cnode ) {
$entry -> parentNode -> insertBefore ( $cnode );
}
}
$entry -> parentNode -> removeChild ( $entry );
}
}
}
$node = $doc -> getElementsByTagName ( 'body' ) -> item ( 0 );
2012-02-02 08:46:07 +00:00
// http://tt-rss.org/forum/viewtopic.php?f=1&t=970
if ( $node )
2013-03-16 12:07:11 +00:00
return $doc -> saveXML ( $node );
2012-02-02 08:46:07 +00:00
else
return $html ;
2010-11-26 10:13:09 +00:00
}
2013-04-17 14:34:18 +00:00
function filter_to_sql ( $filter , $owner_uid ) {
2012-09-03 11:05:43 +00:00
$query = array ();
2011-04-18 09:04:24 +00:00
2012-09-03 11:05:43 +00:00
if ( DB_TYPE == " pgsql " )
$reg_qpart = " ~ " ;
else
$reg_qpart = " REGEXP " ;
2011-04-18 09:04:24 +00:00
2012-09-03 11:05:43 +00:00
foreach ( $filter [ " rules " ] AS $rule ) {
2013-07-05 18:34:38 +00:00
$rule [ 'reg_exp' ] = str_replace ( '/' , '\/' , $rule [ " reg_exp " ]);
2012-09-03 11:05:43 +00:00
$regexp_valid = preg_match ( '/' . $rule [ 'reg_exp' ] . '/' ,
$rule [ 'reg_exp' ]) !== FALSE ;
2011-04-18 09:04:24 +00:00
2012-09-03 11:05:43 +00:00
if ( $regexp_valid ) {
2011-04-18 09:04:24 +00:00
2013-04-17 14:34:18 +00:00
$rule [ 'reg_exp' ] = db_escape_string ( $rule [ 'reg_exp' ]);
2011-04-18 09:04:24 +00:00
2013-03-25 15:46:43 +00:00
switch ( $rule [ " type " ]) {
2012-09-03 11:05:43 +00:00
case " title " :
$qpart = " LOWER(ttrss_entries.title) $reg_qpart LOWER(' " .
$rule [ 'reg_exp' ] . " ') " ;
break ;
case " content " :
$qpart = " LOWER(ttrss_entries.content) $reg_qpart LOWER(' " .
$rule [ 'reg_exp' ] . " ') " ;
break ;
case " both " :
$qpart = " LOWER(ttrss_entries.title) $reg_qpart LOWER(' " .
$rule [ 'reg_exp' ] . " ') OR LOWER( " .
" ttrss_entries.content) $reg_qpart LOWER(' " . $rule [ 'reg_exp' ] . " ') " ;
break ;
case " tag " :
$qpart = " LOWER(ttrss_user_entries.tag_cache) $reg_qpart LOWER(' " .
$rule [ 'reg_exp' ] . " ') " ;
break ;
case " link " :
$qpart = " LOWER(ttrss_entries.link) $reg_qpart LOWER(' " .
$rule [ 'reg_exp' ] . " ') " ;
break ;
case " author " :
$qpart = " LOWER(ttrss_entries.author) $reg_qpart LOWER(' " .
$rule [ 'reg_exp' ] . " ') " ;
break ;
}
2011-04-18 09:04:24 +00:00
2013-03-25 16:08:34 +00:00
if ( isset ( $rule [ 'inverse' ])) $qpart = " NOT ( $qpart ) " ;
2012-09-03 11:18:27 +00:00
if ( isset ( $rule [ " feed_id " ]) && $rule [ " feed_id " ] > 0 ) {
2013-04-17 14:34:18 +00:00
$qpart .= " AND feed_id = " . db_escape_string ( $rule [ " feed_id " ]);
2012-09-03 11:05:43 +00:00
}
2011-04-21 14:27:44 +00:00
2012-09-03 11:05:43 +00:00
if ( isset ( $rule [ " cat_id " ])) {
2012-10-24 07:59:36 +00:00
if ( $rule [ " cat_id " ] > 0 ) {
2013-04-17 14:34:18 +00:00
$children = getChildCategories ( $rule [ " cat_id " ], $owner_uid );
2012-10-24 07:59:36 +00:00
array_push ( $children , $rule [ " cat_id " ]);
$children = join ( " , " , $children );
$cat_qpart = " cat_id IN ( $children ) " ;
} else {
$cat_qpart = " cat_id IS NULL " ;
}
$qpart .= " AND $cat_qpart " ;
2012-02-21 08:36:29 +00:00
}
2012-09-03 11:05:43 +00:00
array_push ( $query , " ( $qpart ) " );
2012-02-21 08:36:29 +00:00
}
2012-09-03 11:05:43 +00:00
}
2012-02-21 08:36:29 +00:00
2012-09-03 11:05:43 +00:00
if ( count ( $query ) > 0 ) {
2013-03-25 15:46:43 +00:00
$fullquery = " ( " . join ( $filter [ " match_any_rule " ] ? " OR " : " AND " , $query ) . " ) " ;
2012-02-21 08:36:29 +00:00
} else {
2013-03-25 15:46:43 +00:00
$fullquery = " (false) " ;
2012-02-21 08:36:29 +00:00
}
2013-03-25 15:46:43 +00:00
if ( $filter [ 'inverse' ]) $fullquery = " (NOT $fullquery ) " ;
return $fullquery ;
2011-04-18 09:04:24 +00:00
}
2011-04-20 11:21:00 +00:00
2011-12-28 07:00:58 +00:00
if ( ! function_exists ( 'gzdecode' )) {
function gzdecode ( $string ) { // no support for 2nd argument
return file_get_contents ( 'compress.zlib://data:who/cares;base64,' .
base64_encode ( $string ));
}
}
2012-01-23 18:04:01 +00:00
function get_random_bytes ( $length ) {
if ( function_exists ( 'openssl_random_pseudo_bytes' )) {
return openssl_random_pseudo_bytes ( $length );
} else {
$output = " " ;
for ( $i = 0 ; $i < $length ; $i ++ )
$output .= chr ( mt_rand ( 0 , 255 ));
return $output ;
}
}
2012-08-09 10:20:27 +00:00
function read_stdin () {
$fp = fopen ( " php://stdin " , " r " );
if ( $fp ) {
$line = trim ( fgets ( $fp ));
fclose ( $fp );
return $line ;
}
return null ;
}
2012-08-23 09:03:39 +00:00
function tmpdirname ( $path , $prefix ) {
// Use PHP's tmpfile function to create a temporary
// directory name. Delete the file and keep the name.
$tempname = tempnam ( $path , $prefix );
if ( ! $tempname )
return false ;
if ( ! unlink ( $tempname ))
return false ;
return $tempname ;
}
2013-04-17 14:34:18 +00:00
function getFeedCategory ( $feed ) {
$result = db_query ( " SELECT cat_id FROM ttrss_feeds
2012-08-30 14:50:56 +00:00
WHERE id = '$feed' " );
if ( db_num_rows ( $result ) > 0 ) {
return db_fetch_result ( $result , 0 , " cat_id " );
} else {
return false ;
}
}
2012-12-23 19:05:51 +00:00
function implements_interface ( $class , $interface ) {
return in_array ( $interface , class_implements ( $class ));
}
2013-03-19 05:02:40 +00:00
2013-07-10 16:18:20 +00:00
function geturl ( $url , $depth = 0 ){
if ( $depth == 20 ) return $url ;
2013-03-18 21:10:02 +00:00
2013-04-18 07:35:58 +00:00
if ( ! function_exists ( 'curl_init' ))
return user_error ( 'CURL Must be installed for geturl function to work. Ask your host to enable it or uncomment extension=php_curl.dll in php.ini' , E_USER_ERROR );
2013-03-18 21:10:02 +00:00
$curl = curl_init ();
$header [ 0 ] = " Accept: text/xml,application/xml,application/xhtml+xml, " ;
$header [ 0 ] .= " text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 " ;
$header [] = " Cache-Control: max-age=0 " ;
$header [] = " Connection: keep-alive " ;
$header [] = " Keep-Alive: 300 " ;
$header [] = " Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 " ;
$header [] = " Accept-Language: en-us,en;q=0.5 " ;
$header [] = " Pragma: " ;
curl_setopt ( $curl , CURLOPT_URL , $url );
curl_setopt ( $curl , CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 Firefox/5.0' );
curl_setopt ( $curl , CURLOPT_HTTPHEADER , $header );
curl_setopt ( $curl , CURLOPT_HEADER , true );
curl_setopt ( $curl , CURLOPT_REFERER , $url );
curl_setopt ( $curl , CURLOPT_ENCODING , 'gzip,deflate' );
curl_setopt ( $curl , CURLOPT_AUTOREFERER , true );
curl_setopt ( $curl , CURLOPT_RETURNTRANSFER , true );
//curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); //CURLOPT_FOLLOWLOCATION Disabled...
curl_setopt ( $curl , CURLOPT_TIMEOUT , 60 );
2013-05-29 18:55:22 +00:00
curl_setopt ( $curl , CURLOPT_SSL_VERIFYPEER , false );
2013-03-18 21:10:02 +00:00
2013-07-16 14:15:28 +00:00
if (( OPENSSL_VERSION_NUMBER >= 0x0090808f ) && ( OPENSSL_VERSION_NUMBER < 0x10000000 )) {
curl_setopt ( $curl , CURLOPT_SSLVERSION , 3 );
}
2013-03-18 21:10:02 +00:00
$html = curl_exec ( $curl );
$status = curl_getinfo ( $curl );
if ( $status [ 'http_code' ] != 200 ){
if ( $status [ 'http_code' ] == 301 || $status [ 'http_code' ] == 302 ) {
2013-05-29 18:50:27 +00:00
curl_close ( $curl );
2013-03-18 21:10:02 +00:00
list ( $header ) = explode ( " \r \n \r \n " , $html , 2 );
$matches = array ();
preg_match ( " /(Location:|URI:)[^( \n )]*/ " , $header , $matches );
$url = trim ( str_replace ( $matches [ 1 ], " " , $matches [ 0 ]));
$url_parsed = parse_url ( $url );
2013-07-10 16:18:20 +00:00
return ( isset ( $url_parsed )) ? geturl ( $url , $depth + 1 ) : '' ;
2013-03-18 21:10:02 +00:00
}
2013-05-29 18:50:27 +00:00
global $fetch_last_error ;
$fetch_last_error = curl_errno ( $curl ) . " " . curl_error ( $curl );
curl_close ( $curl );
2013-03-18 21:10:02 +00:00
$oline = '' ;
foreach ( $status as $key => $eline ){ $oline .= '[' . $key . ']' . $eline . ' ' ;}
$line = $oline . " \r \n " . $url . " \r \n ----------------- \r \n " ;
2013-03-20 05:14:41 +00:00
# $handle = @fopen('./curl.error.log', 'a');
# fwrite($handle, $line);
2013-03-18 21:10:02 +00:00
return FALSE ;
}
2013-05-29 18:50:27 +00:00
curl_close ( $curl );
2013-03-18 21:10:02 +00:00
return $url ;
}
2012-12-23 19:05:51 +00:00
2013-03-18 07:00:44 +00:00
function get_minified_js ( $files ) {
require_once 'lib/jshrink/Minifier.php' ;
$rv = '' ;
foreach ( $files as $js ) {
if ( ! isset ( $_GET [ 'debug' ])) {
2013-05-14 20:10:10 +00:00
$cached_file = CACHE_DIR . " /js/ " . basename ( $js ) . " .js " ;
2013-03-18 07:00:44 +00:00
if ( file_exists ( $cached_file ) &&
is_readable ( $cached_file ) &&
filemtime ( $cached_file ) >= filemtime ( " js/ $js .js " )) {
$rv .= file_get_contents ( $cached_file );
} else {
$minified = JShrink\Minifier :: minify ( file_get_contents ( " js/ $js .js " ));
file_put_contents ( $cached_file , $minified );
$rv .= $minified ;
}
} else {
$rv .= file_get_contents ( " js/ $js .js " );
}
}
return $rv ;
}
2013-03-20 16:33:46 +00:00
function stylesheet_tag ( $filename ) {
$timestamp = filemtime ( $filename );
echo " <link rel= \" stylesheet \" type= \" text/css \" href= \" $filename ? $timestamp\ " /> \n " ;
}
function javascript_tag ( $filename ) {
$query = " " ;
if ( ! ( strpos ( $filename , " ? " ) === FALSE )) {
$query = substr ( $filename , strpos ( $filename , " ? " ) + 1 );
$filename = substr ( $filename , 0 , strpos ( $filename , " ? " ));
}
$timestamp = filemtime ( $filename );
if ( $query ) $timestamp .= " & $query " ;
echo " <script type= \" text/javascript \" charset= \" utf-8 \" src= \" $filename ? $timestamp\ " ></ script > \n " ;
}
2013-03-21 14:01:42 +00:00
function calculate_dep_timestamp () {
2013-05-20 13:57:16 +00:00
$files = array_merge ( glob ( " js/*.js " ), glob ( " css/*.css " ));
2013-03-21 14:01:42 +00:00
$max_ts = - 1 ;
foreach ( $files as $file ) {
if ( filemtime ( $file ) > $max_ts ) $max_ts = filemtime ( $file );
}
return $max_ts ;
}
2013-03-25 08:45:27 +00:00
function T_js_decl ( $s1 , $s2 ) {
if ( $s1 && $s2 ) {
$s1 = preg_replace ( " / \n / " , " " , $s1 );
$s2 = preg_replace ( " / \n / " , " " , $s2 );
$s1 = preg_replace ( " / \" / " , " \\ \" " , $s1 );
$s2 = preg_replace ( " / \" / " , " \\ \" " , $s2 );
return " T_messages[ \" $s1\ " ] = \ " $s2\ " ; \n " ;
}
}
function init_js_translations () {
print ' var T_messages = new Object ();
function __ ( msg ) {
if ( T_messages [ msg ]) {
return T_messages [ msg ];
} else {
return msg ;
}
}
function ngettext ( msg1 , msg2 , n ) {
2013-07-13 05:09:19 +00:00
return __ (( parseInt ( n ) > 1 ) ? msg2 : msg1 );
2013-03-25 08:45:27 +00:00
} ' ;
$l10n = _get_reader ();
for ( $i = 0 ; $i < $l10n -> total ; $i ++ ) {
$orig = $l10n -> get_original_string ( $i );
2013-07-13 05:09:19 +00:00
if ( strpos ( $orig , " \000 " ) !== FALSE ) { // Plural forms
$key = explode ( chr ( 0 ), $orig );
2013-07-16 20:36:37 +00:00
print T_js_decl ( $key [ 0 ], _ngettext ( $key [ 0 ], $key [ 1 ], 1 )); // Singular
print T_js_decl ( $key [ 1 ], _ngettext ( $key [ 0 ], $key [ 1 ], 2 )); // Plural
2013-07-13 05:09:19 +00:00
} else {
$translation = __ ( $orig );
print T_js_decl ( $orig , $translation );
}
2013-03-25 08:45:27 +00:00
}
}
2013-03-27 05:40:07 +00:00
function label_to_feed_id ( $label ) {
return LABEL_BASE_INDEX - 1 - abs ( $label );
}
function feed_to_label_id ( $feed ) {
return LABEL_BASE_INDEX - 1 + abs ( $feed );
}
2013-04-19 09:17:28 +00:00
function format_libxml_error ( $error ) {
return T_sprintf ( " LibXML error %s at line %d (column %d): %s " ,
$error -> code , $error -> line , $error -> column ,
$error -> message );
}
2013-03-15 15:54:18 +00:00
?>