188 Commits

Author SHA1 Message Date
  J. King dab4cb21e6 Geekttrss seems to work 1 week ago
  J. King d836d6a243 Add more clients to the untested list 1 week ago
  J. King 50b2ca4500 Document tokens and metadata in the manual 1 week ago
  J. King 9c0a3b7a57 Fix typo 2 weeks ago
  J. King 3ba82b7c6d Fix CLI bootstrap problem 2 weeks ago
  J. King fa6d641634 Implement CLI for tokens 2 weeks ago
  J. King 3795b1ccd8 Simplify CLI command processing 2 weeks ago
  J. King e8ed716ae6 Fix errors in CLI documentation 2 weeks ago
  J. King 97d1de46f8 Fill in upgrade notes 2 weeks ago
  J. King 68422390da Implement CLI for user metadata 2 weeks ago
  J. King b7c7915a65 Enforce admin rquirements in NCNv1 2 weeks ago
  J. King a760bf2ded Implement "t" and "f" booleans in TT-RSS 2 weeks ago
  J. King 9ad4a37ddf Tests and fixes for Miniflux with PDO 2 weeks ago
  J. King 687995c497 More potential Miniflux Web clints 2 weeks ago
  J. King 29761d767a Update documentation 2 weeks ago
  J. King dad74c2616 Implement Fever icons 2 weeks ago
  J. King 90034ac1f8 Style fixes 2 weeks ago
  J. King 211cea648e Implement TT-RSS API level 15 2 weeks ago
  J. King f2e5d567ec Update sample Web server configuration 2 weeks ago
  J. King eae0ba4b68 Tests fortoken operations 2 weeks ago
  J. King 9cc779a717 Import/export tests 2 weeks ago
  J. King 37fd2ad4e9 Tests for new exception features 2 weeks ago
  J. King 6c2de89f3e Revert copy-paste corruption 2 weeks ago
  J. King 54a6fcc0d6 Consolidate object factoriesinto one place 2 weeks ago
  J. King a0d563e468 Update dependencies 2 weeks ago
  J. King b4ae988b79 Prototype OPML handling 2 weeks ago
  J. King 681654f249 Documentation update 2 weeks ago
  J. King dd29ef6c1b Add feed refreshing stubs 2 weeks ago
  J. King ab1cf7447b Implement article marking 2 weeks ago
  J. King 334a585cb8 Implement single-entry querying 2 weeks ago
  J. King a7d05a7717 Feed- and category-specific entry list routes 2 weeks ago
  J. King 00ad1cc5b9 Last tests for article querying 2 weeks ago
  J. King d4a6909cf6 Positional article queries tests 3 weeks ago
  J. King e42e25d333 More article query tests 3 weeks ago
  J. King f7b3a473a9 Clarify ordering syntax rationale 3 weeks ago
  J. King af51377fe9 First set of article query tests 3 weeks ago
  J. King 23ca6bb77b Count articles without offset or limit 3 weeks ago
  J. King 0e7abfa8f9 Largely complete article querying 3 weeks ago
  J. King a43f8797c5 Add ability to sort by folder ID or name 3 weeks ago
  J. King ed27e0aaaa Sort nulls consistently 3 weeks ago
  J. King 9d7ada7f59 Partial implementation of article sorting 3 weeks ago
  J. King 007183450a Context and column list for article queries 3 weeks ago
  J. King 197cbba77d Document article column definitions 3 weeks ago
  J. King ddbcb598e8 Match more closely Miniflux query string behaviour 3 weeks ago
  J. King bb89083444 Perform strict validation of query parameters 3 weeks ago
  J. King 1e924bed83 Partial query string normalization 3 weeks ago
  J. King 3b2190ca10 Include folder names directly in subscription list 3 weeks ago
  J. King ad094f5217 Don't return icons without types at all 4 weeks ago
  J. King cd5f13f4b9 Tests for icon querying 4 weeks ago
  J. King 76f1cc8e91 Adjust users of subscriptionIcon 4 weeks ago
  J. King cc2672fb0a Improve icon fetching interface 4 weeks ago
  J. King 1eea3b3a4c Fix feed update test 4 weeks ago
  J. King 8e749bb73c Report 404 on icons for absence of data 1 month ago
  J. King bdf9c0e9d2 Prototype feed icon querying 1 month ago
  J. King 9197a8d08b Implement feed deletion 1 month ago
  J. King 8eebb75b18 Implement feed editing 1 month ago
  J. King 5a8a044a92 Implement single-feed querying 1 month ago
  J. King a646ad77b7 Use a read transaction when computing filter rules 1 month ago
  J. King cca4b205e4 Correct error output of getCategoryFeeds 1 month ago
  J. King a34edcb0d1 Last tests for feed creation 1 month ago
  J. King 7893b5f59d More feed adding tests 1 month ago
  J. King 36cc4928b9 Test feed fetching errors for Miniflux 1 month ago
  J. King 727864f401 Implement feed listing by category 1 month ago
  J. King 4972c79e32 Allow simpler feed exception creation 1 month ago
  J. King 6936f365e4 Add calls coming in next version of Miniflux 1 month ago
  J. King fd25be5c27 Basic tests for feed creation 1 month ago
  J. King e7b2f54183 Prototype feed creation 1 month ago
  J. King 14d2d19ae1 Tests for Miniflux feed listing 1 month ago
  J. King 2cf4bf0d4d Prototype Miniflux feed listing 1 month ago
  J. King 86897af0b3 Add ability to enable scraper 1 month ago
  J. King 7897585d98 Test scraping 1 month ago
  J. King 76f70119fd More work on scraping 1 month ago
  J. King 4cb23dd198 Partial implementation of proper content scraping 1 month ago
  J. King e74b44cc39 Change favicon to icon_url and add icon_id 1 month ago
  J. King 2536c9fe03 Last tests for article filters 1 month ago
  J. King 9f2b8d4f83 Imprement setting of filter rules 1 month ago
  J. King 618fd67f80 Set marks for filtered articles on feed refresh 1 month ago
  J. King 7a6186f2d7 Update Miniflux documentation 1 month ago
  J. King 097362881b Tests for filtering during feed parsing 1 month ago
  J. King a4146ec129 Start on test for filtering during feed parsing 1 month ago
  J. King 9e29235d87 Don't fetch from example.com during tests 1 month ago
  J. King 549c7bdc72 Style fixes 1 month ago
  J. King 4f34b4ff29 Rule refactoring 1 month ago
  J. King c1eff8479c Simplify configuration property caching 1 month ago
  J. King 6dba8aa66b Fixes for rules 1 month ago
  J. King 461e256052 Work around MySQL syntax weirdness 1 month ago
  J. King 47ae65b9d3 Function to apply filter rules 1 month ago
  J. King b12f87e231 Support Xdebug 3.x for coverage 1 month ago
  J. King ffc5579a7a Partial implementation of filter rule handling 1 month ago
  J. King 7e17332714 Implement marking all as read for Miniflux 1 month ago
  J. King 31f0539dc0 Implement Miniflux user deletion 1 month ago
  J. King bf95b134bd Fix up error codes for category changes 1 month ago
  J. King 197922f92f Implement Miniflux user creation 1 month ago
  J. King ee0c3c9449 Tests and fixes for user modification 1 month ago
  J. King cc648e1c3a Update tooling 1 month ago
  J. King 67f577d573 Bump emulated Miniflux version 1 month ago
  J. King f58005640a Prototype user modification 1 month ago
  J. King 2946d950f2 Forbid more user names 1 month ago
  J. King 405f3af257 Invalidate sessions and Fever passwords when renaming users 2 months ago
  J. King 5ec04d33c6 Add backend functionality to rename users 2 months ago
  J. King 88cf3c6dae Test filter rule retrieval 2 months ago
  J. King d66cf32c1f Style fixes 2 months ago
  J. King a81760e39d Aggressivly clean up hidden articles 2 months ago
  J. King ade0402210 Adjust TT-RSS to ignore hidden items 2 months ago
  J. King f33359f3e3 Move some Miniflux features to abstract handler 2 months ago
  J. King b7ce6f5c79 Adjust Fever to ignore hidden items 2 months ago
  J. King b2fae336e8 Adjust Nextcloud News to ignore hidden items 2 months ago
  J. King f0bfe1fdff Simplify editionLatest Database method 2 months ago
  J. King 8527c83976 Exclude hiddens from subscription unread count 2 months ago
  J. King 97010d8822 Tests for marking articles hidden 2 months ago
  J. King 86c4a30744 Adjust articleStarred function to discount hidden 2 months ago
  J. King ffc98daff3 Adjust article marking tests to account for new hidden mark 2 months ago
  J. King 8ae3740d5f Implement querying articles by hidden mark 2 months ago
  J. King d5cd5b6a17 Implement hidden marks 2 months ago
  J. King c43d0dcae3 Groundwork for filtering rules 2 months ago
  J. King 95a2018e75 Implement caategory marking as read 2 months ago
  J. King 5124f76b70 Implementcategory deletion 2 months ago
  J. King eb079166de Tests for category renaming 2 months ago
  J. King 3ebb46f48e Some work on categories 2 months ago
  J. King 2e6c5d2ad2 Query Miniflux categories 2 months ago
  J. King 4b73698381 More user query tests 2 months ago
  J. King ebdfad535c More Miniflux user tests 2 months ago
  J. King 7c841b5fc2 Test for listing users 2 months ago
  J. King 5c83655541 Add modification timestamp to user metadata 2 months ago
  J. King d85988f09d Prototype Miniflux user querying 2 months ago
  J. King 2eedf7d38c Finally fix MySQL 2 months ago
  J. King e9d449a8ba Fix user manager and tests 2 months ago
  J. King ce68566fcb Hopefully fix MySQL 2 months ago
  J. King a431243421 Fixes for MySQL and PostgreSQL 2 months ago
  J. King fcf1260dab Adjust database portion of user property manager 2 months ago
  J. King 978929aabd WIP redesign of user properties 2 months ago
  J. King 0f3e0411f0 Document some differences frrom Miniflux 2 months ago
  J. King 94154d4354 Implement Miniflux feed discovery 2 months ago
  J. King 669e17a1f6 Add ability to discover multiple feeds 2 months ago
  J. King 2a0d6e6599 OPTIONS tests 2 months ago
  J. King 7fa5523a7d Simplify handling of invalid paths and methods 2 months ago
  J. King def07bb1ad Tests for Miniflux authentication 2 months ago
  J. King 8c059773bb Update tooling 2 months ago
  J. King 90117b5cd7 Fix Miniflux strip value 3 months ago
  J. King 06dee77bac First tests for Miniflux 3 months ago
  J. King f6cd2b87ce Port token data from Microsub branch 3 months ago
  J. King d4bcdcdadd Fix TTRSS coverage 3 months ago
  J. King d3ebb1bd56 Last set of tests for user management. Fixes #180 3 months ago
  J. King e16df90bae Style fixes 3 months ago
  J. King 180b4ecc9b More user tests 3 months ago
  J. King 27d9c046d5 More work on user management 3 months ago
  J. King 7f2117adaa Differentiate between duplicate/missing users and other failure modes 3 months ago
  J. King 351f972512 Tests for internal user driver 3 months ago
  J. King 4baf5fa2f9 Tests for new user functionality in Database 3 months ago
  J. King dde9d7a28a Refinements to user manager 3 months ago
  J. King eb2fe522bf Last bits of the new user metadata handling 3 months ago
  J. King 5a17efc7b5 Clean up user driver API 3 months ago
  J. King 771f79323c Strip out remnants of the authorizer 3 months ago
  J. King 576d7e16a8 Fix handling of bytea-typed nulls 3 months ago
  J. King 1b1789988a More client compatibility updates 3 months ago
  J. King 532ce4a502 Prototype changes to user management 3 months ago
  J. King ee050e505c Add more Android clients to manual 3 months ago
  J. King 9fb185a8e2 Add TT-RSS Web client to manual 3 months ago
  J. King b62c11a43e Lasts tests for icon cache; fixes #177 3 months ago
  J. King 1d3725341a Fix detection of Xdebug for coverage 3 months ago
  J. King 311910795a More tests for icon cache 3 months ago
  J. King 3d3c20de5c Don't anticipate API features 3 months ago
  J. King 4d532cba3f Initial Miniflux documentation 3 months ago
  J. King e861cca53d Integrate schema change necessary for microsub 3 months ago
  J. King b24c469dca Update changelog 3 months ago
  J. King 8f739cec85 Excluse empty-string URLs from icons table 3 months ago
  J. King 424b14d2b4 Clean up use of subscriptionFavicon 3 months ago
  J. King dd1a80f279 Consolidate subscription icon querying 3 months ago
  J. King 4fc208d940 More consistent icon API 3 months ago
  J. King c3a57ca68b Tests for icon cache population 3 months ago
  J. King bd650765e1 Generalize icon fetching tests 3 months ago
  J. King 50fd127ac4 Test for icon fetching 3 months ago
  J. King 7c40c81fb3 Add icons to the database upon feed update 3 months ago
  J. King c25782f98c Partial icon handling skeleton 3 months ago
  J. King af675479b8 Remove excess whitespace 3 months ago
  J. King 2438f35f3d Add icon cache to database 3 months ago
  J. King 5e60da00a9 Merge branch 'master' into miniflux 3 months ago
  J. King b5f959aabf Fix blob tests 3 months ago
  J. King 41bcffd6fb Correctly query PostgreSQL byte arrays 3 months ago
  J. King c21ae3eca9 Correctly send binary data to PostgreSQL 3 months ago
  J. King c92bb12a11 Prototype Miniflux dispatcher 3 months ago
  J. King 905f8938e2 Typo 3 months ago
  J. King 8ad7fc81a8 Initially mapping out of Miniflux API 3 months ago
  J. King 16d2e01668 New schema for PostgreSQL and MySQL 3 months ago
  J. King 4db1b95cf4 Add numeric IDs and other Miniflux data to SQLite schema 3 months ago
  J. King 3ac010d5b6 Fix tests in absence of database extensions 3 months ago
  J. King b58a326461 Prepare for schema changes 3 months ago
  J. King e9682bc601 Correct typos 4 months ago
