Skip to content

Commit ad616c4

Browse files
committed
v2.8 - Ajout d'une expiration des comptes utilisateurs au bout d'une durée sans connexion (pour ne pas les conserver indéfiniment)
1 parent 0105e8e commit ad616c4

File tree

14 files changed

+269
-17
lines changed

14 files changed

+269
-17
lines changed

__tests/AdminTest.php

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,83 @@ public function testGetUnusedFiles(): void
140140
'neverUsedFileWithThumbsDisplayedLongTimeAgo.png doit être détectée (miniature affichée il y a trop longtemps)'
141141
);
142142
}
143+
144+
145+
/**
146+
* Les comptes admin ne doivent pas être détectés comme inactifs
147+
*/
148+
#[RunInSeparateProcess]
149+
public function testProtectionCompteAdmin(): void
150+
{
151+
require 'config/config.php';
152+
153+
$inactiveAccounts = HelperAdmin::getInactiveAccounts();
154+
$unusedAccounts = HelperAdmin::getUnusedAccounts();
155+
156+
$this->assertContains(
157+
'4',
158+
$inactiveAccounts,
159+
'Le compte 4 doit être détecté'
160+
);
161+
$this->assertContains(
162+
'4',
163+
$unusedAccounts,
164+
'Le compte 4 doit être détecté'
165+
);
166+
$this->assertNotContains(
167+
'3',
168+
$inactiveAccounts,
169+
'Le compte 3 ne doit pas être détecté'
170+
);
171+
$this->assertNotContains(
172+
'3',
173+
$unusedAccounts,
174+
'Le compte 3 ne doit pas être détecté'
175+
);
176+
}
177+
178+
/**
179+
* Détection des comptes qui n'ont jamais été utilisés
180+
*/
181+
#[RunInSeparateProcess]
182+
public function testUnusedAccounts(): void
183+
{
184+
require 'config/config.php';
185+
186+
$unusedAccounts = HelperAdmin::getUnusedAccounts();
187+
188+
$this->assertContains(
189+
'5',
190+
$unusedAccounts,
191+
'Le compte 5 doit être détecté'
192+
);
193+
$this->assertNotContains(
194+
'6',
195+
$unusedAccounts,
196+
'Le compte 6 ne doit pas être détecté'
197+
);
198+
}
199+
200+
201+
/**
202+
* Détection des comptes inactifs
203+
*/
204+
#[RunInSeparateProcess]
205+
public function testInactiveAccounts(): void
206+
{
207+
require 'config/config.php';
208+
209+
$inactiveAccounts = HelperAdmin::getInactiveAccounts();
210+
211+
$this->assertContains(
212+
'4',
213+
$inactiveAccounts,
214+
'Le compte 4 doit être détecté'
215+
);
216+
$this->assertNotContains(
217+
'5',
218+
$inactiveAccounts,
219+
'Le compte 5 ne doit pas être détecté'
220+
);
221+
}
143222
}

__tests/config/config.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@
6969
const _QUOTA_MAXIMAL_IMAGES_GO_ = 90;
7070
// Affichage des messages d'erreur
7171
const _DEBUG_ = true;
72+
// Délai de conservation des comptes jamais utilisés (en jours)
73+
const _DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ = 30;
74+
// Délai de conservation des comptes qui ne sont plus utilisés (en jours)
75+
const _DELAI_EFFACEMENT_COMPTES_INACTIFS_ = 365;
7276

7377

7478
/* Gestion des abus */

