Compare commits

...

62 Commits

Author SHA1 Message Date
J. King 0a8d19d37d Require PHP 7.3 6 days ago
J. King fe06ffc176 Avoid dynamic property creation with PicoFeed 6 days ago
J. King 0d6f8d2921 Avoid most deprecation warnings 1 week ago
J. King 92b1a840a1 Support PHP 8.2 properly 1 week ago
J. King a25e777ec6 Version bump 5 months ago
J. King 44e2c9c13e Update documentation 5 months ago
J. King 866800dcc5 Finish last Guzzle-related tests 5 months ago
J. King 136d3782e3 Update changelog 6 months ago
J. King 3be3f43bab Start on tests for response wrappers 6 months ago
J. King d2f3f19128 Fix failures 6 months ago
J. King 459e44e041 Address remaining errors 6 months ago
J. King 56f015bfb9 More Guzzle conversion 6 months ago
J. King 64ec3f6ae4 Use unused variable 6 months ago
J. King 4d18bf27e2 Adjust most uses of Diactoros to Guzzle PSR-7 6 months ago
J. King e588a52e88 Replace ServerRequestFactory 6 months ago
J. King 6c0183faea Replace instances of Diactoros' EmptyResponse 6 months ago
J. King 560d4db139 Remove Diactoros in favour of Guzzle PSR-7 6 months ago
J. King 2557c22410 Update dependencies 8 months ago
J. King 4ca7b65a65 Update dependencies 8 months ago
J. King 4d37ae30ae Update dependencies 8 months ago
J. King d1da6fbe5e Use cases rather than casting bools to int in SQL 8 months ago
J. King d54733ad98 Update link to Nextcloud News documentation again 9 months ago
J. King a0c31fac5d Merge branch 'reader' 9 months ago
J. King 59358ec35b More PHP 7 fixes 9 months ago
J. King 90b66241b3 Fixes for PHP 7 9 months ago
J. King 761b3d5333 Return removed articles correctly in Miniflux 9 months ago
J. King d64dc751f9 Tests for query filters 9 months ago
J. King f51acb4264 Build exceptions correctly in Miniflux for clarity 9 months ago
J. King 300225439c Fix trivial error in Miniflux 9 months ago
J. King c6cc2a1a42 Restore coverage for Query class 9 months ago
J. King a44fe103d8 Prototype for nesting query filters 9 months ago
J. King 630536d789 Tests for union context 9 months ago
J. King 206c5c0012 Fill in union context 9 months ago
J. King 0c8f33c37c Remove setCTE and pushCTE from query builder 9 months ago
J. King 26e431b1a5 Simplify more queries 9 months ago
J. King 336207741d Add missing API documentation 9 months ago
J. King 6863c182d7 Update reference to the "Reeder" client 9 months ago
J. King f2aad7188c Update links to TT-RSS documentation 9 months ago
J. King 65b1bb4fcd Allow multiple dates in TT-RSS searches 9 months ago
J. King 2c5b9a6768 Fix missing TTRSS coverage 9 months ago
J. King 17832ac63e Allow timezone in TT-RSS search queries 9 months ago
J. King e65069885b Clean up obsolete FIXMEs 9 months ago
J. King 7e5d8494c4 Tests for selecting arrays of ranges 9 months ago
J. King e6505a5fda Work around possible MySQL bug 9 months ago
J. King 2acacd2647 Implement handling for arrays of ranges 9 months ago
J. King f6799e2ab1 Tests for date ranges in contexts 10 months ago
J. King 33a3478a58 Avoid use of PHP 7.4 feature 10 months ago
J. King 2489743d0f Further simplifications 10 months ago
J. King 0bd01849bb Remove unnecessary in() clause 10 months ago
J. King 895c045c9b Simplify folder selection in article queries 10 months ago
J. King fe02613214 Fix coverage 10 months ago
J. King 427bddd3b7 Allow multiple date ranges 10 months ago
J. King 53ba591720 Finish up article selection refactor 10 months ago
J. King 97dfef3267 Fix typos 10 months ago
J. King 396ca86482 Start on removal of conditional CTEs 10 months ago
J. King 4a87926dd5 Fix up context tests 10 months ago
J. King 6f1332c559 Start to shore up testing 10 months ago
J. King 308b592b18 Clean up coontext classes 10 months ago
J. King 983fa58ec8 Convert article and edition ranges to atomic 10 months ago
J. King 2c2bb4a856 Retrofits dates to use ranges 10 months ago
J. King c993168002 Update URL of Nextcloud News documentation 10 months ago
J. King 73497688fc Break contexts up into traits 10 months ago
  1. 1
      .gitignore
  2. 22
      CHANGELOG
  3. 13
      UPGRADING
  4. 2
      arsse.php
  5. 20
      composer.json
  6. 594
      composer.lock
  7. 8
      dist/arch/PKGBUILD
  8. 8
      dist/arch/PKGBUILD-git
  9. 2
      dist/debian/control
  10. 2
      docs/en/020_Getting_Started/020_Download_and_Installation/999_ On_Other_Systems.md
  11. 1
      docs/en/030_Supported_Protocols/005_Miniflux.md
  12. 2
      docs/en/030_Supported_Protocols/010_Nextcloud_News.md
  13. 4
      docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md
  14. 4
      docs/en/040_Compatible_Clients.md
  15. 2
      lib/Arsse.php
  16. 4
      lib/Conf.php
  17. 27
      lib/Context/AbstractContext.php
  18. 35
      lib/Context/BooleanMembers.php
  19. 40
      lib/Context/Context.php
  20. 250
      lib/Context/ExclusionContext.php
  21. 262
      lib/Context/ExclusionMembers.php
  22. 20
      lib/Context/RootContext.php
  23. 50
      lib/Context/UnionContext.php
  24. 618
      lib/Database.php
  25. 4
      lib/Db/MySQL/Driver.php
  26. 2
      lib/Db/MySQL/Statement.php
  27. 2
      lib/Db/PDOStatement.php
  28. 2
      lib/Db/PostgreSQL/Statement.php
  29. 3
      lib/Db/SQLite3/Driver.php
  30. 2
      lib/Db/SQLite3/Statement.php
  31. 107
      lib/Feed.php
  32. 24
      lib/Feed/Item.php
  33. 27
      lib/Misc/HTTP.php
  34. 75
      lib/Misc/Query.php
  35. 75
      lib/Misc/QueryFilter.php
  36. 6
      lib/Misc/ValueInfo.php
  37. 10
      lib/REST.php
  38. 25
      lib/REST/Fever/API.php
  39. 19
      lib/REST/Miniflux/ErrorResponse.php
  40. 11
      lib/REST/Miniflux/Status.php
  41. 245
      lib/REST/Miniflux/V1.php
  42. 146
      lib/REST/NextcloudNews/V1_2.php
  43. 11
      lib/REST/NextcloudNews/Versions.php
  44. 44
      lib/REST/TinyTinyRSS/API.php
  45. 14
      lib/REST/TinyTinyRSS/Icon.php
  46. 42
      lib/REST/TinyTinyRSS/Search.php
  47. 2
      locale/en.php
  48. 2
      sql/SQLite3/0.sql
  49. 2
      sql/SQLite3/2.sql
  50. 3
      tests/bootstrap.php
  51. 2
      tests/cases/CLI/TestCLI.php
  52. 4
      tests/cases/Database/AbstractTest.php
  53. 66
      tests/cases/Database/SeriesArticle.php
  54. 2
      tests/cases/Database/SeriesFeed.php
  55. 2
      tests/cases/Database/SeriesLabel.php
  56. 3
      tests/cases/Database/SeriesTag.php
  57. 4
      tests/cases/Db/BaseDriver.php
  58. 2
      tests/cases/Db/SQLite3/TestCreation.php
  59. 2
      tests/cases/Db/SQLite3PDO/TestCreation.php
  60. 48
      tests/cases/Feed/TestFeed.php
  61. 2
      tests/cases/ImportExport/TestImportExport.php
  62. 182
      tests/cases/Misc/TestContext.php
  63. 27
      tests/cases/Misc/TestHTTP.php
  64. 61
      tests/cases/Misc/TestQuery.php
  65. 171
      tests/cases/Misc/TestValueInfo.php
  66. 62
      tests/cases/REST/Fever/TestAPI.php
  67. 22
      tests/cases/REST/Miniflux/TestErrorResponse.php
  68. 17
      tests/cases/REST/Miniflux/TestStatus.php
  69. 465
      tests/cases/REST/Miniflux/TestV1.php
  70. 211
      tests/cases/REST/NextcloudNews/TestV1_2.php
  71. 11
      tests/cases/REST/NextcloudNews/TestVersions.php
  72. 69
      tests/cases/REST/TestREST.php
  73. 261
      tests/cases/REST/TinyTinyRSS/TestAPI.php
  74. 24
      tests/cases/REST/TinyTinyRSS/TestIcon.php
  75. 22
      tests/cases/REST/TinyTinyRSS/TestSearch.php
  76. 1
      tests/cases/Service/TestDaemon.php
  77. 2
      tests/cases/User/TestUser.php
  78. 31
      tests/lib/AbstractTest.php
  79. 1
      tests/phpunit.dist.xml
  80. 342
      vendor-bin/csfixer/composer.lock
  81. 363
      vendor-bin/daux/composer.lock
  82. 18
      vendor-bin/phpstan/composer.lock
  83. 564
      vendor-bin/phpunit/composer.lock
  84. 355
      vendor-bin/robo/composer.lock