164 changed files with 7562 additions and 3734 deletions
Split View
  1. +0
    -1
      .gitignore
  2. +22
    -1
      CHANGELOG
  3. +3
    -3
      RoboFile.php
  4. +17
    -0
      UPGRADING
  5. +2
    -1
      arsse.php
  6. +19
    -80
      composer.lock
  7. +4
    -4
      dist/apache.conf
  8. +17
    -0
      dist/nginx.conf
  9. +1
    -0
      docs/en/010_About.md
  10. +35
    -2
      docs/en/025_Using_The_Arsse/010_Managing_Users.md
  11. +61
    -0
      docs/en/030_Supported_Protocols/005_Miniflux.md
  12. +0
    -1
      docs/en/030_Supported_Protocols/010_Nextcloud_News.md
  13. +0
    -1
      docs/en/030_Supported_Protocols/030_Fever.md
  14. +1
    -0
      docs/en/030_Supported_Protocols/index.md
  15. +203
    -9
      docs/en/040_Compatible_Clients.md
  16. +1
    -1
      docs/theme/arsse/arsse.css
  17. +2
    -2
      docs/theme/src/arsse.scss
  18. +21
    -4
      lib/AbstractException.php
  19. +4
    -1
      lib/Arsse.php
  20. +196
    -67
      lib/CLI.php
  21. +8
    -18
      lib/Conf.php
  22. +5
    -0
      lib/Context/Context.php
  23. +635
    -440
      lib/Database.php
  24. +3
    -0
      lib/Db/Driver.php
  25. +4
    -0
      lib/Db/MySQL/Driver.php
  26. +4
    -0
      lib/Db/PostgreSQL/Driver.php
  27. +26
    -0
      lib/Db/PostgreSQL/PDOResult.php
  28. +14
    -0
      lib/Db/PostgreSQL/PDOStatement.php
  29. +15
    -1
      lib/Db/PostgreSQL/Result.php
  30. +3
    -0
      lib/Db/PostgreSQL/Statement.php
  31. +2
    -0
      lib/Db/SQLite3/Driver.php
  32. +5
    -2
      lib/Factory.php
  33. +61
    -23
      lib/Feed.php
  34. +24
    -21
      lib/Feed/Exception.php
  35. +2
    -2
      lib/ImportExport/AbstractImportExport.php
  36. +2
    -2
      lib/ImportExport/OPML.php
  37. +1
    -1
      lib/Misc/Date.php
  38. +11
    -0
      lib/Misc/ValueInfo.php
  39. +16
    -7
      lib/REST.php
  40. +9
    -13
      lib/REST/AbstractHandler.php
  41. +33
    -21
      lib/REST/Fever/API.php
  42. +19
    -0
      lib/REST/Miniflux/ErrorResponse.php
  43. +37
    -0
      lib/REST/Miniflux/Status.php
  44. +31
    -0
      lib/REST/Miniflux/Token.php
  45. +1203
    -0
      lib/REST/Miniflux/V1.php
  46. +38
    -23
      lib/REST/NextcloudNews/V1_2.php
  47. +110
    -72
      lib/REST/TinyTinyRSS/API.php
  48. +7
    -4
      lib/REST/TinyTinyRSS/Icon.php
  49. +2
    -2
      lib/Rule/Exception.php
  50. +85
    -0
      lib/Rule/Rule.php
  51. +2
    -0
      lib/Service.php
  52. +134
    -33
      lib/User.php
  53. +71
    -18
      lib/User/Driver.php
  54. +1
    -1
      lib/User/ExceptionConflict.php
  55. +1
    -1
      lib/User/ExceptionInput.php
  56. +42
    -13
      lib/User/Internal/Driver.php
  57. +48
    -7
      locale/en.php
  58. +56
    -0
      sql/MySQL/6.sql
  59. +55
    -0
      sql/PostgreSQL/6.sql
  60. +116
    -0
      sql/SQLite3/6.sql
  61. +5
    -1
      tests/bootstrap.php
  62. +125
    -15
      tests/cases/CLI/TestCLI.php
  63. +1
    -1
      tests/cases/Database/AbstractTest.php
  64. +249
    -143
      tests/cases/Database/SeriesArticle.php
  65. +55
    -13
      tests/cases/Database/SeriesCleanup.php
  66. +109
    -28
      tests/cases/Database/SeriesFeed.php
  67. +3
    -44
      tests/cases/Database/SeriesFolder.php
  68. +97
    -0
      tests/cases/Database/SeriesIcon.php
  69. +20
    -65
      tests/cases/Database/SeriesLabel.php
  70. +3
    -17
      tests/cases/Database/SeriesSession.php
  71. +159
    -146
      tests/cases/Database/SeriesSubscription.php
  72. +5
    -59
      tests/cases/Database/SeriesTag.php
  73. +19
    -20
      tests/cases/Database/SeriesToken.php
  74. +111
    -48
      tests/cases/Database/SeriesUser.php
  75. +18
    -7
      tests/cases/Db/BaseDriver.php
  76. +25
    -0
      tests/cases/Db/BaseResult.php
  77. +0
    -7
      tests/cases/Db/BaseStatement.php
  78. +54
    -0
      tests/cases/Db/BaseUpdate.php
  79. +2
    -0
      tests/cases/Db/PostgreSQL/TestResult.php
  80. +5
    -0
      tests/cases/Db/PostgreSQL/TestStatement.php
  81. +3
    -1
      tests/cases/Db/PostgreSQLPDO/TestResult.php
  82. +5
    -0
      tests/cases/Db/PostgreSQLPDO/TestStatement.php
  83. +4
    -2
      tests/cases/Db/SQLite3/TestDriver.php
  84. +4
    -2
      tests/cases/Db/SQLite3/TestResult.php
  85. +4
    -2
      tests/cases/Db/SQLite3/TestStatement.php
  86. +4
    -2
      tests/cases/Db/SQLite3/TestUpdate.php
  87. +10
    -0
      tests/cases/Exception/TestException.php
  88. +6
    -6
      tests/cases/Feed/TestException.php
  89. +55
    -0
      tests/cases/Feed/TestFeed.php
  90. +5
    -7
      tests/cases/ImportExport/TestImportExport.php
  91. +25
    -26
      tests/cases/ImportExport/TestOPML.php
  92. +1
    -0
      tests/cases/Misc/TestContext.php
  93. +17
    -0
      tests/cases/Misc/TestFactory.php
  94. +51
    -0
      tests/cases/Misc/TestRule.php
  95. +46
    -37
      tests/cases/REST/Fever/TestAPI.php
  96. +1
    -1
      tests/cases/REST/Fever/TestUser.php
  97. +13
    -0
      tests/cases/REST/Miniflux/PDO/TestToken.php
  98. +13
    -0
      tests/cases/REST/Miniflux/PDO/TestV1.php
  99. +22
    -0
      tests/cases/REST/Miniflux/TestErrorResponse.php
  100. +34
    -0
      tests/cases/REST/Miniflux/TestStatus.php

