Very rough edit workflow for AuthProvider configuration
Summary: Ref T1536. Many rough / broken edges, but adds the rough skeleton of the provider edit workflow.
Test Plan: {F46333}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, chad
Maniphest Tasks: T1536
Differential Revision: https://secure.phabricator.com/D6200
This commit is contained in:
@@ -0,0 +1,220 @@
|
||||
<?php
|
||||
|
||||
final class PhabricatorAuthEditController
|
||||
extends PhabricatorAuthProviderConfigController {
|
||||
|
||||
private $providerClass;
|
||||
private $configID;
|
||||
|
||||
public function willProcessRequest(array $data) {
|
||||
$this->providerClass = idx($data, 'className');
|
||||
$this->configID = idx($data, 'id');
|
||||
}
|
||||
|
||||
public function processRequest() {
|
||||
$request = $this->getRequest();
|
||||
$viewer = $request->getUser();
|
||||
|
||||
$provider = null;
|
||||
if ($this->configID) {
|
||||
$config = id(new PhabricatorAuthProviderConfigQuery())
|
||||
->setViewer($viewer)
|
||||
->requireCapabilities(
|
||||
array(
|
||||
PhabricatorPolicyCapability::CAN_VIEW,
|
||||
PhabricatorPolicyCapability::CAN_EDIT,
|
||||
))
|
||||
->withIDs(array($this->configID))
|
||||
->executeOne();
|
||||
if (!$config) {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
$is_new = false;
|
||||
} else {
|
||||
$providers = PhabricatorAuthProvider::getAllBaseProviders();
|
||||
foreach ($providers as $candidate_provider) {
|
||||
if (get_class($candidate_provider) === $this->providerClass) {
|
||||
$provider = $candidate_provider;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$provider) {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
// TODO: When we have multi-auth providers, support them here.
|
||||
|
||||
$configs = id(new PhabricatorAuthProviderConfigQuery())
|
||||
->setViewer($viewer)
|
||||
->withProviderClasses(array(get_class($provider)))
|
||||
->execute();
|
||||
|
||||
if ($configs) {
|
||||
// TODO: We could link to the other config's edit interface here.
|
||||
throw new Exception("This provider is already configured!");
|
||||
}
|
||||
|
||||
$config = id(new PhabricatorAuthProviderConfig())
|
||||
->setProviderClass(get_class($provider))
|
||||
->setShouldAllowLogin(1)
|
||||
->setShouldAllowRegistration(1)
|
||||
->setShouldAllowLink(1)
|
||||
->setShouldAllowUnlink(1);
|
||||
|
||||
$is_new = true;
|
||||
}
|
||||
|
||||
$errors = array();
|
||||
|
||||
$v_registration = $config->getShouldAllowRegistration();
|
||||
$v_link = $config->getShouldAllowLink();
|
||||
$v_unlink = $config->getShouldAllowUnlink();
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
$xactions = array();
|
||||
|
||||
if ($is_new) {
|
||||
$xactions[] = id(new PhabricatorAuthProviderConfigTransaction())
|
||||
->setTransactionType(
|
||||
PhabricatorAuthProviderConfigTransaction::TYPE_ENABLE)
|
||||
->setNewValue(1);
|
||||
|
||||
$config->setProviderType($provider->getProviderType());
|
||||
$config->setProviderDomain($provider->getProviderDomain());
|
||||
}
|
||||
|
||||
$xactions[] = id(new PhabricatorAuthProviderConfigTransaction())
|
||||
->setTransactionType(
|
||||
PhabricatorAuthProviderConfigTransaction::TYPE_REGISTRATION)
|
||||
->setNewValue($request->getInt('allowRegistration'));
|
||||
|
||||
$xactions[] = id(new PhabricatorAuthProviderConfigTransaction())
|
||||
->setTransactionType(
|
||||
PhabricatorAuthProviderConfigTransaction::TYPE_LINK)
|
||||
->setNewValue($request->getInt('allowLink'));
|
||||
|
||||
$xactions[] = id(new PhabricatorAuthProviderConfigTransaction())
|
||||
->setTransactionType(
|
||||
PhabricatorAuthProviderConfigTransaction::TYPE_UNLINK)
|
||||
->setNewValue($request->getInt('allowUnlink'));
|
||||
|
||||
if (!$errors) {
|
||||
$editor = id(new PhabricatorAuthProviderConfigEditor())
|
||||
->setActor($viewer)
|
||||
->setContentSourceFromRequest($request)
|
||||
->setContinueOnNoEffect(true)
|
||||
->applyTransactions($config, $xactions);
|
||||
|
||||
return id(new AphrontRedirectResponse())->setURI(
|
||||
$this->getApplicationURI());
|
||||
}
|
||||
}
|
||||
|
||||
if ($errors) {
|
||||
$errors = id(new AphrontErrorView())->setErrors($errors);
|
||||
}
|
||||
|
||||
if ($is_new) {
|
||||
$button = pht('Add Provider');
|
||||
$crumb = pht('Add Provider');
|
||||
$title = pht('Add Authentication Provider');
|
||||
$cancel_uri = $this->getApplicationURI('/config/new/');
|
||||
} else {
|
||||
$button = pht('Save');
|
||||
$crumb = pht('Edit Provider');
|
||||
$title = pht('Edit Authentication Provider');
|
||||
$cancel_uri = $this->getApplicationURI();
|
||||
}
|
||||
|
||||
$str_registration = hsprintf(
|
||||
'<strong>%s:</strong> %s',
|
||||
pht('Allow Registration'),
|
||||
pht(
|
||||
'Allow users to register new Phabricator accounts using this '.
|
||||
'provider. If you disable registration, users can still use this '.
|
||||
'provider to log in to existing accounts, but will not be able to '.
|
||||
'create new accounts.'));
|
||||
|
||||
$str_link = hsprintf(
|
||||
'<strong>%s:</strong> %s',
|
||||
pht('Allow Linking Accounts'),
|
||||
pht(
|
||||
'Allow users to link account credentials for this provider to '.
|
||||
'existing Phabricator accounts. There is normally no reason to '.
|
||||
'disable this unless you are trying to move away from a provider '.
|
||||
'and want to stop users from creating new account links.'));
|
||||
|
||||
$str_unlink = hsprintf(
|
||||
'<strong>%s:</strong> %s',
|
||||
pht('Allow Unlinking Accounts'),
|
||||
pht(
|
||||
'Allow users to unlink account credentials for this provider from '.
|
||||
'existing Phabricator accounts. If you disable this, Phabricator '.
|
||||
'accounts will be permanently bound to provider accounts.'));
|
||||
|
||||
$form = id(new AphrontFormView())
|
||||
->setUser($viewer)
|
||||
->setFlexible(true)
|
||||
->appendChild(
|
||||
id(new AphrontFormStaticControl())
|
||||
->setLabel(pht('Provider'))
|
||||
->setValue($provider->getProviderName()))
|
||||
->appendChild(
|
||||
id(new AphrontFormCheckboxControl())
|
||||
->setLabel(pht('Allow'))
|
||||
->addCheckbox(
|
||||
'allowRegistration',
|
||||
1,
|
||||
$str_registration,
|
||||
$v_registration))
|
||||
->appendChild(
|
||||
id(new AphrontFormCheckboxControl())
|
||||
->addCheckbox(
|
||||
'allowLink',
|
||||
1,
|
||||
$str_link,
|
||||
$v_link))
|
||||
->appendChild(
|
||||
id(new AphrontFormCheckboxControl())
|
||||
->addCheckbox(
|
||||
'allowUnlink',
|
||||
1,
|
||||
$str_unlink,
|
||||
$v_unlink));
|
||||
|
||||
$provider->extendEditForm($form);
|
||||
|
||||
$form
|
||||
->appendChild(
|
||||
id(new AphrontFormSubmitControl())
|
||||
->addCancelButton($cancel_uri)
|
||||
->setValue($button));
|
||||
|
||||
$crumbs = $this->buildApplicationCrumbs();
|
||||
$crumbs->addCrumb(
|
||||
id(new PhabricatorCrumbView())
|
||||
->setName($crumb));
|
||||
|
||||
$xaction_view = null;
|
||||
if (!$is_new) {
|
||||
$xactions = id(new PhabricatorAuthProviderConfigTransactionQuery());
|
||||
// TOOD: ...
|
||||
}
|
||||
|
||||
return $this->buildApplicationPage(
|
||||
array(
|
||||
$crumbs,
|
||||
$errors,
|
||||
$form,
|
||||
$xaction_view
|
||||
),
|
||||
array(
|
||||
'title' => $title,
|
||||
'dust' => true,
|
||||
'device' => true,
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user