1
.gitignore

@ -11,6 +11,7 @@
/arsse.db*
/config.php
/.php_cs.cache
/.php-cs-fixer.cache
/tests/.phpunit.result.cache
# Dependencies

22
CHANGELOG

@ -1,3 +1,25 @@
Version 0.??.? (????-??-??)
===========================
Changes:
- Require PHP 7.3
Version 0.10.4 (2023-01-24)
===========================
Changes:
- Support PHP 8.2
Version 0.10.3 (2022-09-14)
===========================
Bug fixes:
- Return all removed articles when multiple statuses are requested in Miniflux
- Allow multiple date ranges in search strings in Tiny Tiny RSS
- Honour user time zone when interpreting search strings in Tiny Tiny RSS
- Perform MySQL table maintenance more reliably
- Address CVE-2022-31090, CVE-2022-31091, CVE-2022-29248, and CVE-2022-31109
Version 0.10.2 (2022-04-04)
===========================

13
UPGRADING

@ -9,6 +9,19 @@ usually prudent:
- Check for any changes to sample systemd unit or other init files
- If installing from source, update dependencies with:
`composer install -o --no-dev`
Upgrading from 0.10.2 to 0.10.3
=============================
- PHP 7.3 is now required
Upgrading from 0.10.2 to 0.10.3
=============================
- The following Composer dependencies have been removed:
- laminas/laminas-diactoros
Upgrading from 0.8.5 to 0.9.0

2
arsse.php

