]> git.agnieray.net Git - galette.git/blob - tests/Galette/Util/tests/units/Password.php
Migrate to phpunit; closes #1674
[galette.git] / tests / Galette / Util / tests / units / Password.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * Password tests
7 *
8 * PHP version 5
9 *
10 * Copyright © 2020-2023 The Galette Team
11 *
12 * This file is part of Galette (http://galette.tuxfamily.org).
13 *
14 * Galette is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation, either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * Galette is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
26 *
27 * @category Util
28 * @package GaletteTests
29 *
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2020-2023 The Galette Team
32 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
33 * @link http://galette.tuxfamily.org
34 * @since 2020-04-25
35 */
36
37 namespace Galette\Util\test\units;
38
39 use PHPUnit\Framework\TestCase;
40 use Galette\Core\Preferences;
41 use PHPUnit\Framework\Attributes\DataProvider;
42
43 /**
44 * Password tests class
45 *
46 * @category Util
47 * @name Password
48 * @package GaletteTests
49 * @author Johan Cwiklinski <johan@x-tnd.be>
50 * @copyright 2020-2023 The Galette Team
51 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
52 * @link http://galette.tuxfamily.org
53 * @since 2020-04-25
54 */
55 class Password extends TestCase
56 {
57 private \Galette\Core\Db $zdb;
58 private \Galette\Core\Preferences $preferences;
59
60 /**
61 * Tear down tests
62 *
63 * @return void
64 */
65 public function tearDow(): void
66 {
67 if (TYPE_DB === 'mysql') {
68 $this->assertSame([], $this->zdb->getWarnings());
69 }
70 $this->preferences->pref_password_strength = Preferences::PWD_NONE;
71 $this->preferences->pref_password_length = 6;
72 $this->preferences->pref_password_blacklist = false;
73 $this->preferences->store();
74 }
75
76 /**
77 * Set up tests
78 *
79 * @return void
80 */
81 public function setUp(): void
82 {
83 $this->zdb = new \Galette\Core\Db();
84 $this->preferences = new \Galette\Core\Preferences($this->zdb);
85 }
86
87 /**
88 * Passwords data provider
89 *
90 * @return array
91 */
92 public static function passProvider()
93 {
94 return [
95 // [strength, password, errors]
96 [Preferences::PWD_WEAK, 'weaker', ['A', '1', '@']],
97 [Preferences::PWD_WEAK, '123456', ['nl', '@']],
98 [Preferences::PWD_WEAK, '²²²²²²', ['nl', '@']],
99 [Preferences::PWD_WEAK, 'foobar', ['A', '1', '@']],
100 [Preferences::PWD_WEAK, 'ömgwat', ['A', '1', '@']],
101 [Preferences::PWD_WEAK, '!.!.!.', ['nl', '1']],
102 [Preferences::PWD_WEAK, '!.!.!﴾', ['nl', '1']],
103 [Preferences::PWD_WEAK, '7857375923752947', ['nl', '@']],
104 [Preferences::PWD_WEAK, 'FSDFJSLKFFSDFDSF', ['a', '1', '@']],
105 [Preferences::PWD_WEAK, 'FÜKFJSLKFFSDFDSF', ['a', '1', '@']],
106 [Preferences::PWD_WEAK, 'fjsfjdljfsjsjjlsj', ['A', '1', '@']],
107
108 [Preferences::PWD_MEDIUM, 'wee6eak',['A', '@']],
109 [Preferences::PWD_MEDIUM, 'foobar!', ['A', '1']],
110 [Preferences::PWD_MEDIUM, 'Foobar', ['1', '@']],
111 [Preferences::PWD_MEDIUM, '123456!', ['nl']],
112 [Preferences::PWD_MEDIUM, 'fjsfjdljfsjsjjls1', ['A', '@']],
113 [Preferences::PWD_MEDIUM, '785737592375294b', ['A', '@']],
114
115 [Preferences::PWD_STRONG, 'Foobar﴾', ['1']],
116 [Preferences::PWD_STRONG, 'foo-b0r!', ['A']],
117
118 [Preferences::PWD_VERY_STRONG, 'Foobar!55!', []],
119 [Preferences::PWD_VERY_STRONG, 'Foobar$55', []],
120 [Preferences::PWD_VERY_STRONG, 'Foobar€55', []],
121 [Preferences::PWD_VERY_STRONG, 'Foobar€55', []],
122 [Preferences::PWD_VERY_STRONG, 'Foobar$55_4&F', []],
123 [Preferences::PWD_VERY_STRONG, 'L33RoyJ3Jenkins!', []],
124 ];
125 }
126
127 /**
128 * Test password validation
129 *
130 * @param integer $level Password level
131 * @param string $pass Password
132 * @param array $errors Errors
133 *
134 * @return void
135 */
136 #[DataProvider('passProvider')]
137 public function testValidatePassword($level, $pass, $errors)
138 {
139 //errror messages mapping
140 foreach ($errors as &$err) {
141 switch ($err) {
142 case 'nl':
143 $err = 'Does not contains letters';
144 break;
145 case 'a':
146 $err = 'Does not contains lowercase letters';
147 break;
148 case 'A':
149 $err = 'Does not contains uppercase letters';
150 break;
151 case 1:
152 $err = 'Does not contains numbers';
153 break;
154 case '@':
155 $err = 'Does not contains special characters';
156 break;
157 }
158 }
159
160 if ($level < Preferences::PWD_VERY_STRONG) {
161 $this->preferences->pref_password_strength = $level + 1;
162 $password = new \Galette\Util\Password($this->preferences);
163 $this->assertFalse($password->isValid($pass));
164 $this->assertEquals($password->getErrors(), $errors);
165 }
166
167 $this->preferences->pref_password_strength = $level;
168 $password = new \Galette\Util\Password($this->preferences);
169 $this->assertTrue($password->isValid($pass), implode(', ', $password->getErrors()));
170 $this->assertSame($password->getErrors(), []);
171 $this->assertEquals($password->getStrenghtErrors(), $errors);
172 }
173
174 /**
175 * Blacklist password provider
176 *
177 * @return array
178 */
179 public static function blacklistProvider()
180 {
181 return [
182 ['galette', true],
183 ['toto', false],
184 ['mypassisgreat', false],
185 ['starwars', true],
186 ['123456', true],
187 ['588795', false]
188 ];
189 }
190
191 /**
192 * Test password blacklist
193 *
194 * @param string $pass Password to test
195 * @param boolean $expected Excpected return
196 *
197 * @return void
198 */
199 #[DataProvider('blacklistProvider')]
200 public function testBlacklist($pass, $expected)
201 {
202 $this->preferences->pref_password_blacklist = true;
203 $password = new \Galette\Util\Password($this->preferences);
204 $this->assertSame($password->isBlacklisted($pass), $expected, $pass);
205
206 $this->preferences->pref_password_blacklist = false;
207 $password = new \Galette\Util\Password($this->preferences);
208 $this->assertFalse($password->isBlacklisted($pass));
209 }
210
211 /**
212 * Test with personal information
213 *
214 * @return void
215 */
216 public function testPersonalInformation()
217 {
218 $infos = [
219 'login' => 'mylogin',
220 'name' => 'myname',
221 'surname' => 'mysurname',
222 'nickname' => 'mynickname'
223 ];
224
225 $this->preferences->pref_password_strength = Preferences::PWD_NONE;
226 $password = new \Galette\Util\Password($this->preferences);
227 $password->addPersonalInformation($infos);
228 foreach ($infos as $info) {
229 $this->assertTrue($password->isValid($info), implode(', ', $password->getErrors()));
230 $this->assertSame($password->getErrors(), []);
231 }
232
233 $this->preferences->pref_password_strength = Preferences::PWD_WEAK;
234 $password = new \Galette\Util\Password($this->preferences);
235 $password->addPersonalInformation($infos);
236 foreach ($infos as $info) {
237 $this->assertFalse($password->isValid($info));
238 $this->assertEquals(
239 $password->getErrors(),
240 ['Do not use any of your personal information as password!']
241 );
242 }
243
244 $this->assertFalse($password->isValid('MyLoGiN'));
245 $this->assertTrue($password->isValid('iMyLoGiN'));
246
247 //create member
248 global $zdb, $login, $i18n; // globals :(
249 $zdb = $this->zdb;
250 $i18n = new \Galette\Core\I18n(
251 \Galette\Core\I18n::DEFAULT_LANG
252 );
253 $login = new \Galette\Core\Login($this->zdb, $i18n);
254 $history = new \Galette\Core\History($this->zdb, $login, $this->preferences);
255 include_once GALETTE_ROOT . 'includes/fields_defs/members_fields.php';
256 $members_fields = $members_fields;
257
258 $adh = new \Galette\Entity\Adherent($this->zdb);
259 $adh->setDependencies(
260 $this->preferences,
261 $members_fields,
262 $history
263 );
264
265 $adh_data = [
266 'nom_adh' => 'Pignon',
267 'prenom_adh' => 'Jean-Cloud Juste',
268 'ddn_adh' => '1980-05-01',
269 'ville_adh' => 'Paris',
270 'pseudo_adh' => 'petit-cheval-de-manège',
271 'login_adh' => 'log_In',
272 'email_adh' => 'mail@galette.eu',
273 //required for check to work
274 'date_crea_adh' => date('Y-m-d'),
275 'sexe_adh' => \Galette\Entity\Adherent::NC
276 ];
277 $check = $adh->check($adh_data, [], []);
278 if (is_array($check)) {
279 var_dump($check);
280 }
281 $this->assertTrue($check);
282
283 $password = new \Galette\Util\Password($this->preferences);
284 $password->setAdherent($adh);
285
286 unset($adh_data['date_crea_adh']);
287 unset($adh_data['sexe_adh']);
288 //add compounds
289 $adh_data['c00'] = 'jean-cloud justepignon';
290 $adh_data['c000'] = 'pignonjean-cloud juste';
291 $adh_data['c01'] = 'jcjpignon';
292 $adh_data['c02'] = 'pignonjcj';
293 $adh_data['c03'] = 'pignonj';
294 $adh_data['c04'] = 'jpignon';
295
296 $adh_data['c10'] = 'log_inpignon';
297 $adh_data['c100'] = 'pignonlog_in';
298 $adh_data['c11'] = 'pignonli';
299 $adh_data['c12'] = 'lipignon';
300 $adh_data['c13'] = 'lpignon';
301 $adh_data['c14'] = 'pignonl';
302
303 $adh_data['c20'] = 'petit-cheval-de-manègepignon';
304 $adh_data['c200'] = 'pignonpetit-cheval-de-manège';
305 $adh_data['c21'] = 'pignonpcdm';
306 $adh_data['c22'] = 'pcdmpignon';
307 $adh_data['c23'] = 'ppignon';
308 $adh_data['c24'] = 'pignonp';
309
310 foreach ($adh_data as $key => $data) {
311 $this->assertFalse($password->isValid($data), $key);
312 }
313
314 $this->assertFalse($password->isValid('19800501'));
315 $this->assertFalse($password->isValid('01051980'));
316 }
317 }