|
|
|
@ -78,10 +78,6 @@ class MyPDO extends Minz_ModelPdo { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function logMe($text) { |
|
|
|
|
file_put_contents(join_path(USERS_PATH, '_', 'log_api.txt'), date('c') . "\t" . $text . "\n", FILE_APPEND); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function debugInfo() { |
|
|
|
|
if (function_exists('getallheaders')) { |
|
|
|
|
$ALL_HEADERS = getallheaders(); |
|
|
|
@ -107,16 +103,14 @@ function debugInfo() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function badRequest() { |
|
|
|
|
logMe("badRequest()"); |
|
|
|
|
logMe(debugInfo()); |
|
|
|
|
Minz_Log::warning('badRequest() ' . debugInfo(), API_LOG); |
|
|
|
|
header('HTTP/1.1 400 Bad Request'); |
|
|
|
|
header('Content-Type: text/plain; charset=UTF-8'); |
|
|
|
|
die('Bad Request!'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function unauthorized() { |
|
|
|
|
logMe("unauthorized()"); |
|
|
|
|
logMe(debugInfo()); |
|
|
|
|
Minz_Log::warning('unauthorized() ' . debugInfo(), API_LOG); |
|
|
|
|
header('HTTP/1.1 401 Unauthorized'); |
|
|
|
|
header('Content-Type: text/plain; charset=UTF-8'); |
|
|
|
|
header('Google-Bad-Token: true'); |
|
|
|
@ -124,22 +118,21 @@ function unauthorized() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function notImplemented() { |
|
|
|
|
logMe("notImplemented()"); |
|
|
|
|
logMe(debugInfo()); |
|
|
|
|
Minz_Log::warning('notImplemented() ' . debugInfo(), API_LOG); |
|
|
|
|
header('HTTP/1.1 501 Not Implemented'); |
|
|
|
|
header('Content-Type: text/plain; charset=UTF-8'); |
|
|
|
|
die('Not Implemented!'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function serviceUnavailable() { |
|
|
|
|
logMe("serviceUnavailable()"); |
|
|
|
|
Minz_Log::warning('serviceUnavailable() ' . debugInfo(), API_LOG); |
|
|
|
|
header('HTTP/1.1 503 Service Unavailable'); |
|
|
|
|
header('Content-Type: text/plain; charset=UTF-8'); |
|
|
|
|
die('Service Unavailable!'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function checkCompatibility() { |
|
|
|
|
logMe("checkCompatibility()"); |
|
|
|
|
Minz_Log::warning('checkCompatibility() ' . debugInfo(), API_LOG); |
|
|
|
|
header('Content-Type: text/plain; charset=UTF-8'); |
|
|
|
|
if (PHP_INT_SIZE < 8 && !function_exists('gmp_init')) { |
|
|
|
|
die('FAIL 64-bit or GMP extension!'); |
|
|
|
@ -170,7 +163,7 @@ function authorizationToUser() { |
|
|
|
|
if ($headerAuthX[1] === sha1(FreshRSS_Context::$system_conf->salt . $user . FreshRSS_Context::$user_conf->apiPasswordHash)) { |
|
|
|
|
return $user; |
|
|
|
|
} else { |
|
|
|
|
logMe('Invalid API authorisation for user ' . $user . ': ' . $headerAuthX[1]); |
|
|
|
|
Minz_Log::warning('Invalid API authorisation for user ' . $user . ': ' . $headerAuthX[1], API_LOG); |
|
|
|
|
Minz_Log::warning('Invalid API authorisation for user ' . $user . ': ' . $headerAuthX[1]); |
|
|
|
|
unauthorized(); |
|
|
|
|
} |
|
|
|
@ -183,7 +176,6 @@ function authorizationToUser() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function clientLogin($email, $pass) { //http://web.archive.org/web/20130604091042/http://undoc.in/clientLogin.html |
|
|
|
|
//logMe('clientLogin(' . $email . ")"); |
|
|
|
|
if (ctype_alnum($email)) { |
|
|
|
|
if (!function_exists('password_verify')) { |
|
|
|
|
include_once(LIB_PATH . '/password_compat.php'); |
|
|
|
@ -215,7 +207,7 @@ function token($conf) { |
|
|
|
|
//http://blog.martindoms.com/2009/08/15/using-the-google-reader-api-part-1/ |
|
|
|
|
//https://github.com/ericmann/gReader-Library/blob/master/greader.class.php |
|
|
|
|
$user = Minz_Session::param('currentUser', '_'); |
|
|
|
|
//logMe('token('. $user . ")"); //TODO: Implement real token that expires |
|
|
|
|
//Minz_Log::debug('token('. $user . ')', API_LOG); //TODO: Implement real token that expires |
|
|
|
|
$token = str_pad(sha1(FreshRSS_Context::$system_conf->salt . $user . $conf->apiPasswordHash), 57, 'Z'); //Must have 57 characters |
|
|
|
|
echo $token, "\n"; |
|
|
|
|
exit(); |
|
|
|
@ -224,7 +216,6 @@ function token($conf) { |
|
|
|
|
function checkToken($conf, $token) { |
|
|
|
|
//http://code.google.com/p/google-reader-api/wiki/ActionToken |
|
|
|
|
$user = Minz_Session::param('currentUser', '_'); |
|
|
|
|
//logMe('checkToken(' . $token . ")"); |
|
|
|
|
if ($token === str_pad(sha1(FreshRSS_Context::$system_conf->salt . $user . $conf->apiPasswordHash), 57, 'Z')) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
@ -232,7 +223,6 @@ function checkToken($conf, $token) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function userInfo() { //https://github.com/theoldreader/api#user-info |
|
|
|
|
//logMe("userInfo()"); |
|
|
|
|
$user = Minz_Session::param('currentUser', '_'); |
|
|
|
|
exit(json_encode(array( |
|
|
|
|
'userId' => $user, |
|
|
|
@ -243,7 +233,6 @@ function userInfo() { //https://github.com/theoldreader/api#user-info |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function tagList() { |
|
|
|
|
//logMe("tagList()"); |
|
|
|
|
header('Content-Type: application/json; charset=UTF-8'); |
|
|
|
|
|
|
|
|
|
$pdo = new MyPDO(); |
|
|
|
@ -268,7 +257,6 @@ function tagList() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function subscriptionList() { |
|
|
|
|
//logMe("subscriptionList()"); |
|
|
|
|
header('Content-Type: application/json; charset=UTF-8'); |
|
|
|
|
|
|
|
|
|
$pdo = new MyPDO(); |
|
|
|
@ -303,7 +291,6 @@ function subscriptionList() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function subscriptionEdit($streamNames, $titles, $action, $add = '', $remove = '') { |
|
|
|
|
//logMe("subscriptionEdit()"); |
|
|
|
|
//https://github.com/mihaip/google-reader-api/blob/master/wiki/ApiSubscriptionEdit.wiki |
|
|
|
|
switch ($action) { |
|
|
|
|
case 'subscribe': |
|
|
|
@ -360,7 +347,7 @@ function subscriptionEdit($streamNames, $titles, $action, $add = '', $remove = ' |
|
|
|
|
$feed = FreshRSS_feed_Controller::addFeed($streamName, $title, $addCatId, $c_name, $http_auth); |
|
|
|
|
continue; |
|
|
|
|
} catch (Exception $e) { |
|
|
|
|
logMe("subscriptionEdit error subscribe: " . $e->getMessage()); |
|
|
|
|
Minz_Log::error('subscriptionEdit error subscribe: ' . $e->getMessage(), API_LOG); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
badRequest(); |
|
|
|
@ -389,7 +376,6 @@ function subscriptionEdit($streamNames, $titles, $action, $add = '', $remove = ' |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function quickadd($url) { |
|
|
|
|
//logMe("quickadd($url)"); |
|
|
|
|
try { |
|
|
|
|
$feed = FreshRSS_feed_Controller::addFeed($url); |
|
|
|
|
exit(json_encode(array( |
|
|
|
@ -397,7 +383,7 @@ function quickadd($url) { |
|
|
|
|
'streamId' => $feed->id(), |
|
|
|
|
))); |
|
|
|
|
} catch (Exception $e) { |
|
|
|
|
logMe("subscriptionEdit error subscribe: " . $e->getMessage()); |
|
|
|
|
Minz_Log::error('quickadd error: ' . $e->getMessage(), API_LOG); |
|
|
|
|
die(json_encode(array( |
|
|
|
|
'numResults' => 0, |
|
|
|
|
'error' => $e->getMessage(), |
|
|
|
@ -406,7 +392,6 @@ function quickadd($url) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function unreadCount() { //http://blog.martindoms.com/2009/10/16/using-the-google-reader-api-part-2/#unread-count |
|
|
|
|
//logMe("unreadCount()"); |
|
|
|
|
header('Content-Type: application/json; charset=UTF-8'); |
|
|
|
|
|
|
|
|
|
$totalUnreads = 0; |
|
|
|
@ -453,7 +438,6 @@ function unreadCount() { //http://blog.martindoms.com/2009/10/16/using-the-googl |
|
|
|
|
function streamContents($path, $include_target, $start_time, $count, $order, $exclude_target, $continuation) { |
|
|
|
|
//http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI |
|
|
|
|
//http://blog.martindoms.com/2009/10/16/using-the-google-reader-api-part-2/#feed |
|
|
|
|
//logMe("streamContents($path, $include_target, $start_time, $count, $order, $exclude_target, $continuation)"); |
|
|
|
|
header('Content-Type: application/json; charset=UTF-8'); |
|
|
|
|
|
|
|
|
|
$feedDAO = FreshRSS_Factory::createFeedDao(); |
|
|
|
@ -562,8 +546,6 @@ function streamContentsItemsIds($streamId, $start_time, $count, $order, $exclude |
|
|
|
|
//http://code.google.com/p/google-reader-api/wiki/ApiStreamItemsIds |
|
|
|
|
//http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI |
|
|
|
|
//http://blog.martindoms.com/2009/10/16/using-the-google-reader-api-part-2/#feed |
|
|
|
|
//logMe("streamContentsItemsIds($streamId, $start_time, $count, $order, $exclude_target)"); |
|
|
|
|
|
|
|
|
|
$type = 'A'; |
|
|
|
|
$id = ''; |
|
|
|
|
if ($streamId === 'user/-/state/com.google/reading-list') { |
|
|
|
@ -610,8 +592,6 @@ function streamContentsItemsIds($streamId, $start_time, $count, $order, $exclude |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function editTag($e_ids, $a, $r) { |
|
|
|
|
//logMe("editTag()"); |
|
|
|
|
|
|
|
|
|
foreach ($e_ids as $i => $e_id) { |
|
|
|
|
$e_ids[$i] = hex2dec(basename($e_id)); //Strip prefix 'tag:google.com,2005:reader/item/' |
|
|
|
|
} |
|
|
|
@ -645,7 +625,6 @@ function editTag($e_ids, $a, $r) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function renameTag($s, $dest) { |
|
|
|
|
//logMe("renameTag()"); |
|
|
|
|
if ($s != '' && strpos($s, 'user/-/label/') === 0 && |
|
|
|
|
$dest != '' && strpos($dest, 'user/-/label/') === 0) { |
|
|
|
|
$s = substr($s, 13); |
|
|
|
@ -661,7 +640,6 @@ function renameTag($s, $dest) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function disableTag($s) { |
|
|
|
|
//logMe("disableTag($s)"); |
|
|
|
|
if ($s != '' && strpos($s, 'user/-/label/') === 0) { |
|
|
|
|
$s = substr($s, 13); |
|
|
|
|
$categoryDAO = new FreshRSS_CategoryDAO(); |
|
|
|
@ -679,7 +657,6 @@ function disableTag($s) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function markAllAsRead($streamId, $olderThanId) { |
|
|
|
|
//logMe("markAllAsRead($streamId, $olderThanId)"); |
|
|
|
|
$entryDAO = FreshRSS_Factory::createEntryDao(); |
|
|
|
|
if (strpos($streamId, 'feed/') === 0) { |
|
|
|
|
$f_id = basename($streamId); |
|
|
|
@ -696,8 +673,8 @@ function markAllAsRead($streamId, $olderThanId) { |
|
|
|
|
exit('OK'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//logMe('----------------------------------------------------------------'); |
|
|
|
|
//logMe(debugInfo()); |
|
|
|
|
//Minz_Log::debug('----------------------------------------------------------------', API_LOG); |
|
|
|
|
//Minz_Log::debug(debugInfo(), API_LOG); |
|
|
|
|
|
|
|
|
|
$pathInfo = empty($_SERVER['PATH_INFO']) ? '/Error' : urldecode($_SERVER['PATH_INFO']); |
|
|
|
|
$pathInfos = explode('/', $pathInfo); |
|
|
|
@ -718,8 +695,6 @@ if ($user !== '') { |
|
|
|
|
FreshRSS_Context::$user_conf = get_user_configuration($user); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//logMe('User => ' . $user); |
|
|
|
|
|
|
|
|
|
Minz_Session::_param('currentUser', $user); |
|
|
|
|
|
|
|
|
|
if (count($pathInfos) < 3) { |
|
|
|
|