@ -13,7 +13,7 @@ require_once BASE."vendor".DIRECTORY_SEPARATOR."autoload.php";
ignore_user_abort(true);
ini_set("memory_limit", "-1");
ini_set("max_execution_time", "0");
// FIXME: This is required because various dependencies have yet to adjust to PHP 8.1
// NOTE: While running in the wild we don't want to spew deprecation warnings if users are ahead of us in PHP versions
error_reporting(\E_ALL & ~\E_DEPRECATED);
if (\PHP_SAPI === "cli") {

20
composer.json

@ -24,11 +24,11 @@
"ext-hash": "*",
"ext-filter": "*",
"ext-dom": "*",
"nicolus/picofeed": "^0.1.43",
"nicolus/picofeed": "dev-bugfix",
"hosteurope/password-generator": "1.*",
"docopt/docopt": "1.*",
"docopt/docopt": "dev-master",
"jkingweb/druuid": "3.*",
"laminas/laminas-diactoros": "2.*",
"guzzlehttp/psr7": "1.*",
"laminas/laminas-httphandlerrunner": "1.*"
},
"require-dev": {
@ -39,7 +39,7 @@
},
"config": {
"platform": {
"php": "7.1.33"
"php": "7.3.33"
},
"allow-plugins": {
"bamarni/composer-bin-plugin": true
@ -59,5 +59,15 @@
"JKingWeb\\Arsse\\Test\\": "tests/lib/",
"JKingWeb\\Arsse\\TestCase\\": "tests/cases/"
}
}
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/rhukster/picoFeed"
},
{
"type": "vcs",
"url": "https://github.com/docopt/docopt.php"
}
]
}

594
composer.lock