__tests/data.sql

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,5 +161,17 @@ INSERT INTO `possede` (`images_id`, `membres_id`) VALUES
161161
--
162162
-- Second compte utilisateur
163163
--
164-
INSERT INTO `membres` (`id`, `email`, `login`, `password`, `date_action`, `remote_addr`, `remote_port`, `lvl`, `token`) VALUES
165-
(2, 'john.doe2@example.com', 'user', '$2y$12$vMyiKcBZA5BsaYaRMIQac.fYUBTFTFrpbGm0oxbMBDCAKlf1SQ1gq', NOW(), '127.0.0.1', 1234, 1, '');
164+
INSERT INTO `membres` (`id`, `email`, `login`, `password`, `date_action`, `remote_addr`, `remote_port`, `lvl`, `token`, `last_login`) VALUES
165+
(2, 'john.doe2@example.com', 'user', '$2y$12$vMyiKcBZA5BsaYaRMIQac.fYUBTFTFrpbGm0oxbMBDCAKlf1SQ1gq', NOW(), '127.0.0.1', 1234, 1, '', NOW());
166+
167+
--
168+
-- Gestion des comptes inactifs / non utilisés
169+
--
170+
INSERT INTO `membres` (`id`, `email`, `login`, `password`, `date_action`, `remote_addr`, `remote_port`, `lvl`, `token`, `last_login`) VALUES
171+
(3, 'inactive-but-lvl-admin@example.com', 'user3', '$2y$12$vMyiKcBZA5BsaYaRMIQac.fYUBTFTFrpbGm0oxbMBDCAKlf1SQ1gq', '2020-01-01 00:00:00', '127.0.0.1', 1234, 2, '', '2020-01-01 00:00:00'),
172+
(4, 'inactive-and-not-admin@example.com', 'user3', '$2y$12$vMyiKcBZA5BsaYaRMIQac.fYUBTFTFrpbGm0oxbMBDCAKlf1SQ1gq', '2020-01-01 00:00:00', '127.0.0.1', 1234, 1, '', '2020-01-01 00:00:00'),
173+
(5, 'unused-account@example.com', 'user3', '$2y$12$vMyiKcBZA5BsaYaRMIQac.fYUBTFTFrpbGm0oxbMBDCAKlf1SQ1gq', DATE_SUB(CURRENT_DATE(), INTERVAL 4 DAY), '127.0.0.1', 1234, 1, '', DATE_SUB(CURRENT_DATE(), INTERVAL 4 DAY)),
174+
(6, 'used-account@example.com', 'user3', '$2y$12$vMyiKcBZA5BsaYaRMIQac.fYUBTFTFrpbGm0oxbMBDCAKlf1SQ1gq', DATE_SUB(CURRENT_DATE(), INTERVAL 4 DAY), '127.0.0.1', 1234, 1, '', DATE_SUB(CURRENT_DATE(), INTERVAL 4 DAY));
175+
176+
INSERT INTO `possede` (`images_id`, `membres_id`) VALUES
177+
(35, 6);

admin/cleanAccountsNeverUsed.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,25 @@
5656
<?= $listeComptes->count() ?> compte<?= $isPlural ?> créé<?= $isPlural ?> il y a au moins <?= _DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ ?> jour<?= _DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ > 1 ? 's' : '' ?> et sans images associées
5757
</div>
5858
<div class="card-body">
59-
<ul>
59+
<table class="table table-bordered">
60+
<thead>
61+
<tr>
62+
<th>ID</th>
63+
<th>Login</th>
64+
<th>Email</th>
65+
</tr>
66+
</thead>
67+
<tbody>
6068
<?php foreach ($listeComptes as $value) : ?>
61-
<li><?= $value ?></li>
69+
<?php $monUtilisateur = new UtilisateurObject($value); ?>
70+
<tr>
71+
<td><?= $monUtilisateur->getId() ?></td>
72+
<td><?= $monUtilisateur->getUserName() ?></td>
73+
<td><?= $monUtilisateur->getEmail() ?></td>
74+
</tr>
6275
<?php endforeach; ?>
63-
</ul>
76+
</tbody>
77+
</table>
6478
</div>
6579
<form method="post">
6680
<button class="btn btn-danger" type="submit" name="effacer">

