Path: blob/master/src/applications/auth/provider/PhabricatorPhabricatorAuthProvider.php
12256 views
<?php12final class PhabricatorPhabricatorAuthProvider3extends PhabricatorOAuth2AuthProvider {45const PROPERTY_PHABRICATOR_NAME = 'oauth2:phabricator:name';6const PROPERTY_PHABRICATOR_URI = 'oauth2:phabricator:uri';78public function getProviderName() {9return PlatformSymbols::getPlatformServerName();10}1112public function getConfigurationHelp() {13if ($this->isCreate()) {14return pht(15"**Step 1 of 2 - Name Remote Server**\n\n".16'Choose a permanent name for the remote server you want to connect '.17'to. This name is used internally to keep track of the remote '.18'server, in case the URL changes later.');19}2021return parent::getConfigurationHelp();22}23protected function getProviderConfigurationHelp() {24$config = $this->getProviderConfig();25$base_uri = rtrim(26$config->getProperty(self::PROPERTY_PHABRICATOR_URI), '/');27$login_uri = PhabricatorEnv::getURI($this->getLoginURI());2829return pht(30"**Step 2 of 2 - Configure OAuth Server**\n\n".31"To configure OAuth, create a new application here:".32"\n\n".33"%s/oauthserver/client/create/".34"\n\n".35"When creating your application, use these settings:".36"\n\n".37" - **Redirect URI:** Set this to: `%s`".38"\n\n".39"After completing configuration, copy the **Client ID** and ".40"**Client Secret** to the fields above. (You may need to generate the ".41"client secret by clicking 'New Secret' first.)",42$base_uri,43$login_uri);44}4546protected function newOAuthAdapter() {47$config = $this->getProviderConfig();48return id(new PhutilPhabricatorAuthAdapter())49->setAdapterDomain($config->getProviderDomain())50->setPhabricatorBaseURI(51$config->getProperty(self::PROPERTY_PHABRICATOR_URI));52}5354protected function getLoginIcon() {55return PlatformSymbols::getPlatformServerName();56}5758private function isCreate() {59return !$this->getProviderConfig()->getID();60}6162public function readFormValuesFromProvider() {63$config = $this->getProviderConfig();64$uri = $config->getProperty(self::PROPERTY_PHABRICATOR_URI);6566return parent::readFormValuesFromProvider() + array(67self::PROPERTY_PHABRICATOR_NAME => $this->getProviderDomain(),68self::PROPERTY_PHABRICATOR_URI => $uri,69);70}7172public function readFormValuesFromRequest(AphrontRequest $request) {73$is_setup = $this->isCreate();74if ($is_setup) {75$parent_values = array();76$name = $request->getStr(self::PROPERTY_PHABRICATOR_NAME);77} else {78$parent_values = parent::readFormValuesFromRequest($request);79$name = $this->getProviderDomain();80}8182return $parent_values + array(83self::PROPERTY_PHABRICATOR_NAME => $name,84self::PROPERTY_PHABRICATOR_URI =>85$request->getStr(self::PROPERTY_PHABRICATOR_URI),86);87}8889public function processEditForm(90AphrontRequest $request,91array $values) {9293$is_setup = $this->isCreate();9495if (!$is_setup) {96list($errors, $issues, $values) =97parent::processEditForm($request, $values);98} else {99$errors = array();100$issues = array();101}102103$key_name = self::PROPERTY_PHABRICATOR_NAME;104$key_uri = self::PROPERTY_PHABRICATOR_URI;105106if (!strlen($values[$key_name])) {107$errors[] = pht('Server name is required.');108$issues[$key_name] = pht('Required');109} else if (!preg_match('/^[a-z0-9.]+\z/', $values[$key_name])) {110$errors[] = pht(111'Server name must contain only lowercase letters, '.112'digits, and periods.');113$issues[$key_name] = pht('Invalid');114}115116if (!strlen($values[$key_uri])) {117$errors[] = pht('Base URI is required.');118$issues[$key_uri] = pht('Required');119} else {120$uri = new PhutilURI($values[$key_uri]);121if (!$uri->getProtocol()) {122$errors[] = pht(123'Base URI should include protocol (like "%s").',124'https://');125$issues[$key_uri] = pht('Invalid');126}127}128129if (!$errors && $is_setup) {130$config = $this->getProviderConfig();131132$config->setProviderDomain($values[$key_name]);133}134135return array($errors, $issues, $values);136}137138public function extendEditForm(139AphrontRequest $request,140AphrontFormView $form,141array $values,142array $issues) {143144$is_setup = $this->isCreate();145146$e_required = $request->isFormPost() ? null : true;147148$v_name = $values[self::PROPERTY_PHABRICATOR_NAME];149if ($is_setup) {150$e_name = idx($issues, self::PROPERTY_PHABRICATOR_NAME, $e_required);151} else {152$e_name = null;153}154155$v_uri = $values[self::PROPERTY_PHABRICATOR_URI];156$e_uri = idx($issues, self::PROPERTY_PHABRICATOR_URI, $e_required);157158if ($is_setup) {159$form160->appendChild(161id(new AphrontFormTextControl())162->setLabel(pht('Server Name'))163->setValue($v_name)164->setName(self::PROPERTY_PHABRICATOR_NAME)165->setError($e_name)166->setCaption(pht(167'Use lowercase letters, digits, and periods. For example: %s',168phutil_tag(169'tt',170array(),171'`example.oauthserver`'))));172} else {173$form174->appendChild(175id(new AphrontFormStaticControl())176->setLabel(pht('Server Name'))177->setValue($v_name));178}179180$form181->appendChild(182id(new AphrontFormTextControl())183->setLabel(pht('Base URI'))184->setValue($v_uri)185->setName(self::PROPERTY_PHABRICATOR_URI)186->setCaption(187pht(188'The URI where the OAuth server is installed. For example: %s',189phutil_tag('tt', array(), 'https://devtools.example.com/')))190->setError($e_uri));191192if (!$is_setup) {193parent::extendEditForm($request, $form, $values, $issues);194}195}196197public function hasSetupStep() {198return true;199}200201public function getPhabricatorURI() {202$config = $this->getProviderConfig();203return $config->getProperty(self::PROPERTY_PHABRICATOR_URI);204}205206}207208209