/**
  * 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'));
 }