admin/cleanInactiveAccounts.php

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
3+
/*
4+
* Copyright 2008-2026 Anael MOBILIA
5+
*
6+
* This file is part of image-heberg.fr.
7+
*
8+
* image-heberg.fr is free software: you can redistribute it and/or modify
9+
* it under the terms of the GNU General Public License as published by
10+
* the Free Software Foundation, either version 3 of the License, or
11+
* (at your option) any later version.
12+
*
13+
* image-heberg.fr is distributed in the hope that it will be useful,
14+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16+
* GNU General Public License for more details.
17+
*
18+
* You should have received a copy of the GNU General Public License
19+
* along with image-heberg.fr. If not, see <http://www.gnu.org/licenses/>
20+
*/
21+
22+
namespace ImageHeberg;
23+
24+
require '../config/config.php';
25+
26+
// Vérification des droits d'accès
27+
UtilisateurObject::checkAccess(UtilisateurObject::LEVEL_ADMIN);
28+
require _TPL_TOP_;
29+
?>
30+
<h1 class="mb-3"><small>Nettoyage des comptes inactifs</small></h1>
31+
<?php
32+
33+
$message = '';
34+
35+
// Je récupère la liste des comptes inactifs
36+
$listeComptes = HelperAdmin::getInactiveAccounts();
37+
$isPlural = ($listeComptes->count() > 1 ? 's' : '');
38+
39+
// Si l'effacement est demandé
40+
if (isset($_POST['effacer'])) :
41+
foreach ($listeComptes as $value) {
42+
$message .= '<br />Suppression du compte ' . $value;
43+
44+
// Je crée mon objet et lance la suppression
45+
$monUtilisateur = new UtilisateurObject($value);
46+
$monUtilisateur->supprimer();
47+
}
48+
$message .= '<br />Effacement terminé !';
49+
?>
50+
<div class="alert alert-success">
51+
<?= $message ?>
52+
</div>
53+
<?php else : ?>
54+
<div class="card">
55+
<div class="card-header">
56+
<?= $listeComptes->count() ?> compte<?= $isPlural ?> inactif<?= $isPlural ?> (>= <?= _DELAI_EFFACEMENT_COMPTES_INACTIFS_ ?> jour<?= _DELAI_EFFACEMENT_COMPTES_INACTIFS_ > 1 ? 's' : '' ?> sans connexion)
57+
</div>
58+
<div class="card-body">
59+
<table class="table table-bordered">
60+
<thead>
61+
<tr>
62+
<th>ID</th>
63+
<th>Login</th>
64+
<th>Email</th>
65+
</tr>
66+
</thead>
67+
<tbody>
68+
<?php foreach ($listeComptes as $value) : ?>
69+
<?php $monUtilisateur = new UtilisateurObject($value); ?>
70+
<tr>
71+
<td><?= $monUtilisateur->getId() ?></td>
72+
<td><?= $monUtilisateur->getUserName() ?></td>
73+
<td><?= $monUtilisateur->getEmail() ?></td>
74+
</tr>
75+
<?php endforeach; ?>
76+
</tbody>
77+
</table>
78+
</div>
79+
<form method="post">
80+
<button class="btn btn-danger" type="submit" name="effacer">
81+
<span class="bi-trash"></span>
82+
&nbsp;Effacer ce<?= $isPlural ?> compte<?= $isPlural ?>
83+
</button>
84+
</form>
85+
</div>
86+
<?php endif; ?>
87+
<?php require _TPL_BOTTOM_; ?>

admin/cleanInactiveFiles.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
UtilisateurObject::checkAccess(UtilisateurObject::LEVEL_ADMIN);
2828
require _TPL_TOP_;
2929
?>
30-
<h1 class="mb-3"><small>Nettoyage des fichiers dormants</small></h1>
31-
<?php
30+
<h1 class="mb-3"><small>Nettoyage des fichiers inactifs</small></h1>
31+
<?php
3232

3333
$message = '';
3434

admin/index.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
<br/>
8383
<a href="<?= _URL_ADMIN_ ?>expiration-images.php" class="btn btn-info">
8484
<span class="bi-bar-chart"></span>
85-
&nbsp;Statistiques
85+
&nbsp;Libération d'espace disque à venir
8686
</a>
8787
<div class="clearfix"></div>
8888
<br/>
@@ -94,13 +94,19 @@
9494
<br/>
9595
<a href="<?= _URL_ADMIN_ ?>cleanInactiveFiles.php" class="btn btn-warning">
9696
<span class="bi-file-earmark-x-fill"></span>
97-
&nbsp;Supprimer les images non affichées depuis plus de <?= _DELAI_INACTIVITE_AVANT_EFFACEMENT_IMAGES_ ?> jour<?= (_DELAI_INACTIVITE_AVANT_EFFACEMENT_IMAGES_ > 1) ? 's' : '' ?>
97+
&nbsp;Supprimer les images inactives (dernier affichage <= <?= _DELAI_INACTIVITE_AVANT_EFFACEMENT_IMAGES_ ?> jour<?= (_DELAI_INACTIVITE_AVANT_EFFACEMENT_IMAGES_ > 1) ? 's' : '' ?>)
9898
</a>
9999
<div class="clearfix"></div>
100100
<br/>
101101
<a href="<?= _URL_ADMIN_ ?>cleanAccountsNeverUsed.php" class="btn btn-warning">
102102
<span class="bi-person-x"></span>
103-
&nbsp;Supprimer les comptes créés il y a plus de <?= _DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ ?> jour<?= (_DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ > 1) ? 's' : '' ?> et sans images associées
103+
&nbsp;Supprimer les comptes sans images et créés il y a plus de <?= _DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ ?> jour<?= (_DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ > 1) ? 's' : '' ?>
104+
</a>
105+
<div class="clearfix"></div>
106+
<br/>
107+
<a href="<?= _URL_ADMIN_ ?>cleanInactiveAccounts.php" class="btn btn-warning">
108+
<span class="bi-person-x-fill"></span>
109+
&nbsp;Supprimer les comptes inactifs (dernière connexion <= <?= _DELAI_EFFACEMENT_COMPTES_INACTIFS_ ?> jour<?= (_DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ > 1) ? 's' : '' ?>)
104110
</a>
105111
</div>
106112
</div>