@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "c658930fbc56b2b2cf646e34c6a8d8d3",
"content-hash": "2e8ad0d4821fdfc0d975e98f2e2c3efe",
"packages": [
{
"name": "docopt/docopt",
"version": "1.0.4",
"version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/docopt/docopt.php.git",
"reference": "bf3683a16e09fa1665e493eb4d5a29469e132a4f"
"reference": "5ad491cb9fc072e8bb0497061a09b0efcf25cbcf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/docopt/docopt.php/zipball/bf3683a16e09fa1665e493eb4d5a29469e132a4f",
"reference": "bf3683a16e09fa1665e493eb4d5a29469e132a4f",
"url": "https://api.github.com/repos/docopt/docopt.php/zipball/5ad491cb9fc072e8bb0497061a09b0efcf25cbcf",
"reference": "5ad491cb9fc072e8bb0497061a09b0efcf25cbcf",
"shasum": ""
},
"require": {
@ -26,13 +26,13 @@
"require-dev": {
"phpunit/phpunit": "4.1.*"
},
"default-branch": true,
"type": "library",
"autoload": {
"classmap": [
"src/docopt.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
@ -51,44 +51,56 @@
"docs"
],
"support": {
"issues": "https://github.com/docopt/docopt.php/issues",
"source": "https://github.com/docopt/docopt.php/tree/1.0.4"
"source": "https://github.com/docopt/docopt.php/tree/master",
"issues": "https://github.com/docopt/docopt.php/issues"
},
"time": "2019-12-03T02:48:46+00:00"
"time": "2022-05-11T23:52:25+00:00"
},
{
"name": "guzzlehttp/guzzle",
"version": "6.5.5",
"version": "7.5.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e"
"reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
"reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba",
"reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.0",
"guzzlehttp/psr7": "^1.6.1",
"php": ">=5.5",
"symfony/polyfill-intl-idn": "^1.17.0"
"guzzlehttp/promises": "^1.5",
"guzzlehttp/psr7": "^1.9 || ^2.4",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
},
"provide": {
"psr/http-client-implementation": "1.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.1",
"ext-curl": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
"psr/log": "^1.1"
"php-http/client-integration-tests": "^3.0",
"phpunit/phpunit": "^8.5.29 || ^9.5.23",
"psr/log": "^1.1 || ^2.0 || ^3.0"
},
"suggest": {
"ext-curl": "Required for CURL handler support",
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
},
"branch-alias": {
"dev-master": "6.5-dev"
"dev-master": "7.5-dev"
}
},
"autoload": {
@ -104,41 +116,86 @@
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Jeremy Lindblom",
"email": "jeremeamia@gmail.com",
"homepage": "https://github.com/jeremeamia"
},
{
"name": "George Mponos",
"email": "gmponos@gmail.com",
"homepage": "https://github.com/gmponos"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://github.com/sagikazarmark"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
}
],
"description": "Guzzle is a PHP HTTP client library",
"homepage": "http://guzzlephp.org/",
"keywords": [
"client",
"curl",
"framework",
"http",
"http client",
"psr-18",
"psr-7",
"rest",
"web service"
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/6.5"
"source": "https://github.com/guzzle/guzzle/tree/7.5.0"
},
"time": "2020-06-16T21:01:06+00:00"
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
"type": "tidelift"
}
],
"time": "2022-08-28T15:39:27+00:00"
},
{
"name": "guzzlehttp/promises",
"version": "1.5.1",
"version": "1.5.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
"reference": "b94b2807d85443f9719887892882d0329d1e2598"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598",
"reference": "b94b2807d85443f9719887892882d0329d1e2598",
"shasum": ""
},
"require": {
@ -193,7 +250,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/1.5.1"
"source": "https://github.com/guzzle/promises/tree/1.5.2"
},
"funding": [
{
@ -209,20 +266,20 @@
"type": "tidelift"
}
],
"time": "2021-10-22T20:56:57+00:00"
"time": "2022-08-28T14:55:35+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "1.8.5",
"version": "1.9.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268"
"reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/337e3ad8e5716c15f9657bd214d16cc5e69df268",
"reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/e98e3e6d4f86621a9b75f623996e6bbdeb4b9318",
"reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318",
"shasum": ""
},
"require": {
@ -243,7 +300,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.7-dev"
"dev-master": "1.9-dev"
}
},
"autoload": {
@ -303,7 +360,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/1.8.5"
"source": "https://github.com/guzzle/psr7/tree/1.9.0"
},
"funding": [
{
@ -319,7 +376,7 @@
"type": "tidelift"
}
],
"time": "2022-03-20T21:51:18+00:00"
"time": "2022-06-20T21:43:03+00:00"
},
{
"name": "hosteurope/password-generator",
@ -493,122 +550,23 @@
},
"time": "2017-08-17T12:23:43+00:00"
},
{
"name": "laminas/laminas-diactoros",
"version": "2.4.1",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-diactoros.git",
"reference": "36ef09b73e884135d2059cc498c938e90821bb57"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/36ef09b73e884135d2059cc498c938e90821bb57",
"reference": "36ef09b73e884135d2059cc498c938e90821bb57",
"shasum": ""
},
"require": {
"laminas/laminas-zendframework-bridge": "^1.0",
"php": "^7.1",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0"
},
"conflict": {
"phpspec/prophecy": "<1.9.0"
},
"provide": {
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0"
},
"replace": {
"zendframework/zend-diactoros": "^2.2.1"
},
"require-dev": {
"ext-curl": "*",
"ext-dom": "*",
"ext-gd": "*",
"ext-libxml": "*",
"http-interop/http-factory-tests": "^0.5.0",
"laminas/laminas-coding-standard": "~1.0.0",
"php-http/psr7-integration-tests": "^1.0",
"phpunit/phpunit": "^7.5.18"
},
"type": "library",
"extra": {
"laminas": {
"config-provider": "Laminas\\Diactoros\\ConfigProvider",
"module": "Laminas\\Diactoros"
}
},
"autoload": {
"files": [
"src/functions/create_uploaded_file.php",
"src/functions/marshal_headers_from_sapi.php",
"src/functions/marshal_method_from_sapi.php",
"src/functions/marshal_protocol_version_from_sapi.php",
"src/functions/marshal_uri_from_sapi.php",
"src/functions/normalize_server.php",
"src/functions/normalize_uploaded_files.php",
"src/functions/parse_cookie_header.php",
"src/functions/create_uploaded_file.legacy.php",
"src/functions/marshal_headers_from_sapi.legacy.php",
"src/functions/marshal_method_from_sapi.legacy.php",
"src/functions/marshal_protocol_version_from_sapi.legacy.php",
"src/functions/marshal_uri_from_sapi.legacy.php",
"src/functions/normalize_server.legacy.php",
"src/functions/normalize_uploaded_files.legacy.php",
"src/functions/parse_cookie_header.legacy.php"
],
"psr-4": {
"Laminas\\Diactoros\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "PSR HTTP Message implementations",
"homepage": "https://laminas.dev",
"keywords": [
"http",
"laminas",
"psr",
"psr-17",
"psr-7"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-diactoros/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-diactoros/issues",
"rss": "https://github.com/laminas/laminas-diactoros/releases.atom",
"source": "https://github.com/laminas/laminas-diactoros"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2020-09-03T14:29:41+00:00"
},
{
"name": "laminas/laminas-httphandlerrunner",
"version": "1.2.0",
"version": "1.5.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-httphandlerrunner.git",
"reference": "e1a5dad040e0043135e8095ee27d1fbf6fb640e1"
"reference": "5f94e55d93f756e8ad07b9049aeb3d6d84582d0e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/e1a5dad040e0043135e8095ee27d1fbf6fb640e1",
"reference": "e1a5dad040e0043135e8095ee27d1fbf6fb640e1",
"url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/5f94e55d93f756e8ad07b9049aeb3d6d84582d0e",
"reference": "5f94e55d93f756e8ad07b9049aeb3d6d84582d0e",
"shasum": ""
},
"require": {
"laminas/laminas-zendframework-bridge": "^1.0",
"php": "^7.1",
"php": "^7.3 || ~8.0.0 || ~8.1.0",
"psr/http-message": "^1.0",
"psr/http-message-implementation": "^1.0",
"psr/http-server-handler": "^1.0"
@ -618,15 +576,13 @@
},
"require-dev": {
"laminas/laminas-coding-standard": "~1.0.0",
"laminas/laminas-diactoros": "^1.7 || ^2.1.1",
"phpunit/phpunit": "^7.0.2"
"laminas/laminas-diactoros": "^2.8.0",
"phpunit/phpunit": "^9.5.9",
"psalm/plugin-phpunit": "^0.16.1",
"vimeo/psalm": "^4.10.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.2.x-dev",
"dev-develop": "1.3.x-dev"
},
"laminas": {
"config-provider": "Laminas\\HttpHandlerRunner\\ConfigProvider"
}
@ -663,40 +619,37 @@
"type": "community_bridge"
}
],
"time": "2020-06-03T15:52:17+00:00"
"time": "2021-09-22T09:17:54+00:00"
},
{
"name": "laminas/laminas-xml",
"version": "1.2.0",
"version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-xml.git",
"reference": "879cc66d1bba6a37705e98074f52a6960c220020"
"reference": "dcadeefdb6d7ed6b39d772b47e3845003d6ea60f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-xml/zipball/879cc66d1bba6a37705e98074f52a6960c220020",
"reference": "879cc66d1bba6a37705e98074f52a6960c220020",
"url": "https://api.github.com/repos/laminas/laminas-xml/zipball/dcadeefdb6d7ed6b39d772b47e3845003d6ea60f",
"reference": "dcadeefdb6d7ed6b39d772b47e3845003d6ea60f",
"shasum": ""
},
"require": {
"laminas/laminas-zendframework-bridge": "^1.0",
"php": "^5.6 || ^7.0"
"ext-dom": "*",
"ext-simplexml": "*",
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"replace": {
"zendframework/zendxml": "self.version"
"conflict": {
"zendframework/zendxml": "*"
},
"require-dev": {
"ext-iconv": "*",
"laminas/laminas-coding-standard": "~1.0.0",
"phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.4"
"phpunit/phpunit": "^9.5.8",
"squizlabs/php_codesniffer": "3.6.1 as 2.9999999.9999999"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.2.x-dev",
"dev-develop": "1.3.x-dev"
}
},
"autoload": {
"psr-4": {
"Laminas\\Xml\\": "src/"
@ -715,34 +668,41 @@
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-xml/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-xml/issues",
"rss": "https://github.com/laminas/laminas-xml/releases.atom",
"source": "https://github.com/laminas/laminas-xml"
},
"time": "2019-12-31T18:05:42+00:00"
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-11-30T02:16:35+00:00"
},
{
"name": "laminas/laminas-zendframework-bridge",
"version": "1.1.1",
"version": "1.4.1",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-zendframework-bridge.git",
"reference": "6ede70583e101030bcace4dcddd648f760ddf642"
"reference": "88bf037259869891afce6504cacc4f8a07b24d0f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642",
"reference": "6ede70583e101030bcace4dcddd648f760ddf642",
"url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/88bf037259869891afce6504cacc4f8a07b24d0f",
"reference": "88bf037259869891afce6504cacc4f8a07b24d0f",
"shasum": ""
},
"require": {
"php": "^5.6 || ^7.0 || ^8.0"
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"require-dev": {
"phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3",
"squizlabs/php_codesniffer": "^3.5"
"phpunit/phpunit": "^9.3",
"psalm/plugin-phpunit": "^0.15.1",
"squizlabs/php_codesniffer": "^3.5",
"vimeo/psalm": "^4.6"
},
"type": "library",
"extra": {
@ -781,20 +741,20 @@
"type": "community_bridge"
}
],
"time": "2020-09-14T14:23:00+00:00"
"time": "2021-12-21T14:34:37+00:00"
},
{
"name": "nicolus/picofeed",
"version": "0.1.43",
"version": "dev-bugfix",
"source": {
"type": "git",
"url": "https://github.com/nicolus/picoFeed.git",
"reference": "e6bfe8d30009603702d1bff46a7abf8bfb25f8a8"
"url": "https://github.com/rhukster/picoFeed.git",
"reference": "b8e5e34ce7d0b97f1910b8c574aa72ff768a4078"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nicolus/picoFeed/zipball/e6bfe8d30009603702d1bff46a7abf8bfb25f8a8",
"reference": "e6bfe8d30009603702d1bff46a7abf8bfb25f8a8",
"url": "https://api.github.com/repos/rhukster/picoFeed/zipball/b8e5e34ce7d0b97f1910b8c574aa72ff768a4078",
"reference": "b8e5e34ce7d0b97f1910b8c574aa72ff768a4078",
"shasum": ""
},
"require": {
@ -803,7 +763,7 @@
"ext-libxml": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"guzzlehttp/guzzle": "~6.0",
"guzzlehttp/guzzle": "^6.0|^7.0",
"kevinrob/guzzle-cache-middleware": "^2.1",
"laminas/laminas-xml": "^1.0",
"php": ">=7.1",
@ -829,7 +789,6 @@
"PicoFeed": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
@ -844,26 +803,26 @@
"description": "RSS/Atom parsing library",
"homepage": "https://github.com/nicolus/picoFeed",
"support": {
"source": "https://github.com/nicolus/picoFeed/tree/0.1.43"
"source": "https://github.com/rhukster/picoFeed/tree/bugfix"
},
"time": "2020-09-15T07:28:23+00:00"
"time": "2022-09-23T17:42:18+00:00"
},
{
"name": "psr/http-factory",
"name": "psr/http-client",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-factory.git",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
"url": "https://github.com/php-fig/http-client.git",
"reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
"reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
"shasum": ""
},
"require": {
"php": ">=7.0.0",
"php": "^7.0 || ^8.0",
"psr/http-message": "^1.0"
},
"type": "library",
@ -874,7 +833,7 @@
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
"Psr\\Http\\Client\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -887,21 +846,18 @@
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interfaces for PSR-7 HTTP message factories",
"description": "Common interface for HTTP clients",
"homepage": "https://github.com/php-fig/http-client",
"keywords": [
"factory",
"http",
"message",
"http-client",
"psr",
"psr-17",
"psr-7",
"request",
"response"
"psr-18"
],
"support": {
"source": "https://github.com/php-fig/http-factory/tree/master"
"source": "https://github.com/php-fig/http-client/tree/master"
},
"time": "2019-04-30T12:38:16+00:00"
"time": "2020-06-29T06:28:15+00:00"
},
{
"name": "psr/http-message",
@ -1108,131 +1064,35 @@
"time": "2019-03-08T08:55:37+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.25.0",
"name": "symfony/deprecation-contracts",
"version": "v2.5.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "749045c69efb97c70d25d7463abba812e91f3a44"
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44",
"reference": "749045c69efb97c70d25d7463abba812e91f3a44",
"shasum": ""
},
"require": {
"php": ">=7.1",
"symfony/polyfill-intl-normalizer": "^1.10",
"symfony/polyfill-php72": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Idn\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Laurent Bassin",
"email": "laurent@bassin.info"
},
{
"name": "Trevor Rowbotham",
"email": "trevor.rowbotham@pm.me"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"idn",
"intl",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.25.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2021-09-14T14:02:44+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Normalizer\\": ""
},
"classmap": [
"Resources/stubs"
"function.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@ -1249,18 +1109,10 @@
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for intl's Normalizer class and related functions",
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"intl",
"normalizer",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0"
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
},
"funding": [
{
@ -1276,111 +1128,42 @@
"type": "tidelift"
}
],
"time": "2021-02-19T12:13:01+00:00"
},
{
"name": "symfony/polyfill-php72",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
"reference": "9a142215a36a3888e30d0a9eeea9766764e96976"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976",
"reference": "9a142215a36a3888e30d0a9eeea9766764e96976",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php72\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php72/tree/v1.25.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2021-05-27T09:17:38+00:00"
"time": "2022-01-02T09:53:40+00:00"
}
],
"packages-dev": [
{
"name": "bamarni/composer-bin-plugin",
"version": "v1.5.0",
"version": "1.8.2",
"source": {
"type": "git",
"url": "https://github.com/bamarni/composer-bin-plugin.git",
"reference": "49934ffea764864788334c1485fbb08a4b852031"
"reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/49934ffea764864788334c1485fbb08a4b852031",
"reference": "49934ffea764864788334c1485fbb08a4b852031",
"url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880",
"reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0 || ^2.0",
"php": "^5.5.9 || ^7.0 || ^8.0"
"composer-plugin-api": "^2.0",
"php": "^7.2.5 || ^8.0"
},
"require-dev": {
"composer/composer": "^1.0 || ^2.0",
"symfony/console": "^2.5 || ^3.0 || ^4.0"
"composer/composer": "^2.0",
"ext-json": "*",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-phpunit": "^1.1",
"phpunit/phpunit": "^8.5 || ^9.5",
"symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
"symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
"symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0"
},
"type": "composer-plugin",
"extra": {
"class": "Bamarni\\Composer\\Bin\\Plugin"
"class": "Bamarni\\Composer\\Bin\\BamarniBinPlugin"
},
"autoload": {
"psr-4": {
@ -1402,14 +1185,17 @@
],
"support": {
"issues": "https://github.com/bamarni/composer-bin-plugin/issues",
"source": "https://github.com/bamarni/composer-bin-plugin/tree/v1.5.0"
"source": "https://github.com/bamarni/composer-bin-plugin/tree/1.8.2"
},
"time": "2022-02-22T21:01:25+00:00"
"time": "2022-10-31T08:38:03+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"stability-flags": {
"nicolus/picofeed": 20,
"docopt/docopt": 20
},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
@ -1422,7 +1208,7 @@
},
"platform-dev": [],
"platform-overrides": {
"php": "7.1.33"
"php": "7.3.33"
},
"plugin-api-version": "2.2.0"
"plugin-api-version": "2.3.0"
}

