New package: phpList newsletter server. Work in progress, help welcome

Hi all,

I started a phplist package for Yunohost. phpList is a newsletter/mailing list app which is on the Yunohost whishlist. It’s nearly usable but some help would be welcome to resolve the remaining issues detailed below (sorry, it’s long).

By using the template app and the guidelines, it was more or less straightforward to get the app to install and run without SSO (more on SSO below), although the appearance of the site is broken for non-logged-in users (visitors) which is not ideal. This is presumably due to some filtering operated by yunohost, since the web console reports a buch of errors of the type

The resource from “https://mydomain.tld/yunohost/sso/?r=XXXX[...]XXXXXX==” was blocked due to MIME type (“text/html”) mismatch (X-Content-Type-Options: nosniff).

for these non-logged-in connections. I’m not proficient enough in web servers to figure how to fix this, and some help on this would be welcome.

For this packaging, I nevertheless found that the guideline sorely lacked even basic information on how to adequately setup the SSO and other details such as Fail2ban or php-fpm. I could gather some scarce information here in the forum, but it took me very long to find, and I’m not sure the present setup is fully correct.

For my use case of phplist, I want that only a subset of my users have the right to manage phplist (defining lists, sending mails, etc.). Visitors and non-admin users should only have the possibility to sign in (or opt out) for receiving newsletters. I got SSO working based on HTTP auth (that is, when the php dictionary string $_SERVER['REMOTE_USER'] is non-empty), but that does not distinguish users that have phplist admin permissions and those that do not and, as a result, all users that are identified in Yunohost SSO end up logged in as phplist superusers (although Yunohost correctly prevents “normal users” from accessing the admin page). Clearly that’s not what I want. In order to avoid this I can give phplist access only to the visitors group and my phplist admins but not to the all_users group. That achieves more or less what I want, although non-admin users may not understand why they cannot access the subscription page while logged in yunohost.

Now, if I want to improve on that last point, is there a way to setup SSO or nginx.conf such that the $_SERVER dictionary in php carries some info about the user actual user permission on the app being accessed? If not, I understand that I can I recourse to LDAP to get the actual user permissions, but can someone point me to a php ynh app that does a simple ldap authentication, so that I can borrow the code there?

The other issue I face is setting up Fail2ban, for which help would also be welcome.

Bonjour,

J’ai commencé un package phplist pour Yunohost. phpList est une application de newsletter/liste de diffusion qui figure sur la “Yunohost whishlist”. C’est quasiment utilisable mais un peu d’aide serait bienvenue pour résoudre quelques soucis détaillés ci-dessous (désolé c’est long).

En utilisant le modèle d’application et les instructions pour le packaging, il a été relativement direct d’arriver à ce que l’application s’installe et fonctionne sans SSO (plus d’informations sur le SSO ci-dessous), bien que l’apparence du site soit cassée pour les utilisateurs non connectés (visiteurs), ce qui n’est pas idéal. Cela est probablement dû à un certain filtrage opéré par yunohost, puisque la console web signale plein d’erreurs du type

The resource from “https://mydomain.tld/yunohost/sso/?r=XXXX[...]XXXXXX==” was blocked due to MIME type (“text/html”) mismatch (X-Content-Type-Options: nosniff).

pour ces connexions hors login yunohost. Je ne suis pas assez compétent en matière de serveurs web pour savoir comment résoudre ce problème, et de l’aide à ce sujet serait la bienvenue.

Pour ce package, j’ai néanmoins trouvé que les instructions manquaient cruellement d’informations de base sur la façon de configurer correctement le SSO et d’autres détails tels que Fail2ban ou php-fpm. J’ai pu rassembler quelques rares informations ici dans le forum, mais il m’a fallu beaucoup de temps pour les trouver, et je ne suis pas sûr que la configuration actuelle soit entièrement correcte.

