summaryrefslogtreecommitdiff
path: root/index.php
blob: 0b6c94584fd8a9eed96fe09bd0ed3cdceae677f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
<?php
// index.php
//
// routeur MVC ou controlleur principal
// il traite les GET et passe la main aux contrôleurs
//
// ce site utilise une architecture Modèle-Vue-Contrôleur (MVC)
// le schéma ci-dessous représente le sens dans lequel le code est interprété
//
//               modèle
//                 ^ |
//                 | v
//  routeur --> contrôleur
//                     |
//                     v
//                    vue ---> envoi de la page au client
//
// pour retrouver quelque chose dans le code, il suffit de suivre un chemin linéaire dont le départ est ici
// pas de croisement, pas de marche arrière, impossible de se perdre!
// autre avantage: les chemins sont tous relatifs et sont toujours bons, parce que tous les fichiers sont "inclus" dans index.php
//
// Les dossiers:
// -> controller: traitements en PHP pur
// -> model: interface entre PHP et données, on y trouve le SQL ou la manipulation de fichiers textes, le PHP y est orienté objet
// -> view: le PHP y produit le HTML, il construit les pages,
// le mélange PHP/HTML étant très vite assez dégueulasse, le HTML figé est placé à part dans le fichier view/template.php
// -> public: contient CSS, JS, images, polices, medias, etc, il est utilisé par template.php
// -> lib: les bibliothèques, on y trouve en particulier le ckeditor qui occupe une place centrale dans le projet, et aussi htmLawed qui nettoie le HTML produit par l'éditeur (failles XSS)
// -> data: comme son nom l'indique
//
// Quelques fichiers spéciaux (indépendants de index.php):
// - imageAJAX.php traite les requêtes AJAX envoyées par l'éditeur
// - .htaccess pour la sécurité (configurer le httpd.conf d'apache peut être nécessaire)
// - erreur404.php (fonctionne avec .htaccess)
//
// le dossier data et son contenu sont "normalement" autorisés en écriture pour deux raisons:
// - placer le contenu pré-existant avec son client FTP
// - autoriser PHP (sinon, c'est comme si on avait un site statique)
// -> pour pouvoir installer le site en n'ayant qu'à modifier les droits du dossier data uniquement et éviter les situations pénibles ou l'utilisateur est bloqué sans rien comprendre, on pourra créer ou utiliser des sauvegardes au format ZIP depuis une page spéciale accessible avec le compte admin

// au premier démarrage du site
require('controller/installation.php');
installation();

// à propos des sessions, penser aux attaques CSRF (cross-site request forgery):
// ça consite à faire qu'un utilisateur connecté avec une session envoie malgré lui une requête GET ou POST qu'un hacker aura cachée par exemple dans une fausse image clicable
// - solution: faire qu'un GET seul dans une session ne suffise pas à effectuer une action (les GET ne doivent servir qu'à afficher la bonne page), une attaque sur un POST est possible aussi mais plus difficile et nécessite d'injecter du javascript
// - on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant
// - il y a la méthode des jetons, "nonces" et horodatage
// - vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête
// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery
session_start();

// traitement des POST du ckeditor
// la fonction submitCKeditor n'affiche rien (controller/admin.php n'est pas utilisé) puis redirige sans GET
if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
    && isset($_GET['action']) && $_GET['action'] == 'submit'
    && isset($_POST['contenu']) && $_POST['contenu'] != '')
{
    require('controller/ckeditor.php'); // traitement du POST
    require('lib/htmlawed/htmLawed.php'); // failles XSS
    require('model/Classes.php'); // modèle

    // modification
    if(isset($_SESSION['nomFichier']))
    {
        submitCKeditor($_SESSION['nomFichier']);
    }
    // nouvel article
    else
    {
        submitCKeditor('');
    }

    // nettoyage
    unset($_SESSION['nomFichier']);
    unset($_GET['action']);
    unset($_POST['contenu']);
    header('Location: index.php?page=' . $_GET['page']);
}

// déconnexion: nettoyer et recharger la page
if(isset($_GET['action']) && isset($_GET['page']))
{
    if($_GET['action'] == "deconnexion")
    {
        $_SESSION['admin'] = 0;
        header('Location: index.php?page=' . $_GET['page']);
    }
}

