Avatar
Posts 3 13

Bonjour à tous 👋

Je me permets de vous présenter une nouvelle fonctionnalité pour renforcer la sécurité de vos forums Flatboard. Le plugin Registration Code permet de contrôler l'accès à votre communauté et protéger vos espaces de discussion contre les inscriptions non autorisées. Le plugin Registration Code ajoute une couche de protection supplémentaire (mais rudimentaire) en exigeant un code secret pour toute nouvelle inscription. Cette approche vous permet de contrôler la création des comptes sans pour autant fermer les inscriptions :

L'idée est de transmettre à vos membres le code d'accès via un autre canal pour permettre de créer des communautés privées sans avoir besoin de créer manuellement les comptes de chacun.

Le plugin injecte sur la page d'inscription un nouveau champ et override /register en POST pour checker la valeur du code avant de créer l'utilisateur.
Un check est fait directement côté front via le formulaire avec une route API pour comparer le code fourni. Le rate limit de Flatboard est utilisé ainsi que le système de ban pour éviter un bruteforce sur cette route.

Le code peut être défini sur la page des options du plugin dans l'administration du forum. On peut également ajouter un texte d'information sous le champ pour guider l'utilisateur (savoir où / comment trouver le code)

Le code est disponible sur le repo suivant : https://github.com/Ilogeek/flatboard-registrationcode

Je reste disponible si vous avez la moindre question / suggestion.
Bonne fin d'année à tous

  • security Plugins
Avatar
Posts 428 1580

Bonjour @Hugo et merci pour ta contribution.
Donc en gros celà évite d'avoir un mail de confirmation ?
Faut il désactivé dans les paramètres la vérification par mail ?
Bonne année 2026 !

Edited on  Dec 31, 2025  By  Fred .

Avatar
Posts 3 13

Je n’ai peut-être pas été assez clair sur l’objectif de ce plugin. Il faut davantage le voir comme un "code d’invitation" à transmettre aux (futurs) membres de ton forum afin de leur permettre de s’inscrire, sans avoir à fermer les inscriptions ni à créer les comptes manuellement pour eux.

Cas d’usage concret :
  • Je souhaite mettre en place un forum pour ma copropriété.
  • Je veux que les habitants puissent s’inscrire de manière autonome, simplement en leur partageant le lien du forum.
  • En revanche, je ne veux pas que n’importe qui puisse créer un compte : l’accès doit être réservé uniquement aux résidents de l’immeuble.

La solution consiste donc à leur fournir, par e-mail, via un groupe WhatsApp ou encore sur papier lors d’une assemblée générale, un "mot de passe d’inscription". Ce code leur permet de prouver, au moment de la création du compte, qu’ils sont bien légitimes à rejoindre le forum.

Ce plugin n’a aucun impact sur les autres paramètres de sécurité ou de gestion du forum. Par exemple, la validation de l’adresse e-mail demeure tout à fait recommandée, comme tu le suggérais.

En résumé, il s’agit simplement de maintenir les inscriptions ouvertes, tout en restreignant la création de comptes aux seules personnes disposant du code ; autrement dit, aux membres autorisés à accéder aux espaces privés du forum.

Merci pour ton projet et belle année

Avatar
Posts 428 1580

Tout est très clair, je voulais juste une confirmation que cela n'outrepasse pas la vérification par mail 😉

  • Like(1)
    HugoHugo
Avatar
Posts 428 1580

Bonjour @Hugo ,

J'ai analysé le code de votre plugin RegistrationCode. Dans l'ensemble, le plugin est bien structuré et s'appuie correctement sur les APIs natives de Flatboard (hooks, Plugin::getData, RateLimiter, Ban, Logger, Sanitizer, etc.). Voici quelques points qui mériteraient attention.


1. Couplage fort avec RegisterController

Dans handleRegistrationWithCode(), le contrôleur natif est instancié directement :

$registerController = new \App\Controllers\Auth\RegisterController($request, $response);
$registerController->register();

C'est le point le plus fragile du plugin. Si la signature du constructeur ou la méthode register() évolue dans une future version de Flatboard, le plugin se brisera silencieusement.

Préférable : utiliser le trigger view.user.register.validation déjà prévu dans RegisterController pour y injecter la validation du code, et laisser le routage natif gérer la suite. Cela évite complètement de surcharger la route /register.


2. Surcharge de la route /register par regex

Le plugin enregistre :

$router->regex('POST', '#^/register$#', [$this, 'handleRegistrationWithCode']);

Cela entre en concurrence directe avec la route native de Flatboard. Le comportement dépend de l'ordre de résolution du routeur, ce qui peut provoquer des effets de bord imprévisibles selon la version ou la configuration. En utilisant le hook du point 1, cette surcharge devient inutile.