cgu.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,15 @@
8888
<li>
8989
Suppression des comptes membres qui n'ont jamais été utilisés au bout de <?= _DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ ?> jour<?= _DELAI_EFFACEMENT_COMPTES_JAMAIS_UTILISES_ > 1 ? 's' : '' ?>.
9090
</li>
91+
<li>
92+
Suppression des comptes membres inactifs (sans connexion) au bout de <?= _DELAI_EFFACEMENT_COMPTES_INACTIFS_ ?> jour<?= _DELAI_EFFACEMENT_COMPTES_INACTIFS_ > 1 ? 's' : '' ?>.
93+
</li>
9194
<li>
9295
Rappel : <a href="contact.php">l'administrateur (<?= _ADMINISTRATEUR_NOM_ ?>)</a> a accès à toutes les données du service.
9396
</li>
9497
</ul>
9598
<div class="card-footer">
96-
<em>Mises à jour le 02 janvier 2024 : ajout de précisions sur les images non autorisées + module de catégorisation IA.</em>
99+
<em>CGU mises à jour le 18 janvier 2026 : ajout du délai de suppression des comptes membres inactifs.</em>
97100
</div>
98101
</div>
99102
</div>

changelog.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,29 @@
4444
</div>
4545
</div>
4646
</div>
47+
<div class="card">
48+
<div class="card-header">
49+
<a data-bs-toggle="collapse" href="#v28">
50+
v2.8 - Janvier 2026
51+
&nbsp;<span class="bi-caret-down-fill"></span>
52+
</a>
53+
</div>
54+
<div id="v28" class="card-collapse">
55+
<div class="card-body">
56+
<ul>
57+
<li>Ajout d'une durée de conservation des comptes inactifs.</li>
58+
</ul>
59+
</div>
60+
</div>
61+
</div>
4762
<div class="card">
4863
<div class="card-header">
4964
<a data-bs-toggle="collapse" href="#v27">
5065
v2.7 - Septembre 2025
5166
&nbsp;<span class="bi-caret-down-fill"></span>
5267
</a>
5368
</div>
54-
<div id="v27" class="card-collapse">
69+
<div id="v27" class="card-collapse collapse">
5570
<div class="card-body">
5671
<ul>
5772
<li>Ajout d'un aperçu de l'image avant l'envoi.</li>

classes/HelperAdmin.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,31 @@ public static function getUnusedAccounts(): ArrayObject
124124

125125
return $monRetour;
126126
}
127+
/**
128+
* Liste des comptes inactifs
129+
* @return ArrayObject
130+
*/
131+
public static function getInactiveAccounts(): ArrayObject
132+
{
133+
// Toutes les comptes dont la date de dernière connexion dépasse xx jours
134+
$req = 'SELECT m.id
135+
FROM membres m
136+
WHERE m.last_login < DATE_SUB(CURRENT_DATE(), INTERVAL ' . _DELAI_EFFACEMENT_COMPTES_INACTIFS_ . ' DAY)
137+
/* Protéger les comptes administrateur */
138+
AND lvl NOT IN (' . UtilisateurObject::LEVEL_ADMIN . ')';
139+
140+
// Exécution de la requête
141+
$resultat = MaBDD::getInstance()->query($req);
142+
143+
$monRetour = new ArrayObject();
144+
// Pour chaque résultat retourné
145+
foreach ($resultat->fetchAll() as $value) {
146+
// J'ajoute l'ID du compte
147+
$monRetour->append($value->id);
148+
}
149+
150+
return $monRetour;
151+
}
127152

128153
/**
129154
* Liste de l'ensemble des images en BDD

0 commit comments

Comments
 (0)