Pour mon utilisation de phplist, je veux que seul un sous-ensemble de mes utilisateurs ait le droit de gérer phplist (définition des listes, envoi de mails, etc.). Les visiteurs et les utilisateurs non administrateurs devraient seulement avoir la possibilité de s’inscrire (ou de se désinscrire) pour recevoir des bulletins d’information. Le SSO que j’ai implémenté utilise l’authentification HTTP (c’est-à-dire lorsque l’entrée de dictionnaire php $_SERVER['REMOTE_USER'] est non vide), mais cela ne distingue pas les utilisateurs qui ont les droits d’administration de phplist de ceux qui ne les ont pas et, par conséquent, tous les utilisateurs qui sont identifiés dans le SSO de Yunohost se retrouvent super-utilisateurs de phplist (même si Yunohost empêche bien l’accès des “utilisateurs normaux” à la page d’administration). Clairement, ce n’est pas ce que je veux. Pour éviter cela, je peux donner l’accès à phplist uniquement au groupe de visiteurs et à mes administrateurs phplist mais pas au groupe all_users. Cela permet d’obtenir plus ou moins ce que je veux, bien que les utilisateurs non-administrateurs puissent ne pas comprendre pourquoi ils ne peuvent pas accéder à la page des abonnements pendant qu’ils sont connectés à yunohost.

Maintenant, si je veux améliorer ce dernier point, y a-t-il un moyen de configurer SSO ou nginx.conf de telle sorte que dans php, le dictionnaire $_SERVER contienne des informations sur les droits d’accès de l’utilisateur pour l’application à laquelle il accède ? Sinon, on peut recourir à LDAP pour obtenir les droits d’accès réels, mais quelqu’un peut-il m’indiquer une application php ynh qui fait une authentification ldap toute simple, afin que je puisse y emprunter le code ?

L’autre problème auquel je suis confronté est la mise en place de Fail2ban, pour laquelle de l’aide serait également la bienvenue.

4 Likes

Effectivement ça parraît bancal

Est-ce que tu as vu qu’il est possible d’ajouter des permissions supplémentaire (typiquement pour restreindre l’accès à une interface d’admin) avec le nouveau système de permission de la 4.1 ? Plus de détails dans https://yunohost.org/packaging_apps_permissions (ou normalement aussi dans l’app d’exemple)

(Par contre ça suppose généralement que la partie admin est dans un sous-chemin clairement identifié comme /admin) (en absolu, https://domain.tld/chemindelapp/admin)

À mon avis la piste du LDAP est mieux oui (à voir ensuite comment PHPlist intègre ça). Tu peux je pense t’inspirer de la conf LDAP de Nextcloud ici : https://github.com/YunoHost-Apps/nextcloud_ynh/blob/new-permissions-system/conf/config.json#L16-L41 (c’est la version dans une branche qui gère notamment le nouveau mécanisme de permission, c.f. le ldap_login_filter). Par contre l’intégration varie vraiment beaucoup en fonction des apps (même pour PHP) car dépends des framework utilisés par l’app … Mais les settings sont généralement un peu toujours les mêmes-mais-en-différents

(Aussi à défaut d’avoir une doc sur le packaging exhaustive, claire et à jour, n’hésite pas à venir sur le chat pour discuter avec d’autres packageurs qui pourront te débloquer : Salons de discussions | Yunohost Documentation)

Merci Aleks pour le lien nextcloud. A première vu c’est assez complexe, il faut que je prenne le temps de m’y plonger.

En attendant, j’ai trouvé comment causer à LDAP depuis php et j’ai bricolé un truc qui vérifie simplement si le REMOTE_USER a la permission “phplist.admin” ou pas dans LDAP. Ca pourrait faire l’affaire, mais il faut tester plus sérieusement et j’ai pas encore les bonnes techniques pour déboguer du php en live dans yunohost. Si quelqu’un à des sugestions, je suis preneur.

Et puis il reste aussi à régler le pb de l’affichage défectueux du site pour les visiteurs. Le site fonctionne, mais il n’y a aucune déco, aucune mise en forme (et plein d’erreurs dans la console web du browser)… Par contre tout est OK si on est identifié dans yunohost.

En tout cas j’invite ceux qui veulent à tester ce package (dans une vm, c’est plus prudent pour le moment).

Ok, I understand why the display is broken for visitors : the index.php invokes js files that are in subdirs of the admin directory, which I have asked yunohost to protect. So it’s working as expected from the point of view of yunohost. I’ll try to see if it is not too complicated to reorganize the directory structure so that js files get exposed properly.

Besides that cosmetic detail, my tests show that SSO it now working as expected. Please test and let me know of any problem.

1 Like

In principle, the ui issue for visitors is now fixed. Testing and reports welcome.

As said earlier, Fail2ban is not presently configured for this app. Security is still provided by Yunohost SSO: only users who are granted the phplist admin permission are allowed to manage recipient lists, compose and send emails etc… All others are considered visitors (and their self-registration can be protected by a captcha to avoids bots).

If anyone can advise on how to configure Fail2ban, I’d be glad to learn.

1 Like