3. Auto-ban dans la couche plugin

La méthode checkRateLimit() crée directement un ban IP via Ban::create() en cas d'abus. Cette logique existe déjà dans les middlewares natifs (RegisterRateLimitMiddleware). Un second mécanisme de ban dans le plugin risque de créer des doublons ou des incohérences avec la gestion des bans existante.

Suggestion : se limiter à retourner une réponse 429 et laisser les middlewares natifs gérer les bans.


4. Instanciation de new Request() dans addValidationScript()

$request = new Request();
if ($request->getUrl() !== '/register') { return; }

Instancier un objet Request dans un hook de vue est inutile. L'URL courante est accessible directement via $_SERVER['REQUEST_URI'] avec un simple parse_url().


5. Garde-fou class_exists('\App\Core\Logger') superflu

if (class_exists('\App\Core\Logger')) {
    \App\Core\Logger::security(...);
}

Logger est une classe du cœur de Flatboard — toujours disponible. Ce contrôle peut être retiré sans risque.


6. Cohérence du nom de vue admin

Flatboard déclenche ce hook dynamiquement sous la forme plugin.view.{viewName}.vars. Le plugin s'abonne à plugin.view.admin.vars, ce qui suppose que le fichier de vue est nommé admin.php. Ce point n'est pas documenté dans le README.md — une mention faciliterait la maintenance.


7. Structure de plugin.json non conventionnelle

Plusieurs champs sont présents mais ignorés par Flatboard :

  • main — non utilisé, c'est class qui est lu
  • category, homepage, repository — non lus nulle part dans le core
  • i18n — ignoré, Flatboard charge les traductions directement depuis langs/{lang}.json
  • compatibility — non vérifié par le core
  • settings — doublon de plugin, seul ce dernier est lu par Plugin::getData()

La structure conventionnelle attendue est : name, id, description, author, email, website, version, date, license, active, priority, class, requires, hooks, permissions, plugin.


8. Partage dans le centre de ressources

Comme mentionné pour le plugin Poll, il serait apprécié que ce plugin soit partagé dans le centre de ressources de Flatboard afin que la communauté puisse en bénéficier, le tester et y contribuer.


Ces remarques visent à rendre le plugin plus robuste face aux évolutions futures de Flatboard. Le travail réalisé est solide dans l'ensemble, notamment sur la sanitisation des entrées, la gestion des traductions et l'utilisation des assets via PluginAssetHelper.

N'hésitez pas si vous avez des questions.

Cordialement Fred.

Edit:

[1.2.0] - 2026-04-05

Ajouté

  • Traduction allemande (de.json)
  • Traduction portugaise (pt.json)
  • Traduction chinoise (zh.json)

Modifié

  • Couverture linguistique complète : toutes les langues natives de Flatboard sont désormais supportées (de, en, fr, pt, zh)
  • Version portée à 1.2.0

[1.1.0] - 2026-04-05

Corrigé

  • Suppression de la surcharge de la route POST /register par regex — le plugin n'entre plus en concurrence avec le routeur natif de Flatboard
  • Suppression de l'instanciation directe de RegisterController qui créait un couplage fort avec le cœur du framework
  • Remplacement de new Request() dans addValidationScript() par une lecture directe de $_SERVER['REQUEST_URI'] via parse_url()
  • Suppression du Ban::create() automatique dans checkRateLimit() — la gestion des bans est désormais entièrement déléguée aux middlewares natifs de Flatboard
  • Suppression du garde-fou class_exists('\\App\\Core\\Logger')Logger est une classe du cœur toujours disponible

Ajouté

  • Hook natif view.user.register.validation pour injecter la validation du code dans le flow d'inscription sans surcharger aucune route
  • Déclaration du hook view.user.register.validation dans plugin.json

Modifié

  • plugin.json réorganisé selon la convention native de Flatboard (ordre des champs aligné sur les plugins du cœur EasyMDE et Logger)
  • Champs non lus par Flatboard supprimés : main, category, homepage, repository, i18n, compatibility, settings
  • Champs conventionnels ajoutés : email, website, date, priority
  • requires.flatboard remplace l'ancien champ compatibility.min_version et passe à >=5.4.0
  • Version portée à 1.1.0

registrationcode-20260405135615.zip

Edited on  Apr 05, 2026  By  Fred .

Visitor, reply to this topic…
Log in to reply
Navigation
5 Posts
post #1
31 Dec 2025
By Utilisateur
Statistics
166
Discussions
911
Replies
21
Flatboarders
4
Contributors
New member : Emmanuel
Online
29 Guests online