+ 0
- 1
.gitignore View File

@ -26,7 +26,6 @@ $RECYCLE.BIN/
.DS_Store
.AppleDouble
.LSOverride
Icon
._*
.Spotlight-V100
.Trashes


+ 22
- 1
CHANGELOG View File

@ -1,9 +1,30 @@
Version 0.9.0 (????-??-??)
==========================
New features:
- Support for the Miniflux protocol (see manual for details)
- Support for API level 15 of Tiny Tiny RSS
- Support for feed icons in Fever
- Command-line functionality for managing user metadata
- Command-line functionality for managing Miniflux login tokens
Bug fixes:
- Use icons specified in Atom feeds when available
- Do not return null as subscription unread count
- Explicitly forbid U+003A COLON and control characters in usernames, for
compatibility with RFC 7617
- Accept "t" and "f" as booleans in Tiny Tiny RSS
Changes:
- Administrator account requirements for Nextcloud News functionality are
now enforced
Version 0.8.5 (2020-10-27)
==========================
Bug fixes:
- Relax Fever HTTP correctness, to fix some clients
- Added the QUERY_STRING FastCGI paramater to the sample Nginx configuration
- Add the QUERY_STRING FastCGI parameter to the sample Nginx configuration
Version 0.8.4 (2020-09-09)
==========================


