diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index 54abec74fd..74c4d772e9 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -814,7 +814,7 @@ celerity_register_resource_map(array( ), 'aphront-form-view-css' => array( - 'uri' => '/res/40b6b684/rsrc/css/aphront/form-view.css', + 'uri' => '/res/28838b5b/rsrc/css/aphront/form-view.css', 'type' => 'css', 'requires' => array( @@ -4057,7 +4057,7 @@ celerity_register_resource_map(array( ), array( 'packages' => array( - 'f2a3a549' => + 'cd17ab77' => array( 'name' => 'core.pkg.css', 'symbols' => @@ -4105,7 +4105,7 @@ celerity_register_resource_map(array( 40 => 'phabricator-property-list-view-css', 41 => 'phabricator-tag-view-css', ), - 'uri' => '/res/pkg/f2a3a549/core.pkg.css', + 'uri' => '/res/pkg/cd17ab77/core.pkg.css', 'type' => 'css', ), 'f2ad0683' => @@ -4299,16 +4299,16 @@ celerity_register_resource_map(array( 'reverse' => array( 'aphront-attached-file-view-css' => 'a7ca34a9', - 'aphront-dialog-view-css' => 'f2a3a549', - 'aphront-error-view-css' => 'f2a3a549', - 'aphront-form-view-css' => 'f2a3a549', - 'aphront-list-filter-view-css' => 'f2a3a549', - 'aphront-pager-view-css' => 'f2a3a549', - 'aphront-panel-view-css' => 'f2a3a549', - 'aphront-table-view-css' => 'f2a3a549', - 'aphront-tokenizer-control-css' => 'f2a3a549', - 'aphront-tooltip-css' => 'f2a3a549', - 'aphront-typeahead-control-css' => 'f2a3a549', + 'aphront-dialog-view-css' => 'cd17ab77', + 'aphront-error-view-css' => 'cd17ab77', + 'aphront-form-view-css' => 'cd17ab77', + 'aphront-list-filter-view-css' => 'cd17ab77', + 'aphront-pager-view-css' => 'cd17ab77', + 'aphront-panel-view-css' => 'cd17ab77', + 'aphront-table-view-css' => 'cd17ab77', + 'aphront-tokenizer-control-css' => 'cd17ab77', + 'aphront-tooltip-css' => 'cd17ab77', + 'aphront-typeahead-control-css' => 'cd17ab77', 'differential-changeset-view-css' => 'dd27a69b', 'differential-core-view-css' => 'dd27a69b', 'differential-inline-comment-editor' => '9488bb69', @@ -4322,7 +4322,7 @@ celerity_register_resource_map(array( 'differential-table-of-contents-css' => 'dd27a69b', 'diffusion-commit-view-css' => 'c8ce2d88', 'diffusion-icons-css' => 'c8ce2d88', - 'global-drag-and-drop-css' => 'f2a3a549', + 'global-drag-and-drop-css' => 'cd17ab77', 'inline-comment-summary-css' => 'dd27a69b', 'javelin-aphlict' => 'f2ad0683', 'javelin-behavior' => 'a9f14d76', @@ -4396,55 +4396,55 @@ celerity_register_resource_map(array( 'javelin-util' => 'a9f14d76', 'javelin-vector' => 'a9f14d76', 'javelin-workflow' => 'a9f14d76', - 'lightbox-attachment-css' => 'f2a3a549', + 'lightbox-attachment-css' => 'cd17ab77', 'maniphest-task-summary-css' => 'a7ca34a9', 'maniphest-transaction-detail-css' => 'a7ca34a9', - 'phabricator-action-list-view-css' => 'f2a3a549', - 'phabricator-application-launch-view-css' => 'f2a3a549', + 'phabricator-action-list-view-css' => 'cd17ab77', + 'phabricator-application-launch-view-css' => 'cd17ab77', 'phabricator-busy' => 'f2ad0683', 'phabricator-content-source-view-css' => 'dd27a69b', - 'phabricator-core-css' => 'f2a3a549', - 'phabricator-crumbs-view-css' => 'f2a3a549', + 'phabricator-core-css' => 'cd17ab77', + 'phabricator-crumbs-view-css' => 'cd17ab77', 'phabricator-drag-and-drop-file-upload' => '9488bb69', 'phabricator-dropdown-menu' => 'f2ad0683', 'phabricator-file-upload' => 'f2ad0683', - 'phabricator-filetree-view-css' => 'f2a3a549', - 'phabricator-flag-css' => 'f2a3a549', - 'phabricator-form-view-css' => 'f2a3a549', - 'phabricator-header-view-css' => 'f2a3a549', + 'phabricator-filetree-view-css' => 'cd17ab77', + 'phabricator-flag-css' => 'cd17ab77', + 'phabricator-form-view-css' => 'cd17ab77', + 'phabricator-header-view-css' => 'cd17ab77', 'phabricator-hovercard' => 'f2ad0683', - 'phabricator-jump-nav' => 'f2a3a549', + 'phabricator-jump-nav' => 'cd17ab77', 'phabricator-keyboard-shortcut' => 'f2ad0683', 'phabricator-keyboard-shortcut-manager' => 'f2ad0683', - 'phabricator-main-menu-view' => 'f2a3a549', + 'phabricator-main-menu-view' => 'cd17ab77', 'phabricator-menu-item' => 'f2ad0683', - 'phabricator-nav-view-css' => 'f2a3a549', + 'phabricator-nav-view-css' => 'cd17ab77', 'phabricator-notification' => 'f2ad0683', - 'phabricator-notification-css' => 'f2a3a549', - 'phabricator-notification-menu-css' => 'f2a3a549', - 'phabricator-object-item-list-view-css' => 'f2a3a549', + 'phabricator-notification-css' => 'cd17ab77', + 'phabricator-notification-menu-css' => 'cd17ab77', + 'phabricator-object-item-list-view-css' => 'cd17ab77', 'phabricator-object-selector-css' => 'dd27a69b', 'phabricator-phtize' => 'f2ad0683', 'phabricator-prefab' => 'f2ad0683', 'phabricator-project-tag-css' => 'a7ca34a9', - 'phabricator-property-list-view-css' => 'f2a3a549', - 'phabricator-remarkup-css' => 'f2a3a549', + 'phabricator-property-list-view-css' => 'cd17ab77', + 'phabricator-remarkup-css' => 'cd17ab77', 'phabricator-shaped-request' => '9488bb69', - 'phabricator-side-menu-view-css' => 'f2a3a549', - 'phabricator-standard-page-view' => 'f2a3a549', - 'phabricator-tag-view-css' => 'f2a3a549', + 'phabricator-side-menu-view-css' => 'cd17ab77', + 'phabricator-standard-page-view' => 'cd17ab77', + 'phabricator-tag-view-css' => 'cd17ab77', 'phabricator-textareautils' => 'f2ad0683', 'phabricator-tooltip' => 'f2ad0683', - 'phabricator-transaction-view-css' => 'f2a3a549', - 'phabricator-zindex-css' => 'f2a3a549', - 'phui-button-css' => 'f2a3a549', - 'phui-form-css' => 'f2a3a549', - 'phui-icon-view-css' => 'f2a3a549', - 'phui-spacing-css' => 'f2a3a549', - 'sprite-apps-large-css' => 'f2a3a549', - 'sprite-gradient-css' => 'f2a3a549', - 'sprite-icons-css' => 'f2a3a549', - 'sprite-menu-css' => 'f2a3a549', - 'syntax-highlighting-css' => 'f2a3a549', + 'phabricator-transaction-view-css' => 'cd17ab77', + 'phabricator-zindex-css' => 'cd17ab77', + 'phui-button-css' => 'cd17ab77', + 'phui-form-css' => 'cd17ab77', + 'phui-icon-view-css' => 'cd17ab77', + 'phui-spacing-css' => 'cd17ab77', + 'sprite-apps-large-css' => 'cd17ab77', + 'sprite-gradient-css' => 'cd17ab77', + 'sprite-icons-css' => 'cd17ab77', + 'sprite-menu-css' => 'cd17ab77', + 'syntax-highlighting-css' => 'cd17ab77', ), )); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index cbbcc05dcb..66be45ff5f 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -818,6 +818,7 @@ phutil_register_library_map(array( 'PhabricatorAuthConfirmLinkController' => 'applications/auth/controller/PhabricatorAuthConfirmLinkController.php', 'PhabricatorAuthController' => 'applications/auth/controller/PhabricatorAuthController.php', 'PhabricatorAuthDAO' => 'applications/auth/storage/PhabricatorAuthDAO.php', + 'PhabricatorAuthEditController' => 'applications/auth/controller/config/PhabricatorAuthEditController.php', 'PhabricatorAuthLinkController' => 'applications/auth/controller/PhabricatorAuthLinkController.php', 'PhabricatorAuthListController' => 'applications/auth/controller/config/PhabricatorAuthListController.php', 'PhabricatorAuthLoginController' => 'applications/auth/controller/PhabricatorAuthLoginController.php', @@ -825,6 +826,7 @@ phutil_register_library_map(array( 'PhabricatorAuthProvider' => 'applications/auth/provider/PhabricatorAuthProvider.php', 'PhabricatorAuthProviderConfig' => 'applications/auth/storage/PhabricatorAuthProviderConfig.php', 'PhabricatorAuthProviderConfigController' => 'applications/auth/controller/config/PhabricatorAuthProviderConfigController.php', + 'PhabricatorAuthProviderConfigEditor' => 'applications/auth/editor/PhabricatorAuthProviderConfigEditor.php', 'PhabricatorAuthProviderConfigQuery' => 'applications/auth/query/PhabricatorAuthProviderConfigQuery.php', 'PhabricatorAuthProviderConfigSearchEngine' => 'applications/auth/query/PhabricatorAuthProviderConfigSearchEngine.php', 'PhabricatorAuthProviderConfigTransaction' => 'applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php', @@ -2692,6 +2694,7 @@ phutil_register_library_map(array( 'PhabricatorAuthConfirmLinkController' => 'PhabricatorAuthController', 'PhabricatorAuthController' => 'PhabricatorController', 'PhabricatorAuthDAO' => 'PhabricatorLiskDAO', + 'PhabricatorAuthEditController' => 'PhabricatorAuthProviderConfigController', 'PhabricatorAuthLinkController' => 'PhabricatorAuthController', 'PhabricatorAuthListController' => array( @@ -2706,6 +2709,7 @@ phutil_register_library_map(array( 1 => 'PhabricatorPolicyInterface', ), 'PhabricatorAuthProviderConfigController' => 'PhabricatorAuthController', + 'PhabricatorAuthProviderConfigEditor' => 'PhabricatorApplicationTransactionEditor', 'PhabricatorAuthProviderConfigQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorAuthProviderConfigSearchEngine' => 'PhabricatorApplicationSearchEngine', 'PhabricatorAuthProviderConfigTransaction' => 'PhabricatorApplicationTransaction', diff --git a/src/applications/auth/application/PhabricatorApplicationAuth.php b/src/applications/auth/application/PhabricatorApplicationAuth.php index c88331fc3f..8b288e6088 100644 --- a/src/applications/auth/application/PhabricatorApplicationAuth.php +++ b/src/applications/auth/application/PhabricatorApplicationAuth.php @@ -38,9 +38,12 @@ final class PhabricatorApplicationAuth extends PhabricatorApplication { '/auth/' => array( /* - '(query/(?P[^/]+)/)?' => - 'PhabricatorAuthListController', - 'config/new/' => 'PhabricatorAuthNewController', + '(query/(?P[^/]+)/)?' => 'PhabricatorAuthListController', + 'config/' => array( + 'new/' => 'PhabricatorAuthNewController', + 'new/(?P[^/]+)/' => 'PhabricatorAuthEditController', + 'edit/(?P\d+)/' => 'PhabricatorAuthEditController', + ), */ 'login/(?P[^/]+)/' => 'PhabricatorAuthLoginController', diff --git a/src/applications/auth/controller/config/PhabricatorAuthEditController.php b/src/applications/auth/controller/config/PhabricatorAuthEditController.php new file mode 100644 index 0000000000..0adfcc8bdc --- /dev/null +++ b/src/applications/auth/controller/config/PhabricatorAuthEditController.php @@ -0,0 +1,220 @@ +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( + '%s: %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( + '%s: %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( + '%s: %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, + )); + } + +} diff --git a/src/applications/auth/controller/config/PhabricatorAuthListController.php b/src/applications/auth/controller/config/PhabricatorAuthListController.php index 4191bb388c..25a555ac5a 100644 --- a/src/applications/auth/controller/config/PhabricatorAuthListController.php +++ b/src/applications/auth/controller/config/PhabricatorAuthListController.php @@ -26,7 +26,14 @@ final class PhabricatorAuthListController $list = new PhabricatorObjectItemListView(); foreach ($configs as $config) { - $item = new PHUIListItemView(); + $item = new PhabricatorObjectItemView(); + + $edit_uri = $this->getApplicationURI('config/edit/'.$config->getID().'/'); + + // TODO: Needs to be built out. + $item + ->setHeader($config->getProviderType()) + ->setHref($edit_uri); $list->addItem($item); } diff --git a/src/applications/auth/editor/PhabricatorAuthProviderConfigEditor.php b/src/applications/auth/editor/PhabricatorAuthProviderConfigEditor.php new file mode 100644 index 0000000000..a32d23f04d --- /dev/null +++ b/src/applications/auth/editor/PhabricatorAuthProviderConfigEditor.php @@ -0,0 +1,94 @@ +getTransactionType()) { + case PhabricatorAuthProviderConfigTransaction::TYPE_ENABLE: + return $object->getIsEnabled(); + case PhabricatorAuthProviderConfigTransaction::TYPE_REGISTRATION: + return $object->getShouldAllowRegistration(); + case PhabricatorAuthProviderConfigTransaction::TYPE_LINK: + return $object->getShouldAllowLink(); + case PhabricatorAuthProviderConfigTransaction::TYPE_UNLINK: + return $object->getShouldAllowUnlink(); + case PhabricatorAuthProviderConfigTransaction::TYPE_PROPERTY: + // TODO + throw new Exception("TODO"); + } + } + + protected function getCustomTransactionNewValue( + PhabricatorLiskDAO $object, + PhabricatorApplicationTransaction $xaction) { + + switch ($xaction->getTransactionType()) { + case PhabricatorAuthProviderConfigTransaction::TYPE_ENABLE: + case PhabricatorAuthProviderConfigTransaction::TYPE_REGISTRATION: + case PhabricatorAuthProviderConfigTransaction::TYPE_LINK: + case PhabricatorAuthProviderConfigTransaction::TYPE_UNLINK: + case PhabricatorAuthProviderConfigTransaction::TYPE_PROPERTY: + return $xaction->getNewValue(); + } + } + + protected function applyCustomInternalTransaction( + PhabricatorLiskDAO $object, + PhabricatorApplicationTransaction $xaction) { + + $v = $xaction->getNewValue(); + switch ($xaction->getTransactionType()) { + case PhabricatorAuthProviderConfigTransaction::TYPE_ENABLE: + return $object->setIsEnabled($v); + case PhabricatorAuthProviderConfigTransaction::TYPE_REGISTRATION: + return $object->setShouldAllowRegistration($v); + case PhabricatorAuthProviderConfigTransaction::TYPE_LINK: + return $object->setShouldAllowLink($v); + case PhabricatorAuthProviderConfigTransaction::TYPE_UNLINK: + return $object->setShouldAllowUnlink($v); + case PhabricatorAuthProviderConfigTransaction::TYPE_PROPERTY: + // TODO + throw new Exception("TODO"); + } + } + + protected function applyCustomExternalTransaction( + PhabricatorLiskDAO $object, + PhabricatorApplicationTransaction $xaction) { + return; + } + + protected function mergeTransactions( + PhabricatorApplicationTransaction $u, + PhabricatorApplicationTransaction $v) { + + $type = $u->getTransactionType(); + switch ($type) { + case PhabricatorAuthProviderConfigTransaction::TYPE_ENABLE: + case PhabricatorAuthProviderConfigTransaction::TYPE_REGISTRATION: + case PhabricatorAuthProviderConfigTransaction::TYPE_LINK: + case PhabricatorAuthProviderConfigTransaction::TYPE_UNLINK: + // For these types, last transaction wins. + return $v; + } + + return parent::mergeTransactions($u, $v); + } + +} diff --git a/src/applications/auth/provider/PhabricatorAuthProvider.php b/src/applications/auth/provider/PhabricatorAuthProvider.php index c424e73654..6db66a08a6 100644 --- a/src/applications/auth/provider/PhabricatorAuthProvider.php +++ b/src/applications/auth/provider/PhabricatorAuthProvider.php @@ -110,6 +110,11 @@ abstract class PhabricatorAuthProvider { throw new Exception("Not implemented!"); } + public function extendEditForm(AphrontFormView $form) { + + } + + public function createProviders() { return array($this); } diff --git a/src/applications/auth/provider/PhabricatorAuthProviderOAuth.php b/src/applications/auth/provider/PhabricatorAuthProviderOAuth.php index 553041538c..7bf1b01971 100644 --- a/src/applications/auth/provider/PhabricatorAuthProviderOAuth.php +++ b/src/applications/auth/provider/PhabricatorAuthProviderOAuth.php @@ -8,7 +8,6 @@ abstract class PhabricatorAuthProviderOAuth extends PhabricatorAuthProvider { abstract protected function getOAuthClientSecret(); abstract protected function newOAuthAdapter(); - public function getDescriptionForCreate() { return pht('Configure %s OAuth.', $this->getProviderName()); } @@ -171,4 +170,35 @@ abstract class PhabricatorAuthProviderOAuth extends PhabricatorAuthProvider { return array($this->loadOrCreateAccount($account_id), $response); } + public function extendEditForm( + AphrontFormView $form) { + + $v_id = $this->getOAuthClientID(); + + $secret = $this->getOAuthClientSecret(); + if ($secret) { + $v_secret = str_repeat('*', strlen($secret->openEnvelope())); + } else { + $v_secret = ''; + } + + $e_id = strlen($v_id) ? null : true; + $e_secret = strlen($v_secret) ? null : true; + + $form + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel(pht('OAuth App ID')) + ->setName('oauth:app:id') + ->setValue($v_id) + ->setError($e_id)) + ->appendChild( + id(new AphrontFormPasswordControl()) + ->setLabel(pht('OAuth App Secret')) + ->setName('oauth:app:secret') + ->setValue($v_secret) + ->setError($e_secret)); + + } + } diff --git a/src/applications/auth/query/PhabricatorAuthProviderConfigQuery.php b/src/applications/auth/query/PhabricatorAuthProviderConfigQuery.php index 451956edb9..7362bddf7d 100644 --- a/src/applications/auth/query/PhabricatorAuthProviderConfigQuery.php +++ b/src/applications/auth/query/PhabricatorAuthProviderConfigQuery.php @@ -5,6 +5,7 @@ final class PhabricatorAuthProviderConfigQuery private $ids; private $phids; + private $providerClasses; const STATUS_ALL = 'status:all'; const STATUS_ENABLED = 'status:enabled'; @@ -26,6 +27,11 @@ final class PhabricatorAuthProviderConfigQuery return $this; } + public function withProviderClasses(array $classes) { + $this->providerClasses = $classes; + return $this; + } + public static function getStatusOptions() { return array( self::STATUS_ALL => pht('All Providers'), @@ -65,6 +71,13 @@ final class PhabricatorAuthProviderConfigQuery $this->phids); } + if ($this->providerClasses) { + $where[] = qsprintf( + $conn_r, + 'providerClass IN (%Ls)', + $this->providerClasses); + } + $status = $this->status; switch ($status) { case self::STATUS_ALL: diff --git a/src/applications/auth/storage/PhabricatorAuthProviderConfig.php b/src/applications/auth/storage/PhabricatorAuthProviderConfig.php index b8ea945d3a..75c72c89c0 100644 --- a/src/applications/auth/storage/PhabricatorAuthProviderConfig.php +++ b/src/applications/auth/storage/PhabricatorAuthProviderConfig.php @@ -3,7 +3,6 @@ final class PhabricatorAuthProviderConfig extends PhabricatorAuthDAO implements PhabricatorPolicyInterface { - protected $phid; protected $providerClass; protected $providerType; protected $providerDomain; @@ -23,6 +22,7 @@ final class PhabricatorAuthProviderConfig extends PhabricatorAuthDAO public function getConfiguration() { return array( + self::CONFIG_AUX_PHID => true, self::CONFIG_SERIALIZATION => array( 'properties' => self::SERIALIZATION_JSON, ), diff --git a/src/applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php b/src/applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php index 5ac5e74d23..ed36b8394a 100644 --- a/src/applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php +++ b/src/applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php @@ -3,6 +3,12 @@ final class PhabricatorAuthProviderConfigTransaction extends PhabricatorApplicationTransaction { + const TYPE_ENABLE = 'config:enable'; + const TYPE_REGISTRATION = 'config:registration'; + const TYPE_LINK = 'config:link'; + const TYPE_UNLINK = 'config:unlink'; + const TYPE_PROPERTY = 'config:property'; + public function getApplicationName() { return 'auth'; } diff --git a/webroot/rsrc/css/aphront/form-view.css b/webroot/rsrc/css/aphront/form-view.css index 0d6bd9df05..e8a71133e0 100644 --- a/webroot/rsrc/css/aphront/form-view.css +++ b/webroot/rsrc/css/aphront/form-view.css @@ -178,8 +178,7 @@ table.aphront-form-control-checkbox-layout { font-size: 13px; } -table.aphront-form-control-radio-layout th, -table.aphront-form-control-checkbox-layout th { +table.aphront-form-control-radio-layout th { padding-top: 3px; padding-left: 8px; padding-bottom: 12px; @@ -187,6 +186,14 @@ table.aphront-form-control-checkbox-layout th { color: #222222; } +table.aphront-form-control-checkbox-layout th { + padding-top: 2px; + padding-left: 8px; + padding-bottom: 12px; + color: #222222; +} + + .aphront-form-control-radio-layout td input, .aphront-form-control-checkbox-layout td input { margin-top: 4px;