public function testGetRequestByClass() { $mb = $this->getMockBuilder(AuthenticationRequest::class, 'AuthenticationRequestTest_AuthenticationRequest2'); $reqs = [$this->getMockForAbstractClass(AuthenticationRequest::class, [], 'AuthenticationRequestTest_AuthenticationRequest1'), $mb->getMockForAbstractClass(), $mb->getMockForAbstractClass(), $this->getMockForAbstractClass(PasswordAuthenticationRequest::class, [], 'AuthenticationRequestTest_PasswordAuthenticationRequest')]; $this->assertNull(AuthenticationRequest::getRequestByClass($reqs, 'AuthenticationRequestTest_AuthenticationRequest0')); $this->assertSame($reqs[0], AuthenticationRequest::getRequestByClass($reqs, 'AuthenticationRequestTest_AuthenticationRequest1')); $this->assertNull(AuthenticationRequest::getRequestByClass($reqs, 'AuthenticationRequestTest_AuthenticationRequest2')); $this->assertNull(AuthenticationRequest::getRequestByClass($reqs, PasswordAuthenticationRequest::class)); $this->assertNull(AuthenticationRequest::getRequestByClass($reqs, 'ClassThatDoesNotExist')); $this->assertNull(AuthenticationRequest::getRequestByClass($reqs, 'AuthenticationRequestTest_AuthenticationRequest0', true)); $this->assertSame($reqs[0], AuthenticationRequest::getRequestByClass($reqs, 'AuthenticationRequestTest_AuthenticationRequest1', true)); $this->assertNull(AuthenticationRequest::getRequestByClass($reqs, 'AuthenticationRequestTest_AuthenticationRequest2', true)); $this->assertSame($reqs[3], AuthenticationRequest::getRequestByClass($reqs, PasswordAuthenticationRequest::class, true)); $this->assertNull(AuthenticationRequest::getRequestByClass($reqs, 'ClassThatDoesNotExist', true)); }
/** * Try to reset the password * @param \User $user * @param AuthenticationRequest[] $reqs * @return AuthenticationResponse */ protected function tryReset(\User $user, array $reqs) { $data = $this->manager->getAuthenticationSessionData('reset-pass'); if (!$data) { return AuthenticationResponse::newAbstain(); } if (is_array($data)) { $data = (object) $data; } if (!is_object($data)) { throw new \UnexpectedValueException('reset-pass is not valid'); } if (!isset($data->msg)) { throw new \UnexpectedValueException('reset-pass msg is missing'); } elseif (!$data->msg instanceof \Message) { throw new \UnexpectedValueException('reset-pass msg is not valid'); } elseif (!isset($data->hard)) { throw new \UnexpectedValueException('reset-pass hard is missing'); } elseif (isset($data->req) && (!$data->req instanceof PasswordAuthenticationRequest || !array_key_exists('retype', $data->req->getFieldInfo()))) { throw new \UnexpectedValueException('reset-pass req is not valid'); } if (!$data->hard) { $req = ButtonAuthenticationRequest::getRequestByName($reqs, 'skipReset'); if ($req) { $this->manager->removeAuthenticationSessionData('reset-pass'); return AuthenticationResponse::newPass(); } } $needReq = isset($data->req) ? $data->req : new PasswordAuthenticationRequest(); if (!$needReq->action) { $needReq->action = AuthManager::ACTION_CHANGE; } $needReq->required = $data->hard ? AuthenticationRequest::REQUIRED : AuthenticationRequest::OPTIONAL; $needReqs = [$needReq]; if (!$data->hard) { $needReqs[] = new ButtonAuthenticationRequest('skipReset', wfMessage('authprovider-resetpass-skip-label'), wfMessage('authprovider-resetpass-skip-help')); } $req = AuthenticationRequest::getRequestByClass($reqs, get_class($needReq)); if (!$req || !array_key_exists('retype', $req->getFieldInfo())) { return AuthenticationResponse::newUI($needReqs, $data->msg, 'warning'); } if ($req->password !== $req->retype) { return AuthenticationResponse::newUI($needReqs, new \Message('badretype'), 'error'); } $req->username = $user->getName(); $status = $this->manager->allowsAuthenticationDataChange($req); if (!$status->isGood()) { return AuthenticationResponse::newUI($needReqs, $status->getMessage(), 'error'); } $this->manager->changeAuthenticationData($req); $this->manager->removeAuthenticationSessionData('reset-pass'); return AuthenticationResponse::newPass(); }