+ 3
- 3
RoboFile.php View File

@ -96,11 +96,11 @@ class RoboFile extends \Robo\Tasks {
if (extension_loaded("pcov")) {
return "$php -d pcov.enabled=1 -d pcov.directory=$code";
} elseif (extension_loaded("xdebug")) {
return $php;
return "$php -d xdebug.mode=coverage";
} elseif (file_exists($dir."pcov.$ext")) {
return "$php -d extension=pcov.$ext -d pcov.enabled=1 -d pcov.directory=$code";
} elseif (file_exists($dir."pcov.$ext")) {
return "$php -d zend_extension=xdebug.$ext";
} elseif (file_exists($dir."xdebug.$ext")) {
return "$php -d zend_extension=xdebug.$ext -d xdebug.mode=coverage";
} else {
if (IS_WIN) {
$dbg = dirname(\PHP_BINARY)."\\phpdbg.exe";


+ 17
- 0
UPGRADING View File

@ -11,6 +11,23 @@ usually prudent:
`composer install -o --no-dev`
Upgrading from 0.8.5 to 0.9.0
=============================
- The database schema has changed from rev6 to rev7; if upgrading the database
manually, apply the 6.sql file
- Web server configuration has changed to accommodate Miniflux; the following
URL paths are affected:
- /v1/
- /version
- /healthcheck
- Icons for existing feeds in Miniflux and Fever will only appear once the
feeds in question have been fetched after upgrade. This may take up to
twenty-four hours to occur
- An administrator account is now required to refresh feeds via the
Nextcloud News protocol
Upgrading from 0.8.4 to 0.8.5
=============================


+ 2
- 1
arsse.php View File

@ -15,7 +15,8 @@ ini_set("memory_limit", "-1");
ini_set("max_execution_time", "0");
if (\PHP_SAPI === "cli") {
// initialize the CLI; this automatically handles --help and --version
// initialize the CLI; this automatically handles --help and --version else
Arsse::$obj = new Factory;
$cli = new CLI;
// handle other CLI requests; some do not require configuration
$exitStatus = $cli->dispatch();


+ 19
- 80
composer.lock View File

@ -484,12 +484,6 @@
"psr-17",
"psr-7"
],
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2020-09-03T14:29:41+00:00"
},
{
@ -549,12 +543,6 @@
"psr-15",
"psr-7"
],
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2020-06-03T15:52:17+00:00"
},
{
@ -653,12 +641,6 @@
"laminas",
"zf"
],
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2020-09-14T14:23:00+00:00"
},
{
@ -967,16 +949,16 @@
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.20.0",
"version": "v1.22.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117"
"reference": "0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117",
"reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44",
"reference": "0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44",
"shasum": ""
},
"require": {
@ -990,7 +972,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.20-dev"
"dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1033,34 +1015,20 @@
"portable",
"shim"
],
"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": "2020-10-23T14:02:19+00:00"
"time": "2021-01-07T16:49:33+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.20.0",
"version": "v1.22.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "727d1096295d807c309fb01a851577302394c897"
"reference": "6e971c891537eb617a00bb07a43d182a6915faba"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897",
"reference": "727d1096295d807c309fb01a851577302394c897",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/6e971c891537eb617a00bb07a43d182a6915faba",
"reference": "6e971c891537eb617a00bb07a43d182a6915faba",
"shasum": ""
},
"require": {
@ -1072,7 +1040,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.20-dev"
"dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1114,34 +1082,20 @@
"portable",
"shim"
],
"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": "2020-10-23T14:02:19+00:00"
"time": "2021-01-07T17:09:11+00:00"
},
{
"name": "symfony/polyfill-php72",
"version": "v1.20.0",
"version": "v1.22.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
"reference": "cede45fcdfabdd6043b3592e83678e42ec69e930"
"reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cede45fcdfabdd6043b3592e83678e42ec69e930",
"reference": "cede45fcdfabdd6043b3592e83678e42ec69e930",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9",
"reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9",
"shasum": ""
},
"require": {
@ -1150,7 +1104,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.20-dev"
"dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@ -1187,21 +1141,7 @@
"portable",
"shim"
],
"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": "2020-10-23T14:02:19+00:00"
"time": "2021-01-07T16:49:33+00:00"
}
],
"packages-dev": [
@ -1267,6 +1207,5 @@
"platform-dev": [],
"platform-overrides": {
"php": "7.1.33"
},
"plugin-api-version": "1.1.0"
}
}

