public function handleRequest(AphrontRequest $request)
 {
     $this->requireApplicationCapability(AuthManageProvidersCapability::CAPABILITY);
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $providers = PhabricatorAuthProvider::getAllBaseProviders();
     $e_provider = null;
     $errors = array();
     if ($request->isFormPost()) {
         $provider_string = $request->getStr('provider');
         if (!strlen($provider_string)) {
             $e_provider = pht('Required');
             $errors[] = pht('You must select an authentication provider.');
         } else {
             $found = false;
             foreach ($providers as $provider) {
                 if (get_class($provider) === $provider_string) {
                     $found = true;
                     break;
                 }
             }
             if (!$found) {
                 $e_provider = pht('Invalid');
                 $errors[] = pht('You must select a valid provider.');
             }
         }
         if (!$errors) {
             return id(new AphrontRedirectResponse())->setURI($this->getApplicationURI('/config/new/' . $provider_string . '/'));
         }
     }
     $options = id(new AphrontFormRadioButtonControl())->setLabel(pht('Provider'))->setName('provider')->setError($e_provider);
     $configured = PhabricatorAuthProvider::getAllProviders();
     $configured_classes = array();
     foreach ($configured as $configured_provider) {
         $configured_classes[get_class($configured_provider)] = true;
     }
     // Sort providers by login order, and move disabled providers to the
     // bottom.
     $providers = msort($providers, 'getLoginOrder');
     $providers = array_diff_key($providers, $configured_classes) + $providers;
     foreach ($providers as $provider) {
         if (isset($configured_classes[get_class($provider)])) {
             $disabled = true;
             $description = pht('This provider is already configured.');
         } else {
             $disabled = false;
             $description = $provider->getDescriptionForCreate();
         }
         $options->addButton(get_class($provider), $provider->getNameForCreate(), $description, $disabled ? 'disabled' : null, $disabled);
     }
     $form = id(new AphrontFormView())->setUser($viewer)->appendChild($options)->appendChild(id(new AphrontFormSubmitControl())->addCancelButton($this->getApplicationURI())->setValue(pht('Continue')));
     $form_box = id(new PHUIObjectBoxView())->setHeaderText(pht('Provider'))->setFormErrors($errors)->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)->setForm($form);
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(pht('Add Provider'));
     $crumbs->setBorder(true);
     $title = pht('Add Auth Provider');
     $header = id(new PHUIHeaderView())->setHeader($title)->setHeaderIcon('fa-plus-square');
     $view = id(new PHUITwoColumnView())->setHeader($header)->setFooter(array($form_box));
     return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($view);
 }
 public static function getFacebookApplicationID()
 {
     $providers = PhabricatorAuthProvider::getAllProviders();
     $fb_provider = idx($providers, 'facebook:facebook.com');
     if (!$fb_provider) {
         return null;
     }
     return $fb_provider->getProviderConfig()->getProperty(self::PROPERTY_APP_ID);
 }
 public function processRequest(AphrontRequest $request)
 {
     $viewer = $request->getUser();
     $providers = PhabricatorAuthProvider::getAllProviders();
     $accounts = id(new PhabricatorExternalAccountQuery())->setViewer($viewer)->withUserPHIDs(array($viewer->getPHID()))->needImages(true)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->execute();
     $linked_head = id(new PHUIHeaderView())->setHeader(pht('Linked Accounts and Authentication'));
     $linked = id(new PHUIObjectItemListView())->setUser($viewer)->setFlush(true)->setNoDataString(pht('You have no linked accounts.'));
     $login_accounts = 0;
     foreach ($accounts as $account) {
         if ($account->isUsableForLogin()) {
             $login_accounts++;
         }
     }
     foreach ($accounts as $account) {
         $item = id(new PHUIObjectItemView());
         $provider = idx($providers, $account->getProviderKey());
         if ($provider) {
             $item->setHeader($provider->getProviderName());
             $can_unlink = $provider->shouldAllowAccountUnlink();
             if (!$can_unlink) {
                 $item->addAttribute(pht('Permanently Linked'));
             }
         } else {
             $item->setHeader(pht('Unknown Account ("%s")', $account->getProviderKey()));
             $can_unlink = true;
         }
         $can_login = $account->isUsableForLogin();
         if (!$can_login) {
             $item->addAttribute(pht('Disabled (an administrator has disabled login for this ' . 'account provider).'));
         }
         $can_unlink = $can_unlink && (!$can_login || $login_accounts > 1);
         $can_refresh = $provider && $provider->shouldAllowAccountRefresh();
         if ($can_refresh) {
             $item->addAction(id(new PHUIListItemView())->setIcon('fa-refresh')->setHref('/auth/refresh/' . $account->getProviderKey() . '/'));
         }
         $item->addAction(id(new PHUIListItemView())->setIcon('fa-times')->setWorkflow(true)->setDisabled(!$can_unlink)->setHref('/auth/unlink/' . $account->getProviderKey() . '/'));
         if ($provider) {
             $provider->willRenderLinkedAccount($viewer, $item, $account);
         }
         $linked->addItem($item);
     }
     $linkable_head = id(new PHUIHeaderView())->setHeader(pht('Add External Account'));
     $linkable = id(new PHUIObjectItemListView())->setUser($viewer)->setFlush(true)->setNoDataString(pht('Your account is linked with all available providers.'));
     $accounts = mpull($accounts, null, 'getProviderKey');
     $providers = PhabricatorAuthProvider::getAllEnabledProviders();
     $providers = msort($providers, 'getProviderName');
     foreach ($providers as $key => $provider) {
         if (isset($accounts[$key])) {
             continue;
         }
         if (!$provider->shouldAllowAccountLink()) {
             continue;
         }
         $link_uri = '/auth/link/' . $provider->getProviderKey() . '/';
         $item = id(new PHUIObjectItemView());
         $item->setHeader($provider->getProviderName());
         $item->setHref($link_uri);
         $item->addAction(id(new PHUIListItemView())->setIcon('fa-link')->setHref($link_uri));
         $linkable->addItem($item);
     }
     $linked_box = id(new PHUIObjectBoxView())->setHeader($linked_head)->setObjectList($linked);
     $linkable_box = id(new PHUIObjectBoxView())->setHeader($linkable_head)->setObjectList($linkable);
     return array($linked_box, $linkable_box);
 }