summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-09-27 23:02:34 +0200
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-09-27 23:02:34 +0200
commit90164df068783f32fee9ca445c99b340004a13c7 (patch)
treeb1e184c5bf090ccf82126d0b8cba7a744018bdf8
parentc1c5279109782537cf7d6b6b2664af2a0990fb16 (diff)
parent1d87ebe9dd607a8e4da395d102763b62a94ac02b (diff)
Merge branch 'FreshRSS/dev' into PostgreSQL
-rw-r--r--CHANGELOG.md4
-rwxr-xr-xapp/Controllers/feedController.php22
-rw-r--r--app/Models/CategoryDAO.php3
-rw-r--r--data/users/_/config.default.php1
-rw-r--r--lib/SimplePie/SimplePie/Content/Type/Sniffer.php8
-rw-r--r--p/api/greader.php76
6 files changed, 88 insertions, 26 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2c8dbec9b..f13922837 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,7 @@
## 2016-XX-XX FreshRSS 1.6.0-dev
* API
- * Support for editing feeds and categories from client applications [#1261](https://github.com/FreshRSS/FreshRSS/pull/1261)
+ * Support for editing feeds and categories from client applications [#1254](https://github.com/FreshRSS/FreshRSS/issues/1254)
* Features
* Better control of number of entries per page or RSS feed [#1249](https://github.com/FreshRSS/FreshRSS/issues/1249)
* Since X hours: `https://freshrss.example/i/?a=rss&hours=3`
@@ -12,6 +12,8 @@
* Support custom ports `localhost:3306` for database servers [#1241](https://github.com/FreshRSS/FreshRSS/issues/1241)
* Bug fixing
* Correction of bugs related CSRF tokens introduced in version 1.5.0 [#1253](https://github.com/FreshRSS/FreshRSS/issues/1253), [44f22ab](https://github.com/FreshRSS/FreshRSS/pull/1261/commits/d9bf9b2c6f0b2cc9dec3b638841b7e3040dcf46f)
+* SimplePie
+ * Fix auto-discovery of RSS feeds in Web pages served as `text/xml` [#1264](https://github.com/FreshRSS/FreshRSS/issues/1264)
* Security
* Prevent `<a target="_blank">` attacks with `window.opener` [#1245](https://github.com/FreshRSS/FreshRSS/issues/1245)
* UI
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index faf670e6e..c2a22aeb3 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -473,17 +473,25 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
return $feedDAO->updateFeed($feed_id, array('name' => $feed_name));
}
- public static function moveFeed($feed_id, $cat_id) {
- if ($feed_id <= 0) {
+ public static function moveFeed($feed_id, $cat_id, $new_cat_name = '') {
+ if ($feed_id <= 0 || ($cat_id <= 0 && $new_cat_name == '')) {
return false;
}
- if ($cat_id <= 0) {
- // If category was not given get the default one.
- $catDAO = new FreshRSS_CategoryDAO();
+
+ $catDAO = new FreshRSS_CategoryDAO();
+ if ($cat_id > 0) {
+ $cat = $catDAO->searchById($cat_id);
+ $cat_id = $cat == null ? 0 : $cat->id();
+ }
+ if ($cat_id <= 1 && $new_cat_name != '') {
+ $cat_id = $catDAO->addCategory(array('name' => $new_cat_name));
+ }
+ if ($cat_id <= 1) {
$catDAO->checkDefault();
- $def_cat = $catDAO->getDefault();
- $cat_id = $def_cat->id();
+ $cat = $catDAO->getDefault();
+ $cat_id = $cat->id();
}
+
$feedDAO = FreshRSS_Factory::createFeedDao();
return $feedDAO->updateFeed($feed_id, array('category' => $cat_id));
}
diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php
index 1dab60ea9..45fdcb5af 100644
--- a/app/Models/CategoryDAO.php
+++ b/app/Models/CategoryDAO.php
@@ -50,6 +50,9 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo implements FreshRSS_Searchable
}
public function deleteCategory($id) {
+ if ($id <= 1) {
+ return false;
+ }
$sql = 'DELETE FROM `' . $this->prefix . 'category` WHERE id=?';
$stm = $this->bd->prepare($sql);
diff --git a/data/users/_/config.default.php b/data/users/_/config.default.php
index 2c56d5f45..6e1d497bc 100644
--- a/data/users/_/config.default.php
+++ b/data/users/_/config.default.php
@@ -5,6 +5,7 @@ return array (
'old_entries' => 3,
'keep_history_default' => 0,
'ttl_default' => 3600,
+ 'mail_login' => '',
'token' => '',
'passwordHash' => '',
'apiPasswordHash' => '',
diff --git a/lib/SimplePie/SimplePie/Content/Type/Sniffer.php b/lib/SimplePie/SimplePie/Content/Type/Sniffer.php
index a32f47f59..daec3607d 100644
--- a/lib/SimplePie/SimplePie/Content/Type/Sniffer.php
+++ b/lib/SimplePie/SimplePie/Content/Type/Sniffer.php
@@ -109,9 +109,7 @@ class SimplePie_Content_Type_Sniffer
{
return $this->unknown();
}
- elseif (substr($official, -4) === '+xml'
- || $official === 'text/xml'
- || $official === 'application/xml')
+ elseif (substr($official, -4) === '+xml')
{
return $official;
}
@@ -126,7 +124,9 @@ class SimplePie_Content_Type_Sniffer
return $official;
}
}
- elseif ($official === 'text/html')
+ elseif ($official === 'text/html'
+ || $official === 'text/xml'
+ || $official === 'application/xml')
{
return $this->feed_or_html();
}
diff --git a/p/api/greader.php b/p/api/greader.php
index e77ef3726..4965ffd3b 100644
--- a/p/api/greader.php
+++ b/p/api/greader.php
@@ -222,6 +222,17 @@ function checkToken($conf, $token) {
unauthorized();
}
+function userInfo() { //https://github.com/theoldreader/api#user-info
+ //logMe("userInfo()");
+ $user = Minz_Session::param('currentUser', '_');
+ exit(json_encode(array(
+ 'userId' => $user,
+ 'userName' => $user,
+ 'userProfileId' => $user,
+ 'userEmail' => FreshRSS_Context::$user_conf->mail_login,
+ )));
+}
+
function tagList() {
//logMe("tagList()");
header('Content-Type: application/json; charset=UTF-8');
@@ -299,16 +310,23 @@ function subscriptionEdit($streamNames, $titles, $action, $add = '', $remove = '
$categoryDAO = new FreshRSS_CategoryDAO();
}
$c_name = '';
- if ($add != '' && strpos($add, 'user/-/label/') === 0) { //user/-/label/Example
- $c_name = substr($add, 13);
+ if ($add != '' && strpos($add, 'user/') === 0) { //user/-/label/Example ; user/username/label/Example
+ if (strpos($add, 'user/-/label/') === 0) {
+ $c_name = substr($add, 13);
+ } else {
+ $user = Minz_Session::param('currentUser', '_');
+ $prefix = 'user/' . $user . '/label/';
+ if (strpos($add, $prefix) === 0) {
+ $c_name = substr($add, strlen($prefix));
+ } else {
+ $c_name = '';
+ }
+ }
$cat = $categoryDAO->searchByName($c_name);
- $addCatId = $cat == null ? -1 : $cat->id();
+ $addCatId = $cat == null ? 0 : $cat->id();
} else if ($remove != '' && strpos($remove, 'user/-/label/')) {
$addCatId = 1; //Default category
}
- if ($addCatId <= 0 && $c_name = '') {
- $addCatId = 1; //Default category
- }
$feedDAO = FreshRSS_Factory::createFeedDao();
for ($i = count($streamNames) - 1; $i >= 0; $i--) {
$streamName = $streamNames[$i]; //feed/http://example.net/sample.xml ; feed/338
@@ -345,8 +363,8 @@ function subscriptionEdit($streamNames, $titles, $action, $add = '', $remove = '
break;
case 'edit':
if ($feedId > 0) {
- if ($addCatId > 0) {
- FreshRSS_feed_Controller::moveFeed($feedId, $addCatId);
+ if ($addCatId > 0 || $c_name != '') {
+ FreshRSS_feed_Controller::moveFeed($feedId, $addCatId, $c_name);
}
if ($title != '') {
FreshRSS_feed_Controller::renameFeed($feedId, $title);
@@ -361,6 +379,23 @@ function subscriptionEdit($streamNames, $titles, $action, $add = '', $remove = '
exit('OK');
}
+function quickadd($url) {
+ //logMe("quickadd($url)");
+ try {
+ $feed = FreshRSS_feed_Controller::addFeed($url);
+ exit(json_encode(array(
+ 'numResults' => 1,
+ 'streamId' => $feed->id(),
+ )));
+ } catch (Exception $e) {
+ logMe("subscriptionEdit error subscribe: " . $e->getMessage());
+ die(json_encode(array(
+ 'numResults' => 0,
+ 'error' => $e->getMessage(),
+ )));
+ }
+}
+
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');
@@ -531,7 +566,7 @@ function streamContentsItemsIds($streamId, $start_time, $count, $order, $exclude
$id = basename($streamId);
} elseif (strpos($streamId, 'user/-/label/') === 0) {
$type = 'c';
- $c_name = basename($streamId);
+ $c_name = substr($streamId, 13);
$categoryDAO = new FreshRSS_CategoryDAO();
$cat = $categoryDAO->searchByName($c_name);
$id = $cat == null ? -1 : $cat->id();
@@ -616,8 +651,8 @@ function renameTag($s, $dest) {
badRequest();
}
-function disableTag($s, $dest) {
- //logMe("renameTag()");
+function disableTag($s) {
+ //logMe("disableTag($s)");
if ($s != '' && strpos($s, 'user/-/label/') === 0) {
$s = substr($s, 13);
$categoryDAO = new FreshRSS_CategoryDAO();
@@ -625,6 +660,9 @@ function disableTag($s, $dest) {
if ($cat != null) {
$feedDAO = FreshRSS_Factory::createFeedDao();
$feedDAO->changeCategory($cat->id(), 0);
+ if ($cat->id() > 1) {
+ $categoryDAO->deleteCategory($cat->id());
+ }
exit('OK');
}
}
@@ -638,7 +676,7 @@ function markAllAsRead($streamId, $olderThanId) {
$f_id = basename($streamId);
$entryDAO->markReadFeed($f_id, $olderThanId);
} elseif (strpos($streamId, 'user/-/label/') === 0) {
- $c_name = basename($streamId);
+ $c_name = substr($streamId, 13);
$categoryDAO = new FreshRSS_CategoryDAO();
$cat = $categoryDAO->searchByName($c_name);
$entryDAO->markReadCat($cat === null ? -1 : $cat->id(), $olderThanId);
@@ -749,6 +787,11 @@ elseif ($pathInfos[1] === 'reader' && $pathInfos[2] === 'api' && isset($pathInfo
subscriptionEdit($streamNames, $titles, $action, $add, $remove);
}
break;
+ case 'quickadd': //https://github.com/theoldreader/api
+ if (isset($_GET['quickadd'])) {
+ quickadd($_GET['quickadd']);
+ }
+ break;
}
}
break;
@@ -776,8 +819,10 @@ elseif ($pathInfos[1] === 'reader' && $pathInfos[2] === 'api' && isset($pathInfo
case 'disable-tag': //https://github.com/theoldreader/api
$token = isset($_POST['T']) ? trim($_POST['T']) : '';
checkToken(FreshRSS_Context::$user_conf, $token);
- $s = isset($_POST['s']) ? $_POST['s'] : ''; //user/-/label/Folder
- disableTag($s);
+ $s_s = multiplePosts('s');
+ foreach ($s_s as $s) {
+ disableTag($s); //user/-/label/Folder
+ }
break;
case 'mark-all-as-read':
$token = isset($_POST['T']) ? trim($_POST['T']) : '';
@@ -792,6 +837,9 @@ elseif ($pathInfos[1] === 'reader' && $pathInfos[2] === 'api' && isset($pathInfo
case 'token':
token(FreshRSS_Context::$user_conf);
break;
+ case 'user-info':
+ userInfo();
+ break;
}
} elseif ($pathInfos[1] === 'check' && $pathInfos[2] === 'compatibility') {
checkCompatibility();