+ 4
- 4
dist/apache.conf View File

@ -10,13 +10,13 @@
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "/usr/share/arsse/arsse.php"
ProxyPreserveHost On
# Nextcloud News v1.2, Tiny Tiny RSS API, TT-RSS newsfeed icons
<LocationMatch "(/index\.php/apps/news/api/?.+|/tt-rss/(api|feed-icons))">
# Nextcloud News v1.2, Tiny Tiny RSS API, TT-RSS newsfeed icons, Miniflux API
<LocationMatch "(/index\.php/apps/news/api/?.+|/tt-rss/(api|feed-icons)|/v1/)">
ProxyPass "unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/usr/share/arsse"
</LocationMatch>
# Nextcloud News API detection, Fever API
<LocationMatch "(/index\.php/apps/news/api/?$|/fever)">
# Nextcloud News API detection, Fever API, Miniflux miscellanies
<LocationMatch "(/index\.php/apps/news/api/?$|/fever|/version$|/healthcheck$)">
# these locations should not be behind HTTP authentication
ProxyPass "unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/usr/share/arsse"
</LocationMatch>


+ 17
- 0
dist/nginx.conf View File

@ -55,4 +55,21 @@ server {
# this path should not be behind HTTP authentication
try_files $uri @arsse;
}
# Miniflux protocol
location /v1/ {
try_files $uri @arsse;
}
# Miniflux version number
location /version {
# this path should not be behind HTTP authentication
try_files $uri @arsse;
}
# Miniflux "health check"
location /healthcheck {
# this path should not be behind HTTP authentication
try_files $uri @arsse;
}
}

+ 1
- 0
docs/en/010_About.md View File

@ -1,5 +1,6 @@
The Advanced RSS Environment (affectionately called "The Arsse") is a news aggregator server which implements multiple synchronization protocols. Unlike most other aggregator servers, The Arsse does not include a Web front-end (though one is planned as a separate project), and it relies on [existing protocols](Supported_Protocols) to maximize compatibility with [existing clients](Compatible_Clients). Supported protocols are:
- Miniflux
- Nextcloud News
- Tiny Tiny RSS
- Fever


+ 35
- 2
docs/en/025_Using_The_Arsse/010_Managing_Users.md View File

@ -21,7 +21,7 @@ Ji0ivMYqi6gKxQK1MHuE
# Setting and changing passwords
Setting's a user's password is practically identical to adding a password:
Setting a user's password is nearly identical to adding a user:
```sh
sudo -u www-data php arsse.php user set-pass "user@example.com" "new password"
@ -49,7 +49,40 @@ $ sudo -u www-data php arsse.php user set-pass --fever "jane.doe"
YfZJHq4fNTRUKDYhzQdR
```
## Managing login tokens for Miniflux
[Miniflux](/en/Supported_Protocols/Miniflux) clients may optionally log in using tokens: randomly-generated strings which act as persistent passwords. For now these must be generated using the command-line interface:
```console
$ sudo -u www-data php arsse.php token create "jane.doe"
xRK0huUE9KHNHf_x_H8JG0oRDo4t_WV44whBtr8Ckf0=
```
Multiple tokens may be generated for use with different clients, and descriptive labels can be assigned for later identification:
```console
$ sudo -u www-data php arsse.php token create "jane.doe" Newsflash
xRK0huUE9KHNHf_x_H8JG0oRDo4t_WV44whBtr8Ckf0=
$ sudo -u www-data php arsse.php token create "jane.doe" Reminiflux
L7asI2X_d-krinGJd1GsiRdFm2o06ZUlgD22H913hK4=
```
There are also commands for listing and revoking tokens. Please consult the integrated help for more details.
# Setting and changing user metadata
Users may also have various metadata properties set. These largely exist for compatibility with [the Miniflux protocol](/en/Supported_Protocols/Miniflux) and have no significant effect. One exception to this, however, is the `admin` flag, which signals whether the user may perform privileged operations where they exist in the supported protocols.
The flag may be changed using the following command:
```sh
sudo -u www-data php arsse.php user set "jane.doe" admin true
```
As a shortcut it is also possible to create administrators directly:
```sh
sudo -u www-data php arsse.php user add "user@example.com" "example password" --admin
```
Please consult the integrated help for more details on metadata and their effects.

+ 61
- 0
docs/en/030_Supported_Protocols/005_Miniflux.md View File