// le site comporte deux modes:
// le mode visiteur en "lecture seule" utilisant le contrôleur visitor.php
// le mode admin avec droits en "écriture" utilisant le contrôleur admin.php

// contrôleur des pages en mode visiteur
// appelé tout le temps parce que certaines pages (accueil, menu) n'ont pas de version "admin" => à améliorer
require('controller/visitor.php');

// utile pour presque toutes les pages
if(isset($_GET['page']) && $_GET['page'] != 'menu')
{
    require('model/Classes.php');
}

// contrôleur des pages en mode admin
if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1)
{
    require('controller/admin.php');
}
else
{
    // initialisation
    $_SESSION['admin'] = 0;
}

// mot de passe de connexion à protéger par le .htaccess !!
$secret = "julian";

// page du site demandée
if(isset($_GET['page']))
{
    // page menu
    if($_GET['page'] == 'menu')
    {
        menu();
    }

    // page melaine
    elseif($_GET['page'] == 'melaine')
    {
        // Si ouverture de l'éditeur pour modification:
        // le lien utilisé pour ouvrir l'éditeur contient un GET avec le numéro de l'article, mais pas le nom du fichier que le visiteur ne doit pas voir
        // GET, POST, cookies => navigation (utiles au visiteur)
        // sessions => action
        // c'est ici qu'on passe des GET aux sessions
        // on associe maintenant le numéro de l'article et le nom du fichier, l'article déjà existant inséré dans l'éditeur DOIT être celui qui sera modifié

        if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor')
        {
            // modification
            if(isset($_GET['article']) && is_numeric($_GET['article']) && $_GET['article'] > 0)
            {
                melaineEdit($_GET['article'], 0);
            }
            // nouvel article
            else
            {
                // par sécurité
                if(isset($_SESSION['nomFichier']))
                {
                    unset($_SESSION['nomFichier']);
                }
                melaineEdit(0, 0);
            }
        }
        // suppression
        else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression')
        {
            melaineEdit($_GET['article'], 1);
        }
        else
        {
            melaineVisitor();
        }
    }
    // page discographie
    elseif($_GET['page'] == 'discographie')
    {
        if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition')
        {
            // modification
            if(isset($_GET['album']) && is_numeric($_GET['album']) && $_GET['album'] > 0)
            {
                discoEdit($_GET['album'], 0);
            }
            // nouvel article
            else
            {
                // par sécurité
                if(isset($_SESSION['nomFichier']))
                {
                    unset($_SESSION['nomFichier']);
                }
                discoEdit(0, 0);
            }
        }
        // suppression
        else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression')
        {
            discoEdit($_GET['album'], 1);
        }
        else
        {
            discoVisitor();
        }
    }
    // page connexion au mode admin
    elseif($_GET['page'] == 'connexion')
    {
        connexion($secret);
    }
    // $_GET['page'] = n'importe quoi!
    else
    {
        menu();
    }
}

// actions en mode admin recharger une des pages principales
elseif($_SESSION['admin'] == 1 && isset($_GET['action']))
{
    if($_GET['action'] == 'nouveau_mdp')
    {
        changerMotDePasse($secret, $_GET['from']);
    }
    // extraction du contenu du dossier data
    else if($_GET['action'] == 'extraction')
    {
        require('controller/backup.php');
        extraction($_GET['from']);
    }
    // l'inverse, insertion des données d'une sauvegarde
    else if($_GET['action'] == 'insertion')
    {
        require('controller/backup.php');
        insertion($_GET['from']);
    }
    else
    {
        accueil();
    }
}

// renvoi ici par le .htaccess si lien mort ou sans http:// au début
elseif(isset($_GET['erreur']))
{
    //if($_GET['erreur'] == 404)
    //{
    //    echo('<p style="color: red;" >ERREUR 404<br/>Le lien sur lequel vous avez cliqué pointe vers un emplacement introuvable.<br />
    //      Ce n\'est pas votre faute. Vous pouvez éventuellement rechercher la page demandée avec votre moteur de recherche ou prévenir le responsable du site.</p>');
    //    echo('<p><a href="index.php" >Retour au site</a></p>');
    //}
    //else
    //{
        accueil();
        // accueil_404(); // à créer
    //}
}

// page d'accueil (adresse sans GET valable)
else
{
    accueil();
}