<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.hackbbs.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tortukitu</id>
	<title>HackBBS - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hackbbs.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tortukitu"/>
	<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php/Sp%C3%A9cial:Contributions/Tortukitu"/>
	<updated>2026-05-01T14:00:06Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.42.0-alpha</generator>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5627</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5627"/>
		<updated>2013-09-20T16:56:33Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:hackbbs_reloaded_architecture.png]]&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
'''Pour consommer des services de cette couche, il faut TOUJOURS le faire via la facade.'''&lt;br /&gt;
&lt;br /&gt;
Voici un diagramme de classes partiel (il manque les méthodes et les attributs...) de la couche consumer :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:class_diagram_consumer.png]]&lt;br /&gt;
&lt;br /&gt;
Pas d'ORM pour ce projet. Pour savoir comment gérer le relationnel, voir la couche transversale modèle.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
Les différents objets du modèle étendent la classe persistent, ce qui permet de donner à chaque instance un identifiant unique. les relations entre objets se font indirectement via leurs identifiants. Il ne faut pas mettre une instance d'un objet dans la variable d'un autre (ce pour éviter les sauvegardes et les chargement en cascade (et éviter un éventuel chargement paresseux d'expérience casse geule à implémenter et à utiliser...)). On a donc opté pour un chargement dynamique des objets a chaque fois que nécéssaire a partir de leurs dentifiants.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, le coût de cette solution en terme de performances ne devrait pas être un problème.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de relations 1-N, il faut utiliser des arrays d'entiers (identifiants) pour représenter cette relation.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le noyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=Fichier:Class_diagram_consumer.png&amp;diff=5626</id>
		<title>Fichier:Class diagram consumer.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=Fichier:Class_diagram_consumer.png&amp;diff=5626"/>
		<updated>2013-09-20T16:50:26Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : Tortukitu a importé une nouvelle version de « Fichier:Class diagram consumer.png »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagramme des classes de la couche consumer&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=Fichier:Class_diagram_consumer.png&amp;diff=5625</id>
		<title>Fichier:Class diagram consumer.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=Fichier:Class_diagram_consumer.png&amp;diff=5625"/>
		<updated>2013-09-20T16:49:22Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : Tortukitu a importé une nouvelle version de « Fichier:Class diagram consumer.png »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagramme des classes de la couche consumer&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5624</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5624"/>
		<updated>2013-09-20T16:44:28Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:hackbbs_reloaded_architecture.png]]&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
'''Pour consommer des services de cette couche, il faut TOUJOURS le faire via la facade.'''&lt;br /&gt;
&lt;br /&gt;
Voici un diagramme de classes partiel (il manque les méthodes...) de la couche consumer :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:class_diagram_consumer.png]]&lt;br /&gt;
&lt;br /&gt;
Pas d'ORM pour ce projet. Pour savoir comment gérer le relationnel, voir la couche transversale modèle.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
Les différents objets du modèle étendent la classe persistent, ce qui permet de donner à chaque instance un identifiant unique. les relations entre objets se font indirectement via leurs identifiants. Il ne faut pas mettre une instance d'un objet dans la variable d'un autre (ce pour éviter les sauvegardes et les chargement en cascade (et éviter un éventuel chargement paresseux d'expérience casse geule à implémenter et à utiliser...)). On a donc opté pour un chargement dynamique des objets a chaque fois que nécéssaire a partir de leurs dentifiants.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, le coût de cette solution en terme de performances ne devrait pas être un problème.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de relations 1-N, il faut utiliser des arrays d'entiers (identifiants) pour représenter cette relation.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le noyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=Fichier:Class_diagram_consumer.png&amp;diff=5623</id>
		<title>Fichier:Class diagram consumer.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=Fichier:Class_diagram_consumer.png&amp;diff=5623"/>
		<updated>2013-09-20T16:43:52Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : Diagramme des classes de la couche consumer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagramme des classes de la couche consumer&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5622</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5622"/>
		<updated>2013-09-20T16:42:46Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:hackbbs_reloaded_architecture.png]]&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
