mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 22:10:55 +01:00
Get rid of "throwResult()" for control flow in MFA factors
Summary: Depends on D20034. Ref T13222. This is just cleanup -- I thought we'd have like two of these, but we ended up having a whole lot in Duo and a decent number in SMS. Just let factors return a result explicitly if they can make a decision early. I think using `instanceof` for control flow is a lesser evil than using `catch`, on the balance. Test Plan: `grep`, went through enroll/gate flows on SMS and Duo. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13222 Differential Revision: https://secure.phabricator.com/D20035
This commit is contained in:
parent
bce44385e1
commit
29b4fad941
5 changed files with 24 additions and 40 deletions
|
@ -2241,7 +2241,6 @@ phutil_register_library_map(array(
|
|||
'PhabricatorAuthFactorProviderTransactionType' => 'applications/auth/xaction/PhabricatorAuthFactorProviderTransactionType.php',
|
||||
'PhabricatorAuthFactorProviderViewController' => 'applications/auth/controller/mfa/PhabricatorAuthFactorProviderViewController.php',
|
||||
'PhabricatorAuthFactorResult' => 'applications/auth/factor/PhabricatorAuthFactorResult.php',
|
||||
'PhabricatorAuthFactorResultException' => 'applications/auth/exception/PhabricatorAuthFactorResultException.php',
|
||||
'PhabricatorAuthFactorTestCase' => 'applications/auth/factor/__tests__/PhabricatorAuthFactorTestCase.php',
|
||||
'PhabricatorAuthFinishController' => 'applications/auth/controller/PhabricatorAuthFinishController.php',
|
||||
'PhabricatorAuthHMACKey' => 'applications/auth/storage/PhabricatorAuthHMACKey.php',
|
||||
|
@ -7970,7 +7969,6 @@ phutil_register_library_map(array(
|
|||
'PhabricatorAuthFactorProviderTransactionType' => 'PhabricatorModularTransactionType',
|
||||
'PhabricatorAuthFactorProviderViewController' => 'PhabricatorAuthFactorProviderController',
|
||||
'PhabricatorAuthFactorResult' => 'Phobject',
|
||||
'PhabricatorAuthFactorResultException' => 'Exception',
|
||||
'PhabricatorAuthFactorTestCase' => 'PhabricatorTestCase',
|
||||
'PhabricatorAuthFinishController' => 'PhabricatorAuthController',
|
||||
'PhabricatorAuthHMACKey' => 'PhabricatorAuthDAO',
|
||||
|
|
|
@ -540,14 +540,22 @@ final class PhabricatorAuthSessionEngine extends Phobject {
|
|||
$provider = $factor->getFactorProvider();
|
||||
$impl = $provider->getFactor();
|
||||
|
||||
try {
|
||||
$new_challenges = $impl->getNewIssuedChallenges(
|
||||
$factor,
|
||||
$viewer,
|
||||
$issued_challenges);
|
||||
} catch (PhabricatorAuthFactorResultException $ex) {
|
||||
$ok = false;
|
||||
$validation_results[$factor_phid] = $ex->getResult();
|
||||
$new_challenges = $impl->getNewIssuedChallenges(
|
||||
$factor,
|
||||
$viewer,
|
||||
$issued_challenges);
|
||||
|
||||
// NOTE: We may get a list of challenges back, or may just get an early
|
||||
// result. For example, this can happen on an SMS factor if all SMS
|
||||
// mailers have been disabled.
|
||||
if ($new_challenges instanceof PhabricatorAuthFactorResult) {
|
||||
$result = $new_challenges;
|
||||
|
||||
if (!$result->getIsValid()) {
|
||||
$ok = false;
|
||||
}
|
||||
|
||||
$validation_results[$factor_phid] = $result;
|
||||
$challenge_map[$factor_phid] = $issued_challenges;
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorAuthFactorResultException
|
||||
extends Exception {
|
||||
|
||||
private $result;
|
||||
|
||||
public function __construct(PhabricatorAuthFactorResult $result) {
|
||||
$this->result = $result;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function getResult() {
|
||||
return $this->result;
|
||||
}
|
||||
|
||||
}
|
|
@ -141,6 +141,11 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
|||
$viewer,
|
||||
$challenges);
|
||||
|
||||
if ($new_challenges instanceof PhabricatorAuthFactorResult) {
|
||||
unset($unguarded);
|
||||
return $new_challenges;
|
||||
}
|
||||
|
||||
assert_instances_of($new_challenges, 'PhabricatorAuthChallenge');
|
||||
|
||||
foreach ($new_challenges as $new_challenge) {
|
||||
|
@ -493,10 +498,6 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
|||
$rows);
|
||||
}
|
||||
|
||||
final protected function throwResult(PhabricatorAuthFactorResult $result) {
|
||||
throw new PhabricatorAuthFactorResultException($result);
|
||||
}
|
||||
|
||||
final protected function getInstallDisplayName() {
|
||||
$uri = PhabricatorEnv::getURI('/');
|
||||
$uri = new PhutilURI($uri);
|
||||
|
|
|
@ -195,35 +195,29 @@ final class PhabricatorSMSAuthFactor
|
|||
}
|
||||
|
||||
if (!$this->loadUserContactNumber($viewer)) {
|
||||
$result = $this->newResult()
|
||||
return $this->newResult()
|
||||
->setIsError(true)
|
||||
->setErrorMessage(
|
||||
pht(
|
||||
'Your account has no primary contact number.'));
|
||||
|
||||
$this->throwResult($result);
|
||||
}
|
||||
|
||||
if (!$this->isSMSMailerConfigured()) {
|
||||
$result = $this->newResult()
|
||||
return $this->newResult()
|
||||
->setIsError(true)
|
||||
->setErrorMessage(
|
||||
pht(
|
||||
'No outbound mailer which can deliver SMS messages is '.
|
||||
'configured.'));
|
||||
|
||||
$this->throwResult($result);
|
||||
}
|
||||
|
||||
if (!$this->hasCSRF($config)) {
|
||||
$result = $this->newResult()
|
||||
return $this->newResult()
|
||||
->setIsContinue(true)
|
||||
->setErrorMessage(
|
||||
pht(
|
||||
'A text message with an authorization code will be sent to your '.
|
||||
'primary contact number.'));
|
||||
|
||||
$this->throwResult($result);
|
||||
}
|
||||
|
||||
// Otherwise, issue a new challenge.
|
||||
|
|
Loading…
Reference in a new issue