Cette page liste toutes les étapes utiles pour la publication de la version 0.5.0 (non encore publiée).
Dernière ligne droite
Todo dernière ligne droite
- 5' vérifiez que le numéro de version a bien été modifié dans /wakka.php : constante WIKINI_VERSION en début de script (le faire si ce n'est pas le cas)
- 30' modifier éventuellement le script d'installation (dans le cas de nouvelles tables ou autre)
- 120' créer/vérifier la documentation en ligne : DocWikiNi05 (cf. DocDeveloppeurOrganisationDeLaDocWikiNi)
- 120' fabriquer la documentation à intégrer au dépôt SVN
- 5' poser un tag "Nom_de_version_RC1" dans le CVS (comment (à documenter))
- 15' générer les fichiers tar.gz et .zip :
- 5' uploader sur wikini.net pour appeler la communauté à tester
- 15' tester : une nouvelle installation et une mise à jour
- 30' Tester : CasDeTestDeWikiNi (l'idéal serait de pouvoir importer automatiquement ces tests dans un nouveau wiki ; après l'installation, via une fonction d'import)
- s'il reste des problèmes
- corriger et faire une RC2
- tester
- quand il ne reste plus de problèmes après le cycle éventuel de RC
- vérifier que les autres développeurs valident la nouvelle version
- 5' poser un tag "Nom_de_version_release" dans le CVS
- 15' générer les fichiers tar.gz et .zip
- à ce stade, si l'on doit découvrir des problèmes ultérieurement, il faut alors créer une version mineure
- vérifier la page DifferencesEntreWikiNi04EtWikiNi05 (prendre DifferencesEntreWikiNi01103EtWikiNi041 en exemple)
- vérifier la page FonctionnalitesDetaillees05 (prendre FonctionnalitesDetaillees041 en exemple)
- vérifier la page PassageDe04A05 (prendre PassageDe01103A041 en exemple)
Toute dernière minute
- uploader les archives sur wikini.net
- modifier la redirection de la page LaDocumentation : {{include page="DocWikiNi05"}}
- modifier la redirection de la page FonctionnalitesDetaillees : {{include page="FonctionnalitesDetaillees041"}}
- [optionnel] basculer la dernière version en production sur wikini.net
- annoncer (où ?)
- [à voir] verrouiller en lecture seule les pages de documentation de la version qui vient ainsi d'être publiée ; les utilisateurs peuvent y laisser des commentaires à l'instar de la doc. PHP
- [à voir] recopier les pages de doc pour créer à l'avance les pages de la prochaine version ; ces pages seront retravaillées au fur et à mesure de l'élaboration de la nouvelle version
Après la publication
- changer WIKINI_VERSION dans la branche MAIN du CVS pour faire apparaître le numéro de la prochaine version, avec un suffixe -dev pour signifier que c'est une version non officielle, en cours de développement
Hors 0.5 (une 0.6 va sortir quelques semaines après 0.5)
Les pages de documentation manquantes ne seront pas publiées, tant pis.
- 5. faut-il y publier le JS anti-spam fourni par David sachant qu'il bogue avec la prévu... Rappel des problèmes de la solution :
- nécessite Javascript activé
- nécessite aussi Curl (a priori, à lire le code source) ; WikiNi a du succès notamment parce qu'il s'installe sur tout serveur PHP de base, hors Curl n'est pas systématiquement dispo chez tous les hébergeurs : c'est la raison pour laquelle je pense qu'il ne faut pas retenir cette solution
- 2. revoir le stockage des triplets (j'ai quelques détails à redire)
- on devrait plutôt avoir (dans l'esprit, à affiner) :
- on ne devrait pas avoir (ce que j'observe actuellement) : ThisWiki:group:admins, http://www.wikini.net/_vocabulary/acls, "Valeur"
- je pense utile de rajouter dans la table des triplets (je dois murir tout ça et trouver des arguments) :
- la date d'enregistrement du triplet ; permet de versionner, trier des triplets ou tout simplement de dater la création/modification un triplet
- l'utilisateur qui est auteur du triplet ; possibilité de loging, transparence
Contenu de la 0.5
Le contenu de la version 0.5 est maintenant figé. Toute nouvelle fonctionnalité est renvoyée à la version suivante. Le contenu est le suivant :
- [DidierLoiseau] : tout ce qui a été développé jusqu'au 2006-09-22 :
- [ok] Actions sous forme d'objet
- ActionEditActionsACLs? (DiscussionsModeleDeDonneesEvolutif) (fonctionnalité majeure)
- [ok] ajout des triplets (DiscussionsModeleDeDonneesEvolutif)
- [ok] amélioration de l'install (si la base de données n'existe pas, le script essaye de la créer ; si OK, on continue ; si KO, on arrête le script en avertissant l'utilisateur)
- [ok] intégration des bugfix et autres petites améliorations
- [CharlesNepote] définition d'un admin lors de l'installation
- [en cours finalisation] développement (attention : il n'y a pas de contrôle sur les données rentrées par l'utilisateur (à faire) ; ce premier développement permet déjà de créer un admin et de tester toutes les actions qui dépendent de lui)
- documentation wiki (compléter la doc sur l'installation ?)
- [ok] publication dans dépôt SVN
- check up de la ProcedureDeDeveloppementDeWikiNi
- Documentation suivantes :
- [DidierLoiseau] [ok] Ajout de la propriété svn:keywords sur les fichiers qui ne l'avaient pas et suppression de cette propriété sur les pages de doc
Problème de l'ActionEditActionsACLs?
Besoins premiers :
- l'admin tech ne devrait pas avoir à intervenir sur la base (c'est risqué, surtout pour des admin tech qui ne connaissent pas forcément la structure des données)
- les admins fonc ne devraient pas pouvoir se supprimer par erreur ; dans ce cas, il faut éviter au max l'intervention de l'admin tech
Cahier des charges proposé par
CharlesNepote :
- l'admin technique (qui gère le compte FTP) doit facilement pouvoir donner ou retirer les droits d'accès à l'ActionEditActionsACLs? ;
- il existe une catégorie de super-admin fonctionnels qui sont créés (ou pas) par l'admin technique ; ils ne peuvent pas se supprimer entre eux ou supprimer leurs propres droits
- il existe une catégorie d'admin fonctionnels qui sont créés (ou pas) par les super-admin fonc ; ils peuvent se supprimer entre eux ; les super-admin fonc peuvent les supprimer ; ils peuvent se supprimer eux-mêmes
Mise en oeuvre proposée :
- les super-admin fonc sont configurés par l'admin tech dans le fichier de config (optionnel) ; exemples de super-admin : DavidDelon, DidierLoiseau, CharlesNepote, etc.
- les super-admin fonc gèrent ensuite eux-mêmes la création d'admin fonc en donnant leur accès à l'ActionEditActionsACLs? ; exemples d'admin : MisAnge, etc.
- les super-admin fonc et admin fonc gère les droits d'accès aux différentes actions via l'ActionEditActionsACLs?
A l'installation du wiki :
- si l'admin tech n'a rien précisé dans le fichier de config : personne n'a accès à l'ActionEditActionsACLs?
- par défaut certaines actions (comme ActionEraseSpamedComments? ne sont accessible qu'au super-admin ou à personne s'il n'y en a pas)
- si l'admin tech précise un super-admin dans le fichier de config, ce dernier peut ensuite donner à d'autres l'accès à l'ActionEditActionsACLs?
Je ne suis pas pour :
- une solution où les admin puissent se supprimer les uns les autres ; car il faudra que l'admin tech aille modifier la base à la mano pour corriger une éventuelle connerie de ce genre
- une solution où les admin ne puissent pas se supprimer (pour les mêmes raisons)
--
CharlesNepote
Pour moi il n'est vraiment pas nécessaire de sortir une telle infrastructure parce que les risques sont faibles (un admin sait ce qu'il fait normalement) et par conséquent:
- il y a peu de chance que cela pose un problème, donc ce n'est pas trop grave si la seule façon de le résoudre consiste à passer par la db
- ce problème ne se produira pas deux fois (en principe à la première l'admin a compris son erreur...)
En outre je note que de tels mécanismes ne sont pas en place dans d'autres logiciels (je prends pour référence le cas de Linux où un sudoer pourrait supprimer le compte root ainsi que tous les sudoers y compris lui-même...).
Ironiquement je constate que la solution proposée consiste à intervenir sur le fichier de config pour ne pas intervenir sur la base. Personnellement je ne trouve pas ça véritablement mieux... (pour moi il est plus simple d'ouvrir
PhpMyAdmin que de commencer à manipuler des fichiers par ftp...).
- Encore faut-il avoir accès à phpMyAdmin ! Dans de très nombreuses entreprises (et notamment la mienne), il y a une organisation ou la "prod" est séparée du développement. Les développeurs font ce qu'ils veulent sur les plateformes de "dev" et de "recette", mais ils n'ont pas accès à phpMyAdmin sur la plateforme de "prod". Toute modification des bases de prod est effectuée, soit par des applications référencées, soit par les admin dba -- avec, pour chaque demande, des délais en conséquence. (Beaucoup d'opérations sont ainsi interdites en prod : créations/suppressions de tables, etc.) En revanche, il est assez simple pour les développeurs de publier en prod un fichier modifié (en utilisant un outil de publication ad hoc basé sur SVN (je ne rentre pas dans les détails)). Bien sûr ce modèle ne concerne pas forcément les petites entreprises ou les hébergements mutualisés, mais il est extrêmement répandu dans les grandes entreprises. Si bien que dans ce cas, il est, de loin, beaucoup plus simple et sans délai, de modifier un fichier.
- Je comprend tout à fait ton argument sur la séparation production/développement, qui est tout à fait logique et classique. Cependant il faut bien faire attention au problème auquel on s'adresse ici hein: c'est un cas où l'admin, qui est supposé responsable, fout la m***e soit par ignorance (mais alors pourquoi l'avoir mis comme admin s'il ne sait pas se servir de l'outil ?), soit par volonté pure de foutre tout par terre. Franchement, je ne vois pas pourquoi on devrait se soucier d'un problème pareil. WikiNi n'a absolument pas pour objectif d'être un outil à très haut niveau de sécurité où chaque opération doit être contrôlée et validée, bien au contraire d'ailleurs si on vise la simplification.
- Par ailleurs, puisque j'ai actuellement l'occasion de découvrir comment fonctionne un logiciel de gestion (TinyERP?, même si ce n'est pas encore une référence) dans le cadre de mon stage, j'ai demandé ce qu'il en était au niveau de la gestion des admins. La réponse est simple: si un admin supprime tout les admins, tant pis, il faut passer par la db pour résoudre le problème. De toute façon ça ne devrait jamais arriver... -- DidierLoiseau
- Par ailleurs, beaucoup d'utilisateurs de WikiNi l'ont justement choisi parce qu'il présente une installation facile, sans avoir à utiliser phpMyAdmin. As-tu pensé que beaucoup d'entre eux n'ont peut-être jamais utilisé phpMyAdmin, dont l'utilisation n'est vraiment pas évidente pour un non informaticien -- sans compter le côté abscon de SQL. En revanche, ces utilisateurs ont forcément utilisé FTP et savent au minimum utiliser un éditeur de texte. Très franchement, WikiNi n'aurait été que pour moi, j'aurais sérieusement réfléchit à ta solution, mais l'intérêt de WikiNi est justement de s'adresser à des non spécialistes.
- Je pense aussi que beaucoup des utilisateurs qui choisissent WikiNi pour sa simplicité n'ont même jamais fait de php et osent à peine toucher au fichier de configuration. Dès lors ce genre de protection ne s'adresse certainement pas à eux, à moins que ce soit proposé lors de l'installation mais alors il faut que cela ne complique pas celle-ci... -- DidierLoiseau
- Avis personnel : pour un pirate, il est plus facile d'attaquer une base qu'un fichier. -- CharlesNepote
- Peut-être... Du moins si c'est le cas c'est dû au fait que la plupart des logiciels multi-utilisateurs font plus d'accès aux bases de données que aux fichiers, et que, de ce fait, les failles ont plus de chances de se retrouver dans l'accès aux base de données. De toute façon on doit nécessairement avoir une partie de la gestion des droits qui se fait via la BDD, pour des raisons de simplicité (on ne peut pas modifier le fichier de config juste pour ajouter un utilisateur dans un groupe...). Par conséquent si un pirate parvient à avoir un accès à un niveau élevé de la sécurité, qu'il vire tous les admins ne changera plus grand chose: il pourra déjà faire tout le mal qu'il veut par d'autres moyens. Par ailleurs il me semble que le risque de piratage n'est pas très élevé pour un wiki (parce que cela ne présente pas grand intérêt vu que les pages peuvent déjà être modifiées librement...). -- DidierLoiseau
Par ailleurs je n'aime pas trop cette solution parce qu'elle complique assez la gestion des droits alors qu'il n'y a pas de demande avérée pour un tel mécanisme. Le besoin traduit plus une crainte qu'un problème véritable... Je ressors ici mon bouquin d'XP pour l'occasion et celui-ci me dit «Pas d'investissements spéculatifs» ou encore «YAGNI», à savoir qu'il ne faut rien coder parce qu'on pense qu'on en aura besoin, mais uniquement se dont on a besoin (sinon on perd son temps au risque que cela cause en plus d'autres problèmes plus tard).
Pour poursuivre sur XP, et si on veut vraiment une solution qui satisfasse tout de même ces besoins, alors DTSTTCPW: interdisons à un utilisateur de se retirer lui-même du groupe admin. Même s'il retire tous les autres, il pourra encore les remettre dedans par la suite. De plus faisons du groupe admin un vrai groupe aux pleins pouvoirs, c'est à dire dont les membres satisfont n'importe quel test CheckACL.
--
DidierLoiseau
- Que se passe-t-il si, avec le temps, le seul admin qui reste quitte l'entreprise ou disparaît dans la nature (c'est assez fréquent, il suffit de regarder tous les développeurs WikiNi hyper motivés dont on n'a plus aucune nouvelle...). A nouveau, il faut repasser par la base, etc. -- CharlesNepote
- Ton scénario me paraît assez farfelu: un admin supprime tous les autres admins, le temps se passe et personne ne se rend compte de rien, puis l'admin en question s'en va... De nouveau cela n'a aucune chance de se produire à part si l'admin veut emm****r son monde... Et de toute façon le problème reste le même avec le fichier de config: il faudra un admin technique pour aller rétablir un admin fonctionnel. Par ailleurs l'exemple de WikiNi montre bien que passer par une base de données n'est pas un problème puisque, lorsque j'ai demandé les droits d'admin (pour Gna!), David, bien qu'assez distant par rapport au projet, a assez rapidement pu me les donner: lorsque le ou les admins deviennent distant par rapport à ce qu'ils administrent, ils (con)cèdent logiquement les droits à une personne plus disponible. -- DidierLoiseau
Franchement, je trouve qu'on pinaille un peu. D'après ce que je comprends, l'unique différence entre nos deux solutions est que dans ma proposition on ajoute un petit test à la con pour savoir si l'utilisateur n'est pas enregistré dans le fichier de config. S'il y a 3 lignes de codes qui diffèrent, c'est, je pense, le bout du monde. Si tu y es absolument opposé je me range à ton avis, je ferais les hack nécessaires pour mes déploiements... N'hésite pas à décrire ta solution complètement pour que tout le monde puisse bien comprendre. --
CharlesNepote
- Oui je suis d'accord que cela ne sert à rien de discuter autant là dessus. J'aurais comme toi voulu l'avis d'une troisième personne mais bon... Maintenant que j'y pense, ta solution n'est peut-être pas si compliquée que cela à réaliser, mais je continue de croire qu'un tel système n'est absolument pas nécessaire. Après tout pourquoi pas proposer cela comme une contribution externe ? Si quelqu'un a un jour un problème avec ses admins, on lui suggérera d'installer cette contribution. -- DidierLoiseau.
- Ok. On réalise ta solution et on intègrera la mienne en 0.6 si nécessaire. -- CharlesNepote
Pour détailler ma solution, c'est en fait assez simple, mais cela se base sur une vision omnipotente des admins:
- Les admins sont les utilisateurs qui font parti du groupe "admin"
- Pour l'instant, la seule particularité du groupe admin est qu'il est utilisé comme groupe par défaut pour les actions d'administration. Mis à part cela, il s'agit d'un groupe comme les autres.
- Pour créer un nouvel admin, il suffit simplement d'ajouter un utilisateur au groupe admins.
- Les admins ont tous les droits :
- éditer/consulter/commenter toutes les pages, même celles qui sont protégées.
- Utiliser toutes les actions, tous les handlers, même si on spécifie le contraire. Si de nouvelles opérations protégées par des droits sont définies, cela s'applique aussi. Ainsi il n'est plus nécessaire de s'assurer que les admins ont bien l'accès, et les admins jouent un vrai rôle d'administrateurs.
- De là, l'accès à l'action editactionsacls est assuré pour les admins, il n'y a plus de risque qu'un admin empêche les admins d'accéder au wiki et à toute ses fonctionnalités (ceci me parait beaucoup plus important que de s'assurer que personne ne supprime les admins)
L'implémentation
- est en soi assez simple: CheckACL renvoie toujours vrai pour les admins, c'est la première vérification qu'elle fait. (il faut juste coder le truc pour pas que ça boucle entre CheckACL et UserIsAdmin)
- Dans la gestion des groupes d'utilisateurs, on ajoute un test pour s'assurer que lorsqu'un utilisateur modifie le groupe admin, il était admin avant (UserIsAdmin) et le sera toujours après (CheckACL($_POST['acl'])). Dès lors il y aura toujours au moins un admin et celui-ci aura accès à tout et sera donc en mesure de rétablir les autres admins s'il les a retirés par erreur.
--
DidierLoiseau
- Comment créé-t-on un admin à l'install ? -- CharlesNepote
- Ce n'est pas encore possible. Comme je l'ai dit il y a quelques jours (et encore aujourd'hui) sur la mailing liste, cela reste à faire, si quelqu'un a le temps, qu'il le dise et le fasse. Sinon je le ferai... -- DidierLoiseau
- Non, je ne te demandais pas comment on le met en oeuvre, mais comment cela se passe fonctionnellement...
Je propose :
1. Si installation
- le système demande de créer un compte administrateur
- MotWiki
- mot de passe (2 fois)
- adresse e-mail
- explication : "le compte administrateur permet de :
- modifier et supprimer n'importe quelle page
- modifier les droits d'accès à n'importe quelle page
- gérer les droits d'accès à n'importe quelle action ou handler
- gérer les groupes
- ajouter/supprimer des utilisateurs au groupe administrateur (ayant les mêmes droits que lui)
- toutes les tâches d'administration sont décrites dans la page "AdministrationDeWikiNi?" accessible depuis la page d'accueil
- création du compte
- création du groupe admin dans lequel on place le compte
- création de la page AdministrationDeWikiNi? + affectation de la propriété à l'admin + réglage des droits en lecture seule
2. Si mise à jour de
WikiNi 0.4
- le système demande de créer un compte administrateur (on n'évite d'utiliser un compte existant car l'admin tech n'a pas forcément déjà créé un compte)
- MotWiki
- mot de passe (2 fois)
- adresse e-mail
- vérification que le compte n'existe pas déjà
- explication : "le compte administrateur permet de :
- modifier et supprimer n'importe quelle page
- modifier les droits d'accès à n'importe quelle page
- gérer les droits d'accès à n'importe quelle action ou handler
- gérer les groupes
- ajouter/supprimer des utilisateurs au groupe administrateur (ayant les mêmes droits que lui)
- toutes les tâches d'administration sont décrites dans la page "AdministrationDeWikiNi?" accessible depuis la page d'accueil
- création du compte
- création du groupe admin dans lequel on place le compte
- création de la page AdministrationDeWikiNi? + affectation de la propriété à l'admin + réglage des droits en lecture seule (que faire si elle existe déjà ????)
3. Si mise à jour de
WikiNi 0.5
- teste de l'existence du groupe admin
- installation classique (que se passe-t-il si la page AdministrationDeWikiNi? a changé dans la nouvelle version installée ?)
Discussions
Pour publier rapidement une version 0.5 propre, nous sommes remontés à la version du 2006-09-22 du trunck :
- avant la création des thèmes
- avant la création des actions sous forme d'objet (car plus complexe et pas encore documenté (voir GererLesActionsSousFormeDObjets))
- ajoute les fonctionnalités suivantes : (hors les corrections de bogues et les améliorations mineures que je ne mentionne pas)
- amélioration de la compatibilité XHTML 1.0 Strict
- rajouter <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> à la place de <html> dans le header (à terme dans l'installation offrir l'option lang="_ _")
- Optimisation et amélioration de la fonction de purge des vieilles versions (fonctionnalité majeure car elle rend impossible de perdre des infos à cause de page spammées)
- Corrections multiples pour une meilleure gestion des commentaires
- Ajout du style "page_preview", spécifique à la prévisualisation.
- les actions sous forme d'objets
- ActionEditActionsACLs? (DiscussionsModeleDeDonneesEvolutif) (fonctionnalité majeure)
- ajout des triplets (DiscussionsModeleDeDonneesEvolutif)
- amélioration de l'install (si la base de données n'existe pas, le script essaye de la créer ; si OK, on continue ; si KO, on arrête le script en avertissant l'utilisateur)
- Ajout de la possibilité de désactiver le HTML brut, ce qui sera la configuration par défaut
Nous y avons ajouté diverses fonctionnalités décrites plus haut.
Relayé pour la version 0.6 :
- action de carto SVG (en + du handler)
- [...] un test de turing basique pour l'inscription (au minimum la version proposée par YannLeGuennec) (+ paramétrage permettant la lecture seulement pour les inscrits ?)
- http://c2.com/cgi/wiki?DelayedIndexing
- du fait de la recrue du spam sur wikini :
- améliorer la fonction de suppression des pages pour permettre à un admin de supprimer une page même si elle est liée par d'autres pages
- retour à la version antérieure d'une page comme sur wikimédia ?
- Meilleure gestion des logs ?
- solution 1 :
- passer le champ "body" au format "mediumtext" (16 Mo) et définir le nom d'une page de log en dur (genre LogDesActionsDesAdmins) (cette page peut être purgée manuellement de temps à autre)
- toute action de l'admin ajoute une ligne descriptive à la page LogDesActionsDesAdmins
- solution 2 : enregistrer les données dans la table des triplets avec une notation simplifiée :
- tel moment (date+id), a vu comme opération d'administration, "telle opération par untel"
- solution 3 : enregistrer tous les objets/attributs dans la table des triplets (réifications nécessaires)
- solution 4 : enregistrer tous les objets/attributs dans la table des quintuplets (remplaçante des triplets), sans réification
- note : un quintuplet est composé de [date], [auteur], [sujet], [propriété], [valeur]
Lister quelque part toutes les possibilités rendues possibles par la création des acls sur les actions et les handler :
- action ou handler de sauvegarde de la base (comme dans SPIP)
- action ou handler de restauration de la base
- handler appendcontent pour ajouter du contenu par un robot ou un outil en mode REST
- ...
Pour archives à reclasser
- 1. prévenir l'omnipotence des administrateurs en rendant toutes leurs actions transparentes (fonction de log à développer)
- besoins : traçabilité des informations suivantes :
- à telle date, telle personne a déclaré : tel page ou commentaire a été supprimée (handler deletepage)
- à telle date, telle personne a déclaré : telle action a pour acls telle liste de personnes ou groupes (action editactionsacls)
- à telle date, telle personne a déclaré : telle page a pour acls telle liste de personnes ou groupes (handler acls)
- à telle date, telle personne a déclaré : telle personne appartient à tel groupe (action editgroup)
- à telle date, telle personne a déclaré : telle personne n'appartient plus à tel groupe (action editgroup)
- ces deux dernières infos peuvent être simplifiées : à telle date, telle personne a déclaré : tel groupe est composé de telle liste de personnes ou groupes (action editgroup) ; mais alors on n'a pas de traçabilité sur les changements de composition du groupe
- éventuellement telle personne a modifié telle page à telle date
- idéalement telle personne a installé tel nouveau plug-in
- idéalement, le log est consultable par tous à un endroit facile d'accès (DerniersChangements ?)
- solution 0 : toute action de l'admin ajoute une ligne descriptive à la page LogDesActionsDesAdmins + date du jour ; à 64 Ko la page, cela permet de stocker plusieurs centaines d'actions par jour (éventuellement on peut ajouter un test qui empêche toute opération d'admin si la page est pleine)
- => Je pense que c'est la solution que nous pouvons retenir en attendant mieux. Il sera toujours temps d'améliorer ce fonctionnement ultérieurement. -- CharlesNepote
- mise en oeuvre : ajout de la méthode AppendContentToPage($content, $page) dans le noyau
- + ajout de la méthode LogAdministrativeAction($date, $user, $content)
- + codage du log dans chaque handler/action d'administration : delete.php, editactionsacls.class.php, editgroups.class.php, edithandlersacls.class.php, erasespamedcomments.class.php