/** * Try to reset the password * @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(); } } if (isset($data->req)) { $needReq = $data->req; } else { $needReq = new PasswordAuthenticationRequest(); $needReq->action = AuthManager::ACTION_CHANGE; } $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); } if ($req->password !== $req->retype) { return AuthenticationResponse::newUI($needReqs, new \Message('badretype')); } $req->username = $user->getName(); $status = $this->manager->allowsAuthenticationDataChange($req); if (!$status->isGood()) { return AuthenticationResponse::newUI($needReqs, $status->getMessage()); } $this->manager->changeAuthenticationData($req); $this->manager->removeAuthenticationSessionData('reset-pass'); return AuthenticationResponse::newPass(); }
public function testGetRequestByName() { $reqs = []; $reqs['testOne'] = new ButtonAuthenticationRequest('foo', wfMessage('msg'), wfMessage('help')); $reqs[] = new ButtonAuthenticationRequest('bar', wfMessage('msg1'), wfMessage('help1')); $reqs[] = new ButtonAuthenticationRequest('bar', wfMessage('msg2'), wfMessage('help2')); $reqs['testSub'] = $this->getMockBuilder(ButtonAuthenticationRequest::class)->setConstructorArgs(['subclass', wfMessage('msg3'), wfMessage('help3')])->getMock(); $this->assertNull(ButtonAuthenticationRequest::getRequestByName($reqs, 'missing')); $this->assertSame($reqs['testOne'], ButtonAuthenticationRequest::getRequestByName($reqs, 'foo')); $this->assertNull(ButtonAuthenticationRequest::getRequestByName($reqs, 'bar')); $this->assertSame($reqs['testSub'], ButtonAuthenticationRequest::getRequestByName($reqs, 'subclass')); }