summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml1
-rw-r--r--CHANGELOG.md29
-rw-r--r--CONTRIBUTING.md27
-rw-r--r--CREDITS.md3
-rw-r--r--Docker/Dockerfile2
-rw-r--r--Docker/README.md2
-rw-r--r--README.fr.md9
-rw-r--r--README.md9
-rwxr-xr-xapp/Controllers/entryController.php20
-rwxr-xr-xapp/Controllers/feedController.php23
-rwxr-xr-xapp/Controllers/indexController.php2
-rwxr-xr-xapp/Controllers/javascriptController.php4
-rw-r--r--app/Controllers/userController.php11
-rw-r--r--app/FreshRSS.php2
-rw-r--r--app/Models/Category.php2
-rw-r--r--app/Models/CategoryDAO.php2
-rw-r--r--app/Models/Entry.php5
-rw-r--r--app/Models/EntryDAO.php38
-rw-r--r--app/Models/EntryDAOSQLite.php17
-rw-r--r--app/Models/Feed.php15
-rw-r--r--app/Models/FeedDAO.php4
-rw-r--r--app/i18n/cz/admin.php6
-rw-r--r--app/i18n/cz/feedback.php5
-rw-r--r--app/i18n/cz/gen.php1
-rw-r--r--app/i18n/cz/index.php1
-rw-r--r--app/i18n/cz/install.php4
-rw-r--r--app/i18n/de/admin.php6
-rw-r--r--app/i18n/de/feedback.php5
-rw-r--r--app/i18n/de/gen.php3
-rw-r--r--app/i18n/de/index.php1
-rw-r--r--app/i18n/de/install.php4
-rw-r--r--app/i18n/en/admin.php6
-rw-r--r--app/i18n/en/feedback.php5
-rw-r--r--app/i18n/en/gen.php1
-rw-r--r--app/i18n/en/index.php1
-rw-r--r--app/i18n/en/install.php4
-rwxr-xr-xapp/i18n/es/admin.php6
-rwxr-xr-xapp/i18n/es/feedback.php5
-rwxr-xr-xapp/i18n/es/gen.php1
-rwxr-xr-xapp/i18n/es/index.php1
-rwxr-xr-xapp/i18n/es/install.php4
-rw-r--r--app/i18n/fr/admin.php8
-rw-r--r--app/i18n/fr/feedback.php5
-rw-r--r--app/i18n/fr/gen.php1
-rw-r--r--app/i18n/fr/index.php3
-rw-r--r--app/i18n/fr/install.php8
-rw-r--r--app/i18n/he/admin.php10
-rw-r--r--app/i18n/he/feedback.php5
-rw-r--r--app/i18n/he/gen.php1
-rw-r--r--app/i18n/he/index.php1
-rw-r--r--app/i18n/he/install.php10
-rw-r--r--app/i18n/it/admin.php6
-rw-r--r--app/i18n/it/feedback.php5
-rw-r--r--app/i18n/it/gen.php1
-rw-r--r--app/i18n/it/index.php1
-rw-r--r--app/i18n/it/install.php4
-rw-r--r--app/i18n/kr/admin.php12
-rw-r--r--app/i18n/kr/conf.php10
-rw-r--r--app/i18n/kr/feedback.php11
-rw-r--r--app/i18n/kr/gen.php3
-rw-r--r--app/i18n/kr/index.php1
-rw-r--r--app/i18n/kr/install.php6
-rw-r--r--app/i18n/kr/sub.php4
-rw-r--r--app/i18n/nl/admin.php6
-rw-r--r--app/i18n/nl/feedback.php5
-rw-r--r--app/i18n/nl/gen.php1
-rw-r--r--app/i18n/nl/index.php1
-rw-r--r--app/i18n/nl/install.php4
-rw-r--r--app/i18n/pt-br/admin.php6
-rw-r--r--app/i18n/pt-br/feedback.php5
-rw-r--r--app/i18n/pt-br/gen.php1
-rw-r--r--app/i18n/pt-br/index.php1
-rw-r--r--app/i18n/pt-br/install.php6
-rw-r--r--app/i18n/ru/admin.php6
-rw-r--r--app/i18n/ru/feedback.php5
-rw-r--r--app/i18n/ru/gen.php1
-rw-r--r--app/i18n/ru/index.php1
-rw-r--r--app/i18n/ru/install.php4
-rw-r--r--app/i18n/tr/admin.php6
-rw-r--r--app/i18n/tr/feedback.php5
-rw-r--r--app/i18n/tr/gen.php1
-rw-r--r--app/i18n/tr/index.php1
-rw-r--r--app/i18n/tr/install.php4
-rw-r--r--app/i18n/zh-cn/admin.php6
-rw-r--r--app/i18n/zh-cn/feedback.php5
-rw-r--r--app/i18n/zh-cn/gen.php1
-rw-r--r--app/i18n/zh-cn/index.php1
-rw-r--r--app/i18n/zh-cn/install.php4
-rw-r--r--app/install.php8
-rw-r--r--app/layout/header.phtml3
-rw-r--r--app/layout/nav_menu.phtml24
-rw-r--r--app/shares.php6
-rw-r--r--app/views/helpers/export/opml.phtml8
-rw-r--r--app/views/helpers/index/normal/entry_bottom.phtml2
-rw-r--r--app/views/helpers/javascript_vars.phtml2
-rwxr-xr-xapp/views/helpers/pagination.phtml2
-rw-r--r--app/views/stats/index.phtml2
-rw-r--r--app/views/stats/repartition.phtml2
-rw-r--r--cli/README.md2
-rwxr-xr-xcli/do-install.php2
-rw-r--r--constants.php2
-rw-r--r--data/PubSubHubbub/feeds/index.html13
-rw-r--r--data/PubSubHubbub/index.html13
-rw-r--r--data/PubSubHubbub/keys/index.html13
-rw-r--r--data/users/_/index.html13
-rw-r--r--docs/fr/developers/01_First_steps.md6
-rw-r--r--lib/Minz/Url.php6
-rw-r--r--lib/lib_install.php2
-rw-r--r--lib/lib_rss.php20
-rw-r--r--p/api/fever.php23
-rw-r--r--p/api/greader.php2
-rw-r--r--p/f.php4
-rw-r--r--p/themes/BlueLagoon/BlueLagoon.css3
-rw-r--r--p/themes/Dark/dark.css3
-rw-r--r--p/themes/Origine-compact/origine-compact.css6
-rw-r--r--p/themes/Screwdriver/screwdriver.css3
-rw-r--r--p/themes/base-theme/template.css6
117 files changed, 514 insertions, 187 deletions
diff --git a/.travis.yml b/.travis.yml
index 0217b61c5..24e0bf36b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,7 +7,6 @@ php:
- '7.1'
- '7.2'
- hhvm
- - nightly
install:
# newest version without https://github.com/squizlabs/PHP_CodeSniffer/pull/1404
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 84ab9fc95..171943c2c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,34 @@
# FreshRSS changelog
+## 2018-09-09 FreshRSS 1.11.2
+
+* Features
+ * New menu to mark selected articles (view) as unread [#1966](https://github.com/FreshRSS/FreshRSS/issues/1966)
+ * Share with LinkedIn [#1960](https://github.com/FreshRSS/FreshRSS/pull/1960)
+* Deployment
+ * Update Docker image to Alpine 3.8 with PHP 7.2 [#1956](https://github.com/FreshRSS/FreshRSS/pull/1956)
+* Bug fixing
+ * Fix bugs when searching with special characters (e.g. preventing marking as read) [#1944](https://github.com/FreshRSS/FreshRSS/issues/1944)
+ * Avoid cutting in the middle of a multi-byte Unicode character [#1996](https://github.com/FreshRSS/FreshRSS/pull/1996)
+ * Fix username check in API to allow underscores [#1955](https://github.com/FreshRSS/FreshRSS/issues/1955)
+ * Fix Fever API to allow 32-bit architectures [#1962](https://github.com/FreshRSS/FreshRSS/issues/1962)
+ * Fix CSS font bug for *Origine-compact* theme [#1990](https://github.com/FreshRSS/FreshRSS/issues/1990)
+ * Fix last user activity for SQLite and PostgreSQL [#2008](https://github.com/FreshRSS/FreshRSS/pull/2008)
+ * Fix article counts with SQLite [#2009](https://github.com/FreshRSS/FreshRSS/pull/2009)
+ * Fix some automatic URL generation cases [#1946](https://github.com/FreshRSS/FreshRSS/issues/1946)
+* Security
+ * Avoid feed credentials in logs [#1949](https://github.com/FreshRSS/FreshRSS/pull/1949)
+* UI
+ * Improved mark-as-read the bottom articles during scrolling [#1973](https://github.com/FreshRSS/FreshRSS/issues/1973)
+ * Show all authors for articles with multiple authors [#1968](https://github.com/FreshRSS/FreshRSS/issues/1968)
+* I18n
+ * Updated Korean [#1985](https://github.com/FreshRSS/FreshRSS/pull/1985)
+* Mics.
+ * Auto-login after self user creation [#1928](https://github.com/FreshRSS/FreshRSS/issues/1928)
+ * Better test if server has public address [#2010](https://github.com/FreshRSS/FreshRSS/pull/2010)
+ * Allow `-` in database name at install time [#2005](https://github.com/FreshRSS/FreshRSS/pull/2005)
+
+
## 2018-06-16 FreshRSS 1.11.1
* Features
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 133813711..df56fad76 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,19 +1,18 @@
# How to contribute to FreshRSS?
-## Join us on the mailing lists
+## Chat with us
-Do you want to ask us some questions? Do you want to discuss with us? Don't hesitate to subscribe to our mailing lists!
+Do you want to ask us some questions? Do you want to discuss with us?
+Don’t hesitate to [join our Mattermost chat](https://framateam.org/signup_user_complete/?id=e2680d3e3128b9fac8fdb3003b0024ee)!
-- The first mailing is destined to generic information, it should be adapted to users. [Join mailing@freshrss.org](https://freshrss.org/mailman/listinfo/mailing).
-- The second mailing is mainly for developers. [Join dev@freshrss.org](https://freshrss.org/mailman/listinfo/dev)
## Report a bug
-You found a bug? Don't panic, here are some steps to report it easily:
+You found a bug? Don’t panic, here are some steps to report it easily:
-1. Search for it on [the bug tracker](https://github.com/FreshRSS/FreshRSS/issues) (don't forget to use the search bar).
-2. If you find a similar bug, don't hesitate to post a comment to add more importance to the related ticket.
-3. If you didn't find it, [open a new ticket](https://github.com/FreshRSS/FreshRSS/issues/new).
+1. Search for it on [the bug tracker](https://github.com/FreshRSS/FreshRSS/issues) (don’t forget to use the search bar).
+2. If you find a similar bug, don’t hesitate to post a comment to add more importance to the related ticket.
+3. If you didn’t find it, [open a new ticket](https://github.com/FreshRSS/FreshRSS/issues/new).
If you have to create a new ticket, try to apply the following advices:
@@ -34,24 +33,24 @@ Did you want to fix a bug? To keep a great coordination between collaborators, y
3. [Create a new branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/). The name of the branch must be explicit and being prefixed by the related ticket id. For instance, `783-contributing-file` to fix [ticket #783](https://github.com/FreshRSS/FreshRSS/issues/783).
4. Make your changes to your fork and [send a pull request](https://help.github.com/articles/using-pull-requests/) on the **dev branch**.
-If you have to write code, please follow [our coding style recommendations](http://doc2.freshrss.org/en/Developer_documentation/First_steps/Coding_style).
+If you have to write code, please follow [our coding style recommendations](https://freshrss.github.io/FreshRSS/en/developers/01_First_steps.html).
-**Tip:** if you are searching for bugs easy to fix, have a look at the « [New comers](https://github.com/FreshRSS/FreshRSS/labels/New%20comers) » ticket label.
+**Tip:** if you are searching for bugs easy to fix, have a look at the « [Good first issue](https://github.com/FreshRSS/FreshRSS/issues?q=label%3A%22good+first+issue+%3Ababy%3A%22) » and/or « [Help wanted](https://github.com/FreshRSS/FreshRSS/issues?q=label%3A%22help+wanted+%3Aoctocat%3A%22) » ticket labels.
## Submit an idea
You have great ideas, yes! Don't be shy and open [a new ticket](https://github.com/FreshRSS/FreshRSS/issues/new) on our bug tracker to ask if we can implement it. The greatest ideas often come from the shyest suggestions!
-If your idea is nice, we'll have a look at it.
+If your idea is nice, we’ll have a look at it.
## Contribute to internationalization (i18n)
-If you want to improve internationalization, please open a new ticket first and follow indications from « Fix a bug » section.
+If you want to improve internationalization, please open a new ticket first and follow indications from « Fix a bug » section.
Translations are present in the subdirectories of `./app/i18n/`.
-We are working on a better way to handle internationalization but don't hesitate to suggest any idea!
+We are working on a better way to handle internationalization but don’t hesitate to suggest any idea!
## Contribute to documentation
-The documentation needs a lot of improvements in order to be more useful to new contributors and we are working on it. If you want to give some help, meet us on [the dedicated repository](https://github.com/FreshRSS/documentation)!
+[The documentation](https://freshrss.github.io/FreshRSS/) always needs improvements in order to be more useful to newcomers. If you want to give some help, meet us on [the dedicated sub-folder](https://github.com/FreshRSS/FreshRSS/tree/master/docs)!
diff --git a/CREDITS.md b/CREDITS.md
index 5307061db..d43c5a322 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -34,6 +34,7 @@ People are sorted by name so please keep this order.
* [Julien Reichardt](https://github.com/j8r): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=j8r), [Web](https://blog.jrei.ch/)
* [Kevin Papst](https://github.com/kevinpapst): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=kevinpapst), [Web](http://www.kevinpapst.de/)
* [Luc Didry](https://github.com/ldidry): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=ldidry), [Web](https://www.fiat-tux.fr/)
+* [Luc Sanchez](https://github.com/ColonelMoutarde): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=ColonelMoutarde), (https://www.luc-sanchez.fr/)
* [marcomrc](https://github.com/marcomrc): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=marcomrc)
* [Marcus Rohrmoser](https://github.com/mro): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=mro), [Web](http://mro.name/~me)
* [Marien Fressinaud](https://github.com/marienfressinaud): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=marienfressinaud), [Web](https://marienfressinaud.fr/)
@@ -47,6 +48,7 @@ People are sorted by name so please keep this order.
* [perrinjerome](https://github.com/perrinjerome): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:perrinjerome)
* [plopoyop](https://github.com/plopoyop): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=plopoyop)
* [Paulius Šukys](https://github.com/psukys): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:psukys), [Web](http://sukys.eu)
+* [primaeval](https://github.com/primaeval): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:primaeval)
* [purexo](https://github.com/purexo): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:purexo), [Web](https://purexo.mom/)
* [Quentin Dufour](https://github.com/superboum): [contributions](https://github.com/FreshRSS/documentation/commits?author=superboum), [Web](http://quentin.dufour.io/)
* [Ramón Cutanda](https://github.com/rcutanda): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:rcutanda)
@@ -55,4 +57,5 @@ People are sorted by name so please keep this order.
* [Tets42](https://github.com/Tets42): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Tets42)
* [Thomas Citharel](https://github.com/tcitworld): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:tomgue), [Web](https://www.tcit.fr/)
* [tomgue](https://github.com/tomgue): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=tomgue)
+* [Uncovery](https://github.com/uncovery): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:uncovery)
* [Wanabo](https://github.com/Wanabo): [contributions](https://github.com/FreshRSS/FreshRSS/commits?author=Wanabo)
diff --git a/Docker/Dockerfile b/Docker/Dockerfile
index 189d7175a..cca7bb65e 100644
--- a/Docker/Dockerfile
+++ b/Docker/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.7
+FROM alpine:3.8
RUN apk add --no-cache \
apache2 php7-apache2 \
diff --git a/Docker/README.md b/Docker/README.md
index 133e7c3b8..f2aa3db20 100644
--- a/Docker/README.md
+++ b/Docker/README.md
@@ -20,7 +20,7 @@ git clone https://github.com/FreshRSS/FreshRSS.git
cd ./FreshRSS/
git pull
-sudo docker pull alpine:3.7
+sudo docker pull alpine:3.8
sudo docker build --tag freshrss/freshrss -f Docker/Dockerfile .
```
diff --git a/README.fr.md b/README.fr.md
index 78a182d7b..ef1092e4a 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -37,7 +37,7 @@ Nous sommes une communauté amicale.
* Serveur Web Apache2 (recommandé), ou nginx, lighttpd (non testé sur les autres)
* PHP 5.3.8+ (PHP 5.4+ recommandé, et PHP 5.5+ pour les performances, et PHP 7+ pour d’encore meilleures performances)
* Requis : [cURL](https://secure.php.net/curl), [DOM](https://secure.php.net/dom), [XML](https://secure.php.net/xml), [session](https://secure.php.net/session), [ctype](https://secure.php.net/ctype), et [PDO_MySQL](https://secure.php.net/pdo-mysql) ou [PDO_SQLite](https://secure.php.net/pdo-sqlite) ou [PDO_PGSQL](https://secure.php.net/pdo-pgsql)
- * Recommandés : [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (pour accès API sur plateformes < 64 bits), [IDN](https://secure.php.net/intl.idn) (pour les noms de domaines internationalisés), [mbstring](https://secure.php.net/mbstring) et/ou [iconv](https://secure.php.net/iconv) (pour conversion d’encodages), [ZIP](https://secure.php.net/zip) (pour import/export), [zlib](https://secure.php.net/zlib) (pour les flux compressés)
+ * Recommandés : [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (pour accès API sur plateformes < 64 bits), [IDN](https://secure.php.net/intl.idn) (pour les noms de domaines internationalisés), [mbstring](https://secure.php.net/mbstring) (pour le texte Unicode), [iconv](https://secure.php.net/iconv) (pour conversion d’encodages), [ZIP](https://secure.php.net/zip) (pour import/export), [zlib](https://secure.php.net/zlib) (pour les flux compressés)
* MySQL 5.5.3+ (recommandé), ou SQLite 3.7.4+, ou PostgreSQL 9.2+
* Un navigateur Web récent tel que Firefox / IceCat, Internet Explorer 11 / Edge, Chromium / Chrome, Opera, Safari.
* Fonctionne aussi sur mobile
@@ -54,16 +54,15 @@ Nous sommes une communauté amicale.
4. Accédez à FreshRSS à travers votre navigateur Web et suivez les instructions d’installation
* ou utilisez [l’interface en ligne de commande](cli/README.md)
5. Tout devrait fonctionner :) En cas de problème, n’hésitez pas à [nous contacter](https://github.com/FreshRSS/FreshRSS/issues).
-6. Des paramètres de configuration avancée peuvent être vues dans [config.default.php](config.default.php) et modifiées dans `data/config.php`.
+6. Des paramètres de configuration avancés peuvent être vus dans [config.default.php](config.default.php) et modifiés dans `data/config.php`.
7. Avec Apache, activer [`AllowEncodedSlashes`](https://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes) pour une meilleure compatibilité avec les clients mobiles.
Plus d’informations sur l’installation et la configuration serveur peuvent être trouvées dans [notre documentation](https://freshrss.github.io/FreshRSS/fr/users/01_Installation.md).
## Installation automatisée
-* [Docker](./Docker/)
+* [![Docker](https://www.docker.com/sites/default/files/horizontal.png)](./Docker/)
+* [![YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=freshrss)
* [![Cloudron](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=org.freshrss.cloudronapp)
-* [![DP deploy](https://raw.githubusercontent.com/DFabric/DPlatform-ShellCore/gh-pages/img/deploy.png)](https://dfabric.github.io/DPlatform-ShellCore)
-* [YunoHost](https://github.com/YunoHost-Apps/freshrss_ynh)
## Exemple d’installation complète sur Linux Debian/Ubuntu
```sh
diff --git a/README.md b/README.md
index 7d6c51338..0111d6882 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,7 @@ We are a friendly community.
* A web server: Apache2 (recommended), nginx, lighttpd (not tested on others)
* PHP 5.3.8+ (PHP 5.4+ recommended, and PHP 5.5+ for performance, and PHP 7 for even higher performance)
* Required extensions: [cURL](https://secure.php.net/curl), [DOM](https://secure.php.net/dom), [XML](https://secure.php.net/xml), [session](https://secure.php.net/session), [ctype](https://secure.php.net/ctype), and [PDO_MySQL](https://secure.php.net/pdo-mysql) or [PDO_SQLite](https://secure.php.net/pdo-sqlite) or [PDO_PGSQL](https://secure.php.net/pdo-pgsql)
- * Recommended extensions: [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (for API access on platforms < 64 bits), [IDN](https://secure.php.net/intl.idn) (for Internationalized Domain Names), [mbstring](https://secure.php.net/mbstring) and/or [iconv](https://secure.php.net/iconv) (for charset conversion), [ZIP](https://secure.php.net/zip) (for import/export), [zlib](https://secure.php.net/zlib) (for compressed feeds)
+ * Recommended extensions: [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (for API access on platforms < 64 bits), [IDN](https://secure.php.net/intl.idn) (for Internationalized Domain Names), [mbstring](https://secure.php.net/mbstring) (for Unicode strings), [iconv](https://secure.php.net/iconv) (for charset conversion), [ZIP](https://secure.php.net/zip) (for import/export), [zlib](https://secure.php.net/zlib) (for compressed feeds)
* MySQL 5.5.3+ (recommended), or SQLite 3.7.4+, or PostgreSQL 9.2+
* A recent browser like Firefox / IceCat, Internet Explorer 11 / Edge, Chromium / Chrome, Opera, Safari.
* Works on mobile
@@ -59,11 +59,10 @@ We are a friendly community.
More information about installation and server configuration can be found in [our documentation](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html).
-## Automated install
-* [Docker](./Docker/)
+## Automated install
+* [![Docker](https://www.docker.com/sites/default/files/horizontal.png)](./Docker/)
+* [![YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=freshrss)
* [![Cloudron](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=org.freshrss.cloudronapp)
-* [![DP deploy](https://raw.githubusercontent.com/DFabric/DPlatform-ShellCore/gh-pages/img/deploy.png)](https://dfabric.github.io/DPlatform-ShellCore)
-* [YunoHost](https://github.com/YunoHost-Apps/freshrss_ynh)
## Example of full installation on Linux Debian/Ubuntu
```sh
diff --git a/app/Controllers/entryController.php b/app/Controllers/entryController.php
index 73e181b07..16a15c447 100755
--- a/app/Controllers/entryController.php
+++ b/app/Controllers/entryController.php
@@ -40,6 +40,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController {
$get = Minz_Request::param('get');
$next_get = Minz_Request::param('nextGet', $get);
$id_max = Minz_Request::param('idMax', 0);
+ $is_read = (bool)(Minz_Request::param('is_read', true));
FreshRSS_Context::$search = new FreshRSS_BooleanSearch(Minz_Request::param('search', ''));
FreshRSS_Context::$state = Minz_Request::param('state', 0);
@@ -63,39 +64,38 @@ class FreshRSS_entry_Controller extends Minz_ActionController {
if (!$get) {
// No get? Mark all entries as read (from $id_max)
- $entryDAO->markReadEntries($id_max);
+ $entryDAO->markReadEntries($id_max, $is_read);
} else {
$type_get = $get[0];
$get = substr($get, 2);
switch($type_get) {
case 'c':
- $entryDAO->markReadCat($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state);
+ $entryDAO->markReadCat($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read);
break;
case 'f':
- $entryDAO->markReadFeed($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state);
+ $entryDAO->markReadFeed($get, $id_max, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read);
break;
case 's':
- $entryDAO->markReadEntries($id_max, true, 0, FreshRSS_Context::$search);
+ $entryDAO->markReadEntries($id_max, true, 0, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read);
break;
case 'a':
- $entryDAO->markReadEntries($id_max, false, 0, FreshRSS_Context::$search, FreshRSS_Context::$state);
+ $entryDAO->markReadEntries($id_max, false, 0, FreshRSS_Context::$search, FreshRSS_Context::$state, $is_read);
break;
}
if ($next_get !== 'a') {
// Redirect to the correct page (category, feed or starred)
- // Not "a" because it is the default value if nothing is
- // given.
+ // Not "a" because it is the default value if nothing is given.
$params['get'] = $next_get;
}
}
} else {
- $is_read = (bool)(Minz_Request::param('is_read', true));
$entryDAO->markRead($id, $is_read);
}
if (!$this->ajax) {
- Minz_Request::good(_t('feedback.sub.feed.marked_read'), array(
+ Minz_Request::good(_t($is_read ? 'feedback.sub.articles.marked_read' : 'feedback.sub.articles.marked_unread'),
+ array(
'c' => 'index',
'a' => 'index',
'params' => $params,
@@ -186,7 +186,7 @@ class FreshRSS_entry_Controller extends Minz_ActionController {
$nb = $entryDAO->cleanOldEntries($feed->id(), $date_min, $feed_history);
if ($nb > 0) {
$nb_total += $nb;
- Minz_Log::debug($nb . ' old entries cleaned in feed [' . $feed->url() . ']');
+ Minz_Log::debug($nb . ' old entries cleaned in feed [' . $feed->url(false) . ']');
}
}
}
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index ec88156f9..2f7495884 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -295,12 +295,12 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
if ($feed->lastUpdate() + 10 >= $mtime) {
continue; //Nothing newer from other users
}
- //Minz_Log::debug($feed->url() . ' was updated at ' . date('c', $mtime) . ' by another user');
+ //Minz_Log::debug($feed->url(false) . ' was updated at ' . date('c', $mtime) . ' by another user');
//Will take advantage of the newer cache
}
if (!$feed->lock()) {
- Minz_Log::notice('Feed already being actualized: ' . $feed->url());
+ Minz_Log::notice('Feed already being actualized: ' . $feed->url(false));
continue;
}
@@ -351,7 +351,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
//This entry already exists and is unchanged. TODO: Remove the test with the zero'ed hash in FreshRSS v1.3
$oldGuids[] = $entry->guid();
} else { //This entry already exists but has been updated
- //Minz_Log::debug('Entry with GUID `' . $entry->guid() . '` updated in feed ' . $feed->url() .
+ //Minz_Log::debug('Entry with GUID `' . $entry->guid() . '` updated in feed ' . $feed->url(false) .
//', old hash ' . $existingHash . ', new hash ' . $entry->hash());
$mark_updated_article_unread = $feed->attributes('mark_updated_article_unread') !== null ? (
$feed->attributes('mark_updated_article_unread')
@@ -413,7 +413,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
$entryDAO->updateLastSeen($feed->id(), $oldGuids, $mtime);
}
- if ($feed_history >= 0 && rand(0, 30) === 1) {
+ if ($feed_history >= 0 && mt_rand(0, 30) === 1) {
// TODO: move this function in web cron when available (see entry::purge)
// Remove old entries once in 30.
if (!$entryDAO->inTransaction()) {
@@ -425,8 +425,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
max($feed_history, count($entries) + 10));
if ($nb > 0) {
$needFeedCacheRefresh = true;
- Minz_Log::debug($nb . ' old entries cleaned in feed [' .
- $feed->url() . ']');
+ Minz_Log::debug($nb . ' old entries cleaned in feed [' . $feed->url(false) . ']');
}
}
@@ -442,25 +441,25 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
if ($feed->selfUrl() !== $url) { //https://code.google.com/p/pubsubhubbub/wiki/MovingFeedsOrChangingHubs
$selfUrl = checkUrl($feed->selfUrl());
if ($selfUrl) {
- Minz_Log::debug('PubSubHubbub unsubscribe ' . $feed->url());
+ Minz_Log::debug('PubSubHubbub unsubscribe ' . $feed->url(false));
if (!$feed->pubSubHubbubSubscribe(false)) { //Unsubscribe
- Minz_Log::warning('Error while PubSubHubbub unsubscribing from ' . $feed->url());
+ Minz_Log::warning('Error while PubSubHubbub unsubscribing from ' . $feed->url(false));
}
$feed->_url($selfUrl, false);
- Minz_Log::notice('Feed ' . $url . ' canonical address moved to ' . $feed->url());
+ Minz_Log::notice('Feed ' . $url . ' canonical address moved to ' . $feed->url(false));
$feedDAO->updateFeed($feed->id(), array('url' => $feed->url()));
}
}
} elseif ($feed->url() !== $url) { // HTTP 301 Moved Permanently
- Minz_Log::notice('Feed ' . $url . ' moved permanently to ' . $feed->url());
+ Minz_Log::notice('Feed ' . $url . ' moved permanently to ' . $feed->url(false));
$feedDAO->updateFeed($feed->id(), array('url' => $feed->url()));
}
$feed->faviconPrepare();
if ($pubsubhubbubEnabledGeneral && $feed->pubSubHubbubPrepare()) {
- Minz_Log::notice('PubSubHubbub subscribe ' . $feed->url());
+ Minz_Log::notice('PubSubHubbub subscribe ' . $feed->url(false));
if (!$feed->pubSubHubbubSubscribe(true)) { //Subscribe
- Minz_Log::warning('Error while PubSubHubbub subscribing to ' . $feed->url());
+ Minz_Log::warning('Error while PubSubHubbub subscribing to ' . $feed->url(false));
}
}
$feed->unlock();
diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php
index 8567b4657..ddffdba73 100755
--- a/app/Controllers/indexController.php
+++ b/app/Controllers/indexController.php
@@ -139,7 +139,7 @@ class FreshRSS_index_Controller extends Minz_ActionController {
}
// No layout for RSS output.
- $this->view->url = empty($_SERVER['QUERY_STRING']) ? '' : '?' . $_SERVER['QUERY_STRING'];
+ $this->view->url = PUBLIC_TO_INDEX_PATH . '/' . (empty($_SERVER['QUERY_STRING']) ? '' : '?' . $_SERVER['QUERY_STRING']);
$this->view->rss_title = FreshRSS_Context::$name . ' | ' . Minz_View::title();
$this->view->_useLayout(false);
header('Content-Type: application/rss+xml; charset=utf-8');
diff --git a/app/Controllers/javascriptController.php b/app/Controllers/javascriptController.php
index 6336106a9..9d7acf647 100755
--- a/app/Controllers/javascriptController.php
+++ b/app/Controllers/javascriptController.php
@@ -47,8 +47,8 @@ class FreshRSS_javascript_Controller extends Minz_ActionController {
$this->view->salt1 = sprintf('$2a$%02d$', FreshRSS_user_Controller::BCRYPT_COST);
$alphabet = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for ($i = 22; $i > 0; $i--) {
- $this->view->salt1 .= $alphabet[rand(0, 63)];
+ $this->view->salt1 .= $alphabet[mt_rand(0, 63)];
}
- $this->view->nonce = sha1(rand());
+ $this->view->nonce = sha1(mt_rand());
}
}
diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php
index 47f0ecc62..75a4303d6 100644
--- a/app/Controllers/userController.php
+++ b/app/Controllers/userController.php
@@ -230,6 +230,17 @@ class FreshRSS_user_Controller extends Minz_ActionController {
$_POST['new_user_passwordPlain'] = '';
invalidateHttpCache();
+ // If the user has admin access, it means he's already logged in
+ // and we don't want to login with the new account. Otherwise, the
+ // user just created its account himself so he probably wants to
+ // get started immediately.
+ if ($ok && !FreshRSS_Auth::hasAccess('admin')) {
+ $user_conf = get_user_configuration($new_user_name);
+ Minz_Session::_param('currentUser', $new_user_name);
+ Minz_Session::_param('passwordHash', $user_conf->passwordHash);
+ FreshRSS_Auth::giveAccess();
+ }
+
$notif = array(
'type' => $ok ? 'good' : 'bad',
'content' => _t('feedback.user.created' . (!$ok ? '.error' : ''), $new_user_name)
diff --git a/app/FreshRSS.php b/app/FreshRSS.php
index 25fd429a2..2bd5135a9 100644
--- a/app/FreshRSS.php
+++ b/app/FreshRSS.php
@@ -66,7 +66,7 @@ class FreshRSS extends Minz_FrontController {
403,
array('error' => array(
_t('feedback.access.denied'),
- ' [HTTP_REFERER=' . htmlspecialchars($http_referer) . ']'
+ ' [HTTP_REFERER=' . htmlspecialchars($http_referer, ENT_NOQUOTES, 'UTF-8') . ']'
))
);
}
diff --git a/app/Models/Category.php b/app/Models/Category.php
index 9a44a2d09..197faf942 100644
--- a/app/Models/Category.php
+++ b/app/Models/Category.php
@@ -68,7 +68,7 @@ class FreshRSS_Category extends Minz_Model {
$this->id = $value;
}
public function _name($value) {
- $this->name = substr(trim($value), 0, 255);
+ $this->name = mb_strcut(trim($value), 0, 255, 'UTF-8');
}
public function _feeds($values) {
if (!is_array($values)) {
diff --git a/app/Models/CategoryDAO.php b/app/Models/CategoryDAO.php
index ef2c402a0..cf6b3bae3 100644
--- a/app/Models/CategoryDAO.php
+++ b/app/Models/CategoryDAO.php
@@ -9,7 +9,7 @@ class FreshRSS_CategoryDAO extends Minz_ModelPdo implements FreshRSS_Searchable
$stm = $this->bd->prepare($sql);
$values = array(
- substr($valuesTmp['name'], 0, 255),
+ mb_strcut($valuesTmp['name'], 0, 255, 'UTF-8'),
);
if ($stm && $stm->execute($values)) {
diff --git a/app/Models/Entry.php b/app/Models/Entry.php
index 2b6059638..ccbad5724 100644
--- a/app/Models/Entry.php
+++ b/app/Models/Entry.php
@@ -31,6 +31,7 @@ class FreshRSS_Entry extends Minz_Model {
$this->_isRead($is_read);
$this->_isFavorite($is_favorite);
$this->_feedId($feedId);
+ $tags = mb_strcut($tags, 0, 1023, 'UTF-8');
$this->_tags(preg_split('/[\s#]/', $tags));
$this->_guid($guid);
}
@@ -123,11 +124,11 @@ class FreshRSS_Entry extends Minz_Model {
}
public function _title($value) {
$this->hash = null;
- $this->title = $value;
+ $this->title = mb_strcut($value, 0, 255, 'UTF-8');
}
public function _author($value) {
$this->hash = null;
- $this->author = $value;
+ $this->author = mb_strcut($value, 0, 255, 'UTF-8');
}
public function _content($value) {
$this->hash = null;
diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php
index 59f826c3e..f0e164995 100644
--- a/app/Models/EntryDAO.php
+++ b/app/Models/EntryDAO.php
@@ -160,9 +160,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
$valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 760);
$valuesTmp['guid'] = safe_ascii($valuesTmp['guid']);
$this->addEntryPrepared->bindParam(':guid', $valuesTmp['guid']);
- $valuesTmp['title'] = substr($valuesTmp['title'], 0, 255);
+ $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 255, 'UTF-8');
$this->addEntryPrepared->bindParam(':title', $valuesTmp['title']);
- $valuesTmp['author'] = substr($valuesTmp['author'], 0, 255);
+ $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 255, 'UTF-8');
$this->addEntryPrepared->bindParam(':author', $valuesTmp['author']);
$this->addEntryPrepared->bindParam(':content', $valuesTmp['content']);
$valuesTmp['link'] = substr($valuesTmp['link'], 0, 1023);
@@ -176,7 +176,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
$valuesTmp['is_favorite'] = $valuesTmp['is_favorite'] ? 1 : 0;
$this->addEntryPrepared->bindParam(':is_favorite', $valuesTmp['is_favorite'], PDO::PARAM_INT);
$this->addEntryPrepared->bindParam(':id_feed', $valuesTmp['id_feed'], PDO::PARAM_INT);
- $valuesTmp['tags'] = substr($valuesTmp['tags'], 0, 1023);
+ $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 1023, 'UTF-8');
$this->addEntryPrepared->bindParam(':tags', $valuesTmp['tags']);
if ($this->hasNativeHex()) {
@@ -243,9 +243,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
$valuesTmp['guid'] = substr($valuesTmp['guid'], 0, 760);
$this->updateEntryPrepared->bindParam(':guid', $valuesTmp['guid']);
- $valuesTmp['title'] = substr($valuesTmp['title'], 0, 255);
+ $valuesTmp['title'] = mb_strcut($valuesTmp['title'], 0, 255, 'UTF-8');
$this->updateEntryPrepared->bindParam(':title', $valuesTmp['title']);
- $valuesTmp['author'] = substr($valuesTmp['author'], 0, 255);
+ $valuesTmp['author'] = mb_strcut($valuesTmp['author'], 0, 255, 'UTF-8');
$this->updateEntryPrepared->bindParam(':author', $valuesTmp['author']);
$this->updateEntryPrepared->bindParam(':content', $valuesTmp['content']);
$valuesTmp['link'] = substr($valuesTmp['link'], 0, 1023);
@@ -258,7 +258,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
$this->updateEntryPrepared->bindValue(':is_read', $valuesTmp['is_read'] ? 1 : 0, PDO::PARAM_INT);
}
$this->updateEntryPrepared->bindParam(':id_feed', $valuesTmp['id_feed'], PDO::PARAM_INT);
- $valuesTmp['tags'] = substr($valuesTmp['tags'], 0, 1023);
+ $valuesTmp['tags'] = mb_strcut($valuesTmp['tags'], 0, 1023, 'UTF-8');
$this->updateEntryPrepared->bindParam(':tags', $valuesTmp['tags']);
if ($this->hasNativeHex()) {
@@ -437,7 +437,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
* @param integer $priorityMin
* @return integer affected rows
*/
- public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0) {
+ public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0, $is_read = true) {
FreshRSS_UserDAO::touch();
if ($idMax == 0) {
$idMax = time() . '000000';
@@ -445,14 +445,14 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
}
$sql = 'UPDATE `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed=f.id '
- . 'SET e.is_read=1 '
- . 'WHERE e.is_read=0 AND e.id <= ?';
+ . 'SET e.is_read=? '
+ . 'WHERE e.is_read <> ? AND e.id <= ?';
if ($onlyFavorites) {
$sql .= ' AND e.is_favorite=1';
} elseif ($priorityMin >= 0) {
$sql .= ' AND f.priority > ' . intval($priorityMin);
}
- $values = array($idMax);
+ $values = array($is_read ? 1 : 0, $is_read ? 1 : 0, $idMax);
list($searchValues, $search) = $this->sqlListEntriesWhere('e.', $filters, $state);
@@ -480,7 +480,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
* @param integer $idMax fail safe article ID
* @return integer affected rows
*/
- public function markReadCat($id, $idMax = 0, $filters = null, $state = 0) {
+ public function markReadCat($id, $idMax = 0, $filters = null, $state = 0, $is_read = true) {
FreshRSS_UserDAO::touch();
if ($idMax == 0) {
$idMax = time() . '000000';
@@ -488,9 +488,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
}
$sql = 'UPDATE `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed=f.id '
- . 'SET e.is_read=1 '
- . 'WHERE f.category=? AND e.is_read=0 AND e.id <= ?';
- $values = array($id, $idMax);
+ . 'SET e.is_read=? '
+ . 'WHERE f.category=? AND e.is_read <> ? AND e.id <= ?';
+ $values = array($is_read ? 1 : 0, $id, $is_read ? 1 : 0, $idMax);
list($searchValues, $search) = $this->sqlListEntriesWhere('e.', $filters, $state);
@@ -518,7 +518,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
* @param integer $idMax fail safe article ID
* @return integer affected rows
*/
- public function markReadFeed($id_feed, $idMax = 0, $filters = null, $state = 0) {
+ public function markReadFeed($id_feed, $idMax = 0, $filters = null, $state = 0, $is_read = true) {
FreshRSS_UserDAO::touch();
if ($idMax == 0) {
$idMax = time() . '000000';
@@ -527,9 +527,9 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
$this->bd->beginTransaction();
$sql = 'UPDATE `' . $this->prefix . 'entry` '
- . 'SET is_read=1 '
- . 'WHERE id_feed=? AND is_read=0 AND id <= ?';
- $values = array($id_feed, $idMax);
+ . 'SET is_read=? '
+ . 'WHERE id_feed=? AND is_read <> ? AND id <= ?';
+ $values = array($is_read ? 1 : 0, $id_feed, $is_read ? 1 : 0, $idMax);
list($searchValues, $search) = $this->sqlListEntriesWhere('', $filters, $state);
@@ -909,6 +909,7 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
$stm = $this->bd->prepare($sql);
$stm->execute();
$res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
+ rsort($res);
$all = empty($res[0]) ? 0 : $res[0];
$unread = empty($res[1]) ? 0 : $res[1];
return array('all' => $all, 'unread' => $unread, 'read' => $all - $unread);
@@ -963,6 +964,7 @@ SQL;
$stm = $this->bd->prepare($sql);
$stm->execute(array(':priority_normal' => FreshRSS_Feed::PRIORITY_NORMAL));
$res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
+ rsort($res);
$all = empty($res[0]) ? 0 : $res[0];
$unread = empty($res[1]) ? 0 : $res[1];
return array('all' => $all, 'unread' => $unread, 'read' => $all - $unread);
diff --git a/app/Models/EntryDAOSQLite.php b/app/Models/EntryDAOSQLite.php
index cca970e36..944de8470 100644
--- a/app/Models/EntryDAOSQLite.php
+++ b/app/Models/EntryDAOSQLite.php
@@ -101,6 +101,7 @@ DROP TABLE IF EXISTS `tmp`;
* @return integer affected rows
*/
public function markRead($ids, $is_read = true) {
+ FreshRSS_UserDAO::touch();
if (is_array($ids)) { //Many IDs at once (used by API)
if (true) { //Speed heuristics //TODO: Not implemented yet for SQLite (so always call IDs one by one)
$affected = 0;
@@ -159,19 +160,20 @@ DROP TABLE IF EXISTS `tmp`;
* @param integer $priorityMin
* @return integer affected rows
*/
- public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0) {
+ public function markReadEntries($idMax = 0, $onlyFavorites = false, $priorityMin = 0, $filters = null, $state = 0, $is_read = true) {
+ FreshRSS_UserDAO::touch();
if ($idMax == 0) {
$idMax = time() . '000000';
Minz_Log::debug('Calling markReadEntries(0) is deprecated!');
}
- $sql = 'UPDATE `' . $this->prefix . 'entry` SET is_read=1 WHERE is_read=0 AND id <= ?';
+ $sql = 'UPDATE `' . $this->prefix . 'entry` SET is_read = ? WHERE is_read <> ? AND id <= ?';
if ($onlyFavorites) {
$sql .= ' AND is_favorite=1';
} elseif ($priorityMin >= 0) {
$sql .= ' AND id_feed IN (SELECT f.id FROM `' . $this->prefix . 'feed` f WHERE f.priority > ' . intval($priorityMin) . ')';
}
- $values = array($idMax);
+ $values = array($is_read ? 1 : 0, $is_read ? 1 : 0, $idMax);
list($searchValues, $search) = $this->sqlListEntriesWhere('', $filters, $state);
@@ -199,17 +201,18 @@ DROP TABLE IF EXISTS `tmp`;
* @param integer $idMax fail safe article ID
* @return integer affected rows
*/
- public function markReadCat($id, $idMax = 0, $filters = null, $state = 0) {
+ public function markReadCat($id, $idMax = 0, $filters = null, $state = 0, $is_read = true) {
+ FreshRSS_UserDAO::touch();
if ($idMax == 0) {
$idMax = time() . '000000';
Minz_Log::debug('Calling markReadCat(0) is deprecated!');
}
$sql = 'UPDATE `' . $this->prefix . 'entry` '
- . 'SET is_read=1 '
- . 'WHERE is_read=0 AND id <= ? AND '
+ . 'SET is_read = ? '
+ . 'WHERE is_read <> ? AND id <= ? AND '
. 'id_feed IN (SELECT f.id FROM `' . $this->prefix . 'feed` f WHERE f.category=?)';
- $values = array($idMax, $id);
+ $values = array($is_read ? 1 : 0, $is_read ? 1 : 0, $idMax, $id);
list($searchValues, $search) = $this->sqlListEntriesWhere('', $filters, $state);
diff --git a/app/Models/Feed.php b/app/Models/Feed.php
index 89eb0a53c..ed381a867 100644
--- a/app/Models/Feed.php
+++ b/app/Models/Feed.php
@@ -59,8 +59,8 @@ class FreshRSS_Feed extends Minz_Model {
return $this->hash;
}
- public function url() {
- return $this->url;
+ public function url($includeCredentials = true) {
+ return $includeCredentials ? $this->url : SimplePie_Misc::url_remove_credentials($this->url);
}
public function selfUrl() {
return $this->selfUrl;
@@ -341,7 +341,7 @@ class FreshRSS_Feed extends Minz_Model {
foreach ($feed->get_items() as $item) {
$title = html_only_entity_decode(strip_tags($item->get_title()));
- $author = $item->get_author();
+ $authors = $item->get_authors();
$link = $item->get_permalink();
$date = @strtotime($item->get_date());
@@ -409,12 +409,19 @@ class FreshRSS_Feed extends Minz_Model {
$guid = $item->get_id(false, false);
$hasUniqueGuids &= empty($guids['_' . $guid]);
$guids['_' . $guid] = true;
+ $author_names = '';
+ if (is_array($authors)) {
+ foreach ($authors as $author) {
+ $author_names .= html_only_entity_decode(strip_tags($author->name == '' ? $author->email : $author->name)) . ', ';
+ }
+ }
+ $author_names = substr($author_names, 0, -2);
$entry = new FreshRSS_Entry(
$this->id(),
$guid,
$title === null ? '' : $title,
- $author === null ? '' : html_only_entity_decode(strip_tags($author->name == null ? $author->email : $author->name)),
+ $author_names,
$content === null ? '' : $content,
$link === null ? '' : $link,
$date ? $date : time()
diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php
index 9d980c139..285f17193 100644
--- a/app/Models/FeedDAO.php
+++ b/app/Models/FeedDAO.php
@@ -55,9 +55,9 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
$values = array(
substr($valuesTmp['url'], 0, 511),
$valuesTmp['category'],
- substr($valuesTmp['name'], 0, 255),
+ mb_strcut($valuesTmp['name'], 0, 255, 'UTF-8'),
substr($valuesTmp['website'], 0, 255),
- substr($valuesTmp['description'], 0, 1023),
+ mb_strcut($valuesTmp['description'], 0, 1023, 'UTF-8'),
$valuesTmp['lastUpdate'],
base64_encode($valuesTmp['httpAuth']),
FreshRSS_Feed::KEEP_HISTORY_DEFAULT,
diff --git a/app/i18n/cz/admin.php b/app/i18n/cz/admin.php
index d414ffd07..78a4a52e4 100644
--- a/app/i18n/cz/admin.php
+++ b/app/i18n/cz/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => 'Instalace souborů',
'json' => array(
- 'nok' => 'Nemáte JSON (balíček php5-json).',
+ 'nok' => 'Nemáte JSON (balíček php-json).',
'ok' => 'Máte rozšíření JSON.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Nemáte framework Minz.',
'ok' => 'Máte framework Minz.',
diff --git a/app/i18n/cz/feedback.php b/app/i18n/cz/feedback.php
index ff9c87d12..fe85a3599 100644
--- a/app/i18n/cz/feedback.php
+++ b/app/i18n/cz/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Aktualizovat',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => 'Kategorie %s byla vytvořena.',
'deleted' => 'Kategorie byla smazána.',
@@ -74,7 +78,6 @@ return array(
'error' => 'Kanál nelze aktualizovat',
'internal_problem' => 'RSS kanál nelze přidat. Pro detaily <a href="%s">zkontrolujte logy FreshRSS</a>.', // @todo
'invalid_url' => 'URL <em>%s</em> není platné',
- 'marked_read' => 'Kanály byly označeny jako přečtené',
'n_actualized' => '%d kanálů bylo aktualizováno',
'n_entries_deleted' => '%d článků bylo smazáno',
'no_refresh' => 'Nelze obnovit žádné kanály…',
diff --git a/app/i18n/cz/gen.php b/app/i18n/cz/gen.php
index 09a8307ff..66c011da3 100644
--- a/app/i18n/cz/gen.php
+++ b/app/i18n/cz/gen.php
@@ -168,6 +168,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/cz/index.php b/app/i18n/cz/index.php
index cb0e5955d..48a28d4da 100644
--- a/app/i18n/cz/index.php
+++ b/app/i18n/cz/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Označit vše jako přečtené',
'mark_cat_read' => 'Označit kategorii jako přečtenou',
'mark_feed_read' => 'Označit kanál jako přečtený',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => 'Nové nejdříve',
'non-starred' => 'Zobrazit vše vyjma oblíbených',
'normal_view' => 'Normální',
diff --git a/app/i18n/cz/install.php b/app/i18n/cz/install.php
index ea4812ea5..acdb48ab6 100644
--- a/app/i18n/cz/install.php
+++ b/app/i18n/cz/install.php
@@ -68,6 +68,10 @@ return array(
'nok' => 'Pro parsování JSON chybí doporučená knihovna.',
'ok' => 'Máte doporučenou knihovnu pro parsování JSON.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Nemáte framework Minz.',
'ok' => 'Máte framework Minz.',
diff --git a/app/i18n/de/admin.php b/app/i18n/de/admin.php
index f03e6cdaf..fbeb80296 100644
--- a/app/i18n/de/admin.php
+++ b/app/i18n/de/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => 'Datei-Installation',
'json' => array(
- 'nok' => 'Ihnen fehlt die JSON-Erweiterung (Paket php5-json).',
+ 'nok' => 'Ihnen fehlt die JSON-Erweiterung (Paket php-json).',
'ok' => 'Sie haben die JSON-Erweiterung.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Ihnen fehlt das Minz-Framework.',
'ok' => 'Sie haben das Minz-Framework.',
diff --git a/app/i18n/de/feedback.php b/app/i18n/de/feedback.php
index 2c46bbe56..c20f58487 100644
--- a/app/i18n/de/feedback.php
+++ b/app/i18n/de/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Aktualisieren',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => 'Die Kategorie %s ist erstellt worden.',
'deleted' => 'Die Kategorie ist gelöscht worden.',
@@ -74,7 +78,6 @@ return array(
'error' => 'Der Feed kann nicht aktualisiert werden',
'internal_problem' => 'Der RSS-Feed konnte nicht hinzugefügt werden. Für Details <a href="%s">prüfen Sie die FreshRSS-Protokolle</a>.', // @todo
'invalid_url' => 'Die URL <em>%s</em> ist ungültig',
- 'marked_read' => 'Die Feeds sind als gelesen markiert worden',
'n_actualized' => 'Die %d Feeds sind aktualisiert worden',
'n_entries_deleted' => 'Die %d Artikel sind gelöscht worden',
'no_refresh' => 'Es gibt keinen Feed zum Aktualisieren…',
diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php
index 7dbaac384..eb1e74ed6 100644
--- a/app/i18n/de/gen.php
+++ b/app/i18n/de/gen.php
@@ -59,7 +59,7 @@ return array(
'april' => 'April',
'aug' => 'Aug',
'august' => 'August',
- 'before_yesterday' => 'Vor vorgestern',
+ 'before_yesterday' => 'Ältere Beiträge',
'dec' => 'Dez',
'december' => 'Dezember',
'feb' => 'Feb',
@@ -167,6 +167,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/de/index.php b/app/i18n/de/index.php
index df92d8085..1fa3e3933 100644
--- a/app/i18n/de/index.php
+++ b/app/i18n/de/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Alle als gelesen markieren',
'mark_cat_read' => 'Kategorie als gelesen markieren',
'mark_feed_read' => 'Feed als gelesen markieren',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => 'Neuere zuerst',
'non-starred' => 'Alle außer Favoriten zeigen',
'normal_view' => 'Normale Ansicht',
diff --git a/app/i18n/de/install.php b/app/i18n/de/install.php
index b747d1551..d28b22840 100644
--- a/app/i18n/de/install.php
+++ b/app/i18n/de/install.php
@@ -68,6 +68,10 @@ return array(
'nok' => 'Ihnen fehlt eine empfohlene Bibliothek um JSON zu parsen.',
'ok' => 'Sie haben eine empfohlene Bibliothek um JSON zu parsen.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Ihnen fehlt das Minz-Framework.',
'ok' => 'Sie haben das Minz-Framework.',
diff --git a/app/i18n/en/admin.php b/app/i18n/en/admin.php
index 1f857dbab..9db14978f 100644
--- a/app/i18n/en/admin.php
+++ b/app/i18n/en/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => 'File installation',
'json' => array(
- 'nok' => 'Cannot find JSON (php5-json package).',
+ 'nok' => 'Cannot find JSON (php-json package).',
'ok' => 'You have JSON extension.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.',
+ 'ok' => 'You have the recommended library mbstring for Unicode.',
+ ),
'minz' => array(
'nok' => 'Cannot find the Minz framework.',
'ok' => 'You have the Minz framework.',
diff --git a/app/i18n/en/feedback.php b/app/i18n/en/feedback.php
index a7fbda3a0..634b547f7 100644
--- a/app/i18n/en/feedback.php
+++ b/app/i18n/en/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Updating',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.',
+ 'marked_unread' => 'The articles have been marked as unread.',
+ ),
'category' => array(
'created' => 'Category %s has been created.',
'deleted' => 'Category has been deleted.',
@@ -74,7 +78,6 @@ return array(
'error' => 'Feed cannot be updated',
'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.',
'invalid_url' => 'URL <em>%s</em> is invalid',
- 'marked_read' => 'Feeds have been marked as read',
'n_actualized' => '%d feeds have been updated',
'n_entries_deleted' => '%d articles have been deleted',
'no_refresh' => 'There is no feed to refresh…',
diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php
index ceee25105..34e81af2e 100644
--- a/app/i18n/en/gen.php
+++ b/app/i18n/en/gen.php
@@ -168,6 +168,7 @@ return array(
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
'Known' => 'Known based sites',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/en/index.php b/app/i18n/en/index.php
index 29dccc9ed..1c13abdb7 100644
--- a/app/i18n/en/index.php
+++ b/app/i18n/en/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Mark all as read',
'mark_cat_read' => 'Mark category as read',
'mark_feed_read' => 'Mark feed as read',
+ 'mark_selection_unread' => 'Mark selection as unread',
'newer_first' => 'Newer first',
'non-starred' => 'Show non-favourites',
'normal_view' => 'Normal view',
diff --git a/app/i18n/en/install.php b/app/i18n/en/install.php
index 40fff37dd..53d2f9be0 100644
--- a/app/i18n/en/install.php
+++ b/app/i18n/en/install.php
@@ -68,6 +68,10 @@ return array(
'nok' => 'Cannot find a recommended library to parse JSON.',
'ok' => 'You have a recommended library to parse JSON.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Cannot find the Minz framework.',
'ok' => 'You have the Minz framework.',
diff --git a/app/i18n/es/admin.php b/app/i18n/es/admin.php
index 2884721c7..db41057bf 100755
--- a/app/i18n/es/admin.php
+++ b/app/i18n/es/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => 'Instalación de Archivos',
'json' => array(
- 'nok' => 'No se ha podido localizar JSON (paquete php5-json).',
+ 'nok' => 'No se ha podido localizar JSON (paquete php-json).',
'ok' => 'Dispones de la extensión JSON.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'No se ha podido localizar el entorno Minz.',
'ok' => 'Dispones del entorno Minz.',
diff --git a/app/i18n/es/feedback.php b/app/i18n/es/feedback.php
index 627c86afc..38548e901 100755
--- a/app/i18n/es/feedback.php
+++ b/app/i18n/es/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Actualización',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => 'Se ha creado la categoría %s.',
'deleted' => 'Se ha eliminado la categoría.',
@@ -74,7 +78,6 @@ return array(
'error' => 'No es posible actualizar la fuente',
'internal_problem' => 'No ha sido posible agregar la fuente RSS. <a href="%s">Revisa el registro de FreshRSS </a> para más información.', // @todo
'invalid_url' => 'La URL <em>%s</em> es inválida',
- 'marked_read' => 'Fuentes marcadas como leídas',
'n_actualized' => 'Se han actualiado %d fuentes',
'n_entries_deleted' => 'Se han eliminado %d artículos',
'no_refresh' => 'No hay fuente a actualizar…',
diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php
index a5957e12f..4dc1145b2 100755
--- a/app/i18n/es/gen.php
+++ b/app/i18n/es/gen.php
@@ -168,6 +168,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/es/index.php b/app/i18n/es/index.php
index 03054e23a..c88152459 100755
--- a/app/i18n/es/index.php
+++ b/app/i18n/es/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Marcar todo como leído',
'mark_cat_read' => 'Marcar categoría como leída',
'mark_feed_read' => 'Marcar fuente como leída',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => 'Nuevos primero',
'non-starred' => 'Mostrar todos menos los favoritos',
'normal_view' => 'Vista normal',
diff --git a/app/i18n/es/install.php b/app/i18n/es/install.php
index cd6f63432..a9be807c7 100755
--- a/app/i18n/es/install.php
+++ b/app/i18n/es/install.php
@@ -68,6 +68,10 @@ return array(
'nok' => 'No se ha podido localizar la librería para procesar JSON.',
'ok' => 'Dispones de la librería recomendada para procesar JSON.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'No se ha podido localizar el entorno Minz.',
'ok' => 'Dispones del entorno Minz.',
diff --git a/app/i18n/fr/admin.php b/app/i18n/fr/admin.php
index 6c582d719..1874f2c77 100644
--- a/app/i18n/fr/admin.php
+++ b/app/i18n/fr/admin.php
@@ -63,8 +63,12 @@ return array(
),
'files' => 'Installation des fichiers',
'json' => array(
- 'nok' => 'Vous ne disposez pas de JSON (paquet php5-json).',
- 'ok' => 'Vous disposez de l’extension JSON.',
+ 'nok' => 'Vous ne disposez pas de l’extension recommendée JSON (paquet php-json).',
+ 'ok' => 'Vous disposez de l’extension recommendée JSON.',
+ ),
+ 'mbstring' => array(
+ 'nok' => 'Impossible de trouver la librairie recommandée mbstring pour Unicode.',
+ 'ok' => 'Vouz disposez de la librairie recommandée mbstring pour Unicode.',
),
'minz' => array(
'nok' => 'Vous ne disposez pas de la librairie Minz.',
diff --git a/app/i18n/fr/feedback.php b/app/i18n/fr/feedback.php
index 2443ad30a..dafdd353d 100644
--- a/app/i18n/fr/feedback.php
+++ b/app/i18n/fr/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Actualiser',
+ 'articles' => array(
+ 'marked_read' => 'Les articles sélectionnés ont été marqués comme lus.',
+ 'marked_unread' => 'Les articles sélectionnés ont été marqués comme non-lus.',
+ ),
'category' => array(
'created' => 'La catégorie %s a été créée.',
'deleted' => 'La catégorie a été supprimée.',
@@ -74,7 +78,6 @@ return array(
'error' => 'Une erreur est survenue',
'internal_problem' => 'Le flux ne peut pas être ajouté. <a href="%s">Consulter les logs de FreshRSS</a> pour plus de détails. Vous pouvez essayer de forcer l’ajout par addition de <code>#force_feed</code> à l’URL.',
'invalid_url' => 'L’url <em>%s</em> est invalide.',
- 'marked_read' => 'Les flux ont été marqués comme lus.',
'n_actualized' => '%d flux ont été mis à jour.',
'n_entries_deleted' => '%d articles ont été supprimés.',
'no_refresh' => 'Il n’y a aucun flux à actualiser…',
diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php
index 24c4b82fb..13e19283f 100644
--- a/app/i18n/fr/gen.php
+++ b/app/i18n/fr/gen.php
@@ -168,6 +168,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/fr/index.php b/app/i18n/fr/index.php
index 0a3a4abb3..bb0d14faf 100644
--- a/app/i18n/fr/index.php
+++ b/app/i18n/fr/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Tout marquer comme lu',
'mark_cat_read' => 'Marquer la catégorie comme lue',
'mark_feed_read' => 'Marquer le flux comme lu',
+ 'mark_selection_unread' => 'Marquer la sélection comme non-lue',
'newer_first' => 'Plus récents en premier',
'non-starred' => 'Afficher les non-favoris',
'normal_view' => 'Vue normale',
@@ -52,7 +53,7 @@ return array(
'starred' => 'Afficher les favoris',
'stats' => 'Statistiques',
'subscription' => 'Gestion des abonnements',
- 'unread' => 'Afficher les non lus',
+ 'unread' => 'Afficher les non-lus',
),
'share' => 'Partager',
'tag' => array(
diff --git a/app/i18n/fr/install.php b/app/i18n/fr/install.php
index 09625de78..9f2d90195 100644
--- a/app/i18n/fr/install.php
+++ b/app/i18n/fr/install.php
@@ -65,8 +65,12 @@ return array(
'ok' => 'Le HTTP REFERER est connu et semble correspondre à votre serveur.',
),
'json' => array(
- 'nok' => 'Impossible de trouver une librairie recommandée pour JSON.',
- 'ok' => 'Vouz disposez de la librairie recommandée pour JSON.',
+ 'nok' => 'Vous ne disposez pas de l’extension recommendée JSON (paquet php-json).',
+ 'ok' => 'Vous disposez de l’extension recommendée JSON.',
+ ),
+ 'mbstring' => array(
+ 'nok' => 'Impossible de trouver la librairie recommandée mbstring pour Unicode.',
+ 'ok' => 'Vouz disposez de la librairie recommandée mbstring pour Unicode.',
),
'minz' => array(
'nok' => 'Vous ne disposez pas de la librairie Minz.',
diff --git a/app/i18n/he/admin.php b/app/i18n/he/admin.php
index 2840213c9..71f86357e 100644
--- a/app/i18n/he/admin.php
+++ b/app/i18n/he/admin.php
@@ -33,7 +33,7 @@ return array(
'ok' => 'הספרייה הנדרשת ל character type checking (ctype) מותקנת',
),
'curl' => array(
- 'nok' => 'בURL לא מותקן (php5-curl package)',
+ 'nok' => 'בURL לא מותקן (php-curl package)',
'ok' => 'You have cURL extension.', // @todo
),
'data' => array(
@@ -63,9 +63,13 @@ return array(
),
'files' => 'File installation', // @todo
'json' => array(
- 'nok' => 'You lack JSON (php5-json package).', // @todo
+ 'nok' => 'You lack JSON (php-json package).', // @todo
'ok' => 'You have JSON extension.', // @todo
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'You lack the Minz framework.', // @todo
'ok' => 'יש לכם את תשתית Minz',
@@ -97,7 +101,7 @@ return array(
'ok' => 'Permissions on users directory are good.', // @todo
),
'zip' => array(
- 'nok' => 'You lack ZIP extension (php5-zip package).', // @todo
+ 'nok' => 'You lack ZIP extension (php-zip package).', // @todo
'ok' => 'You have ZIP extension.', // @todo
),
),
diff --git a/app/i18n/he/feedback.php b/app/i18n/he/feedback.php
index 4b79b0d45..369714795 100644
--- a/app/i18n/he/feedback.php
+++ b/app/i18n/he/feedback.php
@@ -53,6 +53,10 @@ return array(
),
'sub' => array(
'actualize' => 'מימוש',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => 'Category %s has been created.', // @todo
'deleted' => 'Category has been deleted.', // @todo
@@ -75,7 +79,6 @@ return array(
'error' => 'Feed cannot be updated', // @todo
'internal_problem' => 'אין אפשרות להוסיף את ההזנה. <a href="%s">בדקו את הלוגים</a> לפרטים.', // @todo
'invalid_url' => 'URL <em>%s</em> אינו תקין',
- 'marked_read' => 'הזנות סומנו כנקראו',
'n_actualized' => '%d הזנות עודכנו',
'n_entries_deleted' => '%d המאמרים נמחקו',
'no_refresh' => 'אין הזנה שניתן לרענן…',
diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php
index 401e13620..a59f6b178 100644
--- a/app/i18n/he/gen.php
+++ b/app/i18n/he/gen.php
@@ -168,6 +168,7 @@ return array(
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
'Known' => 'Known based sites',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/he/index.php b/app/i18n/he/index.php
index cef07eaf8..8ca6e76f7 100644
--- a/app/i18n/he/index.php
+++ b/app/i18n/he/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'סימון הכל כנקרא',
'mark_cat_read' => 'סימון קטגוריה כנקראה',
'mark_feed_read' => 'סימון הזנה כנקראה',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => 'חדשים בראש',
'non-starred' => 'הצגת הכל פרט למועדפים',
'normal_view' => 'תצוגה רגילה',
diff --git a/app/i18n/he/install.php b/app/i18n/he/install.php
index 6d7cee661..93b8063b3 100644
--- a/app/i18n/he/install.php
+++ b/app/i18n/he/install.php
@@ -40,7 +40,7 @@ return array(
'ok' => 'הספרייה הנדרשת ל character type checking (ctype) מותקנת',
),
'curl' => array(
- 'nok' => 'בURL לא מותקן (php5-curl package)',
+ 'nok' => 'בURL לא מותקן (php-curl package)',
'ok' => 'יש לכם את גירסת %s של cURL',
),
'data' => array(
@@ -59,6 +59,14 @@ return array(
'nok' => 'נא לדבוק שאינך פוגעת ב HTTP REFERER שלך.',
'ok' => 'הHTTP REFERER ידוע ותאם לשרת שלך.',
),
+ 'json' => array(
+ 'nok' => 'Cannot find a recommended library to parse JSON.', //TODO
+ 'ok' => 'You have a recommended library to parse JSON.', //TODO
+ ),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'You lack the Minz framework.', // @todo
'ok' => 'יש לכם את תשתית Minz',
diff --git a/app/i18n/it/admin.php b/app/i18n/it/admin.php
index a3034777f..5696ed571 100644
--- a/app/i18n/it/admin.php
+++ b/app/i18n/it/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => 'Installazione files',
'json' => array(
- 'nok' => 'Manca il supoorto a JSON (pacchetto php5-json).',
+ 'nok' => 'Manca il supoorto a JSON (pacchetto php-json).',
'ok' => 'Estensione JSON presente.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Manca il framework Minz.',
'ok' => 'Framework Minz presente.',
diff --git a/app/i18n/it/feedback.php b/app/i18n/it/feedback.php
index 934666aa5..b0f3a814a 100644
--- a/app/i18n/it/feedback.php
+++ b/app/i18n/it/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Aggiorna',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => 'Categoria %s creata.',
'deleted' => 'Categoria cancellata',
@@ -74,7 +78,6 @@ return array(
'error' => 'Feed non aggiornato',
'internal_problem' => 'RSS feed non aggiunto. <a href="%s">Verifica i logs</a> per dettagli.', // @todo
'invalid_url' => 'URL <em>%s</em> non valido',
- 'marked_read' => 'Feeds segnati come letti',
'n_actualized' => '%d feeds aggiornati',
'n_entries_deleted' => '%d articoli cancellati',
'no_refresh' => 'Nessun aggiornamento disponibile…',
diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php
index b2e007bce..2a90693f9 100644
--- a/app/i18n/it/gen.php
+++ b/app/i18n/it/gen.php
@@ -168,6 +168,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/it/index.php b/app/i18n/it/index.php
index d79502c79..718093327 100644
--- a/app/i18n/it/index.php
+++ b/app/i18n/it/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Segna tutto come letto',
'mark_cat_read' => 'Segna la categoria come letta',
'mark_feed_read' => 'Segna il feed come letto',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => 'Mostra prima i recenti',
'non-starred' => 'Escludi preferiti',
'normal_view' => 'Vista elenco',
diff --git a/app/i18n/it/install.php b/app/i18n/it/install.php
index 18f8cc337..2d0a34885 100644
--- a/app/i18n/it/install.php
+++ b/app/i18n/it/install.php
@@ -68,6 +68,10 @@ return array(
'nok' => 'You lack a recommended library to parse JSON.',
'ok' => 'You have a recommended library to parse JSON.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Manca il framework Minz.',
'ok' => 'Framework Minz presente.',
diff --git a/app/i18n/kr/admin.php b/app/i18n/kr/admin.php
index f9e9c9a8e..bc65b3fa2 100644
--- a/app/i18n/kr/admin.php
+++ b/app/i18n/kr/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => '파일 시스템 설치 요구사항',
'json' => array(
- 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php5-json 패키지).',
+ 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php-json 패키지).',
'ok' => 'JSON 확장 기능이 설치되어 있습니다.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Minz 프레임워크를 찾을 수 없습니다.',
'ok' => 'Minz 프레임워크가 설치되어 있습니다.',
@@ -175,15 +179,15 @@ return array(
'user' => array(
'articles_and_size' => '%s 개의 글 (%s)',
'create' => '새 사용자 생성',
- 'delete_users' => 'Delete user', // TODO
+ 'delete_users' => '사용자 삭제',
'language' => '언어',
'number' => '%d 개의 계정이 생성되었습니다',
'numbers' => '%d 개의 계정이 생성되었습니다',
'password_form' => '암호<br /><small>(웹폼 로그인 방식 사용시)</small>',
'password_format' => '7 글자 이상이어야 합니다',
- 'selected' => 'Selected user', // TODO
+ 'selected' => '선택된 사용자',
'title' => '사용자 관리',
- 'update_users' => 'Update user', // TODO
+ 'update_users' => '사용자 정보 변경',
'user_list' => '사용자 목록',
'username' => '사용자 이름',
'users' => '전체 사용자',
diff --git a/app/i18n/kr/conf.php b/app/i18n/kr/conf.php
index 558505973..f618d6c96 100644
--- a/app/i18n/kr/conf.php
+++ b/app/i18n/kr/conf.php
@@ -37,12 +37,12 @@ return array(
'no_limit' => '제한 없음',
'thin' => '얇음',
),
- 'show_nav_buttons' => 'Show the navigation buttons', //TODO
+ 'show_nav_buttons' => '내비게이션 버튼 보이기',
),
'query' => array(
'_' => '사용자 쿼리',
'deprecated' => '이 쿼리는 더 이상 유효하지 않습니다. 해당하는 카테고리나 피드가 삭제되었습니다.',
- 'display' => 'Display user query results', // TODO
+ 'display' => '사용자 쿼리 결과 표시',
'filter' => '적용된 필터:',
'get_all' => '모든 글 표시',
'get_category' => '"%s" 카테고리 표시',
@@ -53,7 +53,7 @@ return array(
'number' => '쿼리 #%d',
'order_asc' => '오래된 글 먼저 표시',
'order_desc' => '최근 글 먼저 표시',
- 'remove' => 'Remove user query', // TODO
+ 'remove' => '사용자 쿼리 삭제',
'search' => '"%s"의 검색 결과',
'state_0' => '모든 글 표시',
'state_1' => '읽은 글 표시',
@@ -128,7 +128,7 @@ return array(
),
'sharing' => array(
'_' => '공유',
- 'add' => 'Add a sharing method', // TODO
+ 'add' => '공유 방법 추가',
'blogotext' => 'Blogotext',
'diaspora' => 'Diaspora*',
'email' => '메일',
@@ -136,7 +136,7 @@ return array(
'g+' => 'Google+',
'more_information' => '자세한 정보',
'print' => '인쇄',
- 'remove' => 'Remove sharing method', // TODO
+ 'remove' => '공유 방법 삭제',
'shaarli' => 'Shaarli',
'share_name' => '표시할 이름',
'share_url' => '사용할 공유 URL',
diff --git a/app/i18n/kr/feedback.php b/app/i18n/kr/feedback.php
index f13675778..12cd673ff 100644
--- a/app/i18n/kr/feedback.php
+++ b/app/i18n/kr/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => '피드를 가져오는 중입니다',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => '%s 카테고리가 생성되었습니다.',
'deleted' => '카테고리가 삭제되었습니다.',
@@ -72,9 +76,8 @@ return array(
'already_subscribed' => '이미 <em>%s</em> 피드를 구독 중입니다',
'deleted' => '피드가 삭제되었습니다',
'error' => '피드를 변경할 수 없습니다',
- 'internal_problem' => 'RSS 피드를 추가할 수 없습니다. 자세한 내용은 <a href="%s">FreshRSS 로그</a>를 참고하세요.', // @todo
+ 'internal_problem' => 'RSS 피드를 추가할 수 없습니다. 자세한 내용은 <a href="%s">FreshRSS 로그</a>를 참고하세요.',
'invalid_url' => 'URL (<em>%s</em>)이 유효하지 않습니다',
- 'marked_read' => '피드가 읽음으로 표시되었습니다',
'n_actualized' => '%d 개의 피드에서 새 글을 가져왔습니다',
'n_entries_deleted' => '%d 개의 글을 삭제했습니다',
'no_refresh' => '새 글을 가져올 피드가 없습니다…',
@@ -102,8 +105,8 @@ return array(
'error' => '%s 사용자를 삭제할 수 없습니다',
),
'updated' => array(
- '_' => 'User %s has been updated', // TODO
- 'error' => 'User %s has not been updated', // TODO
+ '_' => '사용자 %s의 정보가 변경되었습니다',
+ 'error' => '사용자 %s의 정보가 변경되지 않았습니다',
),
),
'profile' => array(
diff --git a/app/i18n/kr/gen.php b/app/i18n/kr/gen.php
index b40ab14c4..e664eaa42 100644
--- a/app/i18n/kr/gen.php
+++ b/app/i18n/kr/gen.php
@@ -19,7 +19,7 @@ return array(
'see_website' => '웹사이트 열기',
'submit' => '설정 저장',
'truncate' => '모든 글 삭제',
- 'update' => 'Update', // TODO
+ 'update' => '변경',
),
'auth' => array(
'email' => '메일 주소',
@@ -168,6 +168,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/kr/index.php b/app/i18n/kr/index.php
index cc03f91c2..cb9684dff 100644
--- a/app/i18n/kr/index.php
+++ b/app/i18n/kr/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => '모두 읽음으로 표시',
'mark_cat_read' => '카테고리를 읽음으로 표시',
'mark_feed_read' => '피드를 읽음으로 표시',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => '최근 글 먼저',
'non-starred' => '즐겨찾기를 제외하고 표시',
'normal_view' => '일반 모드',
diff --git a/app/i18n/kr/install.php b/app/i18n/kr/install.php
index 2eea71ff9..03a8ccdbe 100644
--- a/app/i18n/kr/install.php
+++ b/app/i18n/kr/install.php
@@ -65,9 +65,13 @@ return array(
'ok' => 'HTTP REFERER가 서버와 일치하는 것을 확인했습니다.',
),
'json' => array(
- 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php5-json 패키지).',
+ 'nok' => 'JSON 확장 기능을 찾을 수 없습니다 (php-json 패키지).',
'ok' => 'JSON 확장 기능이 설치되어 있습니다.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Minz 프레임워크를 찾을 수 없습니다.',
'ok' => 'Minz 프레임워크가 설치되어 있습니다.',
diff --git a/app/i18n/kr/sub.php b/app/i18n/kr/sub.php
index 464b64f70..de200c330 100644
--- a/app/i18n/kr/sub.php
+++ b/app/i18n/kr/sub.php
@@ -44,10 +44,10 @@ return array(
'main_stream' => '메인 스트림에 표시하기',
'normal' => '피드가 속한 카테고리에만 표시하기',
),
- 'ssl_verify' => 'Verify SSL security', //TODO
+ 'ssl_verify' => 'SSL 유효성 검사',
'stats' => '통계',
'think_to_add' => '피드를 추가할 수 있습니다.',
- 'timeout' => 'Timeout in seconds', //TODO
+ 'timeout' => '타임아웃 (초)',
'title' => '제목',
'title_add' => 'RSS 피드 추가',
'ttl' => '다음 시간이 지나기 전에 새로고침 금지',
diff --git a/app/i18n/nl/admin.php b/app/i18n/nl/admin.php
index a1d975305..f40db7bcb 100644
--- a/app/i18n/nl/admin.php
+++ b/app/i18n/nl/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => 'Bestanden installatie',
'json' => array(
- 'nok' => 'U mist JSON (php5-json package).',
+ 'nok' => 'U mist JSON (php-json package).',
'ok' => 'U hebt JSON uitbreiding.',
),
+ 'mbstring' => array(
+ 'nok' => 'De voor Unicode aanbevolen bibliotheek mbstring kan niet worden gevonden.',
+ 'ok' => 'De voor Unicode aanbevolen bibliotheek mbstring is gevonden.',
+ ),
'minz' => array(
'nok' => 'U mist Minz framework.',
'ok' => 'U hebt Minz framework.',
diff --git a/app/i18n/nl/feedback.php b/app/i18n/nl/feedback.php
index e73f2f7bd..b16232b84 100644
--- a/app/i18n/nl/feedback.php
+++ b/app/i18n/nl/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Actualiseren',
+ 'articles' => array(
+ 'marked_read' => 'De geselecteerde artikelen zijn als gelezen gemarkeerd.',
+ 'marked_unread' => 'De geselecteerde artikelen zijn als ongelezen gemarkeerd.',
+ ),
'category' => array(
'created' => 'Categorie %s is gemaakt.',
'deleted' => 'Categorie is verwijderd.',
@@ -74,7 +78,6 @@ return array(
'error' => 'Feed kan niet worden vernieuwd',
'internal_problem' => 'De feed kon niet worden toegevoegd. <a href="%s">Controleer de FreshRSS-logbestanden</a> voor details. Toevoegen forceren kan worden geprobeerd door <code>#force_feed</code> aan de URL toe te voegen.',
'invalid_url' => 'URL <em>%s</em> is ongeldig',
- 'marked_read' => 'Feeds zijn gemarkeerd als gelezen',
'n_actualized' => '%d feeds zijn vernieuwd',
'n_entries_deleted' => '%d artikelen zijn verwijderd',
'no_refresh' => 'Er is geen feed om te vernieuwen…',
diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php
index 683209cb9..ccbd86579 100644
--- a/app/i18n/nl/gen.php
+++ b/app/i18n/nl/gen.php
@@ -168,6 +168,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/nl/index.php b/app/i18n/nl/index.php
index e0184a0d0..67b3886ea 100644
--- a/app/i18n/nl/index.php
+++ b/app/i18n/nl/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Markeer alles als gelezen',
'mark_cat_read' => 'Markeer categorie als gelezen',
'mark_feed_read' => 'Markeer feed als gelezen',
+ 'mark_selection_unread' => 'Markeer selectie als ongelezen',
'newer_first' => 'Nieuwste eerst',
'non-starred' => 'Laat alles zien behalve favorieten',
'normal_view' => 'Normale weergave',
diff --git a/app/i18n/nl/install.php b/app/i18n/nl/install.php
index 419ee4c9b..2d2f38913 100644
--- a/app/i18n/nl/install.php
+++ b/app/i18n/nl/install.php
@@ -68,6 +68,10 @@ return array(
'nok' => 'U mist een benodigede bibliotheek om JSON te gebruiken.',
'ok' => 'U hebt de benodigde bibliotheek om JSON te gebruiken.',
),
+ 'mbstring' => array(
+ 'nok' => 'De voor Unicode aanbevolen bibliotheek mbstring kan niet worden gevonden.',
+ 'ok' => 'De voor Unicode aanbevolen bibliotheek mbstring is gevonden.',
+ ),
'minz' => array(
'nok' => 'U mist het Minz framework.',
'ok' => 'U hebt het Minz framework.',
diff --git a/app/i18n/pt-br/admin.php b/app/i18n/pt-br/admin.php
index 16aa027a8..51c5d381f 100644
--- a/app/i18n/pt-br/admin.php
+++ b/app/i18n/pt-br/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => 'Instalação de arquivos',
'json' => array(
- 'nok' => 'Não foi possível encontrar JSON (php5-json).',
+ 'nok' => 'Não foi possível encontrar JSON (php-json).',
'ok' => 'Você tem a extensão JSON.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Não foi possível encontrar o framework Minz.',
'ok' => 'Você tem o framework Minz.',
diff --git a/app/i18n/pt-br/feedback.php b/app/i18n/pt-br/feedback.php
index 2057cf985..a2d66384e 100644
--- a/app/i18n/pt-br/feedback.php
+++ b/app/i18n/pt-br/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Atualizando',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => 'Categoria %s foi criada.',
'deleted' => 'Categoria foi deletada.',
@@ -74,7 +78,6 @@ return array(
'error' => 'O feed não pode ser atualizado',
'internal_problem' => 'O RSS feed não pôde ser adicionado. <a href="%s">Verifique os FreshRSS logs</a> para detalhes.', // @todo
'invalid_url' => 'URL <em>%s</em> é inválida',
- 'marked_read' => 'Feeds foram marcados como lidos',
'n_actualized' => '%d feeds foram atualizados',
'n_entries_deleted' => '%d artigos foram deletados',
'no_refresh' => 'Não há feed para atualizar…',
diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php
index 932b6066d..558482f07 100644
--- a/app/i18n/pt-br/gen.php
+++ b/app/i18n/pt-br/gen.php
@@ -167,6 +167,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/pt-br/index.php b/app/i18n/pt-br/index.php
index 610f00840..2eff8d948 100644
--- a/app/i18n/pt-br/index.php
+++ b/app/i18n/pt-br/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Marcar todos como lidos',
'mark_cat_read' => 'Marcar categoria como lida',
'mark_feed_read' => 'Marcar feed com lido',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => 'Novos primeiro',
'non-starred' => 'Mostrar todos, exceto favoritos',
'normal_view' => 'visualização normal',
diff --git a/app/i18n/pt-br/install.php b/app/i18n/pt-br/install.php
index 3ca5fb854..65bddf62c 100644
--- a/app/i18n/pt-br/install.php
+++ b/app/i18n/pt-br/install.php
@@ -65,9 +65,13 @@ return array(
'ok' => 'Seu HTTP REFERER é conhecido e corresponde ao seu servidor.',
),
'json' => array(
- 'nok' => 'Não foi possível encontrar JSON (php5-json).',
+ 'nok' => 'Não foi possível encontrar JSON (php-json).',
'ok' => 'Você tem a extensão JSON.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Não foi possível encontrar o framework Minz.',
'ok' => 'Você tem o framework Minz.',
diff --git a/app/i18n/ru/admin.php b/app/i18n/ru/admin.php
index 4f5e937d7..91da8adcf 100644
--- a/app/i18n/ru/admin.php
+++ b/app/i18n/ru/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => 'Установка файлов',
'json' => array(
- 'nok' => 'У вас не установлена библиотека для работы с JSON (пакет php5-json).',
+ 'nok' => 'У вас не установлена библиотека для работы с JSON (пакет php-json).',
'ok' => 'У вас установлена библиотека для работы с JSON.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'У вас не установлен фрейворк Minz.',
'ok' => 'У вас установлен фрейворк Minz.',
diff --git a/app/i18n/ru/feedback.php b/app/i18n/ru/feedback.php
index 6d4e5e3fe..693a40b34 100644
--- a/app/i18n/ru/feedback.php
+++ b/app/i18n/ru/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Actualise', //TODO
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => 'Category %s has been created.', //TODO
'deleted' => 'Category has been deleted.', //TODO
@@ -74,7 +78,6 @@ return array(
'error' => 'Feed cannot be updated', //TODO
'internal_problem' => 'The newsfeed could not be added. <a href="%s">Check FreshRSS logs</a> for details. You can try force adding by appending <code>#force_feed</code> to the URL.', //TODO
'invalid_url' => 'URL <em>%s</em> is invalid', //TODO
- 'marked_read' => 'Feeds have been marked as read', //TODO
'n_actualized' => '%d feeds have been updated', //TODO
'n_entries_deleted' => '%d articles have been deleted', //TODO
'no_refresh' => 'There is no feed to refresh…', //TODO
diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php
index ef9217d73..911410a1c 100644
--- a/app/i18n/ru/gen.php
+++ b/app/i18n/ru/gen.php
@@ -168,6 +168,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/ru/index.php b/app/i18n/ru/index.php
index eb6413e3c..9bb327786 100644
--- a/app/i18n/ru/index.php
+++ b/app/i18n/ru/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Mark all as read',
'mark_cat_read' => 'Mark category as read',
'mark_feed_read' => 'Mark feed as read',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => 'Newer first',
'non-starred' => 'Show all but favorites',
'normal_view' => 'Normal view',
diff --git a/app/i18n/ru/install.php b/app/i18n/ru/install.php
index 1dea2cd66..c1d0e81e8 100644
--- a/app/i18n/ru/install.php
+++ b/app/i18n/ru/install.php
@@ -64,6 +64,10 @@ return array(
'nok' => 'Убедитесь, что вы не изменяете ваш HTTP REFERER.',
'ok' => 'Ваш HTTP REFERER известен и соотвествует вашему серверу.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'У вас не установлен фрейворк Minz.',
'ok' => 'У вас установлен фрейворк Minz.',
diff --git a/app/i18n/tr/admin.php b/app/i18n/tr/admin.php
index f982bf644..f481bb294 100644
--- a/app/i18n/tr/admin.php
+++ b/app/i18n/tr/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => 'Dosya kurulumu',
'json' => array(
- 'nok' => 'JSON eklentisi eksik (php5-json package).',
+ 'nok' => 'JSON eklentisi eksik (php-json package).',
'ok' => 'JSON eklentisi sorunsuz.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Minz framework eksik.',
'ok' => 'Minz framework sorunsuz.',
diff --git a/app/i18n/tr/feedback.php b/app/i18n/tr/feedback.php
index df7d1b264..278abe978 100644
--- a/app/i18n/tr/feedback.php
+++ b/app/i18n/tr/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => 'Güncelleme',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => 'Kategori %s oluşturuldu.',
'deleted' => 'Kategori silindi.',
@@ -74,7 +78,6 @@ return array(
'error' => 'Akış güncellenemiyor',
'internal_problem' => 'RSS akışı eklenemiyor. Detaylar için <a href="%s">FreshRSS log kayıtlarını</a> kontrol edin.', // @todo
'invalid_url' => 'URL <em>%s</em> geçersiz',
- 'marked_read' => 'Akışlar okundu olarak işaretlendi',
'n_actualized' => '%d akışları güncellendi',
'n_entries_deleted' => '%d makaleleri silindi',
'no_refresh' => 'Yenilenecek akış yok…',
diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php
index d99081396..2e1761517 100644
--- a/app/i18n/tr/gen.php
+++ b/app/i18n/tr/gen.php
@@ -168,6 +168,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/tr/index.php b/app/i18n/tr/index.php
index cb36d6717..1357c05e7 100644
--- a/app/i18n/tr/index.php
+++ b/app/i18n/tr/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => 'Hepsini okundu olarak işaretle',
'mark_cat_read' => 'Kategoriyi okundu olarak işaretle',
'mark_feed_read' => 'Akışı okundu olarak işaretle',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => 'Önce yeniler',
'non-starred' => 'Favori dışındakileri göster',
'normal_view' => 'Normal görünüm',
diff --git a/app/i18n/tr/install.php b/app/i18n/tr/install.php
index 4ae0ad7e3..f90e43f1d 100644
--- a/app/i18n/tr/install.php
+++ b/app/i18n/tr/install.php
@@ -68,6 +68,10 @@ return array(
'nok' => 'Tavsiye edilen JSON çözümleme kütüphanesi eksik.',
'ok' => 'Tavsiye edilen JSON çözümleme kütüphanesi sorunsuz.',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => 'Minz framework eksik.',
'ok' => 'Minz framework sorunsuz.',
diff --git a/app/i18n/zh-cn/admin.php b/app/i18n/zh-cn/admin.php
index 1072dc972..1f007f964 100644
--- a/app/i18n/zh-cn/admin.php
+++ b/app/i18n/zh-cn/admin.php
@@ -63,9 +63,13 @@ return array(
),
'files' => '文件相关',
'json' => array(
- 'nok' => '找不到 JSON 扩展 (php5-json ) 。',
+ 'nok' => '找不到 JSON 扩展 (php-json ) 。',
'ok' => '已找到 JSON 扩展',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => '找不到 Minz 框架。',
'ok' => '已找到 Minz 框架。',
diff --git a/app/i18n/zh-cn/feedback.php b/app/i18n/zh-cn/feedback.php
index 1db879891..e9f7b4aac 100644
--- a/app/i18n/zh-cn/feedback.php
+++ b/app/i18n/zh-cn/feedback.php
@@ -52,6 +52,10 @@ return array(
),
'sub' => array(
'actualize' => '获取',
+ 'articles' => array(
+ 'marked_read' => 'The selected articles have been marked as read.', //TODO
+ 'marked_unread' => 'The articles have been marked as unread.', //TODO
+ ),
'category' => array(
'created' => '分类 %s 已创建。',
'deleted' => '分类已删除。',
@@ -74,7 +78,6 @@ return array(
'error' => 'RSS 源更新失败',
'internal_problem' => 'RSS 源添加失败。<a href="%s">检查 FreshRSS 日志</a> 查看详情。', // @todo
'invalid_url' => 'URL <em>%s</em> 无效',
- 'marked_read' => 'RSS 源已被设为已读',
'n_actualized' => '%d 个 RSS 源已更新',
'n_entries_deleted' => '%d 篇文章已删除',
'no_refresh' => '没有可刷新的 RSS 源…',
diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php
index 9289d8571..4ea2d73ab 100644
--- a/app/i18n/zh-cn/gen.php
+++ b/app/i18n/zh-cn/gen.php
@@ -168,6 +168,7 @@ return array(
'g+' => 'Google+',
'gnusocial' => 'GNU social',
'jdh' => 'Journal du hacker',
+ 'linkedin' => 'LinkedIn',
'mastodon' => 'Mastodon',
'movim' => 'Movim',
'pocket' => 'Pocket',
diff --git a/app/i18n/zh-cn/index.php b/app/i18n/zh-cn/index.php
index 6729524f5..2b76961ef 100644
--- a/app/i18n/zh-cn/index.php
+++ b/app/i18n/zh-cn/index.php
@@ -40,6 +40,7 @@ return array(
'mark_all_read' => '全部设为已读',
'mark_cat_read' => '此分类设为已读',
'mark_feed_read' => '此源设为已读',
+ 'mark_selection_unread' => 'Mark selection as unread', //TODO
'newer_first' => '由新到旧',
'non-starred' => '显示未收藏',
'normal_view' => '普通视图',
diff --git a/app/i18n/zh-cn/install.php b/app/i18n/zh-cn/install.php
index 1e172f0d5..fe34a44c0 100644
--- a/app/i18n/zh-cn/install.php
+++ b/app/i18n/zh-cn/install.php
@@ -68,6 +68,10 @@ return array(
'nok' => '找不到推荐的 JSON 解析库。',
'ok' => '已找到推荐的 JSON 解析库。',
),
+ 'mbstring' => array(
+ 'nok' => 'Cannot find the recommended library mbstring for Unicode.', //TODO
+ 'ok' => 'You have the recommended library mbstring for Unicode.', //TODO
+ ),
'minz' => array(
'nok' => '找不到 Minz 框架。',
'ok' => '已找到 Minz 框架。',
diff --git a/app/install.php b/app/install.php
index c30f8d583..eec65be9c 100644
--- a/app/install.php
+++ b/app/install.php
@@ -462,6 +462,12 @@ function printStep1() {
<p class="alert alert-error"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.xml.nok'); ?></p>
<?php } ?>
+ <?php if ($res['mbstring'] == 'ok') { ?>
+ <p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.mbstring.ok'); ?></p>
+ <?php } else { ?>
+ <p class="alert alert-warn"><span class="alert-head"><?php echo _t('gen.short.damn'); ?></span> <?php echo _t('install.check.mbstring.nok'); ?></p>
+ <?php } ?>
+
<?php if ($res['fileinfo'] == 'ok') { ?>
<p class="alert alert-success"><span class="alert-head"><?php echo _t('gen.short.ok'); ?></span> <?php echo _t('install.check.fileinfo.ok'); ?></p>
<?php } else { ?>
@@ -645,7 +651,7 @@ function printStep3() {
<div class="form-group">
<label class="group-name" for="base"><?php echo _t('install.bdd'); ?></label>
<div class="group-controls">
- <input type="text" id="base" name="base" maxlength="64" pattern="[0-9A-Za-z_]{1,64}" value="<?php echo isset($_SESSION['bd_base']) ? $_SESSION['bd_base'] : ''; ?>" tabindex="5" />
+ <input type="text" id="base" name="base" maxlength="64" pattern="[0-9A-Za-z_-]{1,64}" value="<?php echo isset($_SESSION['bd_base']) ? $_SESSION['bd_base'] : ''; ?>" tabindex="5" />
</div>
</div>
diff --git a/app/layout/header.phtml b/app/layout/header.phtml
index e589ed7ef..e75a25efa 100644
--- a/app/layout/header.phtml
+++ b/app/layout/header.phtml
@@ -25,7 +25,8 @@ if (FreshRSS_Auth::accessNeedsAction()) {
<?php if (FreshRSS_Auth::hasAccess() || FreshRSS_Context::$system_conf->allow_anonymous) { ?>
<form action="<?php echo _url('index', 'index'); ?>" method="get">
<div class="stick">
- <input type="search" name="search" id="search" class="extend" value="<?php echo FreshRSS_Context::$search; ?>" placeholder="<?php echo _t('gen.menu.search'); ?>" />
+ <input type="search" name="search" id="search" class="extend" value="<?php
+ echo htmlspecialchars(htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), ENT_COMPAT, 'UTF-8'); ?>" placeholder="<?php echo _t('gen.menu.search'); ?>" />
<?php $get = Minz_Request::param('get', ''); ?>
<?php if ($get != '') { ?>
diff --git a/app/layout/nav_menu.phtml b/app/layout/nav_menu.phtml
index ab82c723f..88f882db9 100644
--- a/app/layout/nav_menu.phtml
+++ b/app/layout/nav_menu.phtml
@@ -62,9 +62,10 @@
<?php
$get = FreshRSS_Context::currentGet();
$string_mark = _t('index.menu.mark_all_read');
- if ($get[0] == 'f') {
+ $string_unmark = _t('index.menu.mark_selection_unread');
+ if ($get[0] === 'f') {
$string_mark = _t('index.menu.mark_feed_read');
- } elseif ($get[0] == 'c') {
+ } elseif ($get[0] === 'c') {
$string_mark = _t('index.menu.mark_cat_read');
}
@@ -75,10 +76,14 @@
'get' => $get,
'nextGet' => FreshRSS_Context::$next_get,
'idMax' => FreshRSS_Context::$id_max,
- 'search' => FreshRSS_Context::$search,
+ 'search' => htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES),
'state' => FreshRSS_Context::$state,
- )
+ ),
);
+
+ $mark_unread_url = $mark_read_url;
+ $mark_unread_url['params']['is_read'] = false;
+ $mark_unread_url['params']['nextGet'] = $get;
?>
<div class="stick" id="nav_menu_read_all">
@@ -110,6 +115,7 @@
$mark_before_today['params']['idMax'] = $today . '000000';
$mark_before_one_week = $mark_read_url;
$mark_before_one_week['params']['idMax'] = ($today - 604800) . '000000';
+ $mark_unread_enabled = FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_READ) or !FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_NOT_READ);
?>
<li class="item">
<button class="as-link <?php echo $confirm; ?>"
@@ -123,6 +129,13 @@
formaction="<?php echo Minz_Url::display($mark_before_one_week); ?>"
type="submit"><?php echo _t('index.menu.before_one_week'); ?></button>
</li>
+ <li class="separator"></li>
+ <li class="item">
+ <button class="as-link <?php echo $mark_unread_enabled ? $confirm : '" disabled="disabled'; ?>"
+ form="mark-read-menu"
+ formaction="<?php echo Minz_Url::display($mark_unread_url); ?>"
+ type="submit"><?php echo $string_unmark; ?></button>
+ </li>
</ul>
</div>
</form>
@@ -162,7 +175,8 @@
<div class="item search">
<form action="<?php echo _url('index', 'index'); ?>" method="get">
- <input type="search" name="search" class="extend" value="<?php echo FreshRSS_Context::$search; ?>" placeholder="<?php echo _t('index.menu.search_short'); ?>" />
+ <input type="search" name="search" class="extend" value="<?php
+ echo htmlspecialchars(htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES), ENT_COMPAT, 'UTF-8'); ?>" placeholder="<?php echo _t('index.menu.search_short'); ?>" />
<?php $get = Minz_Request::param('get', ''); ?>
<?php if($get != '') { ?>
diff --git a/app/shares.php b/app/shares.php
index 8c6b4eac6..55deed785 100644
--- a/app/shares.php
+++ b/app/shares.php
@@ -131,4 +131,10 @@ return array(
'form' => 'simple',
'method' => 'GET',
),
+ 'linkedin' => array(
+ 'url' => 'https://www.linkedin.com/shareArticle?url=~LINK~&amp;title=~TITLE~&amp;source=FreshRSS',
+ 'transform' => array('rawurlencode'),
+ 'form' => 'simple',
+ 'method' => 'GET',
+ ),
);
diff --git a/app/views/helpers/export/opml.phtml b/app/views/helpers/export/opml.phtml
index 236cca303..edb4d4eda 100644
--- a/app/views/helpers/export/opml.phtml
+++ b/app/views/helpers/export/opml.phtml
@@ -16,11 +16,11 @@ foreach ($this->categories as $key => $cat) {
foreach ($cat['feeds'] as $feed) {
$opml_array['body'][$key]['@outlines'][] = array(
- 'text' => htmlspecialchars_decode($feed->name()),
+ 'text' => htmlspecialchars_decode($feed->name(), ENT_QUOTES),
'type' => 'rss',
- 'xmlUrl' => htmlspecialchars_decode($feed->url()),
- 'htmlUrl' => htmlspecialchars_decode($feed->website()),
- 'description' => htmlspecialchars_decode($feed->description()),
+ 'xmlUrl' => htmlspecialchars_decode($feed->url(), ENT_QUOTES),
+ 'htmlUrl' => htmlspecialchars_decode($feed->website(), ENT_QUOTES),
+ 'description' => htmlspecialchars_decode($feed->description(), ENT_QUOTES),
);
}
}
diff --git a/app/views/helpers/index/normal/entry_bottom.phtml b/app/views/helpers/index/normal/entry_bottom.phtml
index 793c644f9..6417da4cb 100644
--- a/app/views/helpers/index/normal/entry_bottom.phtml
+++ b/app/views/helpers/index/normal/entry_bottom.phtml
@@ -81,7 +81,7 @@
<ul class="dropdown-menu">
<li class="dropdown-close"><a href="#close">❌</a></li><?php
foreach($tags as $tag) {
- ?><li class="item"><a href="<?php echo _url('index', 'index', 'search', '#' . htmlspecialchars_decode($tag)); ?>"><?php echo $tag; ?></a></li><?php
+ ?><li class="item"><a href="<?php echo _url('index', 'index', 'search', '#' . htmlspecialchars_decode($tag, ENT_QUOTES)); ?>"><?php echo $tag; ?></a></li><?php
} ?>
</ul>
</div>
diff --git a/app/views/helpers/javascript_vars.phtml b/app/views/helpers/javascript_vars.phtml
index 1b9b614d2..d7b3e4360 100644
--- a/app/views/helpers/javascript_vars.phtml
+++ b/app/views/helpers/javascript_vars.phtml
@@ -56,4 +56,4 @@ echo htmlspecialchars(json_encode(array(
'icons' => array(
'close' => _i('close'),
),
-), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES);
+), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES, 'UTF-8');
diff --git a/app/views/helpers/pagination.phtml b/app/views/helpers/pagination.phtml
index 893451af9..fc37ce3f5 100755
--- a/app/views/helpers/pagination.phtml
+++ b/app/views/helpers/pagination.phtml
@@ -11,7 +11,7 @@
'get' => FreshRSS_Context::currentGet(),
'nextGet' => FreshRSS_Context::$next_get,
'idMax' => FreshRSS_Context::$id_max,
- 'search' => FreshRSS_Context::$search,
+ 'search' => htmlspecialchars_decode(FreshRSS_Context::$search, ENT_QUOTES),
'state' => FreshRSS_Context::$state,
)
);
diff --git a/app/views/stats/index.phtml b/app/views/stats/index.phtml
index a36f812a8..2ff3e6c52 100644
--- a/app/views/stats/index.phtml
+++ b/app/views/stats/index.phtml
@@ -88,6 +88,6 @@ echo htmlspecialchars(json_encode(array(
'dataCount' => $this->count,
'feedByCategory' => $this->feedByCategory,
'entryByCategory' => $this->entryByCategory,
-), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES);
+), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES, 'UTF-8');
?></script>
<script src="../scripts/stats.js?<?php echo @filemtime(PUBLIC_PATH . '/scripts/stats.js'); ?>"></script>
diff --git a/app/views/stats/repartition.phtml b/app/views/stats/repartition.phtml
index 5ebcdce5a..4bce418c9 100644
--- a/app/views/stats/repartition.phtml
+++ b/app/views/stats/repartition.phtml
@@ -69,6 +69,6 @@ echo htmlspecialchars(json_encode(array(
'days' => $this->days,
'repartitionMonth' => $this->repartitionMonth,
'months' => $this->months,
-), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES);
+), JSON_UNESCAPED_UNICODE), ENT_NOQUOTES, 'UTF-8');
?></script>
<script src="../scripts/repartition.js?<?php echo @filemtime(PUBLIC_PATH . '/scripts/repartition.js'); ?>"></script>
diff --git a/cli/README.md b/cli/README.md
index 0d1c0a7d4..c314bd388 100644
--- a/cli/README.md
+++ b/cli/README.md
@@ -35,7 +35,7 @@ cd /usr/share/FreshRSS
./cli/prepare.php
# Ensure the needed directories in ./data/
-./cli/do-install.php --default_user admin ( --auth_type form --environment production --base_url https://rss.example.net/ --language en --title FreshRSS --allow_anonymous --api_enabled --db-type mysql --db-host localhost:3306 --db-user freshrss --db-password dbPassword123 --db-base freshrss --db-prefix freshrss )
+./cli/do-install.php --default_user admin ( --auth_type form --environment production --base_url https://rss.example.net --language en --title FreshRSS --allow_anonymous --api_enabled --db-type mysql --db-host localhost:3306 --db-user freshrss --db-password dbPassword123 --db-base freshrss --db-prefix freshrss )
# --auth_type can be: 'form' (default), 'http_auth' (using the Web server access control), 'none' (dangerous)
# --db-type can be: 'sqlite' (default), 'mysql' (MySQL or MariaDB), 'pgsql' (PostgreSQL)
# --base_url should be a public (routable) URL if possible, and is used for push (PubSubHubbub), for some API functions (e.g. favicons), and external URLs in FreshRSS.
diff --git a/cli/do-install.php b/cli/do-install.php
index 4ebba0469..7435ab9f1 100755
--- a/cli/do-install.php
+++ b/cli/do-install.php
@@ -33,7 +33,7 @@ $options = getopt('', array_merge($params, $dBparams));
if (empty($options['default_user'])) {
fail('Usage: ' . basename(__FILE__) . " --default_user admin ( --auth_type form" .
- " --environment production --base_url https://rss.example.net/" .
+ " --environment production --base_url https://rss.example.net" .
" --language en --title FreshRSS --allow_anonymous --api_enabled" .
" --db-type mysql --db-host localhost:3306 --db-user freshrss --db-password dbPassword123" .
" --db-base freshrss --db-prefix freshrss_ --disable_update )");
diff --git a/constants.php b/constants.php
index 7fedc0d59..2bd64708f 100644
--- a/constants.php
+++ b/constants.php
@@ -2,7 +2,7 @@
//NB: Do not edit; use ./constants.local.php instead.
//<Not customisable>
-define('FRESHRSS_VERSION', '1.11.1');
+define('FRESHRSS_VERSION', '1.11.2');
define('FRESHRSS_WEBSITE', 'https://freshrss.org');
define('FRESHRSS_WIKI', 'https://freshrss.github.io/FreshRSS/');
diff --git a/data/PubSubHubbub/feeds/index.html b/data/PubSubHubbub/feeds/index.html
new file mode 100644
index 000000000..85faaa37e
--- /dev/null
+++ b/data/PubSubHubbub/feeds/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB">
+<head>
+<meta charset="UTF-8" />
+<meta http-equiv="Refresh" content="0; url=/" />
+<title>Redirection</title>
+<meta name="robots" content="noindex" />
+</head>
+
+<body>
+<p><a href="/">Redirection</a></p>
+</body>
+</html>
diff --git a/data/PubSubHubbub/index.html b/data/PubSubHubbub/index.html
new file mode 100644
index 000000000..85faaa37e
--- /dev/null
+++ b/data/PubSubHubbub/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB">
+<head>
+<meta charset="UTF-8" />
+<meta http-equiv="Refresh" content="0; url=/" />
+<title>Redirection</title>
+<meta name="robots" content="noindex" />
+</head>
+
+<body>
+<p><a href="/">Redirection</a></p>
+</body>
+</html>
diff --git a/data/PubSubHubbub/keys/index.html b/data/PubSubHubbub/keys/index.html
new file mode 100644
index 000000000..85faaa37e
--- /dev/null
+++ b/data/PubSubHubbub/keys/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB">
+<head>
+<meta charset="UTF-8" />
+<meta http-equiv="Refresh" content="0; url=/" />
+<title>Redirection</title>
+<meta name="robots" content="noindex" />
+</head>
+
+<body>
+<p><a href="/">Redirection</a></p>
+</body>
+</html>
diff --git a/data/users/_/index.html b/data/users/_/index.html
new file mode 100644
index 000000000..85faaa37e
--- /dev/null
+++ b/data/users/_/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB">
+<head>
+<meta charset="UTF-8" />
+<meta http-equiv="Refresh" content="0; url=/" />
+<title>Redirection</title>
+<meta name="robots" content="noindex" />
+</head>
+
+<body>
+<p><a href="/">Redirection</a></p>
+</body>
+</html>
diff --git a/docs/fr/developers/01_First_steps.md b/docs/fr/developers/01_First_steps.md
index 400523e23..d2bf9d315 100644
--- a/docs/fr/developers/01_First_steps.md
+++ b/docs/fr/developers/01_First_steps.md
@@ -4,11 +4,7 @@
## Docker
-L'image Docker contenant l'environnement de développement de FreshRSS est accessible via :
-
-`$ docker pull marienfressinaud/freshrss`
-
-Vous pouvez lire [le fichier README du dépôt dédié](https://github.com/FreshRSS/docker-freshrss).
+Le développement et le deploiement de FreshRSS peuvent se faire [via Docker](https://github.com/FreshRSS/FreshRSS/tree/dev/Docker).
# Architecture du projet
diff --git a/lib/Minz/Url.php b/lib/Minz/Url.php
index 99c0443c1..1c222ce25 100644
--- a/lib/Minz/Url.php
+++ b/lib/Minz/Url.php
@@ -27,6 +27,10 @@ class Minz_Url {
$url_string = Minz_Request::getBaseUrl();
if ($url_string == '') {
$url_string = Minz_Request::guessBaseUrl();
+ if (PUBLIC_RELATIVE === '..') {
+ //TODO: Implement proper resolver of relative parts such as /test/./../
+ $url_string = dirname($url_string);
+ }
}
if ($isArray) {
$url_string .= PUBLIC_TO_INDEX_PATH;
@@ -39,7 +43,7 @@ class Minz_Url {
}
if ($isArray) {
- $url_string .= self::printUri($url, $encodage);
+ $url_string .= '/' . self::printUri($url, $encodage);
} elseif ($encodage === 'html') {
$url_string = Minz_Helper::htmlspecialchars_utf8($url_string . $url);
} else {
diff --git a/lib/lib_install.php b/lib/lib_install.php
index 7305d8e28..d51a37e58 100644
--- a/lib/lib_install.php
+++ b/lib/lib_install.php
@@ -41,6 +41,7 @@ function checkRequirements($dbType = '') {
$dom = class_exists('DOMDocument');
$xml = function_exists('xml_parser_create');
$json = function_exists('json_encode');
+ $mbstring = extension_loaded('mbstring');
$data = DATA_PATH && is_writable(DATA_PATH);
$cache = CACHE_PATH && is_writable(CACHE_PATH);
$users = USERS_PATH && is_writable(USERS_PATH);
@@ -61,6 +62,7 @@ function checkRequirements($dbType = '') {
'dom' => $dom ? 'ok' : 'ko',
'xml' => $xml ? 'ok' : 'ko',
'json' => $json ? 'ok' : 'ko',
+ 'mbstring' => $mbstring ? 'ok' : 'ko',
'data' => $data ? 'ok' : 'ko',
'cache' => $cache ? 'ok' : 'ko',
'users' => $users ? 'ok' : 'ko',
diff --git a/lib/lib_rss.php b/lib/lib_rss.php
index 5f460862e..44123b746 100644
--- a/lib/lib_rss.php
+++ b/lib/lib_rss.php
@@ -21,6 +21,12 @@ if (!function_exists('json_encode')) {
defined('JSON_UNESCAPED_UNICODE') or define('JSON_UNESCAPED_UNICODE', 256); //PHP 5.3
+if (!function_exists('mb_strcut')) {
+ function mb_strcut($str, $start, $length = null, $encoding = 'UTF-8') {
+ return substr($str, $start, $length);
+ }
+}
+
/**
* Build a directory path by concatenating a list of directory names.
*
@@ -103,24 +109,29 @@ function safe_ascii($text) {
* localhost address.
*
* @param $address the address to test, can be an IP or a URL.
- * @return true if server is accessible, false else.
+ * @return true if server is accessible, false otherwise.
* @todo improve test with a more valid technique (e.g. test with an external server?)
*/
function server_is_public($address) {
$host = parse_url($address, PHP_URL_HOST);
$is_public = !in_array($host, array(
- '127.0.0.1',
'localhost',
'localhost.localdomain',
'[::1]',
+ 'ip6-localhost',
'localhost6',
'localhost6.localdomain6',
));
- return $is_public;
-}
+ if ($is_public) {
+ $ip = gethostbyname($host);
+ $is_public &= !preg_match('/^(10|127|172[.]16|192[.]168)[.]/', $ip);
+ $is_public &= !preg_match('/^(\[)?(::1$|fc00::|fe80::)/i', $ip);
+ }
+ return (bool)$is_public;
+}
function format_number($n, $precision = 0) {
// number_format does not seem to be Unicode-compatible
@@ -405,6 +416,7 @@ function check_install_php() {
'fileinfo' => extension_loaded('fileinfo'),
'dom' => class_exists('DOMDocument'),
'json' => extension_loaded('json'),
+ 'mbstring' => extension_loaded('mbstring'),
'zip' => extension_loaded('zip'),
);
}
diff --git a/p/api/fever.php b/p/api/fever.php
index d1482e8a1..55baa6d16 100644
--- a/p/api/fever.php
+++ b/p/api/fever.php
@@ -69,14 +69,16 @@ class FeverDAO extends Minz_ModelPdo
if (!empty($entry_ids)) {
$bindEntryIds = $this->bindParamArray('id', $entry_ids, $values);
$sql .= " id IN($bindEntryIds)";
- } else if (!empty($max_id)) {
+ } elseif ($max_id != null) {
$sql .= ' id < :id';
$values[':id'] = $max_id;
$order = ' ORDER BY id DESC';
- } else {
+ } elseif ($since_id != null) {
$sql .= ' id > :id';
$values[':id'] = $since_id;
$order = ' ORDER BY id ASC';
+ } else {
+ $sql .= ' 1=1';
}
if (!empty($feed_ids)) {
@@ -204,14 +206,14 @@ class FeverAPI
$response_arr['saved_item_ids'] = $this->getSavedItemIds();
}
- if (isset($_REQUEST['mark'], $_REQUEST['as'], $_REQUEST['id']) && is_numeric($_REQUEST['id'])) {
+ $id = isset($_REQUEST['id']) ? '' . $_REQUEST['id'] : '';
+ if (isset($_REQUEST['mark'], $_REQUEST['as'], $_REQUEST['id']) && ctype_digit($id)) {
$method_name = 'set' . ucfirst($_REQUEST['mark']) . 'As' . ucfirst($_REQUEST['as']);
$allowedMethods = array(
'setFeedAsRead', 'setGroupAsRead', 'setItemAsRead',
'setItemAsSaved', 'setItemAsUnread', 'setItemAsUnsaved'
);
if (in_array($method_name, $allowedMethods)) {
- $id = intval($_REQUEST['id']);
switch (strtolower($_REQUEST['mark'])) {
case 'item':
$this->{$method_name}($id);
@@ -471,17 +473,18 @@ class FeverAPI
if (isset($_REQUEST['max_id'])) {
// use the max_id argument to request the previous $item_limit items
- if (is_numeric($_REQUEST['max_id'])) {
- $max = $_REQUEST['max_id'] > 0 ? intval($_REQUEST['max_id']) : 0;
- if ($max) {
- $max_id = $max;
- }
+ $max_id = '' . $_REQUEST['max_id'];
+ if (!ctype_digit($max_id)) {
+ $max_id = null;
}
} else if (isset($_REQUEST['with_ids'])) {
$entry_ids = explode(',', $_REQUEST['with_ids']);
} else {
// use the since_id argument to request the next $item_limit items
- $since_id = isset($_REQUEST['since_id']) && is_numeric($_REQUEST['since_id']) ? intval($_REQUEST['since_id']) : 0;
+ $since_id = '' . $_REQUEST['since_id'];
+ if (!ctype_digit($since_id)) {
+ $since_id = null;
+ }
}
$items = array();
diff --git a/p/api/greader.php b/p/api/greader.php
index 5ab6c8115..4affc2826 100644
--- a/p/api/greader.php
+++ b/p/api/greader.php
@@ -176,7 +176,7 @@ function authorizationToUser() {
}
function clientLogin($email, $pass) { //http://web.archive.org/web/20130604091042/http://undoc.in/clientLogin.html
- if (ctype_alnum($email)) {
+ if (FreshRSS_user_Controller::checkUsername($email)) {
if (!function_exists('password_verify')) {
include_once(LIB_PATH . '/password_compat.php');
}
diff --git a/p/f.php b/p/f.php
index 81df8984b..b68109cd5 100644
--- a/p/f.php
+++ b/p/f.php
@@ -28,7 +28,7 @@ $txt_mtime = @filemtime($txt);
header('Content-Type: image/x-icon');
-if ($ico_mtime == false || $ico_mtime < $txt_mtime || ($ico_mtime < time() - (rand(15, 20) * 86400))) {
+if ($ico_mtime == false || $ico_mtime < $txt_mtime || ($ico_mtime < time() - (mt_rand(15, 20) * 86400))) {
if ($txt_mtime == false) {
show_default_favicon(1800);
exit();
@@ -49,6 +49,6 @@ if ($ico_mtime == false || $ico_mtime < $txt_mtime || ($ico_mtime < time() - (ra
header('Content-Disposition: inline; filename="' . $id . '.ico"');
-if (!httpConditional($ico_mtime, rand(14, 21) * 86400, 2)) {
+if (!httpConditional($ico_mtime, mt_rand(14, 21) * 86400, 2)) {
readfile($ico);
}
diff --git a/p/themes/BlueLagoon/BlueLagoon.css b/p/themes/BlueLagoon/BlueLagoon.css
index 186258752..424970501 100644
--- a/p/themes/BlueLagoon/BlueLagoon.css
+++ b/p/themes/BlueLagoon/BlueLagoon.css
@@ -115,6 +115,9 @@ form th {
}
/*=== Buttons */
+button.as-link[disabled] {
+ color:#555 !important;
+}
.dropdown-menu .input select, .dropdown-menu .input input {
background:#444;
diff --git a/p/themes/Dark/dark.css b/p/themes/Dark/dark.css
index 348b00009..38a78a277 100644
--- a/p/themes/Dark/dark.css
+++ b/p/themes/Dark/dark.css
@@ -113,6 +113,9 @@ form th {
}
/*=== Buttons */
+button.as-link[disabled] {
+ color:#445 !important;
+}
.stick {
vertical-align: middle;
font-size: 0;
diff --git a/p/themes/Origine-compact/origine-compact.css b/p/themes/Origine-compact/origine-compact.css
index 8447e2486..26129415a 100644
--- a/p/themes/Origine-compact/origine-compact.css
+++ b/p/themes/Origine-compact/origine-compact.css
@@ -1,11 +1,5 @@
@charset "UTF-8";
-/*=== FONTS */
-@font-face {
- font-family: "OpenSans";
- src: url("../fonts/openSans.woff") format("woff");
-}
-
/*=== GENERAL */
/*============*/
html, body {
diff --git a/p/themes/Screwdriver/screwdriver.css b/p/themes/Screwdriver/screwdriver.css
index 969695f13..a142c3860 100644
--- a/p/themes/Screwdriver/screwdriver.css
+++ b/p/themes/Screwdriver/screwdriver.css
@@ -115,6 +115,9 @@ form th {
}
/*=== Buttons */
+button.as-link[disabled] {
+ color:#555 !important;
+}
.dropdown-menu .input select, .dropdown-menu .input input {
background:#444;
diff --git a/p/themes/base-theme/template.css b/p/themes/base-theme/template.css
index 9b8ad902b..26143a5d5 100644
--- a/p/themes/base-theme/template.css
+++ b/p/themes/base-theme/template.css
@@ -118,6 +118,9 @@ button.as-link:active {
font-size: 1.1em;
text-align: left;
}
+button.as-link[disabled] {
+ color:#DDD !important;
+}
/*=== Tables */
table {
@@ -630,7 +633,8 @@ br + br + br {
#bigMarkAsRead {
display: block;
width: 100%;
- padding: 1em 0;
+ padding: 1em 0 100% 0;
+ padding: 1em 0 100vh 0;
text-align: center;
font-size: 1.4em;
}