Repository navigation
OctoGuard : le cran « Retenir » et Signalements dans OctoGuard (lot 2) - #951
Merged
Merged
Conversation
Lot 2 de la mise en conformité avec la maquette validée (CDC E4h, D17). Le 5e cran, entre Signaler et Avertir. Un contenu retenu n'est jamais écrit dans channel_messages, posts ou threads : il attend dans octoguard_held (migration 131), invisible de tous sauf de son auteur (« en attente de validation ») et de l'équipe. Il n'est publié qu'à l'approbation, par les mêmes modèles que la publication normale. Rien à filtrer dans les lectures existantes (historique, recherche, mentions, aperçus), donc rien ne fuit. - Chat, réponse du forum, nouveau fil et modification d'un message. Profils, sondages et wiki n'ont pas d'attente : la règle y signale, ce que l'écran de la règle annonce. - Décision atomique (UPDATE ... WHERE status = 'pending') : deux clics simultanés ne publient qu'une fois. On ne relit pas son propre contenu, garde-fou de rang comme pour les signalements. - D17 : sans décision au bout de 72 h, refus automatique, l'auteur est prévenu (en direct et par notification). L'auteur ne voit jamais le nom de la règle (D20). - Signalements rejoint OctoGuard (page à trois colonnes de la maquette) : À traiter, À relire, Traités. L'ancienne adresse /admin/reports y mène. Le compteur du menu compte aussi les messages à relire. - Modèles : Jeunesse retient les liens des comptes neufs, Jeu compétitif retient les invitations, comme la maquette. Deux trous trouvés au banc d'essai, présents avant ce lot, corrigés : le moteur lisait l'aperçu des signalements au lieu du texte du forum et du wiki, donc un lien caché derrière un texte (« ici ») échappait aux règles de liens, et tout ce qui suivait les 1000 premiers caractères n'était pas lu (textForModeration).
- Déni de service : le lecteur du texte du forum (textForModeration) tournait sur le contenu brut, avant nettoyage, avec des expressions régulières qui reviennent en arrière. 40 000 « <a href> » jamais fermés bloquaient tout le cœur plus de deux minutes. Réécrit en un passage : 880 ms pour 480 Ko, et le cœur répond aux autres pendant ce temps. Même durcissement pour le lecteur de l'écran de l'équipe. - Le moteur lit désormais tout le message (avant : 1000 caractères). Mesuré : 90 ms au pire pour les 7 règles sur 500 Ko hostiles. - Inondation de la file : 5 contenus en attente au plus par auteur, la limite est dans la requête d'insertion. Au-delà, refus avec un motif. - Jamais de publication sur un échec : si la mise en attente échoue, le contenu est refusé (avant, chat et forum le publiaient). - Approuver ne contourne plus un bannissement ni un verrouillage intervenus depuis (409 AUTHOR_BANNED / THREAD_LOCKED). - Le texte d'un contenu refusé ou expiré est effacé 30 jours après la décision (le journal garde l'extrait). - Forum : une modification refusée par OctoGuard ne ferme plus l'éditeur en silence en perdant le texte ; le motif s'affiche.
This was referenced Nov 7, 2026
Relecture du 07/11, avant fusion. - La publication d'un contenu retenu enchaînait plusieurs écritures sans transaction. Une erreur APRÈS la création (points de réputation, notification, étiquettes, cache) faisait croire que rien n'était publié : le contenu repassait en attente et une seconde approbation le publiait deux fois. Désormais, dès que le message ou le fil existe, la publication est acquise ; le reste est fait au mieux et journalisé s'il échoue. - Un nouveau fil dont le premier message échoue est retiré : plus de fil vide laissé derrière. - Le résumé envoyé à l'auteur est borné avant toute expression régulière. - Signalements : « À traiter » vide alors que des messages attendent dans « À relire » (le compteur du menu les compte) : la page le dit et y mène. Trouvé en testant le parcours d'un modérateur.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Remplace #948, fermée automatiquement par GitHub quand la branche de #947 a été supprimée à la fusion. Même code, reposé sur
main(arbre identique, vérifié pargit diff).Lot 2 de la mise en conformité avec la maquette validée (CDC E4h, D17 validée le 04/11).
Ce que ça change
Le 5e cran, Retenir, entre Signaler et Avertir. Le message n'est pas publié : son auteur le voit « en attente de validation », personne d'autre ne le voit. L'équipe l'approuve (il est publié pour de vrai) ou le refuse. Sans décision au bout de 72 h, il est refusé et l'auteur est prévenu.
Signalements entre dans OctoGuard, avec la page à trois colonnes de la maquette (la file, le contenu, la décision) et les onglets À traiter, À relire, Traités. L'ancienne adresse
/admin/reportsy mène. Le compteur rouge du menu compte aussi les messages à relire. La conversation autour et l'historique des modifications arrivent au lot 3, dans cette même page.Modèles : Jeunesse retient les liens des comptes neufs et Jeu compétitif retient les invitations, comme le montre la maquette.
Conception
Un contenu retenu n'est jamais écrit dans
channel_messages,postsouthreads. Il attend dansoctoguard_held(migration 131) et n'est publié qu'à l'approbation, par les mêmes modèles que la publication normale. Aucune lecture existante (historique, recherche, mentions, aperçus, notifications) n'a donc à être filtrée : rien ne peut fuiter.La décision est atomique (
UPDATE ... WHERE status = 'pending' RETURNING) : deux membres de l'équipe qui cliquent en même temps ne publient qu'une fois. On ne relit pas son propre contenu, et le garde-fou de rang est le même que pour les signalements.Deux trous trouvés au banc d'essai, présents avant cette PR
Le moteur lisait l'aperçu des signalements au lieu du texte complet du forum et du wiki :
Corrigé par
textForModeration. Le test de régression tombe sur l'ancien code.Preuves