@ -0,0 +1,61 @@
[TOC]
# About
<dl>
<dt>Supported since</dt>
<dd>0.9.0</dd>
<dt>Base URL</dt>
<dd>/</dd>
<dt>API endpoint</dt>
<dd>/v1/</dd>
<dt>Specifications</dt>
<dd><a href="https://miniflux.app/docs/api.html">API Reference</a>, <a href="https://miniflux.app/docs/rules.html#filtering-rules">Filtering Rules</a></dd>
</dl>
The Miniflux protocol is a fairly well-designed protocol supporting a wide variety of operations on newsfeeds, folders (termed "categories"), and articles; it also allows for user administration, and native OPML importing and exporting. Architecturally it is similar to the Nextcloud News protocol, but has more capabilities.
Miniflux version 2.0.28 is emulated, though not all features are implemented
# Missing features
- JSON Feed format is not suported
- Various feed-related features are not supported; attempting to use them has no effect
- Rewrite rules and scraper rules
- Custom User-Agent strings
- The `disabled`, `ignore_http_cache`, and `fetch_via_proxy` flags
- Changing the URL, username, or password of a feed
- Manually refreshing feeds
- Titles and types are not available during feed discovery and are filled with generic data
- Reading time is not calculated and will always be zero
- Only the first enclosure of an article is retained
- Comment URLs of articles are not exposed
# Differences
- Various error codes and messages differ due to significant implementation differences
- `PUT` requests which return a body respond with `200 OK` rather than `201 Created`
- The "All" category is treated specially (see below for details)
- Feed and category titles consisting only of whitespace are rejected along with the empty string
- 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
# Behaviour of filtering (block and keep) rules
The Miniflux documentation gives only a brief example of a pattern for its filtering rules; the allowed syntax is described in full [in Google's documentation for RE2](https://github.com/google/re2/wiki/Syntax). Being a PHP application, The Arsse instead accepts [PCRE syntax](http://www.pcre.org/original/doc/html/pcresyntax.html) (or since PHP 7.3 [PCRE2 syntax](https://www.pcre.org/current/doc/html/pcre2syntax.html)), specifically in UTF-8 mode. Delimiters should not be included, and slashes should not be escaped; anchors may be used if desired. For example `^(?i)RE/MAX$` is a valid pattern.
For convenience the patterns are tested after collapsing whitespace. Unlike Miniflux, The Arsse tests the patterns against an article's author-supplied categories if they do not match its title. Also unlike Miniflux, when filter rules are modified they are re-evaluated against all applicable articles immediately.
# Special handling of the "All" category
Nextcloud News' root folder and Tiny Tiny RSS' "Uncategorized" catgory are mapped to Miniflux's initial "All" category. This Miniflux category can be renamed, but it cannot be deleted. Attempting to do so will delete the child feeds it contains, but not the category itself.
Because the root folder does not existing in the database as a separate entity, it will always sort first when ordering by `category_id` or `category_title`.
# Interaction with nested categories
Tiny Tiny RSS is unique in allowing newsfeeds to be grouped into categories nested to arbitrary depth. When newsfeeds are placed into nested categories, they simply appear in the top-level category when accessed via the Miniflux protocol. This does not affect OPML exports, where full nesting is preserved.

+ 0
- 1
docs/en/030_Supported_Protocols/010_Nextcloud_News.md View File

@ -24,7 +24,6 @@ It allows organizing newsfeeds into single-level folders, and supports a wide ra
- When marking articles as starred the feed ID is ignored, as they are not needed to establish uniqueness
- The feed updater ignores the `userId` parameter: feeds in The Arsse are deduplicated, and have no owner
- The `/feeds/all` route lists only feeds which should be checked for updates, and it also returns all `userId` attributes as empty strings: feeds in The Arsse are deduplicated, and have no owner
- The API's "updater" routes do not require administrator priviledges as The Arsse has no concept of user classes
- The "updater" console commands mentioned in the protocol specification are not implemented, as The Arsse does not implement the required Nextcloud subsystems
- The `lastLoginTimestamp` attribute of the user metadata is always the current time: The Arsse's implementation of the protocol is fully stateless
- Syntactically invalid JSON input will yield a `400 Bad Request` response instead of falling back to GET parameters


+ 0
- 1
docs/en/030_Supported_Protocols/030_Fever.md View File

@ -23,7 +23,6 @@ The Fever protocol is incomplete, unusual, _and_ a product of proprietary softwa
- All feeds are considered "Kindling"
- The "Hot Links" feature is not implemented; when requested, an empty array will be returned. As there is no way to classify a feed as a "Spark" in the protocol itself and no documentation exists on how link temperature was calculated, an implementation is unlikely to appear in the future
- Favicons are not currently supported; all feeds have a simple blank image as their favicon unless the client finds the icons itself
# Special considerations


+ 1
- 0
docs/en/030_Supported_Protocols/index.md View File

@ -1,5 +1,6 @@
The Arsse was designed from the start as a server for multiple synchronization protocols which clients can make use of. Currently the following protocols are supported:
- [Miniflux](Miniflux)
- [Nextcloud News](Nextcloud_News)
- [Tiny Tiny RSS](Tiny_Tiny_RSS)
- [Fever](Fever)


+ 203
- 9
docs/en/040_Compatible_Clients.md View File

@ -5,27 +5,74 @@ The Arsse does not at this time have any first party clients. However, because T
<tr>
<th rowspan="2">Name</th>
<th rowspan="2">OS</th>
<th colspan="3">Protocol</th>
<th colspan="4">Protocol</th>
<th rowspan="2">Notes</th>
</tr>
<tr>
<th>Miniflux</th>
<th>Nextcloud News</th>
<th>Tiny Tiny RSS</th>
<th>Fever</th>
</tr>
</thead>
<tbody>
<th colspan="7">Web</th>
<tr>
<th colspan="6">Desktop</th>
</tr>
<tr>
<td><a href="https://github.com/jakobend/maxiflux">maxiflux</a></td>
<td></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td></td>
</tr>
<tr>
<td><a href="https://github.com/yurikhan/miniflux-reader">Miniflux Reader</a></td>
<td></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td></td>
</tr>
<tr>
<td><a href="https://github.com/reminiflux/reminiflux">reminiflux</a></td>
<td></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td>
<p>Three-pane alternative front-end for Minflux.</p>
</td>
</tr>
<tr>
<td><a href="https://github.com/TheScientist/ttrss-pwa">Tiny Tiny RSS Progressive Web App</a></td>
<td></td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p>Does not (<a href="https://github.com/TheScientist/ttrss-pwa/issues/7">yet</a>) support HTTP authentication.</p>
</td>
</tr>
</tbody>
<tbody>
<tr>
<th colspan="7">Desktop</th>
</tr>
<tr>
<td><a href="https://jangernert.github.io/FeedReader/">FeedReader</a></td>
<td>Linux</td>
<td class="N"></td>
<td class="Y"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p>Excellent reader; one of the best on any platform.</p>
<p>Excellent reader; discontinued in favour of NewsFlash.</p>
<p>Not compatible with HTTP authentication when using TT-RSS.</p>
</td>
</tr>
@ -33,6 +80,7 @@ The Arsse does not at this time have any first party clients. However, because T
<td><a href="https://lzone.de/liferea/">Liferea</a></td>
<td>Linux</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
@ -44,6 +92,7 @@ The Arsse does not at this time have any first party clients. However, because T
<td>Linux, macOS</td>
<td class="Y"></td>
<td class="Y"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p>Terminal-based client.</p>
@ -52,11 +101,12 @@ The Arsse does not at this time have any first party clients. However, because T
<tr>
<td><a href="https://gitlab.com/news-flash/news_flash_gtk">NewsFlash</a></td>
<td>Linux</td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td>
<p>Successor to FeedReader.</p>
<p>Successor to FeedReader. One of the best on any platform</p>
</td>
</tr>
<tr>
@ -64,6 +114,7 @@ The Arsse does not at this time have any first party clients. However, because T
<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>
@ -72,18 +123,20 @@ The Arsse does not at this time have any first party clients. However, because T
<tr>
<td><a href="https://github.com/martinrotter/rssguard/">RSS Guard</a></td>
<td>Windows, macOS, Linux</td>
<td class="N"></td>
<td class="Y"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p>Very basic client; now discontinued.</p>
<p>Very basic client.</p>
</td>
</tr>
</tr>
<tr>
<td><a href="https://www.microsoft.com/store/apps/9wzdncrdmbn3">Tiny Tiny RSS Reader</td>
<td><a href="https://bitbucket.org/thescientist/tiny-tiny-rss-wp8-client/src/master/">Tiny Tiny RSS Reader</td>
<td>Windows</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
@ -93,11 +146,12 @@ The Arsse does not at this time have any first party clients. However, because T
</tbody>
<tbody>
<tr>
<th colspan="6">Mobile</th>
<th colspan="7">Mobile</th>
</tr>
<tr>
<td><a href="https://peterandlinda.com/cloudnews/">CloudNews</a></td>
<td>iOS</td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
@ -109,6 +163,7 @@ The Arsse does not at this time have any first party clients. However, because T
<td><a href="https://play.google.com/store/apps/details?id=com.seazon.feedme">FeedMe</a></td>
<td>Android</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
@ -119,6 +174,7 @@ The Arsse does not at this time have any first party clients. However, because T
<td><a href="http://cocoacake.net/apps/fiery/">Fiery Feeds</a></td>
<td>iOS</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="Y"></td>
<td>
@ -126,9 +182,48 @@ The Arsse does not at this time have any first party clients. However, because T
<p>Currently keeps showing items in the unread badge which have already been read.</p>
</td>
</tr>
<tr>
<td><a href="https://github.com/fbarthelery/geekttrss">Geekttrss</a></td>
<td>Android</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p></p>
</td>
</tr>
<tr>
<td><a href="https://play.google.com/store/apps/details?id=com.constantin.microflux">Microflux for Miniflux</a></td>
<td>Android</td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td></td>
</tr>
<tr>
<td><a href="https://github.com/DocMarty84/miniflutt">Miniflutt</a></td>
<td>Android</td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td></td>
</tr>
<tr>
<td><a href="https://play.google.com/store/apps/details?id=mobi.newsjet.rss">NewsJet RSS</a></td>
<td>Android</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td></td>
</tr>
<tr>
<td><a href="https://github.com/SimonSchubert/NewsOut">Newsout</a></td>
<td>Android, iOS</td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
@ -139,6 +234,7 @@ The Arsse does not at this time have any first party clients. However, because T
<tr>
<td><a href="https://github.com/nextcloud/news-android/">Nextcloud News</a></td>
<td>Android</td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
@ -149,6 +245,7 @@ The Arsse does not at this time have any first party clients. However, because T
<tr>
<td><a href="https://github.com/schaal/ocreader/">OCReader</a></td>
<td>Android</td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
@ -159,16 +256,38 @@ The Arsse does not at this time have any first party clients. However, because T
<td>Android</td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td>
<p>Fetches favicons independently.</p>
</td>
</tr>
<tr>
<td><a href="https://github.com/readrops/Readrops">Readrops</a></td>
<td>Android</td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td></td>
</tr>
<tr>
<td><a href="https://github.com/ali322/reed">Reed</a></td>
<td>Android</td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td>
<p>Binaries only available from GitHub.</p>
</td>
</tr>
<tr>
<td><a href="https://reeder.app/">Reeder</a></td>
<td>iOS</td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td>
<p>Also available for macOS.</p>
@ -178,6 +297,7 @@ The Arsse does not at this time have any first party clients. However, because T
<td><a href="http://tt-rss.org/">Tiny Tiny RSS</a></td>
<td>Android</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
@ -188,6 +308,7 @@ The Arsse does not at this time have any first party clients. However, because T
<td><a href="http://github.com/nilsbraden/ttrss-reader-fork/">TTRSS-Reader</a></td>
<td>Android</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
@ -199,6 +320,7 @@ The Arsse does not at this time have any first party clients. However, because T
<td>iOS</td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td>
<p>Trialware with one-time purchase.</p>
@ -214,10 +336,11 @@ The Arsse does not at this time have any first party clients. However, because T
<tr>
<th rowspan="2">Name</th>
<th rowspan="2">OS</th>
<th colspan="3">Protocol</th>
<th colspan="4">Protocol</th>
<th rowspan="2">Notes</th>
</tr>
<tr>
<th>Miniflux</th>
<th>Nextcloud News</th>
<th>Tiny Tiny RSS</th>
<th>Fever</th>
@ -228,20 +351,66 @@ The Arsse does not at this time have any first party clients. However, because T
<td><a href="https://github.com/jeena/feedthemonkey">FeedTheMonkey</a></td>
<td>Linux</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p></p>
</td>
</tr>
<tr>
<td><a href="https://github.com/Huessenbergnetz/Fuoten">Fuoten</a></td>
<td>Sailfish</td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td>
<p></p>
</td>
</tr>
<tr>
<td><a href="https://github.com/mkiol/kaktus">Kaktus</a></td>
<td>Sailfish, BlackBerry</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p></p>
</td>
</tr>
<!--
<tr>
<td><a href="https://github.com/fabienheureux/liseur">Liseur</a></td>
<td>Windows?</td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td>
<p>Level of functionality unclear.</p>
</td>
</tr>
-->
<tr>
<td><a href="https://open-store.io/app/newsie.martinferretti">Newsie</a></td>
<td>Ubuntu Touch</td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td>
</td>
</tr>
<tr>
<td><a href="https://github.com/jgerstbe/nx-news-ion">NX News</a></td>
<td>Web</td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td class="N"></td>
<td>
<p>Does not support HTTP authentication.</p>
</td>
</tr>
<tr>
@ -249,6 +418,7 @@ The Arsse does not at this time have any first party clients. However, because T
<td>macOS</td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td>
<p>Requires purchase. Presumed to work.</p>
@ -259,6 +429,7 @@ The Arsse does not at this time have any first party clients. However, because T
<td>Windows</td>
<td class="N"></td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td>
<p>Requires manual configuration.</p>
@ -268,11 +439,34 @@ The Arsse does not at this time have any first party clients. However, because T
<td><a href="http://www.pluchon.com/en/tiny_reader_rss.php">tiny Reader RSS</a></td>
<td>iOS</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p>Does not support HTTP authentication.</p>
</td>
</tr>
<tr>
<td><a href="https://github.com/kucrut/ttrss-reader">Tiny Tiny RSS Reader</a></td>
<td>Web</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p></p>
</td>
</tr>
<tr>
<td><a href="https://github.com/cnlpete/ttrss">ttrss</a></td>
<td>Sailfish</td>
<td class="N"></td>
<td class="N"></td>
<td class="Y"></td>
<td class="N"></td>
<td>
<p></p>
</td>
</tr>
</tbody>
</table>

+ 1
- 1
docs/theme/arsse/arsse.css
File diff suppressed because it is too large
View File


+ 2
- 2
docs/theme/src/arsse.scss View File

@ -245,12 +245,12 @@ ul.TableOfContents {
}
thead tr + tr th {
width: 16.66%;
width: 12%;
text-align: center;
}
tbody td {
&:nth-child(3), &:nth-child(4), &:nth-child(5) {
&:nth-child(3), &:nth-child(4), &:nth-child(5), &:nth-child(6) {
text-align: center;
}


+ 21
- 4
lib/AbstractException.php View File

@ -46,6 +46,7 @@ abstract class AbstractException extends \Exception {
"Db/Exception.savepointStale" => 10227,
"Db/Exception.resultReused" => 10228,
"Db/ExceptionRetry.schemaChange" => 10229,
"Db/ExceptionInput.invalidValue" => 10230,
"Db/ExceptionInput.missing" => 10231,
"Db/ExceptionInput.whitespace" => 10232,
"Db/ExceptionInput.tooLong" => 10233,
@ -68,13 +69,15 @@ abstract class AbstractException extends \Exception {
"Conf/Exception.typeMismatch" => 10311,
"Conf/Exception.semanticMismatch" => 10312,
"Conf/Exception.ambiguousDefault" => 10313,
"User/Exception.functionNotImplemented" => 10401,
"User/Exception.doesNotExist" => 10402,
"User/Exception.alreadyExists" => 10403,
"User/Exception.authMissing" => 10411,
"User/Exception.authFailed" => 10412,
"User/ExceptionAuthz.notAuthorized" => 10421,
"User/ExceptionConflict.doesNotExist" => 10402,
"User/ExceptionConflict.alreadyExists" => 10403,
"User/ExceptionSession.invalid" => 10431,
"User/ExceptionInput.invalidTimezone" => 10441,
"User/ExceptionInput.invalidValue" => 10442,
"User/ExceptionInput.invalidNonZeroInteger" => 10443,
"User/ExceptionInput.invalidUsername" => 10444,
"Feed/Exception.internalError" => 10500,
"Feed/Exception.invalidCertificate" => 10501,
"Feed/Exception.invalidUrl" => 10502,
@ -98,9 +101,15 @@ abstract class AbstractException extends \Exception {
"ImportExport/Exception.invalidFolderName" => 10613,
"ImportExport/Exception.invalidFolderCopy" => 10614,
"ImportExport/Exception.invalidTagName" => 10615,
"Rule/Exception.invalidPattern" => 10701,
];
protected $symbol;
protected $params;
public function __construct(string $msgID = "", $vars = null, \Throwable $e = null) {
$this->symbol = $msgID;
$this->params = $vars ?? [];
if ($msgID === "") {
$msg = "Exception.unknown";
$code = 10000;
@ -117,4 +126,12 @@ abstract class AbstractException extends \Exception {
}
parent::__construct($msg, $code, $e);
}
public function getSymbol(): string {
return $this->symbol;
}
public function getParams(): array {
return $this->params;
}
}

+ 4
- 1
lib/Arsse.php View File

@ -7,8 +7,10 @@ declare(strict_types=1);
namespace JKingWeb\Arsse;
class Arsse {
public const VERSION = "0.8.5";
public const VERSION = "0.9.0";
/** @var Factory */
public static $obj;
/** @var Lang */
public static $lang;
/** @var Conf */
@ -19,6 +21,7 @@ class Arsse {
public static $user;
public static function load(Conf $conf): void {
static::$obj = static::$obj ?? new Factory;
static::$lang = static::$lang ?? new Lang;
static::$conf = $conf;
static::$lang->set($conf->lang);


+ 196
- 67
lib/CLI.php View File

@ -8,6 +8,7 @@ namespace JKingWeb\Arsse;
use JKingWeb\Arsse\REST\Fever\User as Fever;
use JKingWeb\Arsse\ImportExport\OPML;
use JKingWeb\Arsse\REST\Miniflux\Token as Miniflux;
class CLI {
public const USAGE = <<<USAGE_TEXT
@ -17,13 +18,19 @@ Usage:
arsse.php feed refresh <n>
arsse.php conf save-defaults [<file>]
arsse.php user [list]
arsse.php user add <username> [<password>]
arsse.php user add <username> [<password>] [--admin]
arsse.php user remove <username>
arsse.php user show <username>
arsse.php user set <username> <property> <value>
arsse.php user unset <username> <property>
arsse.php user set-pass <username> [<password>]
[--oldpass=<pass>] [--fever]
arsse.php user unset-pass <username>
[--oldpass=<pass>] [--fever]
arsse.php user auth <username> <password> [--fever]
arsse.php token list <username>
arsse.php token create <username> [<label>]
arsse.php token revoke <username> [<token>]
arsse.php import <username> [<file>]
[-f | --flat] [-r | --replace]
arsse.php export <username> [<file>]
@ -63,11 +70,13 @@ Commands:
Prints a list of all existing users, one per line.
user add <username> [<password>]
user add <username> [<password>] [--admin]
Adds the user specified by <username>, with the provided password
<password>. If no password is specified, a random password will be
generated and printed to standard output.
generated and printed to standard output. The --admin option will make
the user an administrator, which allows them to manage users via the
Miniflux protocol, among other things.
user remove <username>
@ -76,6 +85,22 @@ Commands:
which the user was subscribed will be retained and refreshed until the
configured retention time elapses.
user show <username>
Displays the metadata of a user in a basic tabular format. See below for
details on the various properties displayed.
user set <username> <property> <value>
Sets a user's metadata property to the supplied value. See below for
details on the various properties available.
user unset <username> <property>
Sets a user's metadata property to its default value. See below for
details on the various properties available. What the default value
for a property evaluates to depends on which protocol is used.
user set-pass <username> [<password>]
Changes <username>'s password to <password>. If no password is specified,
@ -104,6 +129,24 @@ Commands:
The --fever option may be used to test the user's Fever protocol password,
if any.
token list <username>
Lists available tokens for <username> in a simple tabular format. These
tokens act as an alternative means of authentication for the Miniflux
protocol and may be required by some clients. They do not expire.
token create <username> [<label>]
Creates a new login token for <username> and prints it. These tokens act
as