8
dist/arch/PKGBUILD

@ -1,6 +1,6 @@
# Maintainer: J. King <jking@jkingweb.ca>
pkgname="arsse"
pkgver=0.9.2
pkgver=0.10.4
pkgrel=1
epoch=
pkgdesc="Multi-protocol RSS/Atom newsfeed synchronization server"
@ -14,7 +14,7 @@ optdepends=("nginx: HTTP server"
"apache>=2.4: HTTP server"
"percona-server: Alternate database"
"postgresql>=10: Alternate database"
"php-pgsql>=7.1: PostgreSQL database support")
"php-pgsql>=7.3: PostgreSQL database support")
backup=("etc/webapps/arsse/config.php"
"etc/php/php-fpm.d/arsse.conf"
"etc/webapps/arsse/nginx/example.conf"
@ -24,12 +24,12 @@ backup=("etc/webapps/arsse/config.php"
"etc/webapps/arsse/apache/example.conf"
"etc/webapps/arsse/apache/arsse.conf"
"etc/webapps/arsse/apache/arsse-loc.conf")
source=("arsse-0.9.2.tar.gz")
source=("arsse-0.10.4.tar.gz")
md5sums=("SKIP")
package() {
# define runtime dependencies
depends=("php>=7.1" "php-intl>=7.1" "php-sqlite>=7.1" "php-fpm>=7.1")
depends=("php>=7.3" "php-intl>=7.3" "php-sqlite>=7.3" "php-fpm>=7.3")
# create most directories necessary for the final package
cd "$pkgdir"
mkdir -p "usr/share/webapps/arsse" "usr/share/doc/arsse" "usr/share/licenses/arsse" "usr/lib/systemd/system" "usr/lib/sysusers.d" "usr/lib/tmpfiles.d" "etc/php/php-fpm.d" "etc/webapps/arsse"

8
dist/arch/PKGBUILD-git

@ -1,6 +1,6 @@
# Maintainer: J. King <jking@jkingweb.ca>
pkgname="arsse-git"
pkgver=0.9.2
pkgver=0.10.4
pkgrel=1
epoch=
pkgdesc="Multi-protocol RSS/Atom newsfeed synchronization server, bugfix-testing version"
@ -9,14 +9,14 @@ url="https://thearsse.com/"
license=("MIT")
provides=("arsse")
conflicts=("arsse")
depends=("php>=7.1" "php-intl>=7.1" "php-sqlite>=7.1")
depends=("php>=7.3" "php-intl>=7.3" "php-sqlite>=7.3")
makedepends=("composer" "pandoc")
checkdepends=()
optdepends=("nginx: HTTP server"
"apache>=2.4: HTTP server"
"percona-server: Alternate database"
"postgresql>=10: Alternate database"
"php-pgsql>=7.1: PostgreSQL database support")
"php-pgsql>=7.3: PostgreSQL database support")
backup=("etc/webapps/arsse/config.php"
"etc/php/php-fpm.d/arsse.conf"
"etc/webapps/arsse/nginx/example.conf"
@ -46,7 +46,7 @@ build() {
package() {
# define runtime dependencies
depends=("php>=7.1" "php-intl>=7.1" "php-sqlite>=7.1" "php-fpm>=7.1")
depends=("php>=7.3" "php-intl>=7.3" "php-sqlite>=7.3" "php-fpm>=7.3")
# create most directories necessary for the final package
cd "$pkgdir"
mkdir -p "usr/share/webapps/arsse" "usr/share/doc/arsse" "usr/share/licenses/arsse" "usr/lib/systemd/system" "usr/lib/sysusers.d" "usr/lib/tmpfiles.d" "etc/php/php-fpm.d" "etc/webapps/arsse"

2
dist/debian/control

@ -20,7 +20,7 @@ Description: Multi-protocol RSS/Atom newsfeed synchronization server
server.
Depends: ${misc:Depends},
dbconfig-sqlite3 | dbconfig-pgsql | dbconfig-mysql | dbconfig-no-thanks,
php (>= 7.1.0),
php (>= 7.3.0),
php-cli,
php-intl,
php-json,

2
docs/en/020_Getting_Started/020_Download_and_Installation/999_ On_Other_Systems.md

@ -11,7 +11,7 @@ The Arsse has the following requirements:
- A Web server such as:
- [Nginx](https://nginx.org)
- [Apache HTTP server](https://httpd.apache.org) 2.4 or later
- PHP 7.1.0 or later with the following extensions:
- PHP 7.3.0 or later with the following extensions:
- [intl](https://php.net/manual/en/book.intl.php), [json](https://php.net/manual/en/book.json.php), [hash](https://php.net/manual/en/book.hash.php), [filter](https://php.net/manual/en/book.filter.php), and [dom](https://php.net/manual/en/book.dom.php)
- [simplexml](https://php.net/manual/en/book.simplexml.php), and [iconv](https://php.net/manual/en/book.iconv.php)
- One of:

1
docs/en/030_Supported_Protocols/005_Miniflux.md

@ -39,7 +39,6 @@ Miniflux version 2.0.28 is emulated, though not all features are implemented
- Filtering rules may not function identically (see below for details)
- The `checked_at` field of feeds indicates when the feed was last updated rather than when it was last checked
- Creating a feed with the `scrape` property set to `true` might not return scraped content for the initial synchronization
- Querying articles for both read/unread and removed statuses will not return all removed articles
- Search strings will match partial words
- OPML import either succeeds or fails atomically: if one feed fails, no feeds are imported

2
docs/en/030_Supported_Protocols/010_Nextcloud_News.md

@ -10,7 +10,7 @@
<dt>API endpoint</dt>
<dd>/index.php/apps/news/api/v1-2/</dd>
<dt>Specifications</dt>
<dd><a href="https://github.com/nextcloud/news/blob/master/docs/externalapi/Legacy.md">Version 1.2</a></dd>
<dd><a href="https://github.com/nextcloud/news/blob/master/docs/api/api-v1-2.md">Version 1.2</a></dd>
</dl>
The Nextcloud News protocol was the first supported by The Arsse, and has been supported in full since version 0.3.0.

4
docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md

@ -10,7 +10,7 @@
<dt>API endpoint</dt>
<dd>/tt-rss/api</dd>
<dt>Specifications</dt>
<dd><a href="https://git.tt-rss.org/git/tt-rss/wiki/ApiReference">Main</a>, <a href="https://git.tt-rss.org/fox/tt-rss/wiki/SearchSyntax">search syntax</a>, <a href="https://github.com/jangernert/FeedReader/blob/master/data/tt-rss-feedreader-plugin/README.md">FeedReader extensions</a>, <a href="https://github.com/hrk/tt-rss-newsplus-plugin/blob/master/README.md">News+ extension</a></dd>
<dd><a href="https://tt-rss.org/wiki/ApiReference">Main</a>, <a href="https://tt-rss.org/wiki/SearchSyntax">search syntax</a>, <a href="https://github.com/jangernert/FeedReader/blob/master/data/tt-rss-feedreader-plugin/README.md">FeedReader extensions</a>, <a href="https://github.com/hrk/tt-rss-newsplus-plugin/blob/master/README.md">News+ extension</a></dd>
</dl>
The Arsse supports not only the Tiny Tiny RSS protocol, but also extensions required by the FeedReader client and the more commonly supported `getCompactHeadlines` extension.
@ -37,7 +37,7 @@ The Arsse does not currently support the entire protocol. Notably missing featur
- Processing of the `search` parameter of the `getHeadlines` operation differs in the following ways:
- Values other than `"true"` or `"false"` for the `unread`, `star`, and `pub` special keywords treat the entire token as a search term rather than as `"false"`
- Invalid dates are ignored rather than assumed to be `"1970-01-01"`
- Only a single negative date is allowed (this is a known bug rather than intentional)
- Specifying multiple non-negative dates usually returns no results as articles must match all specified dates simultaneously; The Arsse instead returns articles matching any of the specified dates
- Dates are always relative to UTC
- Full-text search is not yet employed with any database, including PostgreSQL
- Article hashes are normally SHA1; The Arsse uses SHA256 hashes

4
docs/en/040_Compatible_Clients.md

@ -121,14 +121,14 @@ The Arsse does not at this time have any first party clients. However, because T
</td>
</tr>
<tr>
<td><a href="https://reeder.app/">Reeder</a></td>
<td><a href="https://reeder.app/">Reeder 3</a></td>
<td>macOS</td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td>
<p>Also available for iOS.</p>
<p>Also available for iOS. Reeder 5 no longer supports the Fever protocol.</p>
</td>
</tr>
<tr>

2
lib/Arsse.php

@ -7,7 +7,7 @@ declare(strict_types=1);
namespace JKingWeb\Arsse;
class Arsse {
public const VERSION = "0.10.2";
public const VERSION = "0.10.4";
public const REQUIRED_EXTENSIONS = [
"intl", // as this extension is required to prepare formatted messages, its absence will throw a distinct English-only exception
"dom",

4
lib/Conf.php

@ -7,13 +7,15 @@
declare(strict_types=1);
namespace JKingWeb\Arsse;
use AllowDynamicProperties;
use JKingWeb\Arsse\Misc\ValueInfo as Value;
/** Class for loading, saving, and querying configuration
*
* The Conf class serves both as a means of importing and querying configuration information, as well as a source for default parameters when a configuration file does not specify a value.
* All public properties are configuration parameters that may be set by the server administrator. */
class Conf {
#[AllowDynamicProperties]
class Conf {
/** @var string Default language to use for logging and errors */
public $lang = "en";

27
lib/Context/AbstractContext.php

@ -0,0 +1,27 @@
<?php
/** @license MIT
* Copyright 2017 J. King, Dustin Wilson et al.
* See LICENSE and AUTHORS files for details */
declare(strict_types=1);
namespace JKingWeb\Arsse\Context;
abstract class AbstractContext {
protected $props = [];
protected $parent = null;
protected function act(string $prop, int $set, $value) {
if ($set) {
if (is_null($value)) {
unset($this->props[$prop]);
$this->$prop = (new \ReflectionClass($this))->getDefaultProperties()[$prop];
} else {
$this->props[$prop] = true;
$this->$prop = $value;
}
return $this->parent ?? $this;
} else {
return isset($this->props[$prop]);
}
}
}

35
lib/Context/BooleanMembers.php

@ -0,0 +1,35 @@
<?php
/** @license MIT
* Copyright 2017 J. King, Dustin Wilson et al.
* See LICENSE and AUTHORS files for details */
declare(strict_types=1);
namespace JKingWeb\Arsse\Context;
trait BooleanMembers {
public $unread = null;
public $starred = null;
public $hidden = null;
public $labelled = null;
public $annotated = null;
public function unread(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function starred(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function hidden(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function labelled(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function annotated(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
}

40
lib/Context/Context.php

@ -6,16 +6,12 @@
declare(strict_types=1);
namespace JKingWeb\Arsse\Context;
class Context extends ExclusionContext {
class Context extends RootContext {
use BooleanMembers;
use ExclusionMembers;
/** @var ExclusionContext */
public $not;
public $limit = 0;
public $offset = 0;
public $unread;
public $starred;
public $hidden;
public $labelled;
public $annotated;
public function __construct() {
$this->not = new ExclusionContext($this);
@ -30,32 +26,4 @@ class Context extends ExclusionContext {
public function __destruct() {
unset($this->not);
}
public function limit(int $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function offset(int $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function unread(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function starred(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function hidden(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function labelled(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
public function annotated(bool $spec = null) {
return $this->act(__FUNCTION__, func_num_args(), $spec);
}
}

250
lib/Context/ExclusionContext.php

@ -6,53 +6,18 @@
declare(strict_types=1);
namespace JKingWeb\Arsse\Context;
use JKingWeb\Arsse\Misc\ValueInfo;
use JKingWeb\Arsse\Misc\Date;
class ExclusionContext extends AbstractContext {
use ExclusionMembers;
class ExclusionContext {
public $folder;
public $folders;
public $folderShallow;
public $foldersShallow;
public $tag;
public $tags;
public $tagName;
public $tagNames;
public $subscription;
public $subscriptions;
public $edition;
public $editions;
public $article;
public $articles;
public $label;
public $labels;
public $labelName;
public $labelNames;
public $annotationTerms;
public $searchTerms;
public $titleTerms;
public $authorTerms;
public $oldestArticle;
public $latestArticle;
public $oldestEdition;
public $latestEdition;
public $modifiedSince;
public $notModifiedSince;
public $markedSince;
public $notMarkedSince;
protected $props = [];
protected $parent;
public function __construct(self $c = null) {
$this->parent = $c;
public function __construct(Context $parent = null) {
$this->parent = $parent;
}
public function __clone() {
// if the context was cloned because its parent was cloned, change the parent to the clone
if ($this->parent) {
$t = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS | \DEBUG_BACKTRACE_PROVIDE_OBJECT, 2)[1];
if (($t['object'] ?? null) instanceof self && $t['function'] === "__clone") {
if (($t['object'] ?? null) instanceof Context && $t['function'] === "__clone") {
$this->parent = $t['object'];
}
}
@ -62,209 +27,4 @@ class ExclusionContext {
public function __destruct() {
unset($this->parent);
}
protected function act(string $prop, int $set, $value) {
if ($set) {
if (is_null($value)) {
unset($this->props[$prop]);
$this->$prop = (new \ReflectionClass($this))->getDefaultProperties()[$prop];
} else {
$this->props[$prop] = true;
$this->$prop = $value;
}
return $this->parent ?? $this;
} else {
return isset($this->props[$prop]);
}