aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2024-01-15 10:36:30 +0100
committerGravatar GitHub <noreply@github.com> 2024-01-15 10:36:30 +0100
commit314077a457f04cc2f0472e036af029e2676fbf02 (patch)
tree1f38bb78761a56b8ee2034caba0dbda3912ef7c1 /app
parent52f6c8399b41e0c8be49dd56c89f451843189791 (diff)
PHPStan prepare exceptions (#6037)
Take advantage of https://phpstan.org/blog/bring-your-exceptions-under-control Minimum changes to pass `tooWideThrowType` and `implicitThrows`. Revert some mistakes from: https://github.com/FreshRSS/FreshRSS/pull/5504 Preparation needed before new PRs of the same type: https://github.com/FreshRSS/FreshRSS/pull/5962 Fix several wrong PHPDocs and catches: > Method ... has ...Exception in PHPDoc @throws tag but it's not thrown. > Dead catch - ...Exception is never thrown in the try block.
Diffstat (limited to 'app')
-rw-r--r--app/Controllers/authController.php1
-rw-r--r--app/Controllers/feedController.php4
-rw-r--r--app/Controllers/indexController.php1
-rw-r--r--app/Controllers/tagController.php2
-rw-r--r--app/Controllers/updateController.php18
-rw-r--r--app/Controllers/userController.php6
-rw-r--r--app/Exceptions/AlreadySubscribedException.php2
-rw-r--r--app/Exceptions/ContextException.php2
-rw-r--r--app/Exceptions/DAOException.php6
-rw-r--r--app/Exceptions/EntriesGetterException.php2
-rw-r--r--app/Exceptions/FeedException.php2
-rw-r--r--app/Exceptions/FeedNotAddedException.php2
-rw-r--r--app/Exceptions/ZipException.php2
-rw-r--r--app/Exceptions/ZipMissingException.php2
-rw-r--r--app/Models/CategoryDAO.php2
-rw-r--r--app/Models/Context.php7
-rw-r--r--app/Models/Entry.php3
-rw-r--r--app/Models/EntryDAO.php5
-rw-r--r--app/Models/Feed.php27
-rw-r--r--app/Models/FeedDAO.php1
-rw-r--r--app/Models/UserQuery.php6
-rw-r--r--app/Utils/dotpathUtil.php147
-rw-r--r--app/install.php5
23 files changed, 131 insertions, 124 deletions
diff --git a/app/Controllers/authController.php b/app/Controllers/authController.php
index 82dfefddd..7b0462888 100644
--- a/app/Controllers/authController.php
+++ b/app/Controllers/authController.php
@@ -65,7 +65,6 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController {
*
* It forwards to the correct login page (form) or main page if
* the user is already connected.
- * @throws Minz_ConfigurationParamException
*/
public function loginAction(): void {
if (FreshRSS_Auth::hasAccess() && Minz_Request::paramString('u') === '') {
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index 018bdb382..c194baf95 100644
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -30,8 +30,9 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController {
/**
* @param array<string,mixed> $attributes
* @throws FreshRSS_AlreadySubscribed_Exception
- * @throws FreshRSS_FeedNotAdded_Exception
+ * @throws FreshRSS_BadUrl_Exception
* @throws FreshRSS_Feed_Exception
+ * @throws FreshRSS_FeedNotAdded_Exception
* @throws Minz_FileNotExistException
*/
public static function addFeed(string $url, string $title = '', int $cat_id = 0, string $new_cat_name = '',
@@ -874,7 +875,6 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController {
/**
* @throws Minz_ConfigurationNamespaceException
- * @throws JsonException
* @throws Minz_PDOConnectionException
*/
public static function renameFeed(int $feed_id, string $feed_name): bool {
diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php
index a83307714..20223d340 100644
--- a/app/Controllers/indexController.php
+++ b/app/Controllers/indexController.php
@@ -241,6 +241,7 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController {
/**
* This method returns a list of entries based on the Context object.
* @return Traversable<FreshRSS_Entry>
+ * @throws FreshRSS_EntriesGetter_Exception
*/
public static function listEntriesByContext(): Traversable {
$entryDAO = FreshRSS_Factory::createEntryDao();
diff --git a/app/Controllers/tagController.php b/app/Controllers/tagController.php
index da90b3f1c..6233207ed 100644
--- a/app/Controllers/tagController.php
+++ b/app/Controllers/tagController.php
@@ -160,7 +160,7 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController {
/**
* @throws Minz_ConfigurationNamespaceException
- * @throws Minz_PDOConnectionException|JsonException
+ * @throws Minz_PDOConnectionException
*/
public function renameAction(): void {
if (!FreshRSS_Auth::hasAccess()) {
diff --git a/app/Controllers/updateController.php b/app/Controllers/updateController.php
index 78f28e493..eeac7eb09 100644
--- a/app/Controllers/updateController.php
+++ b/app/Controllers/updateController.php
@@ -11,18 +11,19 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
/**
* Automatic change to the new name of edge branch since FreshRSS 1.18.0.
+ * @throws Minz_Exception
*/
public static function migrateToGitEdge(): bool {
$errorMessage = 'Error during git checkout to edge branch. Please change branch manually!';
if (!is_writable(FRESHRSS_PATH . '/.git/config')) {
- throw new Exception($errorMessage);
+ throw new Minz_Exception($errorMessage);
}
//Note `git branch --show-current` requires git 2.22+
exec('git symbolic-ref --short HEAD', $output, $return);
if ($return != 0) {
- throw new Exception($errorMessage);
+ throw new Minz_Exception($errorMessage);
}
$line = implode('', $output);
if ($line !== 'master' && $line !== 'dev') {
@@ -33,13 +34,13 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
unset($output);
exec('git checkout edge --guess -f', $output, $return);
if ($return != 0) {
- throw new Exception($errorMessage);
+ throw new Minz_Exception($errorMessage);
}
unset($output);
exec('git reset --hard FETCH_HEAD', $output, $return);
if ($return != 0) {
- throw new Exception($errorMessage);
+ throw new Minz_Exception($errorMessage);
}
return true;
@@ -64,6 +65,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
chdir(FRESHRSS_PATH);
$output = [];
try {
+ /** @throws ValueError */
exec('git fetch --prune', $output, $return);
if ($return == 0) {
$output = [];
@@ -72,7 +74,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
$line = implode('; ', $output);
Minz_Log::warning('git fetch warning: ' . $line);
}
- } catch (Exception $e) {
+ } catch (Throwable $e) {
Minz_Log::warning('git fetch error: ' . $e->getMessage());
}
chdir($cwd);
@@ -101,11 +103,9 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
$output = [];
self::migrateToGitEdge();
- } catch (Exception $e) {
+ } catch (Throwable $e) {
Minz_Log::warning('Git error: ' . $e->getMessage());
- if (empty($output)) {
- $output = $e->getMessage();
- }
+ $output = $e->getMessage();
$return = 1;
}
chdir($cwd);
diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php
index 126eb60a2..fdf57b5f9 100644
--- a/app/Controllers/userController.php
+++ b/app/Controllers/userController.php
@@ -208,7 +208,11 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController {
}
}
- /** @param array<string,mixed> $userConfigOverride */
+ /**
+ * @param array<string,mixed> $userConfigOverride
+ * @throws Minz_ConfigurationNamespaceException
+ * @throws Minz_PDOConnectionException
+ */
public static function createUser(string $new_user_name, ?string $email, string $passwordPlain,
array $userConfigOverride = [], bool $insertDefaultFeeds = true): bool {
$userConfig = [];
diff --git a/app/Exceptions/AlreadySubscribedException.php b/app/Exceptions/AlreadySubscribedException.php
index 3802e7d65..8e2eaa13a 100644
--- a/app/Exceptions/AlreadySubscribedException.php
+++ b/app/Exceptions/AlreadySubscribedException.php
@@ -1,7 +1,7 @@
<?php
declare(strict_types=1);
-class FreshRSS_AlreadySubscribed_Exception extends Exception {
+class FreshRSS_AlreadySubscribed_Exception extends Minz_Exception {
private string $feedName = '';
diff --git a/app/Exceptions/ContextException.php b/app/Exceptions/ContextException.php
index 5d06baf35..90b2e5f85 100644
--- a/app/Exceptions/ContextException.php
+++ b/app/Exceptions/ContextException.php
@@ -4,6 +4,6 @@ declare(strict_types=1);
/**
* An exception raised when a context is invalid
*/
-class FreshRSS_Context_Exception extends Exception {
+class FreshRSS_Context_Exception extends Minz_Exception {
}
diff --git a/app/Exceptions/DAOException.php b/app/Exceptions/DAOException.php
deleted file mode 100644
index 3f689f318..000000000
--- a/app/Exceptions/DAOException.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-declare(strict_types=1);
-
-class FreshRSS_DAO_Exception extends Exception {
-
-}
diff --git a/app/Exceptions/EntriesGetterException.php b/app/Exceptions/EntriesGetterException.php
index a9f29e034..8d8a880c6 100644
--- a/app/Exceptions/EntriesGetterException.php
+++ b/app/Exceptions/EntriesGetterException.php
@@ -1,6 +1,6 @@
<?php
declare(strict_types=1);
-class FreshRSS_EntriesGetter_Exception extends Exception {
+class FreshRSS_EntriesGetter_Exception extends Minz_Exception {
}
diff --git a/app/Exceptions/FeedException.php b/app/Exceptions/FeedException.php
index 343aca5d6..26d042f6f 100644
--- a/app/Exceptions/FeedException.php
+++ b/app/Exceptions/FeedException.php
@@ -1,6 +1,6 @@
<?php
declare(strict_types=1);
-class FreshRSS_Feed_Exception extends Exception {
+class FreshRSS_Feed_Exception extends Minz_Exception {
}
diff --git a/app/Exceptions/FeedNotAddedException.php b/app/Exceptions/FeedNotAddedException.php
index 921cd985b..cec8397e4 100644
--- a/app/Exceptions/FeedNotAddedException.php
+++ b/app/Exceptions/FeedNotAddedException.php
@@ -1,7 +1,7 @@
<?php
declare(strict_types=1);
-class FreshRSS_FeedNotAdded_Exception extends Exception {
+class FreshRSS_FeedNotAdded_Exception extends Minz_Exception {
private string $url = '';
diff --git a/app/Exceptions/ZipException.php b/app/Exceptions/ZipException.php
index a0664f913..57176ab5f 100644
--- a/app/Exceptions/ZipException.php
+++ b/app/Exceptions/ZipException.php
@@ -1,7 +1,7 @@
<?php
declare(strict_types=1);
-class FreshRSS_Zip_Exception extends Exception {
+class FreshRSS_Zip_Exception extends Minz_Exception {
private int $zipErrorCode = 0;
diff --git a/app/Exceptions/ZipMissingException.php b/app/Exceptions/ZipMissingException.php
index c33c1bcb8..1ed8c7626 100644
--- a/app/Exceptions/ZipMissingException.php
+++ b/app/Exceptions/ZipMissingException.php
@@ -1,5 +1,5 @@
<?php
declare(strict_types=1);
-class FreshRSS_ZipMissing_Exception extends Exception {
+class FreshRSS_ZipMissing_Exception extends Minz_Exception {
}
diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php
index a22cda420..020a5e2e2 100644
--- a/app/Models/CategoryDAO.php
+++ b/app/Models/CategoryDAO.php
@@ -101,7 +101,6 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo {
/**
* @param array{'name':string,'id'?:int,'kind'?:int,'lastUpdate'?:int,'error'?:int|bool,'attributes'?:string|array<string,mixed>} $valuesTmp
* @return int|false
- * @throws JsonException
*/
public function addCategory(array $valuesTmp) {
// TRIM() to provide a type hint as text
@@ -155,7 +154,6 @@ SQL;
/**
* @param array{'name':string,'kind':int,'attributes'?:array<string,mixed>|mixed|null} $valuesTmp
* @return int|false
- * @throws JsonException
*/
public function updateCategory(int $id, array $valuesTmp) {
// No tag of the same name
diff --git a/app/Models/Context.php b/app/Models/Context.php
index bb6fa4cbd..2d22290bc 100644
--- a/app/Models/Context.php
+++ b/app/Models/Context.php
@@ -75,6 +75,9 @@ final class FreshRSS_Context {
}
}
+ /**
+ * @throws FreshRSS_Context_Exception
+ */
public static function &systemConf(): FreshRSS_SystemConfiguration {
if (FreshRSS_Context::$system_conf === null) {
throw new FreshRSS_Context_Exception('System configuration not initialised!');
@@ -88,7 +91,6 @@ final class FreshRSS_Context {
/**
* Initialize the context for the current user.
- * @throws Minz_ConfigurationParamException
*/
public static function initUser(string $username = '', bool $userMustExist = true): void {
FreshRSS_Context::$user_conf = null;
@@ -153,6 +155,9 @@ final class FreshRSS_Context {
}
}
+ /**
+ * @throws FreshRSS_Context_Exception
+ */
public static function &userConf(): FreshRSS_UserConfiguration {
if (FreshRSS_Context::$user_conf === null) {
throw new FreshRSS_Context_Exception('User configuration not initialised!');
diff --git a/app/Models/Entry.php b/app/Models/Entry.php
index 16f01483a..d3cfa07de 100644
--- a/app/Models/Entry.php
+++ b/app/Models/Entry.php
@@ -691,6 +691,7 @@ HTML;
/**
* @param array<string,mixed> $attributes
+ * @throws Minz_Exception
*/
public static function getContentByParsing(string $url, string $path, array $attributes = [], int $maxRedirs = 3): string {
$cachePath = FreshRSS_Feed::cacheFilename($url, $attributes, FreshRSS_Feed::KIND_HTML_XPATH);
@@ -741,7 +742,7 @@ HTML;
$html = trim(sanitizeHTML($content, $base));
return $html;
} else {
- throw new Exception();
+ throw new Minz_Exception();
}
}
diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php
index b809c7475..abcc33a1a 100644
--- a/app/Models/EntryDAO.php
+++ b/app/Models/EntryDAO.php
@@ -1007,6 +1007,7 @@ SQL;
/**
* @param 'ASC'|'DESC' $order
* @return array{0:array<int|string>,1:string}
+ * @throws FreshRSS_EntriesGetter_Exception
*/
protected function sqlListEntriesWhere(string $alias = '', ?FreshRSS_BooleanSearch $filters = null,
int $state = FreshRSS_Entry::STATE_ALL,
@@ -1059,6 +1060,7 @@ SQL;
* @param int $id category/feed/tag ID
* @param 'ASC'|'DESC' $order
* @return array{0:array<int|string>,1:string}
+ * @throws FreshRSS_EntriesGetter_Exception
*/
private function sqlListWhere(string $type = 'a', int $id = 0, int $state = FreshRSS_Entry::STATE_ALL,
string $order = 'DESC', int $limit = 1, string $firstId = '', ?FreshRSS_BooleanSearch $filters = null,
@@ -1126,6 +1128,7 @@ SQL;
* @param 'ASC'|'DESC' $order
* @param int $id category/feed/tag ID
* @return PDOStatement|false
+ * @throws FreshRSS_EntriesGetter_Exception
*/
private function listWhereRaw(string $type = 'a', int $id = 0, int $state = FreshRSS_Entry::STATE_ALL,
string $order = 'DESC', int $limit = 1, string $firstId = '', ?FreshRSS_BooleanSearch $filters = null,
@@ -1161,6 +1164,7 @@ SQL;
* @param int $id category/feed/tag ID
* @param 'ASC'|'DESC' $order
* @return Traversable<FreshRSS_Entry>
+ * @throws FreshRSS_EntriesGetter_Exception
*/
public function listWhere(string $type = 'a', int $id = 0, int $state = FreshRSS_Entry::STATE_ALL,
string $order = 'DESC', int $limit = 1, string $firstId = '',
@@ -1226,6 +1230,7 @@ SQL;
* @param int $id category/feed/tag ID
* @param 'ASC'|'DESC' $order
* @return array<numeric-string>|null
+ * @throws FreshRSS_EntriesGetter_Exception
*/
public function listIdsWhere(string $type = 'a', int $id = 0, int $state = FreshRSS_Entry::STATE_ALL,
string $order = 'DESC', int $limit = 1, string $firstId = '', ?FreshRSS_BooleanSearch $filters = null): ?array {
diff --git a/app/Models/Feed.php b/app/Models/Feed.php
index 40e78bfeb..1de8258e8 100644
--- a/app/Models/Feed.php
+++ b/app/Models/Feed.php
@@ -65,6 +65,9 @@ class FreshRSS_Feed extends Minz_Model {
private string $hubUrl = '';
private string $selfUrl = '';
+ /**
+ * @throws FreshRSS_BadUrl_Exception
+ */
public function __construct(string $url, bool $validate = true) {
if ($validate) {
$this->_url($url);
@@ -248,6 +251,9 @@ class FreshRSS_Feed extends Minz_Model {
$this->id = $value;
}
+ /**
+ * @throws FreshRSS_BadUrl_Exception
+ */
public function _url(string $value, bool $validate = true): void {
$this->hash = '';
$url = $value;
@@ -323,9 +329,16 @@ class FreshRSS_Feed extends Minz_Model {
$this->nbEntries = $value;
}
+ /**
+ * @throws Minz_FileNotExistException
+ * @throws FreshRSS_Feed_Exception
+ */
public function load(bool $loadDetails = false, bool $noCache = false): ?SimplePie {
if ($this->url != '') {
- // @phpstan-ignore-next-line
+ /**
+ * @phpstan-ignore-next-line
+ * @throws Minz_FileNotExistException
+ */
if (CACHE_PATH == '') {
throw new Minz_FileNotExistException(
'CACHE_PATH',
@@ -615,9 +628,6 @@ class FreshRSS_Feed extends Minz_Model {
];
}
- /**
- * @throws FreshRSS_Context_Exception
- */
public function loadJson(): ?SimplePie {
if ($this->url == '') {
return null;
@@ -654,9 +664,6 @@ class FreshRSS_Feed extends Minz_Model {
return $this->simplePieFromContent($feedContent);
}
- /**
- * @throws FreshRSS_Context_Exception
- */
public function loadHtmlXpath(): ?SimplePie {
if ($this->url == '') {
return null;
@@ -799,7 +806,6 @@ class FreshRSS_Feed extends Minz_Model {
/**
* @return int|null The max number of unread articles to keep, or null if disabled.
- * @throws JsonException
*/
public function keepMaxUnread() {
$keepMaxUnread = $this->attributeInt('keep_max_n_unread');
@@ -881,7 +887,10 @@ class FreshRSS_Feed extends Minz_Model {
return false;
}
- /** @param array<string,mixed> $attributes */
+ /**
+ * @param array<string,mixed> $attributes
+ * @throws FreshRSS_Context_Exception
+ */
public static function cacheFilename(string $url, array $attributes, int $kind = FreshRSS_Feed::KIND_RSS): string {
$simplePie = customSimplePie($attributes);
$filename = $simplePie->get_cache_filename($url);
diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php
index 895d2d333..0744970de 100644
--- a/app/Models/FeedDAO.php
+++ b/app/Models/FeedDAO.php
@@ -37,7 +37,6 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo {
* @param array{'url':string,'kind':int,'category':int,'name':string,'website':string,'description':string,'lastUpdate':int,'priority'?:int,
* 'pathEntries'?:string,'httpAuth':string,'error':int|bool,'ttl'?:int,'attributes'?:string|array<string|mixed>} $valuesTmp
* @return int|false
- * @throws JsonException
*/
public function addFeed(array $valuesTmp) {
$sql = 'INSERT INTO `_feed` (url, kind, category, name, website, description, `lastUpdate`, priority, `pathEntries`, `httpAuth`, error, ttl, attributes)
diff --git a/app/Models/UserQuery.php b/app/Models/UserQuery.php
index 85df49f1c..000cfbbdd 100644
--- a/app/Models/UserQuery.php
+++ b/app/Models/UserQuery.php
@@ -109,8 +109,6 @@ class FreshRSS_UserQuery {
/**
* Parse the query string when it is a "category" query
- *
- * @throws FreshRSS_DAO_Exception
*/
private function parseCategory(int $id): void {
if ($this->category_dao === null) {
@@ -127,8 +125,6 @@ class FreshRSS_UserQuery {
/**
* Parse the query string when it is a "feed" query
- *
- * @throws FreshRSS_DAO_Exception
*/
private function parseFeed(int $id): void {
if ($this->feed_dao === null) {
@@ -145,8 +141,6 @@ class FreshRSS_UserQuery {
/**
* Parse the query string when it is a "tag" query
- *
- * @throws FreshRSS_DAO_Exception
*/
private function parseTag(int $id): void {
if ($this->tag_dao === null) {
diff --git a/app/Utils/dotpathUtil.php b/app/Utils/dotpathUtil.php
index 299b1dcc4..b4da1506e 100644
--- a/app/Utils/dotpathUtil.php
+++ b/app/Utils/dotpathUtil.php
@@ -110,97 +110,92 @@ final class FreshRSS_dotpath_Util
$view->rss_url = $feedSourceUrl;
$view->entries = [];
- try {
- $view->rss_title = isset($dotPaths['feedTitle'])
- ? (htmlspecialchars(FreshRSS_dotpath_Util::getString($jf, $dotPaths['feedTitle']) ?? '', ENT_COMPAT, 'UTF-8') ?: $defaultRssTitle)
- : $defaultRssTitle;
-
- $jsonItems = FreshRSS_dotpath_Util::get($jf, $dotPaths['item']);
- if (!is_array($jsonItems) || count($jsonItems) === 0) {
- return null;
- }
+ $view->rss_title = isset($dotPaths['feedTitle'])
+ ? (htmlspecialchars(FreshRSS_dotpath_Util::getString($jf, $dotPaths['feedTitle']) ?? '', ENT_COMPAT, 'UTF-8') ?: $defaultRssTitle)
+ : $defaultRssTitle;
- foreach ($jsonItems as $jsonItem) {
- $rssItem = [];
- $rssItem['link'] = isset($dotPaths['itemUri']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemUri']) ?? '' : '';
- if (empty($rssItem['link'])) {
- continue;
- }
- $rssItem['title'] = isset($dotPaths['itemTitle']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemTitle']) ?? '' : '';
- $rssItem['author'] = isset($dotPaths['itemAuthor']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemAuthor']) ?? '' : '';
- $rssItem['timestamp'] = isset($dotPaths['itemTimestamp']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemTimestamp']) ?? '' : '';
-
- //get simple content, but if a path for HTML content has been provided, replace the simple content with HTML content
- $rssItem['content'] = isset($dotPaths['itemContent']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemContent']) ?? '' : '';
- $rssItem['content'] = isset($dotPaths['itemContentHTML'])
- ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemContentHTML']) ?? ''
- : $rssItem['content'];
-
- if (isset($dotPaths['itemTimeFormat']) && is_string($dotPaths['itemTimeFormat'])) {
- $dateTime = DateTime::createFromFormat($dotPaths['itemTimeFormat'], $rssItem['timestamp']);
- if ($dateTime != false) {
- $rssItem['timestamp'] = $dateTime->format(DateTime::ATOM);
- }
+ $jsonItems = FreshRSS_dotpath_Util::get($jf, $dotPaths['item']);
+ if (!is_array($jsonItems) || count($jsonItems) === 0) {
+ return null;
+ }
+
+ foreach ($jsonItems as $jsonItem) {
+ $rssItem = [];
+ $rssItem['link'] = isset($dotPaths['itemUri']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemUri']) ?? '' : '';
+ if (empty($rssItem['link'])) {
+ continue;
+ }
+ $rssItem['title'] = isset($dotPaths['itemTitle']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemTitle']) ?? '' : '';
+ $rssItem['author'] = isset($dotPaths['itemAuthor']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemAuthor']) ?? '' : '';
+ $rssItem['timestamp'] = isset($dotPaths['itemTimestamp']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemTimestamp']) ?? '' : '';
+
+ //get simple content, but if a path for HTML content has been provided, replace the simple content with HTML content
+ $rssItem['content'] = isset($dotPaths['itemContent']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemContent']) ?? '' : '';
+ $rssItem['content'] = isset($dotPaths['itemContentHTML'])
+ ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemContentHTML']) ?? ''
+ : $rssItem['content'];
+
+ if (isset($dotPaths['itemTimeFormat']) && is_string($dotPaths['itemTimeFormat'])) {
+ $dateTime = DateTime::createFromFormat($dotPaths['itemTimeFormat'], $rssItem['timestamp']);
+ if ($dateTime != false) {
+ $rssItem['timestamp'] = $dateTime->format(DateTime::ATOM);
}
+ }
- if (isset($dotPaths['itemCategories'])) {
- $jsonItemCategories = FreshRSS_dotpath_Util::get($jsonItem, $dotPaths['itemCategories']);
- if (is_string($jsonItemCategories) && $jsonItemCategories !== '') {
- $rssItem['tags'] = [$jsonItemCategories];
- } elseif (is_array($jsonItemCategories) && count($jsonItemCategories) > 0) {
- $rssItem['tags'] = [];
- foreach ($jsonItemCategories as $jsonItemCategory) {
- if (is_string($jsonItemCategory)) {
- $rssItem['tags'][] = $jsonItemCategory;
- }
+ if (isset($dotPaths['itemCategories'])) {
+ $jsonItemCategories = FreshRSS_dotpath_Util::get($jsonItem, $dotPaths['itemCategories']);
+ if (is_string($jsonItemCategories) && $jsonItemCategories !== '') {
+ $rssItem['tags'] = [$jsonItemCategories];
+ } elseif (is_array($jsonItemCategories) && count($jsonItemCategories) > 0) {
+ $rssItem['tags'] = [];
+ foreach ($jsonItemCategories as $jsonItemCategory) {
+ if (is_string($jsonItemCategory)) {
+ $rssItem['tags'][] = $jsonItemCategory;
}
}
}
+ }
- $rssItem['thumbnail'] = isset($dotPaths['itemThumbnail']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemThumbnail']) ?? '' : '';
-
- //Enclosures?
- if (isset($dotPaths['itemAttachment'])) {
- $jsonItemAttachments = FreshRSS_dotpath_Util::get($jsonItem, $dotPaths['itemAttachment']);
- if (is_array($jsonItemAttachments) && count($jsonItemAttachments) > 0) {
- $rssItem['attachments'] = [];
- foreach ($jsonItemAttachments as $attachment) {
- $rssAttachment = [];
- $rssAttachment['url'] = isset($dotPaths['itemAttachmentUrl'])
- ? FreshRSS_dotpath_Util::getString($attachment, $dotPaths['itemAttachmentUrl'])
- : '';
- $rssAttachment['type'] = isset($dotPaths['itemAttachmentType'])
- ? FreshRSS_dotpath_Util::getString($attachment, $dotPaths['itemAttachmentType'])
- : '';
- $rssAttachment['length'] = isset($dotPaths['itemAttachmentLength'])
- ? FreshRSS_dotpath_Util::get($attachment, $dotPaths['itemAttachmentLength'])
- : '';
- $rssItem['attachments'][] = $rssAttachment;
- }
+ $rssItem['thumbnail'] = isset($dotPaths['itemThumbnail']) ? FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemThumbnail']) ?? '' : '';
+
+ //Enclosures?
+ if (isset($dotPaths['itemAttachment'])) {
+ $jsonItemAttachments = FreshRSS_dotpath_Util::get($jsonItem, $dotPaths['itemAttachment']);
+ if (is_array($jsonItemAttachments) && count($jsonItemAttachments) > 0) {
+ $rssItem['attachments'] = [];
+ foreach ($jsonItemAttachments as $attachment) {
+ $rssAttachment = [];
+ $rssAttachment['url'] = isset($dotPaths['itemAttachmentUrl'])
+ ? FreshRSS_dotpath_Util::getString($attachment, $dotPaths['itemAttachmentUrl'])
+ : '';
+ $rssAttachment['type'] = isset($dotPaths['itemAttachmentType'])
+ ? FreshRSS_dotpath_Util::getString($attachment, $dotPaths['itemAttachmentType'])
+ : '';
+ $rssAttachment['length'] = isset($dotPaths['itemAttachmentLength'])
+ ? FreshRSS_dotpath_Util::get($attachment, $dotPaths['itemAttachmentLength'])
+ : '';
+ $rssItem['attachments'][] = $rssAttachment;
}
}
+ }
- if (isset($dotPaths['itemUid'])) {
- $rssItem['guid'] = FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemUid']);
- }
+ if (isset($dotPaths['itemUid'])) {
+ $rssItem['guid'] = FreshRSS_dotpath_Util::getString($jsonItem, $dotPaths['itemUid']);
+ }
- if (empty($rssItem['guid'])) {
- $rssItem['guid'] = 'urn:sha1:' . sha1($rssItem['title'] . $rssItem['content'] . $rssItem['link']);
- }
+ if (empty($rssItem['guid'])) {
+ $rssItem['guid'] = 'urn:sha1:' . sha1($rssItem['title'] . $rssItem['content'] . $rssItem['link']);
+ }
- if ($rssItem['title'] != '' || $rssItem['content'] != '' || $rssItem['link'] != '') {
- // HTML-encoding/escaping of the relevant fields (all except 'content')
- foreach (['author', 'guid', 'link', 'thumbnail', 'timestamp', 'tags', 'title'] as $key) {
- if (!empty($rssItem[$key]) && is_string($rssItem[$key])) {
- $rssItem[$key] = Minz_Helper::htmlspecialchars_utf8($rssItem[$key]);
- }
+ if ($rssItem['title'] != '' || $rssItem['content'] != '' || $rssItem['link'] != '') {
+ // HTML-encoding/escaping of the relevant fields (all except 'content')
+ foreach (['author', 'guid', 'link', 'thumbnail', 'timestamp', 'tags', 'title'] as $key) {
+ if (!empty($rssItem[$key]) && is_string($rssItem[$key])) {
+ $rssItem[$key] = Minz_Helper::htmlspecialchars_utf8($rssItem[$key]);
}
- $view->entries[] = FreshRSS_Entry::fromArray($rssItem);
}
+ $view->entries[] = FreshRSS_Entry::fromArray($rssItem);
}
- } catch (Exception $ex) {
- Minz_Log::warning($ex->getMessage());
- return null;
}
return $view->renderToString();
diff --git a/app/install.php b/app/install.php
index 7703b3840..3ad69c071 100644
--- a/app/install.php
+++ b/app/install.php
@@ -508,7 +508,10 @@ function printStep1(): void {
<?php
}
-/* Select database & configuration */
+/**
+ * Select database & configuration
+ * @throws Minz_ConfigurationNamespaceException
+ */
function printStep2(): void {
$system_default_config = FreshRSS_SystemConfiguration::get('default_system');
$s2 = checkStep2();