From 923f986e67413ac548cc98d6d59fa01de9681035 Mon Sep 17 00:00:00 2001 From: Devlin Junker Date: Sat, 5 Aug 2023 19:16:39 -0700 Subject: upmerged from master Signed-off-by: Devlin Junker --- .github/pull_request_template.md | 12 + .github/workflows/api-integration-tests.yml | 17 +- .github/workflows/api-php-static-code-check.yml | 10 +- .github/workflows/api-php-tests.yml | 7 +- .github/workflows/build-release.yml | 8 +- .github/workflows/frontend-nodejs-tests.yml | 4 +- .github/workflows/lint-eslint.yml | 4 +- .github/workflows/post-merge-tasks.yml | 2 +- .github/workflows/updater-test.yml | 80 + .gitignore | 6 + .gitmodules | 3 + AUTHORS.md | 9 +- CHANGELOG.md | 71 +- README.md | 8 + appinfo/info.xml | 12 +- composer.json | 20 +- docs/admin.md | 7 +- docs/clients.md | 1 + docs/faq.md | 119 - docs/features/integration.md | 30 + docs/install.md | 8 +- docs/troubleshooting.md | 97 + js-old/directive/NewsStickyMenu.js | 6 +- js-old/gui/KeyboardShortcuts.js | 2 +- l10n/ar.js | 111 +- l10n/ar.json | 111 +- l10n/ast.js | 87 +- l10n/ast.json | 87 +- l10n/az.js | 4 +- l10n/az.json | 4 +- l10n/bg.js | 3 + l10n/bg.json | 3 + l10n/ca.js | 21 + l10n/ca.json | 21 + l10n/cs.js | 3 + l10n/cs.json | 3 + l10n/de.js | 3 + l10n/de.json | 3 + l10n/de_DE.js | 9 +- l10n/de_DE.json | 9 +- l10n/el.js | 1 + l10n/el.json | 1 + l10n/en_GB.js | 27 + l10n/en_GB.json | 27 + l10n/es.js | 3 + l10n/es.json | 3 + l10n/es_EC.js | 28 + l10n/es_EC.json | 28 + l10n/et_EE.js | 13 +- l10n/et_EE.json | 13 +- l10n/eu.js | 5 + l10n/eu.json | 5 + l10n/fa.js | 3 +- l10n/fa.json | 3 +- l10n/fi.js | 4 + l10n/fi.json | 4 + l10n/fr.js | 5 +- l10n/fr.json | 5 +- l10n/gl.js | 32 +- l10n/gl.json | 32 +- l10n/hu.js | 3 + l10n/hu.json | 3 + l10n/id.js | 41 + l10n/id.json | 41 + l10n/it.js | 1 + l10n/it.json | 1 + l10n/ja.js | 1 + l10n/ja.json | 1 + l10n/ko.js | 1 + l10n/ko.json | 1 + l10n/lt_LT.js | 7 + l10n/lt_LT.json | 7 + l10n/mk.js | 1 + l10n/mk.json | 1 + l10n/nb.js | 25 + l10n/nb.json | 25 + l10n/nl.js | 1 + l10n/nl.json | 1 + l10n/pl.js | 1 + l10n/pl.json | 1 + l10n/pt_BR.js | 3 + l10n/pt_BR.json | 3 + l10n/ro.js | 2 +- l10n/ro.json | 2 +- l10n/ru.js | 9 + l10n/ru.json | 9 + l10n/sk.js | 1 + l10n/sk.json | 1 + l10n/sl.js | 1 + l10n/sl.json | 1 + l10n/sr.js | 21 + l10n/sr.json | 21 + l10n/sv.js | 1 + l10n/sv.json | 1 + l10n/th.js | 84 +- l10n/th.json | 84 +- l10n/tr.js | 13 +- l10n/tr.json | 13 +- l10n/uk.js | 12 +- l10n/uk.json | 12 +- l10n/zh_CN.js | 47 +- l10n/zh_CN.json | 47 +- l10n/zh_HK.js | 3 + l10n/zh_HK.json | 3 + l10n/zh_TW.js | 3 + l10n/zh_TW.json | 3 + lib/AppInfo/Application.php | 3 + lib/Config/FetcherConfig.php | 6 +- lib/Controller/PageController.php | 1 + lib/Db/Feed.php | 8 +- lib/Db/ItemMapperV2.php | 7 +- lib/Fetcher/FeedFetcher.php | 67 +- lib/Fetcher/Fetcher.php | 7 +- lib/Fetcher/IFeedFetcher.php | 4 +- lib/Migration/RemoveUnusedJob.php | 50 + lib/Scraper/Scraper.php | 7 +- lib/Search/FeedSearchProvider.php | 6 +- lib/Search/FolderSearchProvider.php | 4 +- lib/Search/ItemSearchProvider.php | 109 + lib/Service/FeedServiceV2.php | 57 +- lib/Service/StatusService.php | 27 +- lib/Settings/AdminSettings.php | 14 +- mkdocs.yml | 2 + package-lock.json | 42747 +++++++++++++--------- package.json | 12 +- src/components/AdminSettings.vue | 29 +- templates-old/part.navigation.addfeed.php | 2 +- tests/Unit/Db/ItemMapperTest.php | 12 +- tests/Unit/Fetcher/FeedFetcherTest.php | 21 +- tests/Unit/Search/FeedSearchProviderTest.php | 2 +- tests/Unit/Search/FolderSearchProviderTest.php | 2 +- tests/Unit/Search/ItemSearchProviderTest.php | 147 + tests/Unit/Service/StatusServiceTest.php | 12 +- tests/api/items.bats | 2 +- tests/command/feeds.bats | 3 +- tests/test_helper/bats-assert | 2 +- tests/test_helper/feeds/Nextcloud.rss | 22 +- tests/test_helper/feeds/heise.xml | 602 +- tests/test_helper/feeds/no_guid_feed.xml | 22 +- tests/test_helper/php-feed-generator | 1 + tests/updater/helpers/settings.bash | 8 + tests/updater/update.bats | 276 + 142 files changed, 27596 insertions(+), 18538 deletions(-) create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/updater-test.yml delete mode 100644 docs/faq.md create mode 100644 docs/features/integration.md create mode 100644 docs/troubleshooting.md create mode 100644 lib/Migration/RemoveUnusedJob.php create mode 100644 lib/Search/ItemSearchProvider.php create mode 100644 tests/Unit/Search/ItemSearchProviderTest.php create mode 160000 tests/test_helper/php-feed-generator create mode 100644 tests/updater/helpers/settings.bash create mode 100644 tests/updater/update.bats diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..ff211fb84 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,12 @@ + +* Resolves: # + +## Summary + + + +## Checklist + +- Code is [properly formatted](https://nextcloud.github.io/news/developer/#coding-style-guidelines) +- [Sign-off message](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md) is added to all commits +- Changelog entry added for all important changes. diff --git a/.github/workflows/api-integration-tests.yml b/.github/workflows/api-integration-tests.yml index 484bf38b3..16ea84198 100644 --- a/.github/workflows/api-integration-tests.yml +++ b/.github/workflows/api-integration-tests.yml @@ -28,23 +28,27 @@ jobs: - 5432:5432 # Maps tcp port 5432 on service container to the host strategy: matrix: - php-versions: ['7.4', '8.0'] - nextcloud: ['stable23', 'stable24', 'stable25'] + php-versions: ['8.0', '8.1'] + nextcloud: ['stable25', 'stable26', 'stable27'] database: ['sqlite', 'pgsql', 'mysql'] experimental: [false] include: - - php-versions: '8.0' + - php-versions: 8.1 nextcloud: pre-release database: sqlite experimental: true - - php-versions: '8.2' + - php-versions: 8.2 nextcloud: pre-release database: sqlite experimental: true - - php-versions: 8.1 + - php-versions: 7.4 nextcloud: stable25 database: sqlite experimental: false + - php-versions: 8.2 + nextcloud: stable26 + database: sqlite + experimental: false steps: - name: Checkout uses: actions/checkout@v3 @@ -126,9 +130,6 @@ jobs: kill %1 kill %2 - - name: Setup problem matchers for PHP - run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" - - name: Functional tests maintenance working-directory: ../server run: | diff --git a/.github/workflows/api-php-static-code-check.yml b/.github/workflows/api-php-static-code-check.yml index 57776f400..4afd9eaf1 100644 --- a/.github/workflows/api-php-static-code-check.yml +++ b/.github/workflows/api-php-static-code-check.yml @@ -7,14 +7,18 @@ jobs: continue-on-error: true strategy: matrix: - php-versions: [ '7.4', '8.0', '8.1' ] - nextcloud: [ 'stable25' ] + php-versions: ['8.0', '8.1', '8.2' ] + nextcloud: [ 'stable27' ] database: [ 'sqlite' ] include: - - php-versions: '8.2' + - php-versions: 8.2 nextcloud: pre-release database: sqlite experimental: true + - php-versions: 7.4 + nextcloud: stable25 + database: sqlite + experimental: false name: "phpstan: Nextcloud ${{ matrix.nextcloud }} with ${{ matrix.php-versions }}" steps: - name: Checkout diff --git a/.github/workflows/api-php-tests.yml b/.github/workflows/api-php-tests.yml index 0a2635316..dae893f22 100644 --- a/.github/workflows/api-php-tests.yml +++ b/.github/workflows/api-php-tests.yml @@ -10,13 +10,13 @@ jobs: strategy: matrix: php-versions: ['8.1'] - nextcloud: ['stable25'] + nextcloud: ['stable26', 'stable27'] database: ['sqlite'] experimental: [false] codecoverage: [false] include: - php-versions: 8.0 - nextcloud: stable24 + nextcloud: stable25 database: sqlite experimental: false codecoverage: true @@ -50,9 +50,6 @@ jobs: app: 'news' check-code: false - - name: Setup problem matchers for PHPUnit - run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" - - name: Prep PHP tests working-directory: ../server/apps/news run: make php-test-dependencies diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 06b1f4c3d..636235de0 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: php-versions: ['8.1'] - nextcloud: ['stable25'] + nextcloud: ['stable27'] database: ['sqlite'] steps: - name: Checkout @@ -29,7 +29,7 @@ jobs: coverage: none - name: Set up server non MySQL - uses: SMillerDev/nextcloud-actions/setup-nextcloud@fae87e29aa7cdf1ea0b8033c67f60e75b10be2cd + uses: SMillerDev/nextcloud-actions/setup-nextcloud@main with: cron: false version: ${{ matrix.nextcloud }} @@ -39,7 +39,7 @@ jobs: run: make - name: Configure server with app - uses: SMillerDev/nextcloud-actions/setup-nextcloud-app@fae87e29aa7cdf1ea0b8033c67f60e75b10be2cd + uses: SMillerDev/nextcloud-actions/setup-nextcloud-app@main with: app: ${{ env.APP_NAME }} check-code: false @@ -52,7 +52,7 @@ jobs: app_public_crt: ${{ secrets.APP_PUBLIC_CRT }} - name: Upload app tarball to release - uses: svenstaro/upload-release-action@133984371c30d34e38222a64855679a414cb7575 + uses: svenstaro/upload-release-action@2b9d2847a97b04d02ad5c3df2d3a27baa97ce689 id: attach_to_release with: repo_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/frontend-nodejs-tests.yml b/.github/workflows/frontend-nodejs-tests.yml index d78409ae4..e077e7d1b 100644 --- a/.github/workflows/frontend-nodejs-tests.yml +++ b/.github/workflows/frontend-nodejs-tests.yml @@ -4,13 +4,13 @@ on: jobs: php: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 continue-on-error: ${{ matrix.experimental }} name: "Frontend: Nextcloud ${{ matrix.nextcloud }} - PHP ${{ matrix.php-versions }} - DB ${{ matrix.database }}" strategy: matrix: php-versions: ['8.1'] - nextcloud: ['stable24'] + nextcloud: ['stable27'] database: ['sqlite'] experimental: [false] steps: diff --git a/.github/workflows/lint-eslint.yml b/.github/workflows/lint-eslint.yml index c08763ea9..ec439166b 100644 --- a/.github/workflows/lint-eslint.yml +++ b/.github/workflows/lint-eslint.yml @@ -25,10 +25,10 @@ jobs: uses: actions/checkout@v3 - name: Read package.json node and npm engines version - uses: skjnldsv/read-package-engines-version-actions@v1.2 + uses: skjnldsv/read-package-engines-version-actions@v2.2 id: versions with: - fallbackNode: '^12' + fallbackNode: '^16' fallbackNpm: '^6' - name: Set up node ${{ steps.versions.outputs.nodeVersion }} diff --git a/.github/workflows/post-merge-tasks.yml b/.github/workflows/post-merge-tasks.yml index 6385657d3..ea446f0ce 100644 --- a/.github/workflows/post-merge-tasks.yml +++ b/.github/workflows/post-merge-tasks.yml @@ -10,7 +10,7 @@ jobs: name: "Coverage: Nextcloud PHP ${{ matrix.php-versions }}" strategy: matrix: - nextcloud: ['stable25'] + nextcloud: ['stable27'] steps: - name: Checkout uses: actions/checkout@v3 diff --git a/.github/workflows/updater-test.yml b/.github/workflows/updater-test.yml new file mode 100644 index 000000000..eb5901a51 --- /dev/null +++ b/.github/workflows/updater-test.yml @@ -0,0 +1,80 @@ +name: Updater Tests +on: + pull_request + +env: + POSTGRES_PASSWORD: nc_test_db + MYSQL_USER: nc_test + MYSQL_PASSWORD: nc_test_db + MYSQL_DATABASE: nc_test + MYSQL_PORT: 3800 + +jobs: + integration: + runs-on: ubuntu-latest + continue-on-error: ${{ matrix.experimental }} + name: "Update Test: Nextcloud ${{ matrix.nextcloud }} - PHP ${{ matrix.php-versions }}" + strategy: + matrix: + php-versions: ['8.1'] + nextcloud: ['stable27'] + database: ['sqlite'] + experimental: [false] + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + extensions: pdo_sqlite,pdo_mysql,pdo_pgsql,gd,zip + coverage: none + + - name: Setup BATS & httpie + run: sudo apt-get install -y httpie && npm install -g bats@1.7.0 + + - name: Set up server + uses: SMillerDev/nextcloud-actions/setup-nextcloud@main + with: + version: ${{ matrix.nextcloud }} + cron: true + database-type: ${{ matrix.database }} + database-host: localhost + database-port: 5432 + database-name: postgres + database-user: postgres + database-password: ${{ env.POSTGRES_PASSWORD }} + + - name: Prime app build + run: make + + - name: Configure server with app + uses: SMillerDev/nextcloud-actions/setup-nextcloud-app@main + with: + app: 'news' + check-code: false + force: ${{ matrix.experimental }} + + - name: Install composer install php-feed-generator + working-directory: ../server + run: composer install -d apps/news/tests/test_helper/php-feed-generator + + - name: Run Updater tests + working-directory: ../server + run: | + php -S localhost:8080 &> /tmp/webserver.log & + cd apps/news/tests/test_helper/feeds && php -S localhost:8090 &> /tmp/feedserver.log & + + sleep 2 + + cd ${{ github.workspace }}/../server + + bats apps/news/tests/updater + + # Kill php server + kill %1 + kill %2 + diff --git a/.gitignore b/.gitignore index 651ed673e..649a92217 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,9 @@ tests/api/helpers/settings-override.bash #bats tests/api/helpers/settings-override.bash +tests/test_helper/feeds/test.xml +tests/test_helper/feeds/feed1.xml +tests/test_helper/feeds/feed2.xml # python PKG-INFO @@ -72,3 +75,6 @@ nbproject # Mac OS .DS_Store *.iml + +# VS Code +.vscode \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index d74af0778..b3b42f3c2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "tests/test_helper/bats-assert"] path = tests/test_helper/bats-assert url = https://github.com/bats-core/bats-assert.git +[submodule "tests/test_helper/php-feed-generator"] + path = tests/test_helper/php-feed-generator + url = https://github.com/Grotax/php-feed-generator.git diff --git a/AUTHORS.md b/AUTHORS.md index 42fe73777..ced11a335 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -50,11 +50,14 @@ * [Daniel Kesselberg](mailto:mail@danielkesselberg.de) * [ELHADDAD Hamza](mailto:elhaddadhamza49@gmail.com) * [Jakob Sack](mailto:mail@jakobsack.de) +* [ManuelSailer](mailto:github.com@manuel-sailer.de) * [Qingping Hou](mailto:dave2008713@gmail.com) * [Roman](mailto:reverse@jamm.me) * [b_b](mailto:bruno@eliaz.fr) +* [chylex](mailto:contact@chylex.com) * [heyarne](mailto:arne@schlueter.is) * [marco.nassabain@etu.unistra.fr](mailto:marco.nassabain@hotmail.com) +* [Anderson Silva](mailto:UnderEu@users.noreply.github.com) * [Andreas Fischer](mailto:bantu@owncloud.com) * [David Guillot](mailto:david@guillot.me) * [Gioele Falcetti](mailto:thegio.f@gmail.com) @@ -66,13 +69,13 @@ * [Konrad Graefe](mailto:konradgraefe@aol.com) * [Loki3000](mailto:github@labcms.ru) * [Maik Kulbe](mailto:info@linux-web-development.de) +* [Manuel Sailer](mailto:github.com@manuel-sailer.de) * [Michael Gapczynski](mailto:mtgap@owncloud.com) * [Nikita Chernyi](mailto:rakshazi@users.noreply.github.com) * [Peter Hedlund](mailto:peter@peterandlinda.com) * [Simon Spannagel](mailto:simonspa@kth.se) * [bbBowser](mailto:carspi@mail.de) * [benediktb](mailto:benedikt@blablub.de) -* [chylex](mailto:contact@chylex.com) * [coderkun](mailto:olli@coderkun.de) * [davidak](mailto:git@davidak.de) * [hooger](mailto:horvathg.1988@gmail.com) @@ -85,7 +88,6 @@ * [Alexander Grüßung](mailto:alexander@gruessung-online.de) * [Allan Nordhøy](mailto:epost@anotheragency.no) * [Alwaysin](mailto:adrien@demma.fr) -* [Anderson Silva](mailto:UnderEu@users.noreply.github.com) * [Andrea Boero](mailto:mail@tsumi.it) * [Andreas Demmelbauer](mailto:git@notice.at) * [Artem Lavrukhin](mailto:lavryha4590@gmail.com) @@ -107,6 +109,7 @@ * [Colin W](mailto:cwmke@users.noreply.github.com) * [Daniel Aleksandersen](mailto:code@daniel.priv.no) * [Daniel S](mailto:daniel@while-true-do.org) +* [Daniel Starzmann](mailto:daniel@starze.de) * [David Baucum](mailto:david@baucum.me) * [David Engster](mailto:deng@randomsample.de) * [Dennis Müller](mailto:dennismueller.kontakt@gmail.com) @@ -129,6 +132,7 @@ * [Hendrik Leppelsack](mailto:hendrik@leppelsack.de) * [Jasper Knockaert](mailto:jasper@knockaert.nl) * [Kevin Decherf](mailto:kevin@kdecherf.com) +* [Kuba Orlik](mailto:kontakt@kuba-orlik.name) * [Maceček Richard](mailto:46937538+macecekrichard@users.noreply.github.com) * [Marc Cousin](mailto:marc.cousin@people-doc.com) * [Martin Ferretti](mailto:ferrettimartin@protonmail.com) @@ -148,6 +152,7 @@ * [Piotr Dobrowolski](mailto:admin@tastycode.pl) * [Raspbeguy](mailto:raspbeguy@users.noreply.github.com) * [René Henrich](mailto:contact@rene-henrich.de) +* [Robert Wunderer](mailto:robert.wunderer@caprisys.at) * [Rodrigo Aguilera](mailto:rodrigo.aguilera@amazee.com) * [Roeland Jago Douma](mailto:roeland@famdouma.nl) * [Simon](mailto:sschubert89@gmail.com) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e655e246..a646485f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,82 @@ All notable changes to this project will be documented in this file. The format is mostly based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), older entries don't fully match. # Unreleased -## [20.x.x] +## [23.x.x] ### Changed - Vue Rewrite - Add Typescript - Add Jest for Unit Tests # Releases +## [22.0.0] - 2023-07-23 +### Changed +- Support deflate and gzip compression for HTTP response bodies (#2269) +- Broke apart old FAQ into different guides. Deprecated old FAQ (#2285) + +## [22.0.0-beta2] - 2023-06-18 +### Changed +- allowEvalScript set to true (#2262) + +## [22.0.0-beta1] - 2023-05-18 +### Changed +- Drop support for Nextcloud 24 (#2223) +- Add support for Nextcloud 27 (#2223) + +## [21.2.0] - 2023-05-06 +### Changed +- Improve visibility of links in dark theme (#2215) + +## [21.2.0-beta4] - 2023-04-16 +### Fixed +- Fix audio player floating when scrolling in NC25+ (#2142) +- Fix sorting of folder names in select when adding subscription (#2090) + +## [21.2.0-beta3] - 2023-04-16 +### Changed +- Improve performance of item updates (#1322) +### Fixed +- Fix display issue in NC26+ (#2192) + +## [21.2.0-beta2] - 2023-04-05 +### Fixed +- Fix last_modified not updated when all items are marked as read (#2183) + +## [21.2.0-beta1] - 2023-03-23 +### Changed +- Use httpLastModified field for If-Modified-Since header when fetching feed updates (#2119) + +## [21.1.0] - 2023-03-20 +No notable changes compared 21.1.0-beta1 + +## [21.1.0-beta1] - 2023-03-13 +### Changed +- Remove unused background job OCA\News\Cron\Updater (#2137) +- (Nextcloud 26+) Add info card to the admin settings, showing last job execution (#2141) + +## [21.0.0] - 2023-02-28 +No notable changes compared 21.0.0-beta1 + +## [21.0.0-beta1] - 2023-02-14 +### Changed +- Drop support for Nextcloud 23 (#2077 ) +- Make the "open" keyboard shortcut work faster (#2080) +- Implemented search for articles, results can only link to the feed. (#2075) +### Fixed +- Stop errors from the favicon library over empty values (#2096) + +## [20.0.1] - 2023-01-19 +### Fixed +- SyntaxError triggered when full-text is enabled with some items. (#2048, #2053) + +## [20.0.0] - 2022-12-14 +### Changed +- Drop support for PHP 7.3 (#2008) +- Dependency updates + +## [19.0.1] - 2022-12-01 +### Changed +- Dependency updates + ## [19.0.0] - 2022-10-25 ### Fixed - Fix nested scrollbars in navigation (#411, #1958) diff --git a/README.md b/README.md index fa1ee4db5..885f9fb7b 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,14 @@ The News app is an RSS/Atom feed aggregator. It offers a [RESTful API](https://n ## Documentation The documentation can be found [here](https://nextcloud.github.io/news/), the source of the documentation is on [GitHub](https://github.com/nextcloud/news/blob/master/docs) +### Common Guides + +There are some small guides for dealing with common setup and issues. + +* [Troubleshooting Guide](docs/troubleshooting.md) +* [Integration Guide](docs/features/integration.md) + + ## Bugs Please read the [appropriate section in the contributing notices](https://github.com/nextcloud/news/blob/master/CONTRIBUTING.md#issues) diff --git a/appinfo/info.xml b/appinfo/info.xml index eeb5af55b..1b06a84ad 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -21,7 +21,7 @@ Create a [feature request](https://github.com/nextcloud/news/discussions/new) Report a [feed issue](https://github.com/nextcloud/news/discussions/new) ]]> - 19.0.0 + 22.0.0 agpl Benjamin Brahmer Sean Molenaar @@ -43,7 +43,7 @@ Report a [feed issue](https://github.com/nextcloud/news/discussions/new) https://raw.githubusercontent.com/nextcloud/news/master/screenshots/2.png https://raw.githubusercontent.com/nextcloud/news/master/screenshots/3.png - + pgsql sqlite mysql @@ -55,13 +55,19 @@ Report a [feed issue](https://github.com/nextcloud/news/discussions/new) json - + OCA\News\Cron\UpdaterJob + + + OCA\News\Migration\RemoveUnusedJob + + + OCA\News\Command\ExploreGenerator OCA\News\Command\ShowFeed diff --git a/composer.json b/composer.json index 355c6619b..42055a515 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,7 @@ "source": "https://github.com/nextcloud/news/" }, "require": { - "php": "^7.2 || ~8.0", + "php": "^7.4 || ~8.0", "ezyang/htmlpurifier": "^4.16.0", "pear/net_url2": "^2.2.2", "riimu/kit-pathjoin": "^1.2.0", @@ -54,16 +54,16 @@ "ext-curl": "*" }, "require-dev": { - "phpunit/phpunit": "9.5.*", - "squizlabs/php_codesniffer": "^3.7.1", - "phpstan/phpstan": "^1.9.0", - "phpstan/phpstan-doctrine": "^1.3.22", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan-deprecation-rules": "^1.0", + "phpunit/phpunit": "9.6.*", + "squizlabs/php_codesniffer": "^3.7.2", + "phpstan/phpstan": "^1.10.26", + "phpstan/phpstan-doctrine": "^1.3.40", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpstan/phpstan-phpunit": "^1.3.13", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan-deprecation-rules": "^1.1", "guzzlehttp/guzzle": "^7.3.0", - "doctrine/dbal": "^3.5.1", + "doctrine/dbal": "^3.6.5", "symfony/console": "^4.4.19", "psr/log": "^1.1.0" }, diff --git a/docs/admin.md b/docs/admin.md index 0b2cef164..b645219e5 100644 --- a/docs/admin.md +++ b/docs/admin.md @@ -11,8 +11,11 @@ Alternatively you may use an [external updater](https://nextcloud.github.io/news Auto purging automatically removes the oldest read items of every feed after every update. The value you enter here is used as the limit of read items per feed, unless the feed comes with more items in it's feed. -For example you have the default value of 200 and the feed has 210 items in it's feed. -In this case the limit will be 210 instead of 200. +The individual limit per feed is only adjusted when it's bigger. Let's say last feed update came with 210 items, +then that will be the limit for that feed as long as no bigger update with more items is fetched. +In this case the limit will be 210 instead of 200, for that feed. + +This is needed to prevent items from reappearing in the feed. ## Purge unread items This changes the behavior of the auto purging to also purge unread items. This is useful if you have users with a lot of unread items. diff --git a/docs/clients.md b/docs/clients.md index 411d91f99..ae046960a 100644 --- a/docs/clients.md +++ b/docs/clients.md @@ -12,6 +12,7 @@ A sync client can be used to read news and synchronize via the API. | [RSS Guard](https://github.com/martinrotter/rssguard) | Windows, Linux, OS/2, macOS | GPL-3.0 License | [GitHub](https://github.com/martinrotter/rssguard) | | [Fluent Reader](https://hyliu.me/fluent-reader/) | Windows, Linux, macOS | BSD-3-Clause License | [GitHub](https://github.com/yang991178/fluent-reader) | | [Communique](https://flathub.org/apps/details/com.github.suzie97.communique) | Linux | LGPL-2.1 License | [GitHub](https://github.com/Suzie97/Communique) | +| [NewsFlash](https://flathub.org/apps/details/com.gitlab.newsflash) | Linux | GPL-3.0 License | [GitLab](https://gitlab.com/news-flash/news_flash_gtk) | | [Nextcloud News Reader](https://play.google.com/store/apps/details?id=de.luhmer.owncloudnewsreader) | Android | GPL-3.0 License | [GitHub](https://github.com/nextcloud/news-android-app) | | [OCReader](https://f-droid.org/repository/browse/?fdid=email.schaal.ocreader) | Android | GPL-3.0 License | [GitHub](https://github.com/schaal/ocreader) | | [Newsout](https://play.google.com/store/apps/details?id=com.inspiredandroid.newsout) | Android | Apache-2.0 License | [GitHub](https://github.com/SimonSchubert/NewsOut) | diff --git a/docs/faq.md b/docs/faq.md deleted file mode 100644 index e9c4d5e95..000000000 --- a/docs/faq.md +++ /dev/null @@ -1,119 +0,0 @@ -# FAQ - -## My browser shows a mixed content warning (Connection is Not Secure) -If you are serving your Nextcloud over HTTPS your browser will very likely warn you with a yellow warnings sign about your connection not being secure. - -Chrome will show no green HTTPS lock sign, Firefox will show you the following image -![Mixed Passive Content](https://ffp4g1ylyit3jdyti1hqcvtb-wpengine.netdna-ssl.com/security/files/2015/10/mixed-passive-click1-600x221.png) - -Note that this warning **is not red and won't block the page like the following images** which signal **a serious issue**: - -![Untrusted Cert](https://www.inmotionhosting.com/support/images/stories/website/errors/ssl/chrome-self-signed-ssl-warning.png) -![Mixed Active Content](https://www.howtogeek.com/wp-content/uploads/2014/02/650x367xchrome-mixed-content-https-problem.png.pagespeed.gp+jp+jw+pj+js+rj+rp+rw+ri+cp+md.ic.r_lQiZiq38.png) - -### What is the cause of the (yellow) error message - -This warning is caused by [mixed passive content](https://developer.mozilla.org/en/docs/Security/MixedContent) and means that your page loads passive resources from non HTTPS resources, such as: - -* Images -* Video/Audio - -This allows a possible attacker to perform a MITM (man-in-the-middle) attack by serving you different images or audio/video. - -### Why doesn't the News app fix it - -The News app fully prevents mixed **active** content by only allowing HTTPS iframes from known locations; other possible mixed active content elements such as are stripped from the feed. Because images and audio/video are an integral part of a feed, we can not simply strip them. - -Since an attacker can not execute code in contrast to mixed active content, but only replace images/audio/video in your feed reader, this is **not considered to be a security issue**. If, for whatever reason (e.g. feed which would allow fishing), this is a security problem for you, contact the specific feed provider and ask him to serve his feed content over HTTPS. - -### Why don't you simply use an HTTPS image/audio/video proxy - -For the same reason that we can't fix non HTTPS websites: It does not fix the underlying issue, but only silences it. If you are using an image HTTPS proxy, an attacker can simply attack your image proxy since the proxy fetches insecure content. **Even worse**: if your image proxy serves these images from the same domain as your Nextcloud installation, you [are vulnerable to XSS via SVG images](https://www.owasp.org/images/0/03/Mario_Heiderich_OWASP_Sweden_The_image_that_called_me.pdf). In addition, people feel safe when essentially they are not. - -Since most people don't understand mixed content and don't have two domains and a standalone server for the image proxy, it is very likely they will choose to host it under the same domain. - -Because we care about our users' security and don't want to hide security warnings, we won't fix (aka silence) this issue. - -The only fix for this issue is that feed providers serve their content over HTTPS. - -## I am getting: Exception: Some\\Class does not exist errors in my nextcloud.log -This is very often caused by missing or old files, e.g. by failing to upload all the News app files or errors during installation. Before you report a bug, please recheck if all files from the archive are in place and accessible. - -## Feeds not updated -Feeds can be updated using Nextcloud's system cron or an [external updater](https://nextcloud.github.io/news/clients/#update-clients) via the API -**The feed update is not run in Webcron and AJAX cron mode!** - -### System Cron -* Check if you are using the system cron (Cron) setting on the admin page. AJAX and Web cron will not update feeds -* Check if the cronjob exists with **crontab -u www-data -e** (replace www-data with your httpd user) -* Check the file permissions of the **cron.php** file and if **www-data** (or whatever your httpd user is called like) can read and execute that script -* Check if you can execute the cron with **sudo -u www-data php -f nextcloud/cron.php** (replace www-data with your httpd user) -* Check your **data/nextcloud.log** for errors -* Check if the cronjob is ever executed by placing an **error_log('updating');** in the [background job file](https://github.com/nextcloud/news/blob/master/lib/Service/UpdaterService.php#L55). If the cronjob runs, there should be an updating log statement in your httpd log. -* If there is no **updating** statement in your logs check if your cronjob is executed by executing a different script -* Check if the **oc_jobs** table has a **reserved_at** entry with a value other than 0. If it does for whatever reason, set it to 0. You can check this by executing: - - ```sql - SELECT * from oc_jobs WHERE class LIKE '%News%' ORDER BY id; - ``` - -You will get two rows where column `class`will be `OCA\News\Cron\Updater` and `OCA\News\Cron\UpdaterJob`. - - Reset the `reserved_at` by executing - - ```sql - UPDATE oc_jobs SET reserved_at = 0 WHERE id = ; - ``` - - * If your cron works fine, but Nextcloud's cronjobs are never executed, file a bug in [server](https://github.com/nextcloud/server/) - -### External Updater -* Check if your configuration is set to **not** use the system cron. -* Consult the documentation of the updater -* Check your **data/nextcloud.log** for errors - -## Adding feeds that use self-signed certificates -If you want to add a feed that uses a self-signed certificate that is not signed by a trusted CA the request will fail with "SSL certificate is invalid". A common solution is to turn off the certificate verification **which is wrong** and **makes your installation vulnerable to MITM attacks**. Therefore **turning off certificate verification is not supported**. - - -If you have control over the feed in question, consider signing your certificate for free on one of the following providers: - -* [Let's Encrypt](https://letsencrypt.org/) -* [ZeroSSL](https://zerossl.com/) - -If you do not have control over the chosen feed, you should [download the certificate from the feed's website](https://superuser.com/questions/97201/how-to-save-a-remote-server-ssl-certificate-locally-as-a-file) and [add it to your server's trusted certificates](https://www.onlinesmartketer.com/2009/06/23/curl-adding-installing-trusting-new-self-signed-certificate/). The exact procedure however may vary depending on your distribution. - -## Is There An Subscription URL To Easily Subscribe To Feeds - -By appending **?subscribe_to=SOME_URL** to your News app URL, you can launch the News app with a pre-filled URL, e.g.: - - https://yourdomain.com/nextcloud/index.php/apps/news?subscribe_to=https://github.com/nextcloud/news/releases - -## Database table grows too big - -If your users have subscribed to some high-volume feeds where a lot of items remain unread, -this can lead to an oversized news table over time. As a consequence, the database upgrade of the news app can take several hours, during which Nextcloud cannot be used. - -By default, Nextcloud News purges old news items above a certain threshold each time it fetches new news items. The maximum number of items per feed -that should be kept during the purging can be defined through the “Maximum read count per feed” setting in the admin UI or the `autoPurgeCount` -value in the config. -Additionally you may enable the option to also purge unread items `purgeUnread`. This is useful if your users have large amounts of unread items. -Starred items are always exempt from purging. - -The command `occ news:updater:after-update [--purge-unread] []` can be used to manually purge old news items across the instance. With -the `--purge-unread` option, unread items are also purged (starred items are still exempt). If `purge-count` is not specified, the configured -`autoPurgeCount` is used. - -The purge count only applies to the items that are purged. For example, when purging a feed that has 100 unread items, 100 starred read -items and 100 unstarred read items, using a `purge-count` of 50 would keep all unread and starred items and the latest 50 read items. Using -a `purge-count` of 50 along with `--purge-unread` would keep the all starred items plus the latest 50 from the set of unread and read items. - -## Missing 4-byte support SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ... - -This is likely caused by your feed using emojis in the feed title or text. - -The DB is then not able to store the feed and runs into strange decoding errors. - -You need to convert your DB to support 4 bytes, check the [Nextcloud documentation](https://docs.nextcloud.com/server/stable/admin_manual/configuration_database/mysql_4byte_support.html). - -References [#1165](https://github.com/nextcloud/news/issues/1165) [#526](https://github.com/nextcloud/news/issues/526) \ No newline at end of file diff --git a/docs/features/integration.md b/docs/features/integration.md new file mode 100644 index 000000000..a69d3ac13 --- /dev/null +++ b/docs/features/integration.md @@ -0,0 +1,30 @@ +# Integrations + +## Is There An Subscription URL To Easily Subscribe To Feeds? + +By appending `/index.php/apps/news?subscribe_to=SOME_RSS_URL` to your NextCloud base path URL, you can launch the News app with a pre-filled URL, e.g.: + +Ex. + + https://yourdomain.com/nextcloud/index.php/apps/news?subscribe_to=https://github.com/nextcloud/news/releases + +### Known Working Integrations + +#### Chrome / Edge + +1. Install [RSS Subscription Extension (by Google)](https://chrome.google.com/webstore/detail/rss-subscription-extensio/nlbjncdgjeocebhnmkbbbdekmmmcbfjd) extension +1. Open the extension's options menu +1. Click `Add..` +1. In the *Description* field, enter a description for the RSS reader entry. 'NextCloud News' is a reasonable name. +1. Enter `https:///index.php/apps/news?subscribe_to=%s` replacing <NEXTCLOUD_BASE_PATH> with the base URL path to your NextCloud instance. + * Domain based example: https://cloud.mydomain.com/index.php/apps/news?subscribe_to=%s + * Domain+subpath based example: https://cloud.mydomain.com/nextcloud/index.php/apps/news?subscribe_to=%s + +#### Firefox + +1. Install Firefox Add-on Extension [Awesome RSS](https://addons.mozilla.org/en-US/firefox/addon/awesome-rss/) +1. Open the `Preferences` for the extension +2. In the 'Subscribe using' section, select the `NextCloud` radio button +3. In the field link field, enter the base NextCloud URL. + * Domain based example: https://cloud.mydomain.com/ + * Domain+subpath based example: https://cloud.mydomain.com/nextcloud/ \ No newline at end of file diff --git a/docs/install.md b/docs/install.md index 84d218341..4fa39b752 100644 --- a/docs/install.md +++ b/docs/install.md @@ -21,7 +21,7 @@ You also need some PHP extensions: * MySQL >= 8.0 * SQLite (discouraged) -Also see the [Nextcloud documentation](https://docs.nextcloud.com/server/stable/admin_manual/configuration_database/linux_database_configuration.html?highlight=database). Oracle is currently not supported by news. +Also see the [Nextcloud documentation](https://docs.nextcloud.com/server/stable/admin_manual/configuration_database/linux_database_configuration.html?highlight=database). Oracle is currently not supported by News. ## Performance Notices * Use MySQL/MariaDB or PostgreSQL for better database performance @@ -108,8 +108,8 @@ If you changed the temporary directory for Nextcloud you need to check on your o Careful, this next part is only intended for admins, that know what they are doing. -To remove the tables from the DB we drop the tables of news. -Your installation might have a different prefix then `oc_` but it is the default in most installations. +To remove the tables from the DB we drop the tables of News. +Your installation might have a different prefix than `oc_` but it is the default in most installations. Connect to your DB and execute the commands. Don't forget to switch to the right database. For example in mysql: `use nextcloud;` @@ -140,4 +140,4 @@ DELETE FROM oc_jobs WHERE class='OCA\\News\\Cron\\Updater'; DELETE FROM oc_jobs WHERE argument='["OCA\\\\News\\\\Cron\\\\Updater","run"]'; ``` -Now nothing is left from news in your nextcloud installation. \ No newline at end of file +Now nothing is left from News in your nextcloud installation. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 000000000..34f66f5ad --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,97 @@ +# Troubleshooting + +This is a brief list of common issues that come up with NextCloud News. + +## My browser shows a mixed content warning (Connection is Not Secure) + +If you are serving your Nextcloud over HTTPS your browser will very likely warn you with a yellow warnings sign about your connection not being secure. + + * Chrome will show no green HTTPS lock sign. + * Firefox will show you the following image Mixed Passive Content ![Mixed Content Type](https://ffp4g1ylyit3jdyti1hqcvtb-wpengine.netdna-ssl.com/security/files/2015/10/mixed-passive-click1-600x221.png) + +Note that this warning **is not red and won't block the page like the following images** which signal a serious issue: + + * Chrome ![Chrome error](https://www.inmotionhosting.com/support/images/stories/website/errors/ssl/chrome-self-signed-ssl-warning.png) + * Firefox ![Firefox error](https://www.howtogeek.com/wp-content/uploads/2014/02/650x367xchrome-mixed-content-https-problem.png.pagespeed.gp+jp+jw+pj+js+rj+rp+rw+ri+cp+md.ic.r_lQiZiq38.png) + +### What is the cause of the (yellow) error message? + +This warning is caused by mixed passive content and means that your page loads passive resources from non HTTPS resources, such as: + +* Images +* Video/Audio +* Some Ads + +This allows a possible attacker to perform a MITM (man-in-the-middle) attack by serving you different images or audio/video. + +### Why doesn't the News app fix it? + +The News app fully prevents mixed **active** content by only allowing HTTPS iframes from known locations; other possible mixed active content elements such as <script\> are stripped from the feed. Because images and audio/video are an integral part of a feed, we can not simply strip them. + +Since an attacker can not execute code in contrast to mixed active content, but only replace images/audio/video in your feed reader, this is **not considered to be a security issue**. If, for whatever reason (e.g. feed which would allow fishing), this is a security problem for you, contact the specific feed provider and ask him to serve his feed content over HTTPS. + +### Why don't you simply use an HTTPS image/audio/video proxy? + + +For the same reason that we can't fix non HTTPS websites: It does not fix the underlying issue, but only silences it. If you are using an image HTTPS proxy, an attacker can simply attack your image proxy since the proxy fetches insecure content. **Even worse**: if your image proxy serves these images from the same domain as your Nextcloud installation, you are [vulnerable to XSS via SVG images](https://www.owasp.org/images/0/03/Mario_Heiderich_OWASP_Sweden_The_image_that_called_me.pdf). In addition, people feel safe when essentially they are not. + +Since most people don't understand mixed content and don't have two domains and a standalone server for the image proxy, it is very likely they will choose to host it under the same domain. + +Because we care about our users' security and don't want to hide security warnings, we won't fix (aka silence) this issue. + +The only fix for this issue is that feed providers serve their content over HTTPS. + +## I am getting: Exception: Some\Class does not exist errors in my nextcloud.log + +This is very often caused by missing or old files, e.g. by failing to upload all the News app files or errors during installation. Before you report a bug, please recheck if all files from the archive are in place and accessible. + +## Feeds not updated + +Feeds can be updated using Nextcloud's system cron or an external updater via the API. **The feed update is not run in Webcron and AJAX cron mode!** + +### Validating Using System Cron + +* Check if you are using the system cron (Cron) setting on the admin page. AJAX and Web cron will not update feeds +* Check if the cronjob exists with crontab -u www-data -e (replace www-data with your httpd user) +* Check the file permissions of the cron.php file and if www-data (or whatever your httpd user is called like) can read and execute that script +* Check if you can execute the cron with sudo -u www-data php -f nextcloud/cron.php (replace www-data with your httpd user) +* Check your data/nextcloud.log for errors +* Check if the cronjob is ever executed by placing an error_log('updating'); in the background job file. If the cronjob runs, there should be an updating log statement in your httpd log. +* If there is no updating statement in your logs check if your cronjob is executed by executing a different script +* Check if the oc_jobs table has a reserved_at entry with a value other than 0. If it does for whatever reason, set it to 0. You can check this by executing: + +#### Info + +* In newer versions of News (21.x.x) the old job OCA\News\Cron\Updater was removed from the DB. + +Reset the reserved_at by executing: + + sql UPDATE oc_jobs SET reserved_at = 0 WHERE id = < id from above SELECT statement > ; + +If your cron works fine, but Nextcloud's cronjobs are never executed, file a bug in [server](https://github.com/nextcloud/server/). + +### Using External Updater + +* Check if your configuration is set to not use the system cron. +* Consult the documentation of the updater +* Check your data/nextcloud.log for errors + +## Database table grows too big + +If your users have subscribed to some high-volume feeds where a lot of items remain unread, this can lead to an oversized news table over time. As a consequence, the database upgrade of the news app can take several hours, during which Nextcloud cannot be used. + +By default, Nextcloud News purges old news items above a certain threshold each time it fetches new news items. The maximum number of items per feed that should be kept during the purging can be defined through the “Maximum read count per feed” setting in the admin UI or the `autoPurgeCount` value in the config. Additionally you may enable the option to also purge unread items `purgeUnread`. This is useful if your users have large amounts of unread items. Starred items are always exempt from purging. + +The command `occ news:updater:after-update [--purge-unread] []` can be used to manually purge old news items across the instance. With the `--purge-unread option`, unread items are also purged (starred items are still exempt). If `purge-count` is not specified, the configured `autoPurgeCount` is used. + +The purge count only applies to the items that are purged. For example, when purging a feed that has 100 unread items, 100 starred read items and 100 unstarred read items, using a purge-count of 50 would keep all unread and starred items and the latest 50 read items. Using a `purge-count` of 50 along with `--purge-unread` would keep the all starred items plus the latest 50 from the set of unread and read items. + +## Missing 4-byte support SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ... + +This is likely caused by your feed using emojis in the feed title or text. + +The DB is then not able to store the feed and runs into strange decoding errors. + +You need to convert your DB to support 4 bytes, check the [Nextcloud documentation](https://docs.nextcloud.com/server/stable/admin_manual/configuration_database/mysql_4byte_support.html). + +References [#1165](https://github.com/nextcloud/news/issues/1165) [#526](https://github.com/nextcloud/news/issues/526) \ No newline at end of file diff --git a/js-old/directive/NewsStickyMenu.js b/js-old/directive/NewsStickyMenu.js index b46500577..7da681214 100644 --- a/js-old/directive/NewsStickyMenu.js +++ b/js-old/directive/NewsStickyMenu.js @@ -7,7 +7,7 @@ * @author Bernhard Posselt * @copyright Bernhard Posselt 2014 */ -app.directive('newsStickyMenu', function () { +app.directive('newsStickyMenu', function (NC_MAJOR_VERSION) { 'use strict'; return function (scope, elem, attr) { @@ -18,7 +18,9 @@ app.directive('newsStickyMenu', function () { if (scrollHeight > height) { elem.addClass('fixed'); - elem.css('top', scrollHeight); + if (NC_MAJOR_VERSION < 25) { + elem.css('top', scrollHeight); + } } else { elem.removeClass('fixed'); } diff --git a/js-old/gui/KeyboardShortcuts.js b/js-old/gui/KeyboardShortcuts.js index 9ddcb582d..3cb174e00 100644 --- a/js-old/gui/KeyboardShortcuts.js +++ b/js-old/gui/KeyboardShortcuts.js @@ -259,10 +259,10 @@ var openLink = function () { onActiveItem(function (item) { - item.trigger('click'); // mark read var url = item.find('.external:visible').attr('href'); var newWindow = window.open(url, '_blank'); newWindow.opener = null; + setTimeout(()=>item.trigger('click'), 0); // mark read }); }; diff --git a/l10n/ar.js b/l10n/ar.js index 036152cd8..24d2efc78 100644 --- a/l10n/ar.js +++ b/l10n/ar.js @@ -1,45 +1,138 @@ OC.L10N.register( "news", { - "Unread articles" : "مقال غير مقروء", + "Request failed, network connection unavailable!" : "فشل الطلب، لا يوجد اتصال بالشبكة!", + "Request unauthorized. Are you logged in?" : "طلب غير مصرح به. هل قمت بتسجيل الدخول؟", + "Request forbidden. Are you an administrator?" : "طلب مرفوض. هل أنت مُشرف؟", + "Token expired or app not enabled! Reload the page!" : "انتهت صلاحية الأَمَارة token، أو أن التطبيق لم يتم تمكينه! حمّل الصفحة من جديد!", + "Internal server error! Please check your data/nextcloud.log file for additional information!" : "خطأ داخلي في الخادوم! يرجى التحقق من ملف data/nextcloud.log للحصول على معلومات إضافية!", + "Request failed, Nextcloud is in currently in maintenance mode!" : "فشل الطلب. نكست كلاود تحت فى حالة صيانة الآن!", + "News feeds" : "تغذية الأخبار News Feeds", + "Unread articles" : "مقالات غير مقروءة", "News" : "الأخبار", + "News folders" : "مُجلّدات الأخبار", + "News articles" : "مقالات الأخبار", + "Shared with me" : "تمّت مُشاركته معي", + "An RSS/Atom feed reader" : "قارئ تغذية RSS/Atom ", + "📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "📰 تطبيق قارئ التغذية الإخبارية من نكست كلاود RSS / Atom لـ Nextcloud\n\n- 📲 قم بمزامنة خلاصاتك مع [عملاء] أجهزة محمولة أو سطح مكتب متعددة (https://nextcloud.github.io/news/clients/) \n- تحديثات تلقائية لخلاصات الأخبار الخاصة بك \n\n- 🆓 مصدر مجاني ومفتوح بموجب AGPLv3 ، لا توجد إعلانات \n** مطلوب تشغيل \"مدير الوظائف الخلفية\" System Cron كي يعمل هذا التطبيق \n\nيمكن إيجاد المتطلبات [هنا](https://nextcloud.github.io/news/install/#dependencies)\n\nسجل التغييرات [هنا](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nأنشيء [بلاغ عن مشكل](https://github.com/nextcloud/news/issues/new/choose)\n\nأنشيء [طلب تحسين](https://github.com/nextcloud/news/discussions/new)\n\nأبلغ عن [مشاكل في التغذية بالأخبار](https://github.com/nextcloud/news/discussions/new)", + "Last job execution ran {relativeTime}. Something seems wrong." : "آخر مهمة job جرت في {relativeTime}. يبدو أن هنالك خطأً ما.", + "Last job ran {relativeTime}." : "آخر مهمة JOB جرت في {relativeTime}.", + "Use system cron for updates" : "للتحديثات، استخدم مُجدول مهام الخلفية cron", + "Disable this if you use a custom updater." : "أوقف هذا إذا كنت تستخدم محدّثاً مُخصّصاً custom updater.", + "Maximum read count per feed" : "الحد الأقصى لعدّاد القراءة لكل إلقام feed", + "Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "يحدد الحد الأقصى لمقدار المقالات التي يمكن قراءتها لكل موجز ويب والتي لن يتم حذفها بواسطة مهمة التنظيف. إذا ظهرت المقالات القديمة مرة أخرى بعد قراءتها، قم بزيادة هذه القيمة. القيم السالبة مثل -1 ستوقف تشغيل هذه الميزة.", + "Delete unread articles automatically" : "حذف المقالات غير المقرؤة تلقائيّاً", + "Enable this if you also want to delete unread articles." : "قم بتمكين هذا إذا رغبت في حذف المقالات غير المقرؤة أيضاً.", + "Maximum redirects" : "الحد الأقصى لعمليات إعادة التوجيه", + "How many redirects the feed fetcher should follow." : "كم إعادة توجيه redirect يجب على جالب التغذية feed fetcher أن يتّبعها.", + "Feed fetcher timeout" : "مهلة جالب التغذية feed fetcher", + "Maximum number of seconds to wait for an RSS or Atom feed to load; if it takes longer the update will be aborted." : "العدد الأقصى للثواني لانتظار تحميل موجز RSS أو Atom> إذا استغرق الأمر وقتًا أطول، فسيتم إنهاء عملية التحديث.", + "Explore Service URL" : "استكشاف عنوان URL للخدمة", + "If given, this service's URL will be queried for displaying the feeds in the explore feed section. To fall back to the built in explore service, leave this input empty." : "إذا تمّ تقديم عنوان URL لهذه الخدمة، فسيتم الاستعلام عنه لعرض تغذية الأخبار الواردة في قسم استكشاف التغذية. للرجوع إلى خدمة الاستكشاف المضمنة، اترك هذا الإدخال فارغًا.", + "Update interval" : "الفترة الفاصلة بين التحدياث", + "Interval in seconds in which the feeds will be updated." : "الفترة الفاصلة بين تحديثات التغذية بالثواني", + "Successfully updated news configuration" : "تمّ بنجاحٍ تحديث تهيئة الأخبار", + "Unable to update news config" : "تعذّر تحديث تهيئة الأخبار", "Download" : "تنزيل", "Close" : "إغلاق", + "Subscribe to" : "إشترك في", + "No articles available" : "لا توجد مقالات متاحة", + "No unread articles available" : "لا توجد مقالات أخرى غير مقروءة ", + "Open website" : "فتح الموقع", + "Star article" : "مقال مميز بنجمة", + "Unstar article" : "تراجع عن تمييز المقال بنجمة", + "Keep article unread" : "إبقاء المقالة غير مقروءة", + "Remove keep article unread" : "إلغاء إبقاء المقالة الحالية غير مقروءة", "Share" : "مشاركة", + "Share with users" : "مشاركة مع مستخدمين", "Username" : "إسم المستخدم", - "by" : "من قبل", + "No users found" : "لا يوجد مستخدمون", + "Error while searching for users" : "خطأ وقع أثناء البحث عن مستخدمين", + "Share on social media" : "البحث في وسائط التواصل الاجتماعي", + "I wanted you to see this article" : "أريدك أن تطّلع على هذا المقال", + "Check out this article" : "أنظر هذا المقال", + "by" : "من قِبَل", "from" : "من", + "shared by" : "مُشاركة من", + "Play audio" : "تشغيل الصوت", + "Download audio" : "تنزيل الصوت", + "Download video" : "تنزيل الفيديو", + "Keyboard shortcut" : "إختصار لوحة المفاتيح", "Description" : "وصف", "right" : "يمين", + "Jump to next article" : "الانتقال إلي المقالة التالية", "left" : "يسار", + "Jump to previous article" : "الانتقال إلي المقالة السابقة", + "Toggle star article" : "تبديل/إلغاء تمييز المقال بنجمة", + "Star article and jump to next one" : "ضع علامة نجمة علي المقال وانتقل إلي المقال التالي", + "Toggle keep current article unread" : "تبديل لإبقاء المقالة الحالية غير مقروءة", + "Open article in new tab" : "افتح المقال في تبويب جديد", + "Toggle expand article in compact view" : "تبديل توسيع المقالة من / إلي العرض المضغوط", "Refresh" : "تحديث", + "Load next feed" : "تحميل الوجبة الإخبارية feed التالية", + "Load previous feed" : "تحميل الوجبة الإخبارية feed السابقة", + "Load previous folder" : "تحميل المجلد السابق", + "Load next folder" : "تحميل المجلد التالي", + "Scroll to active navigation entry" : "انتقل إلى مدخل التصفح النشط", + "Mark current article's feed/folder read" : "تمييز الوجبة الإخبارية أو مجلد المقالات الحالي كمقروء", + "Ajax or webcron mode detected! Your feeds will not be updated!" : "تمّ اكتشاف وضعية Ajax أو webcron! سوف لن يتم تحديث تغذيتك الإخبارية feed!", + "How to set up the operating system cron" : "كيفية تنصيب النظام cron", + "Install and set up a faster parallel updater that uses the News app's update API" : "تثبيت وإعداد محدث مواز أسرع يستخدم التطبيقات الجديدة لتحديث واجهة برمجة التطبيقات \"API\"", + "Subscribe" : "إشترك subscribe", "Web address" : "عنوان ويب", + "Feed exists already!" : "الوجبة الإخبارية موجود بالفعل!", "Folder" : "مجلد", + "No folder" : "لا يوجد مجلد", "New folder" : "مجلد جديد", "Folder name" : "اسم المجلد", - "Go back" : "العودة", - "Credentials" : "Credentials", - "Password" : "كلمة السر", + "Go back" : "عودة", + "Folder exists already!" : "المجلد موجود بالفعل", + "Credentials" : "حيثيّات الدخول credentials", + "HTTP Basic Auth credentials must be stored unencrypted! Everyone with access to the server or database will be able to access them!" : "يجب تخزين بيانات اعتماد الم