'''Pour consommer des services de cette couche, il faut TOUJOURS le faire via la facade.'''&lt;br /&gt;
&lt;br /&gt;
Voici un diagramme de classes partiel (il manque les méthodes...) de la couche consumer : hxxp://s24.postimg.org/8pzr4abb9/model.png&lt;br /&gt;
&lt;br /&gt;
Pas d'ORM pour ce projet. Pour savoir comment gérer le relationnel, voir la couche transversale modèle.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
Les différents objets du modèle étendent la classe persistent, ce qui permet de donner à chaque instance un identifiant unique. les relations entre objets se font indirectement via leurs identifiants. Il ne faut pas mettre une instance d'un objet dans la variable d'un autre (ce pour éviter les sauvegardes et les chargement en cascade (et éviter un éventuel chargement paresseux d'expérience casse geule à implémenter et à utiliser...)). On a donc opté pour un chargement dynamique des objets a chaque fois que nécéssaire a partir de leurs dentifiants.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, le coût de cette solution en terme de performances ne devrait pas être un problème.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de relations 1-N, il faut utiliser des arrays d'entiers (identifiants) pour représenter cette relation.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le noyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=Fichier:Hackbbs_reloaded_architecture.png&amp;diff=5621</id>
		<title>Fichier:Hackbbs reloaded architecture.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=Fichier:Hackbbs_reloaded_architecture.png&amp;diff=5621"/>
		<updated>2013-09-20T16:41:53Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : Description de l'architecture de hackbbs reloaded&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Description de l'architecture de hackbbs reloaded&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5620</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5620"/>
		<updated>2013-09-20T13:10:54Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
'''Pour consommer des services de cette couche, il faut TOUJOURS le faire via la facade.'''&lt;br /&gt;
&lt;br /&gt;
Voici un diagramme de classes partiel (il manque les méthodes...) de la couche consumer : hxxp://s24.postimg.org/8pzr4abb9/model.png&lt;br /&gt;
&lt;br /&gt;
Pas d'ORM pour ce projet. Pour savoir comment gérer le relationnel, voir la couche transversale modèle.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
Les différents objets du modèle étendent la classe persistent, ce qui permet de donner à chaque instance un identifiant unique. les relations entre objets se font indirectement via leurs identifiants. Il ne faut pas mettre une instance d'un objet dans la variable d'un autre (ce pour éviter les sauvegardes et les chargement en cascade (et éviter un éventuel chargement paresseux d'expérience casse geule à implémenter et à utiliser...)). On a donc opté pour un chargement dynamique des objets a chaque fois que nécéssaire a partir de leurs dentifiants.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, le coût de cette solution en terme de performances ne devrait pas être un problème.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de relations 1-N, il faut utiliser des arrays d'entiers (identifiants) pour représenter cette relation.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le noyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5619</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5619"/>
		<updated>2013-09-20T13:09:54Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
'''Pour consommer des services de cette couche, il faut TOUJOURS le faire via la facade.'''&lt;br /&gt;
&lt;br /&gt;
Voici un diagramme de classes partiel (il manque les méthodes...) de la couche consumer : hxxp://s24.postimg.org/8pzr4abb9/model.png&lt;br /&gt;
&lt;br /&gt;
Pas d'ORM pour ce projet. Pour savoir comment gérer le relationnel, voir la couche transversale modèle.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
Les différents objets du modèle étendent la classe persistent, ce qui permet de donner à chaque instance un identifiant unique. les relations entre objets se font indirectement via leurs identifiants. Il ne faut pas mettre une instance d'un objet dans la variable d'un autre (ce pour éviter les sauvegardes et les chargement en cascade (et éviter un éventuel chargement paresseux d'expérience casse geule à implémenter et à utiliser...)). On a donc opté pour un chargement dynamique des objets a chaque fois que nécéssaire a partir de leurs dentifiants.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, le coût de cette solution en terme de performances ne devrait pas être un problème.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de relations 1-N, il faut utiliser des arrays d'entiers (identifiants) pour représenter cette relation.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5618</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5618"/>
		<updated>2013-09-20T13:04:57Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
'''Pour consommer des services de cette couche, il faut TOUJOURS le faire via la facade.'''&lt;br /&gt;
&lt;br /&gt;
Voici un diagramme de classes partiel (il manque les méthodes...) de la couche consumer : hxxp://s24.postimg.org/8pzr4abb9/model.png&lt;br /&gt;
&lt;br /&gt;
Pas d'ORM pour ce projet. Pour savoir comment gérer le relationnel, voir la couche transversale modèle.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ATTENTION !&amp;lt;/span&amp;gt; Il faut penser à gérer la concurence dans cette couche.''' Que se passe t-il en cas de modifications parallèle puis de sauvegarde en base ? Est-ce que le dernier a avoir modifié écrase le travail du précédent ?&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
Les différents objets du modèle étendent la classe persistent, ce qui permet de donner à chaque instance un identifiant unique. les relations entre objets se font indirectement via leurs identifiants. Il ne faut pas mettre une instance d'un objet dans la variable d'un autre (ce pour éviter les sauvegardes et les chargement en cascade (et éviter un éventuel chargement paresseux d'expérience casse geule à implémenter et à utiliser...)). On a donc opté pour un chargement dynamique des objets a chaque fois que nécéssaire a partir de leurs dentifiants.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, le coût de cette solution en terme de performances ne devrait pas être un problème.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de relations 1-N, il faut utiliser des arrays d'entiers (identifiants) pour représenter cette relation.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5617</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5617"/>
		<updated>2013-09-20T13:03:32Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
'''Pour consommer des services de cette couche, il faut TOUJOURS le faire via la facade.'''&lt;br /&gt;
&lt;br /&gt;
Voici un diagramme de classes partiel (il manque les méthodes...) de la couche consumer : hxxp://s24.postimg.org/8pzr4abb9/model.png&lt;br /&gt;
&lt;br /&gt;
Pas d'ORM pour ce projet. Pour savoir comment gérer le relationnel, voir la couche transversale modèle.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ATTENTION !&amp;lt;/span&amp;gt; Il faut penser à gérer la concurence dans cette couche.''' Que se passe t-il en cas de modifications parallèle puis de sauvegarde en base ? Est-ce que le dernier a avoir modifié écrase le travail du précédent ?&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
Les différents objets du modèle étendent la classe persistent, ce qui permet de donner à chaque instance un identifiant unique. les relations entre objets se font indirectement via leurs identifiants. Il ne faut pas mettre une instance d'un objet dans la variable d'un autre (ce pour éviter les sauvegardes et les chargement en cascade (et éviter un éventuel chargement paresseux d'expérience casse geule à implémenter et à utiliser...)). On a donc opté pour un chargement dynamique des objets a chaque fois que nécéssaire a partir de leurs dentifiants.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de relations 1-N, il faut utiliser des arrays d'entiers (identifiants) pour représenter cette relation.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5616</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5616"/>
		<updated>2013-09-20T13:00:32Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
'''Pour consommer des services de cette couche, il faut TOUJOURS le faire via la facade.'''&lt;br /&gt;
&lt;br /&gt;
Voici un diagramme de classes partiel (il manque les méthodes...) de la couche consumer : hxxp://s24.postimg.org/8pzr4abb9/model.png&lt;br /&gt;
&lt;br /&gt;
Pas d'ORM pour ce projet. Pour savoir comment gérer le relationnel, voir la couche transversale modèle.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ATTENTION !&amp;lt;/span&amp;gt; Il faut penser à gérer la concurence dans cette couche. Que se passe t-il en cas de modifications parallèle puis de sauvegarde en base ? Est-ce que le dernier a avoir modifié écrase le travail du précédent ?'''&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
Les différents objets du modèle étendent la classe persistent, ce qui permet de donner à chaque instance un identifiant unique. &lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5615</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5615"/>
		<updated>2013-09-20T12:52:18Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
'''Pour consommer des services de cette couche, il faut TOUJOURS le faire via la facade.'''&lt;br /&gt;
&lt;br /&gt;
Voici un diagramme de classes partiel (il manque les méthodes...) de la couche consumer : hxxp://s24.postimg.org/8pzr4abb9/model.png&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5614</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5614"/>
		<updated>2013-09-19T22:30:05Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5613</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5613"/>
		<updated>2013-09-19T21:10:01Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher facilement des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5612</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5612"/>
		<updated>2013-09-19T21:09:46Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges (Sous forme d'un Web service SOAP pour pouvoir y brancher des challs situés sur des serveurs externes)- Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HOWTO_:_Modification_du_mod%C3%A8le_du_noyau&amp;diff=5611</id>
		<title>HOWTO : Modification du modèle du noyau</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HOWTO_:_Modification_du_mod%C3%A8le_du_noyau&amp;diff=5611"/>
		<updated>2013-09-18T13:27:32Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : Page créée avec « Les objets du modèle ne doivent pas contenir de code métier. Les seuls traitement tolérés sont des vérification du contenu des variables de setters. (Par exemple un c... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les objets du modèle ne doivent pas contenir de code métier.&lt;br /&gt;
Les seuls traitement tolérés sont des vérification du contenu des variables de setters. (Par exemple un check sur un identifiant négatif).&lt;br /&gt;
&lt;br /&gt;
Si l'objet est destiné à être persisté, alors il doit étendre la classe Persistent.&lt;br /&gt;
Cette classe est chargée de gérer les setters / getters des ID des bjets persistants.&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5610</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5610"/>
		<updated>2013-09-18T13:25:33Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : /* FAQ / HOWTO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
* [[FAQ : Développement de modules]]&lt;br /&gt;
* [[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5609</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5609"/>
		<updated>2013-09-18T13:25:14Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
[[FAQ : Développement de modules]]&lt;br /&gt;
[[HOWTO : Modification du modèle du noyau]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5608</id>
		<title>FAQ : Développement de modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5608"/>
		<updated>2013-09-18T07:39:29Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Utiliser les sessions ==&lt;br /&gt;
Le noyau gère une pseudo isolation des variables de session. Ceci empèche un module d'écraser accidentellement une variable de session d'un autre module.&lt;br /&gt;
&lt;br /&gt;
Il est donc prohibé d'utiliser directement le $_SESSION de php. Pour setter / getter des variables de session, vous devez passer le service SessionService.&lt;br /&gt;
&lt;br /&gt;
Pour setter une variable de session, il vous faudra une instance de votre implémentation de IModule ou a défaut le nom de la classe qui implémente IModule dans votre module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/*Sette une variable de session*/&lt;br /&gt;
&lt;br /&gt;
SessionService::setSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;, $variableDeSession);&lt;br /&gt;
&lt;br /&gt;
/*Recupere une variable de session*/&lt;br /&gt;
&lt;br /&gt;
SessionService::getSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Récupérer l'utilisateur actuellement identifié ==&lt;br /&gt;
&lt;br /&gt;
SessionService::getAuthenticatedUsed();&lt;br /&gt;
&lt;br /&gt;
Renvoie un objet du type User contenant les informations de l'utilisateur actuellement loggé.&lt;br /&gt;
&lt;br /&gt;
== Vérifier si un utilisateur est connecté ==&lt;br /&gt;
&lt;br /&gt;
UserService::getInstance()-&amp;gt;isUserLoggedIn();&lt;br /&gt;
&lt;br /&gt;
Renvoie true si un utilisateur est loggué, false sinon.&lt;br /&gt;
&lt;br /&gt;
== Vérifier les permissions d'un utilisateur ==&lt;br /&gt;
&lt;br /&gt;
UserService::getInstance()-&amp;gt;isUserAllowed($permission);&lt;br /&gt;
&lt;br /&gt;
Renvoie true si l'utilisateur actuellement loggué dispose de la permission envoyée en argument. False sinon.&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5607</id>
		<title>FAQ : Développement de modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5607"/>
		<updated>2013-09-18T07:37:46Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Utiliser les sessions ==&lt;br /&gt;
Le noyau gère une pseudo isolation des variables de session. Ceci empèche un module d'écraser accidentellement une variable de session d'un autre module.&lt;br /&gt;
&lt;br /&gt;
Il est donc prohibé d'utiliser directement le $_SESSION de php. Pour setter / getter des variables de session, vous devez passer le service SessionService.&lt;br /&gt;
&lt;br /&gt;
Pour setter une variable de session, il vous faudra une instance de votre implémentation de IModule ou a défaut le nom de la classe qui implémente IModule dans votre module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/*Sette une variable de session*/&lt;br /&gt;
&lt;br /&gt;
SessionService::setSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;, $variableDeSession);&lt;br /&gt;
&lt;br /&gt;
/*Recupere une variable de session*/&lt;br /&gt;
&lt;br /&gt;
SessionService::getSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Récupérer l'utilisateur actuellement identifié ==&lt;br /&gt;
&lt;br /&gt;
SessionService::getAuthenticatedUsed();&lt;br /&gt;
&lt;br /&gt;
Renvoie un objet du type User contenant les informations de l'utilisateur actuellement loggé.&lt;br /&gt;
&lt;br /&gt;
== Vérifier si un utilisateur est connecté ==&lt;br /&gt;
&lt;br /&gt;
UserService::getInstance()-&amp;gt;isUserLoggedIn();&lt;br /&gt;
&lt;br /&gt;
Renvoie true si un utilisateur est loggué, false sinon.&lt;br /&gt;
&lt;br /&gt;
== Vérifier les permissions d'un utilisateur ==&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5606</id>
		<title>FAQ : Développement de modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5606"/>
		<updated>2013-09-18T07:36:05Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Utiliser les sessions ==&lt;br /&gt;
Le noyau gère une pseudo isolation des variables de session. Ceci empèche un module d'écraser accidentellement une variable de session d'un autre module.&lt;br /&gt;
&lt;br /&gt;
Il est donc prohibé d'utiliser directement le $_SESSION de php. Pour setter / getter des variables de session, vous devez passer le service SessionService.&lt;br /&gt;
&lt;br /&gt;
Pour setter une variable de session, il vous faudra une instance de votre implémentation de IModule ou a défaut le nom de la classe qui implémente IModule dans votre module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/*Sette une variable de session*/&lt;br /&gt;
&lt;br /&gt;
SessionService::setSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;, $variableDeSession);&lt;br /&gt;
&lt;br /&gt;
/*Recupere une variable de session*/&lt;br /&gt;
&lt;br /&gt;
SessionService::getSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Récupérer l'utilisateur actuellement identifié ==&lt;br /&gt;
&lt;br /&gt;
SessionService::getAuthenticatedUsed();&lt;br /&gt;
&lt;br /&gt;
Renvoie un objet du type User contenant les informations de l'utilisateur actuellement loggé.&lt;br /&gt;
&lt;br /&gt;
== Vérifier si un utilisateur est connecté ==&lt;br /&gt;
&lt;br /&gt;
UserService::getInstance()-&amp;gt;isUserLoggedIn();&lt;br /&gt;
&lt;br /&gt;
Renvoie true si un utilisateur est loggué, false sinon.&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5605</id>
		<title>FAQ : Développement de modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5605"/>
		<updated>2013-09-18T07:32:46Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Utiliser les sessions ==&lt;br /&gt;
Le noyau gère une pseudo isolation des variables de session. Ceci empèche un module d'écraser accidentellement une variable de session d'un autre module.&lt;br /&gt;
&lt;br /&gt;
Il est donc prohibé d'utiliser directement le $_SESSION de php. Pour setter / getter des variables de session, vous devez passer le service SessionService.&lt;br /&gt;
&lt;br /&gt;
Pour setter une variable de session, il vous faudra une instance de votre implémentation de IModule ou a défaut le nom de la classe qui implémente IModule dans votre module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/*Sette une variable de session*/&lt;br /&gt;
&lt;br /&gt;
SessionService::setSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;, $variableDeSession);&lt;br /&gt;
&lt;br /&gt;
/*Recupere une variable de session*/&lt;br /&gt;
&lt;br /&gt;
SessionService::getSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5604</id>
		<title>FAQ : Développement de modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=FAQ_:_D%C3%A9veloppement_de_modules&amp;diff=5604"/>
		<updated>2013-09-18T07:32:29Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : Page créée avec «  == Utiliser les sessions == Le noyau gère une pseudo isolation des variables de session. Ceci empèche un module d'écraser accidentellement une variable de session d'un... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Utiliser les sessions ==&lt;br /&gt;
Le noyau gère une pseudo isolation des variables de session. Ceci empèche un module d'écraser accidentellement une variable de session d'un autre module.&lt;br /&gt;
&lt;br /&gt;
Il est donc prohibé d'utiliser directement le $_SESSION de php. Pour setter / getter des variables de session, vous devez passer le service SessionService.&lt;br /&gt;
&lt;br /&gt;
Pour setter une variable de session, il vous faudra une instance de votre implémentation de IModule ou a défaut le nom de la classe qui implémente IModule dans votre module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/*Sette une variable de session*/&lt;br /&gt;
SessionService::setSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;, $variableDeSession);&lt;br /&gt;
/*Recupere une variable de session*/&lt;br /&gt;
SessionService::getSessionVarForModule($instancedeIModule, &amp;quot;nomVariableDeSession&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5603</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5603"/>
		<updated>2013-09-18T07:25:38Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;br /&gt;
&lt;br /&gt;
==  FAQ / HOWTO ==&lt;br /&gt;
[[FAQ : Développement de modules]]&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5602</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5602"/>
		<updated>2013-09-18T06:06:29Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Lancien : dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5593</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5593"/>
		<updated>2013-09-17T21:32:27Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer du noyau - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5592</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5592"/>
		<updated>2013-09-17T21:31:45Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - [[Migrer devBBS vers le wiki]] - Lancien&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer - Korigan&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=GIT_reloadedHackBBS&amp;diff=5590</id>
		<title>GIT reloadedHackBBS</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=GIT_reloadedHackBBS&amp;diff=5590"/>
		<updated>2013-09-17T21:30:35Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Récupération du repo:&lt;br /&gt;
 git clone &amp;lt;user&amp;gt;@git.hackbbs.org:/var/local/git/repos/hackbbsreloaded&lt;br /&gt;
&lt;br /&gt;
Récupération des mises à jour:&lt;br /&gt;
 git pull origin master&lt;br /&gt;
&lt;br /&gt;
Commiter une modification:&lt;br /&gt;
 git commit -m &amp;quot;pourquoi je commit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pusher ses modifications sur le dépot:&lt;br /&gt;
 git push&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=GIT_reloadedHackBBS&amp;diff=5589</id>
		<title>GIT reloadedHackBBS</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=GIT_reloadedHackBBS&amp;diff=5589"/>
		<updated>2013-09-17T21:30:07Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Récupération du repo:&lt;br /&gt;
 git clone &amp;lt;user&amp;gt;@git.hackbbs.org:/var/local/git/repos/hackbbsreloaded&lt;br /&gt;
&lt;br /&gt;
Récupération des mises à jour:&lt;br /&gt;
 git pull origin master&lt;br /&gt;
&lt;br /&gt;
Pousser une modification:&lt;br /&gt;
 git commit -m &amp;quot;pourquoi je commit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pusher sur le dépot:&lt;br /&gt;
 git push&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5582</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5582"/>
		<updated>2013-09-17T21:02:40Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot [[GIT reloadedHackBBS]] - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées. Les modules préexistants seront alors fusionnés avec le moyau.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5580</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5580"/>
		<updated>2013-09-17T20:58:45Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette implémentation est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
Ce répertoire est à placer dans le répertoire '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5579</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5579"/>
		<updated>2013-09-17T20:54:53Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* Choisissez toujours la convention sur la configuration&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5578</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5578"/>
		<updated>2013-09-17T20:53:23Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/''' et '''/resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5577</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5577"/>
		<updated>2013-09-17T20:52:44Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est envoyé du serveur vers le client. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5576</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5576"/>
		<updated>2013-09-17T20:52:07Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication du serveur vers le client se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5575</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5575"/>
		<updated>2013-09-17T20:51:32Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectuée par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5574</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5574"/>
		<updated>2013-09-17T20:51:18Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?) - Sliim?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos - Korigan et?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau - Tortukitu, Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer - Korigan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges - Anybody :)&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenue. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5572</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5572"/>
		<updated>2013-09-17T20:17:34Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales (A toujours avoir sous les yeux !) ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respectez l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5571</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5571"/>
		<updated>2013-09-17T20:09:26Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Écrire le code métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Écrire le code de la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5570</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5570"/>
		<updated>2013-09-17T20:08:50Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Développer des modules testant toutes le fonctionnalitées de base du noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5569</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5569"/>
		<updated>2013-09-17T20:06:42Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
* HTML5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5568</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5568"/>
		<updated>2013-09-17T20:05:06Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#0000ff&amp;quot;&amp;gt;En cours&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5567</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5567"/>
		<updated>2013-09-17T20:04:34Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5566</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5566"/>
		<updated>2013-09-17T20:04:06Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev avec une bdd propre et vidée de ses véritables infos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5565</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5565"/>
		<updated>2013-09-17T20:03:16Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Mettre en place un environnement de test et de dev&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5564</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5564"/>
		<updated>2013-09-17T20:00:28Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* '''Pensez sécurité...''' Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5563</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5563"/>
		<updated>2013-09-17T20:00:08Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. &lt;br /&gt;
&lt;br /&gt;
C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* Pensez sécurité... Vous développez un site de hack. Il sera attaqué de la facon la plus tordue possible. Vous avez un service de nettoyage des entrées, alors utilisez-le !&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5562</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5562"/>
		<updated>2013-09-17T19:58:29Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet et des tickets (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5561</id>
		<title>HackBBS Reloaded</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=HackBBS_Reloaded&amp;diff=5561"/>
		<updated>2013-09-17T19:58:07Z</updated>

		<summary type="html">&lt;p&gt;Tortukitu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avec l'age, de nombreuses fonctionnalitées ont été rajoutées à HackBBS. La qualité originelle du code et les modifications successives ne permettent plus d'avoir quelque chose de maintenable. C'est dans cette optique que la refonte du site a été envisagée.&lt;br /&gt;
&lt;br /&gt;
== Équipe ==&lt;br /&gt;
&lt;br /&gt;
* Korigan : CDP, dev&lt;br /&gt;
* TorTukiTu : Architecte, dev&lt;br /&gt;
* Vous ?&lt;br /&gt;
&lt;br /&gt;
== Liste des tâches ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer la GUI (IHM) - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;FAIT&amp;lt;/span&amp;gt; - Concevoir et Développer le noyau - Tortukitu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Créer le dépot GIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - (Optionnel) Créer le système de gestion de projet (Redmine ? autre ?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer le métier du noyau&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer la couche consumer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;A faire&amp;lt;/span&amp;gt; - Développer une API pour brancher les challenges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
&lt;br /&gt;
* Utiliser l'installation et la configuration actuelle du serveur Apache2&lt;br /&gt;
* Utiliser des technologies les plus connues et les plus répandues possibles. (Ce qui permettra une implication plus large de la communautée)&lt;br /&gt;
* Utiliser des technologies permettant une modularité&lt;br /&gt;
* Utiliser des technologies pouvant s'interfacer avec MySQL (Réutilisation de la base de données existante)&lt;br /&gt;
* Limiter au maximum l'utilisation de frameworks pour que le projet soit maintenable avec un bagage de connaissances minimum &lt;br /&gt;
&lt;br /&gt;
== Technologies retenues ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* PHP&lt;br /&gt;
* PDO&lt;br /&gt;
* Ajax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'une architecture 3 couches:&lt;br /&gt;
* Une couche gère l'interface utiisateur&lt;br /&gt;
* Une couche contient le code métier&lt;br /&gt;
* Une couche consomme les différents services (Tape dans les bases de données, envoie les emails, etc.).&lt;br /&gt;
&lt;br /&gt;
Le diagramme ci dessous vous présente l'architecture retenue. Une ligne pleine représente une notion de dépendance, une ligne pointillée un flux de communication.&lt;br /&gt;
&lt;br /&gt;
hxxp://imagik.fr/view-rl/48310&lt;br /&gt;
&lt;br /&gt;
La communication entre les couches '''DOIT''' suivre le sens indiqué par les flèches. Par exemple, appeller des fonctions dans la couche Consumer depuis la couche Business est autorisé. Par contre appeller des fonctions de la couche Business depuis la couche Consumer est interdit.&lt;br /&gt;
&lt;br /&gt;
Une approche par script de transaction a été choisie. Ce qui signifie que les objets du modèle ne '''DOIVENT JAMAIS''' comporter des fonctions métier de traitement.&lt;br /&gt;
&lt;br /&gt;
D'une manière plus générale, retenez seulement que vos modules ne devraient accéder '''QUE''' a la couche business du noyau (et les couches transversales tel que le modèle ou la sécurité).&lt;br /&gt;
&lt;br /&gt;
L'ensemble de l'application est extensible via l'utilisation de modules (cf. schéma).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Couche provider (Interface utilisateur) ===&lt;br /&gt;
&lt;br /&gt;
Une interface de type &amp;quot;terminal&amp;quot; a été retenu. Ce type d'interface pose en temps normal des problèmes d'expérience utilisateur, mais s'agissant d'un site de chall, ceci n'entre pas vraiment en ligne de compte.&lt;br /&gt;
La gestion du terminal est effectué par des fonctions javascript utilisant la lirairie JQuery et ses extensions jTerminal et JQueryUI.&lt;br /&gt;
&lt;br /&gt;
La communication entre le client et le serveur se fait en JSON. C'est en fait un objet DataBusVO sérialisé qui est échangé entre le client et le serveur. La sérialisation est gérée par le script dispatcher.php&lt;br /&gt;
&lt;br /&gt;
L'ensemble du travail des modules consiste donc à générer une instance de DataBusVO qui sera récupérée par dispatcher.php pour modifier l'affichage côté client.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/ et /resources'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche business (métier) ===&lt;br /&gt;
&lt;br /&gt;
La couche métier présente des services aux couches supérieures. Ces services consistent en des singletons ou, plus exotiquement, des fonctions statiques.&lt;br /&gt;
Les services présentés sont les suivants:&lt;br /&gt;
* LoaderService : Gère le chargement dynamique des modules.&lt;br /&gt;
* SecurityService : Fourni des fonctions de vérification des permissions des utilisateurs&lt;br /&gt;
* SessionService : Gère l'étanchéité des variables de sessions entre différents modules, fournis des fonctions de récupération de l'utilisateur courant&lt;br /&gt;
* UserService : Fournis des fonctions de CRUD des utilisatuers, de vérification de connection d'un utilisateur&lt;br /&gt;
* SanitizerService : Fournis des fonctions de nettoyage des variables utilisateur.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/business''' et '''/php/modules'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche consumer (consommateur de services) ===&lt;br /&gt;
&lt;br /&gt;
Cette couche conient des services de manipulation de la base de données et d'envoi d'emails.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/core_services/consumer'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : modèle ===&lt;br /&gt;
&lt;br /&gt;
Cette couche contient des objets porteurs de données dont les instances sont transportés d'une couche à l'autre. Par exemple, la couche consumer crée une instance de User qui est renvoyé à la couche Business.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de cette couche sont situés dans le répertoire '''/php/model'''.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : sécurité ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
=== Couche transversale : logging ===&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
La configuration (données d'accès aux bases, définition des modules à charger) se trouve dans le fichier hackbbsConf.ini dans le répertoire /php/conf/&lt;br /&gt;
&lt;br /&gt;
[[Détail du fichier de confguration]]&lt;br /&gt;
&lt;br /&gt;
== Développement de modules ==&lt;br /&gt;
&lt;br /&gt;
Un module (ici Monmodule) est consitué de trois éléments:&lt;br /&gt;
* Une implémentation de l'interface IModule (''obligatoire'') appellé par convention MonmoduleModule.&lt;br /&gt;
* Un dossier (''optionnel'') appellé par convention monmoduleModule.&lt;br /&gt;
* Une déclaration names[] = Monmodule dans le fichier de configuration hackbbsConf.ini (''obligatoire'').&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;ATTENTION ! Tous les modules doivent se trouver dans le dossier /php/modules. Veillez à bien respecter les conventions de nommage. Sinon, votre module ne sera pas chargé par le LoaderService et ne sera pas disponible dans le terminal.&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Implémentation de IModule ===&lt;br /&gt;
&lt;br /&gt;
L'interface à implémenter (/php/contract/IModule) compte 3 fonctions :&lt;br /&gt;
&lt;br /&gt;
* function canHandleData($data) : $data est la String que l'utilisateur a entré dans le terminal. Renvoyez true si votre module doit se charger de réaliser l'opération demandée par l'utilisateur, false sinon.&lt;br /&gt;
* function manageData($data) : $data est la String que l'utilisateur a entré dans le terminal. Ici, réalisez vos traitements, puis renvoyez une instance de DataBusVO contenant les actions que vous voulez effectuer sur le terminal. Voir la page [[Contrôle du terminal via DataBusVO]].&lt;br /&gt;
* function getPrototype() : Renvoie String contenant une description rapide de la commande en HTML. Typiquement &amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande.&lt;br /&gt;
&lt;br /&gt;
Ci dessous une implémentation de démonstration de IModule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
class MonmoduleModule implements IModule{&lt;br /&gt;
    public function canHandleData($data) {&lt;br /&gt;
        $ans = false;&lt;br /&gt;
        if($data == &amp;quot;macommande&amp;quot;){&lt;br /&gt;
            $ans = true;&lt;br /&gt;
        }&lt;br /&gt;
        return $ans;&lt;br /&gt;
    }&lt;br /&gt;
    public function getPrototype() {&lt;br /&gt;
        return &amp;quot;&amp;lt;b&amp;gt;macommande&amp;lt;/b&amp;gt; : Ce que fait ma commande&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public function manageData($data) {&lt;br /&gt;
        $dataBus = new DataBusVO();&lt;br /&gt;
        $dataBus-&amp;gt;setHtmlData(&amp;quot;Cette comande ne fait rien de particulier.&amp;quot;);&lt;br /&gt;
        return $dataBus;&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modification du fichier de configuration ===&lt;br /&gt;
&lt;br /&gt;
Ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
names[] = Monmodule&lt;br /&gt;
&lt;br /&gt;
A la fin de la section [modules] du fichier /php/conf/hackbbsConf.ini&lt;br /&gt;
&lt;br /&gt;
=== Répertoire monmoduleModule ===&lt;br /&gt;
&lt;br /&gt;
Contient tous les fichiers spécifiques au mondule monmodule. Si nécéssaire, découper en couches business, model et consumer.&lt;br /&gt;
&lt;br /&gt;
'''REMARQUE''' : ''Entorse à l'architecture pendant la partie refonte de HackBBS.. Un développeur de modules ne devrait jamais toucher au noyau. Or, '''&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;la plupart du métier (et modèle) développé aujourd'hui sera nécéssaire à un grand nombre de futur modules. Il est donc de bon ton d'ajouter au métier du noyau les fonctions et services que l'on saura réutilisés dans la suite des développements&amp;lt;/span&amp;gt;'''. Ceci est laissé à l'appréciation du développeur. Lorsque la refonte sera terminé, il deviendra interdit aux futurs développeurs de toucher au code du noyau pour y ajouter de nouvelles fonctionnalitées.''&lt;br /&gt;
&lt;br /&gt;
== Règles générales ==&lt;br /&gt;
&lt;br /&gt;
* A toute classe son interface.&lt;br /&gt;
* Jamais de copier coller&lt;br /&gt;
* '''Respecter l'architecture'''&lt;br /&gt;
* Ne jamais utiliser directement $_SESSION, toujours passser par le service SessionService (sauf exceptions autorisées par l'architecte)&lt;br /&gt;
* '''Chaque classe et fonction doit être commentée'''&lt;br /&gt;
* (Optionnel) Écrire une page de wiki par module&lt;br /&gt;
* (Optionnel) Si vous avez le temps, les tests unitaires, c'est bien&lt;/div&gt;</summary>
		<author><name>Tortukitu</name></author>
	</entry>
</feed>