| 
									
										
										
										
											2019-12-21 13:18:03 +00:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2020-01-01 16:04:14 +00:00
										 |  |  | namespace LAM\LOGIN\WEBAUTHN; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use \PHPUnit\Framework\TestCase; | 
					
						
							|  |  |  | use \Webauthn\PublicKeyCredentialDescriptor; | 
					
						
							| 
									
										
										
										
											2019-12-21 13:18:03 +00:00
										 |  |  | use \Webauthn\PublicKeyCredentialSource; | 
					
						
							| 
									
										
										
										
											2020-01-01 16:04:14 +00:00
										 |  |  | use \Webauthn\TrustPath\CertificateTrustPath; | 
					
						
							| 
									
										
										
										
											2019-12-21 13:18:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) | 
					
						
							| 
									
										
										
										
											2020-01-01 16:04:14 +00:00
										 |  |  |   Copyright (C) 2019 - 2020  Roland Gruber | 
					
						
							| 
									
										
										
										
											2019-12-21 13:18:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |   it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |   the Free Software Foundation; either version 2 of the License, or | 
					
						
							|  |  |  |   (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |   but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |   GNU General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |   along with this program; if not, write to the Free Software | 
					
						
							|  |  |  |   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-01 16:04:14 +00:00
										 |  |  | require_once __DIR__ . '/../../lib/modules.inc'; | 
					
						
							|  |  |  | require_once __DIR__ . '/../../lib/webauthn.inc'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Checks the webauthn functionality. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @author Roland Gruber | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class WebauthnManagerTest extends TestCase { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @var \PHPUnit_Framework_MockObject_MockObject|PublicKeyCredentialSourceRepositorySQLite | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	private $database; | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @var \PHPUnit_Framework_MockObject_MockObject|WebauthnManager | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	private $manager; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	protected function setup(): void { | 
					
						
							|  |  |  | 		$this->database = $this | 
					
						
							|  |  |  | 			->getMockBuilder(PublicKeyCredentialSourceRepositorySQLite::class) | 
					
						
							| 
									
										
										
										
											2020-02-22 10:07:30 +00:00
										 |  |  | 			->onlyMethods(array('findOneByCredentialId', 'findAllForUserEntity', 'saveCredentialSource')) | 
					
						
							| 
									
										
										
										
											2020-01-01 16:04:14 +00:00
										 |  |  | 			->getMock(); | 
					
						
							|  |  |  | 		$this->database->method('findOneByCredentialId')->willReturn(null); | 
					
						
							|  |  |  | 		$this->database->method('findAllForUserEntity')->willReturn(array()); | 
					
						
							| 
									
										
										
										
											2020-02-22 10:07:30 +00:00
										 |  |  | 		$this->database->method('saveCredentialSource')->willReturn(null); | 
					
						
							| 
									
										
										
										
											2020-01-01 16:04:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		$this->manager = $this | 
					
						
							|  |  |  | 			->getMockBuilder(WebauthnManager::class) | 
					
						
							| 
									
										
										
										
											2020-02-22 10:07:30 +00:00
										 |  |  | 			->onlyMethods(array('getDatabase')) | 
					
						
							| 
									
										
										
										
											2020-01-01 16:04:14 +00:00
										 |  |  | 			->getMock(); | 
					
						
							|  |  |  | 		$this->manager->method('getDatabase')->willReturn($this->database); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$cfgMain = new \LAMCfgMain(); | 
					
						
							|  |  |  | 		$cfgMain->passwordMinLength = 3; | 
					
						
							|  |  |  | 		$logFile = tmpfile(); | 
					
						
							|  |  |  | 		$logFilePath = stream_get_meta_data($logFile)['uri']; | 
					
						
							|  |  |  | 		$cfgMain->logDestination = $logFilePath; | 
					
						
							|  |  |  | 		$_SESSION['cfgMain'] = $cfgMain; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$file = tmpfile(); | 
					
						
							|  |  |  | 		$filePath = stream_get_meta_data($file)['uri']; | 
					
						
							|  |  |  | 		$config = new \LAMConfig($filePath); | 
					
						
							|  |  |  | 		$config->setTwoFactorAuthenticationDomain('domain'); | 
					
						
							|  |  |  | 		$_SESSION['config'] = $config; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function test_getAuthenticationObject() { | 
					
						
							|  |  |  | 		$authenticationObj = $this->manager->getAuthenticationObject('userDN', false); | 
					
						
							|  |  |  | 		$this->assertEquals(40, sizeof($authenticationObj->getChallenge())); | 
					
						
							|  |  |  | 		$this->assertEquals('domain', $authenticationObj->getRpId()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function test_getRegistrationObject() { | 
					
						
							|  |  |  | 		$registrationObject = $this->manager->getRegistrationObject('userDn', false); | 
					
						
							|  |  |  | 		$this->assertEquals(40, sizeof($registrationObject->getChallenge())); | 
					
						
							|  |  |  | 		$this->assertEquals('domain', $registrationObject->getRp()->getId()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function test_isRegistered() { | 
					
						
							|  |  |  | 		$this->database->method('findAllForUserEntity')->willReturn(array()); | 
					
						
							|  |  |  | 		$isRegistered = $this->manager->isRegistered('userDN'); | 
					
						
							|  |  |  | 		$this->assertFalse($isRegistered); | 
					
						
							|  |  |  | 		$this->database->method('findAllForUserEntity')->willReturn(array( | 
					
						
							|  |  |  | 			new PublicKeyCredentialSource( | 
					
						
							|  |  |  | 				"id1", | 
					
						
							|  |  |  | 				PublicKeyCredentialDescriptor::CREDENTIAL_TYPE_PUBLIC_KEY, | 
					
						
							|  |  |  | 				array(), | 
					
						
							|  |  |  | 				"atype", | 
					
						
							|  |  |  | 				new CertificateTrustPath(array('x5c' => 'test')), | 
					
						
							|  |  |  | 				\Ramsey\Uuid\Uuid::uuid1(), | 
					
						
							|  |  |  | 				"p1", | 
					
						
							|  |  |  | 				"uh1", | 
					
						
							|  |  |  | 				1) | 
					
						
							|  |  |  | 		)); | 
					
						
							|  |  |  | 		$isRegistered = $this->manager->isRegistered('userDN'); | 
					
						
							|  |  |  | 		$this->assertTrue($isRegistered); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |