6 require_once
'libs/composer/vendor/autoload.php';
7 require_once
'Services/User/classes/class.ilUserPasswordManager.php';
8 require_once
'Services/User/classes/class.ilUserPasswordEncoderFactory.php';
9 require_once
'Services/Password/classes/class.ilBasePasswordEncoder.php';
10 require_once
'Services/Utilities/classes/class.ilUtil.php';
11 require_once
'Services/User/classes/class.ilObjUser.php';
12 require_once
'Services/User/exceptions/class.ilUserException.php';
13 require_once
'Services/User/test/ilUserBaseTest.php';
69 protected function setUp() : void
71 vfs\vfsStream::setup();
72 $this->
setTestDirectory(vfs\vfsStream::newDirectory(
'tests')->at(vfs\vfsStreamWrapper::getRoot()));
95 'password_encoder' =>
'md5',
110 'password_encoder' =>
'md5',
111 'encoder_factory' =>
'test',
115 }
catch (TypeError
$e) {
116 throw new PHPUnit\Framework\Error\Error($e->getMessage(), $e->getCode(), $e->getFile(), $e->getLine());
126 $factory_mock = $this->getMockBuilder(
'ilUserPasswordEncoderFactory')->disableOriginalConstructor()->getMock();
127 $factory_mock->expects($this->exactly(2))->method(
'getSupportedEncoderNames')->will($this->onConsecutiveCalls(
139 'password_encoder' =>
'md5',
140 'encoder_factory' => $factory_mock,
144 $this->assertInstanceOf(
'ilUserPasswordManager', $password_manager);
145 $this->assertEquals(
'md5', $password_manager->getEncoderName());
146 $this->assertEquals($factory_mock, $password_manager->getEncoderFactory());
148 $this->assertTrue($password_manager->isEncodingTypeSupported(
'second_mockencoder'));
149 $this->assertFalse($password_manager->isEncodingTypeSupported(
'second_mockencoder'));
158 $user_mock = $this->getMockBuilder(
'ilObjUser')->disableOriginalConstructor()->getMock();
159 $encoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
160 $factory_mock = $this->getMockBuilder(
'ilUserPasswordEncoderFactory')->disableOriginalConstructor()->getMock();
162 $user_mock->expects($this->once())->method(
'setPasswordSalt')->with($this->isType(
'string'));
163 $user_mock->expects($this->once())->method(
'getPasswordSalt')->will($this->returnValue(
'asuperrandomsalt'));
164 $user_mock->expects($this->once())->method(
'setPasswordEncodingType')->with($this->equalTo(
'mockencoder'));
165 $user_mock->expects($this->once())->method(
'setPasswd')->with(
166 $this->equalTo(self::ENCODED_PASSWORD),
170 $encoder->expects($this->once())->method(
'getName')->will($this->returnValue(
'mockencoder'));
171 $encoder->expects($this->once())->method(
'requiresSalt')->will($this->returnValue(
true));
172 $encoder->expects($this->once())->method(
'encodePassword')
174 $this->equalTo(self::PASSWORD),
175 $this->isType(
'string')
176 )->will($this->returnValue(self::ENCODED_PASSWORD));
178 $factory_mock->expects($this->once())->method(
'getEncoderByName')->will($this->returnValue($encoder));
182 'password_encoder' =>
'mockencoder',
183 'encoder_factory' => $factory_mock,
188 $password_manager->encodePassword($user_mock, self::PASSWORD);
197 $user_mock = $this->getMockBuilder(
'ilObjUser')->disableOriginalConstructor()->getMock();
198 $encoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
199 $factory_mock = $this->getMockBuilder(
'ilUserPasswordEncoderFactory')->disableOriginalConstructor()->getMock();
201 $user_mock->expects($this->once())->method(
'setPasswordSalt')->with($this->equalTo(null));
202 $user_mock->expects($this->once())->method(
'getPasswordSalt')->will($this->returnValue(null));
203 $user_mock->expects($this->once())->method(
'setPasswordEncodingType')->with($this->equalTo(
'mockencoder'));
204 $user_mock->expects($this->once())->method(
'setPasswd')->with(
205 $this->equalTo(self::ENCODED_PASSWORD),
209 $encoder->expects($this->once())->method(
'getName')->will($this->returnValue(
'mockencoder'));
210 $encoder->expects($this->once())->method(
'requiresSalt')->will($this->returnValue(
false));
211 $encoder->expects($this->once())->method(
'encodePassword')->with(
212 $this->equalTo(self::PASSWORD),
214 )->will($this->returnValue(self::ENCODED_PASSWORD));
216 $factory_mock->expects($this->once())->method(
'getEncoderByName')->will($this->returnValue($encoder));
220 'password_encoder' =>
'mockencoder',
221 'encoder_factory' => $factory_mock,
226 $password_manager->encodePassword($user_mock, self::PASSWORD);
235 $user_mock = $this->getMockBuilder(
'ilObjUser')->disableOriginalConstructor()->getMock();
236 $encoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
237 $factory_mock = $this->getMockBuilder(
'ilUserPasswordEncoderFactory')->disableOriginalConstructor()->getMock();
239 $user_mock->expects($this->atLeast(1))->method(
'getPasswordSalt')->will($this->returnValue(
'asuperrandomsalt'));
240 $user_mock->expects($this->atLeast(1))->method(
'getPasswordEncodingType')->will($this->returnValue(
'mockencoder'));
241 $user_mock->expects($this->atLeast(1))->method(
'getPasswd')->will($this->returnValue(self::ENCODED_PASSWORD));
242 $user_mock->expects($this->never())->method(
'resetPassword');
244 $encoder->expects($this->once())->method(
'getName')->will($this->returnValue(
'mockencoder'));
245 $encoder->expects($this->once())->method(
'isPasswordValid')->with(
246 $this->equalTo(self::ENCODED_PASSWORD),
247 $this->equalTo(self::PASSWORD),
248 $this->isType(
'string')
249 )->will($this->returnValue(
true));
250 $encoder->expects($this->once())->method(
'requiresReencoding')
251 ->with($this->equalTo(self::ENCODED_PASSWORD))
252 ->will($this->returnValue(
false));
254 $factory_mock->expects($this->once())->method(
'getEncoderByName')->will($this->returnValue($encoder));
258 'password_encoder' =>
'mockencoder',
259 'encoder_factory' => $factory_mock,
264 $this->assertTrue($password_manager->verifyPassword($user_mock, self::PASSWORD));
273 $user_mock = $this->getMockBuilder(
'ilObjUser')->disableOriginalConstructor()->getMock();
274 $encoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
275 $factory_mock = $this->getMockBuilder(
'ilUserPasswordEncoderFactory')->disableOriginalConstructor()->getMock();
277 $user_mock->expects($this->once())->method(
'getPasswordSalt')->will($this->returnValue(
'asuperrandomsalt'));
278 $user_mock->expects($this->once())->method(
'getPasswordEncodingType')->will($this->returnValue(
'second_mockencoder'));
279 $user_mock->expects($this->once())->method(
'getPasswd')->will($this->returnValue(self::ENCODED_PASSWORD));
280 $user_mock->expects($this->once())->method(
'resetPassword')->with(
281 $this->equalTo(self::PASSWORD),
282 $this->equalTo(self::PASSWORD)
285 $encoder->expects($this->once())->method(
'getName')->will($this->returnValue(
'second_mockencoder'));
286 $encoder->expects($this->once())->method(
'isPasswordValid')->with(
287 $this->equalTo(self::ENCODED_PASSWORD),
288 $this->equalTo(self::PASSWORD),
289 $this->isType(
'string')
290 )->will($this->returnValue(
true));
291 $encoder->expects($this->never())->method(
'requiresReencoding')
292 ->with($this->equalTo(self::ENCODED_PASSWORD))
293 ->will($this->returnValue(
false));
295 $factory_mock->expects($this->once())->method(
'getEncoderByName')->will($this->returnValue($encoder));
299 'password_encoder' =>
'mockencoder',
300 'encoder_factory' => $factory_mock,
305 $this->assertTrue($password_manager->verifyPassword($user_mock, self::PASSWORD));
314 $user_mock = $this->getMockBuilder(
'ilObjUser')->disableOriginalConstructor()->getMock();
315 $encoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
316 $factory_mock = $this->getMockBuilder(
'ilUserPasswordEncoderFactory')->disableOriginalConstructor()->getMock();
318 $user_mock->expects($this->once())->method(
'getPasswordSalt')->will($this->returnValue(
'asuperrandomsalt'));
319 $user_mock->expects($this->once())->method(
'getPasswordEncodingType')->will($this->returnValue(
'mockencoder'));
320 $user_mock->expects($this->exactly(2))->method(
'getPasswd')->will($this->returnValue(self::ENCODED_PASSWORD));
321 $user_mock->expects($this->once())->method(
'resetPassword')->with(
322 $this->equalTo(self::PASSWORD),
323 $this->equalTo(self::PASSWORD)
326 $encoder->expects($this->once())->method(
'getName')->will($this->returnValue(
'mockencoder'));
327 $encoder->expects($this->once())->method(
'isPasswordValid')->with(
328 $this->equalTo(self::ENCODED_PASSWORD),
329 $this->equalTo(self::PASSWORD),
330 $this->isType(
'string')
331 )->will($this->returnValue(
true));
332 $encoder->expects($this->once())->method(
'requiresReencoding')
333 ->with($this->equalTo(self::ENCODED_PASSWORD))
334 ->will($this->returnValue(
true));
336 $factory_mock->expects($this->once())->method(
'getEncoderByName')->will($this->returnValue($encoder));
340 'password_encoder' =>
'mockencoder',
341 'encoder_factory' => $factory_mock,
346 $this->assertTrue($password_manager->verifyPassword($user_mock, self::PASSWORD));
355 $user_mock = $this->getMockBuilder(
'ilObjUser')->disableOriginalConstructor()->getMock();
356 $encoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
357 $factory_mock = $this->getMockBuilder(
'ilUserPasswordEncoderFactory')->disableOriginalConstructor()->getMock();
359 $user_mock->expects($this->once())->method(
'getPasswordSalt')->will($this->returnValue(
'asuperrandomsalt'));
360 $user_mock->expects($this->once())->method(
'getPasswordEncodingType')->will($this->returnValue(
'second_mockencoder'));
361 $user_mock->expects($this->once())->method(
'getPasswd')->will($this->returnValue(self::ENCODED_PASSWORD));
362 $user_mock->expects($this->never())->method(
'resetPassword');
364 $encoder->expects($this->once())->method(
'getName')->will($this->returnValue(
'second_mockencoder'));
365 $encoder->expects($this->never())->method(
'requiresReencoding');
366 $encoder->expects($this->once())->method(
'isPasswordValid')
368 $this->equalTo(self::ENCODED_PASSWORD),
369 $this->equalTo(self::PASSWORD),
370 $this->isType(
'string')
371 )->will($this->returnValue(
false));
373 $factory_mock->expects($this->once())->method(
'getEncoderByName')->will($this->returnValue($encoder));
377 'password_encoder' =>
'mockencoder',
378 'encoder_factory' => $factory_mock,
383 $this->assertFalse($password_manager->verifyPassword($user_mock, self::PASSWORD));
394 $this->assertInstanceOf(
'ilUserPasswordEncoderFactory',
$factory);
405 'default_password_encoder' =>
'md5',
408 $this->assertEquals(
'md5',
$factory->getDefaultEncoder());
410 $encoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
411 $encoder->expects($this->atLeastOnce())->method(
'getName')->will($this->returnValue(
'mockencoder'));
413 $second_mockencoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
414 $second_mockencoder->expects($this->atLeastOnce())->method(
'getName')->will($this->returnValue(
'second_mockencoder'));
416 $factory->setEncoders(array($encoder, $second_mockencoder));
417 $this->assertCount(2,
$factory->getEncoders());
418 $this->assertCount(2,
$factory->getSupportedEncoderNames());
421 array_diff(array(
'mockencoder',
'second_mockencoder'),
$factory->getSupportedEncoderNames())
425 array_diff(
$factory->getSupportedEncoderNames(), array(
'mockencoder',
'second_mockencoder'))
439 $factory->setEncoders(array(
'phpunit'));
450 'default_password_encoder' =>
'md5',
453 $factory->getEncoderByName(
'phpunit');
466 $factory->getEncoderByName(
'phpunit',
true);
477 'default_password_encoder' =>
'phpunit',
480 $factory->getEncoderByName(
'phpunit',
true);
490 $encoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
491 $encoder->expects($this->atLeastOnce())->method(
'getName')->will($this->returnValue(
'mockencoder'));
494 'default_password_encoder' => $encoder->getName(),
497 $factory->setEncoders(array($encoder));
498 $this->assertEquals($encoder,
$factory->getEncoderByName(
'phpunit',
true));
508 $encoder = $this->getMockBuilder(
'ilBasePasswordEncoder')->disableOriginalConstructor()->getMock();
509 $encoder->expects($this->atLeastOnce())->method(
'getName')->will($this->returnValue(
'mockencoder'));
512 'default_password_encoder' => $encoder->getName(),
515 $factory->setEncoders(array($encoder));
516 $this->assertEquals($encoder,
$factory->getEncoderByName(
'mockencoder',
true));
testPasswordManagerEncodesRawPasswordWithoutSalt()
testPasswordManagerNeverMigratesPasswordOnFailedVerificationWithVariantEncoders()
testExceptionIsRaisedIfPasswordManagerIsCreatedWithoutValidFactory()
testFactoryReturnsTheDefaultEncoderIfAnUnsupportedEncoderIsRequestedAndASupportedDefaultEncoderWasSpecifiedInFallbackMode()
testFactoryRaisesAnExceptionIfAnUnsupportedEncoderWasInjected()
testExceptionIsRaisedIfAnUnsupportedEncoderIsRequestedFromFactory()
assertException($exception_class)
setTestDirectoryUrl(string $testDirectoryUrl)
testPasswordManagerVerifiesPassword()
testExceptionIsRaisedIfPasswordManagerIsCreatedWithoutEncoderInformation()
setTestDirectory(vfs\vfsStreamDirectory $testDirectory)
testInstanceCanBeCreated()
testPasswordManagerEncodesRawPasswordWithSalt()
testFactoryReturnsCorrectEncoderIfAMatchingEncoderWasFound()
testFactoryCanBeCreated()
testFactoryRaisesAnExceptionIfAnUnsupportedEncoderIsRequestedAndNoDefaultEncoderWasSpecifiedInFallbackMode()
testFactoryRaisesAnExceptionIfAnUnsupportedEncoderIsRequestedAndTheDefaultEncoderDoesNotMatchOneOfTheSupportedEncodersInFallbackMode()
testPasswordManagerMigratesPasswordOnVerificationWithVariantEncoders()
testExceptionIsRaisedIfPasswordManagerIsCreatedWithoutFactory()
testPasswordManagerReencodesPasswordIfReencodingIsNecessary()
testGettersOfFactoryShouldReturnWhatWasSetBySetters()