Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15442899
D9203.id23487.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
10 KB
Referenced Files
None
Subscribers
None
D9203.id23487.diff
View Options
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -151,7 +151,7 @@
'rsrc/css/sprite-conpherence.css' => '3b4a0487',
'rsrc/css/sprite-docs.css' => '5f65d0da',
'rsrc/css/sprite-gradient.css' => '4bdb98a7',
- 'rsrc/css/sprite-login.css' => '878ee4d8',
+ 'rsrc/css/sprite-login.css' => '3c811008',
'rsrc/css/sprite-main-header.css' => '92720ee2',
'rsrc/css/sprite-menu.css' => '28281e16',
'rsrc/css/sprite-minicons.css' => 'df4f76fe',
@@ -816,7 +816,7 @@
'sprite-conpherence-css' => '3b4a0487',
'sprite-docs-css' => '5f65d0da',
'sprite-gradient-css' => '4bdb98a7',
- 'sprite-login-css' => '878ee4d8',
+ 'sprite-login-css' => '3c811008',
'sprite-main-header-css' => '92720ee2',
'sprite-menu-css' => '28281e16',
'sprite-minicons-css' => 'df4f76fe',
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -1279,6 +1279,7 @@
'PhabricatorAuthProviderOAuth1' => 'applications/auth/provider/PhabricatorAuthProviderOAuth1.php',
'PhabricatorAuthProviderOAuth1Bitbucket' => 'applications/auth/provider/PhabricatorAuthProviderOAuth1Bitbucket.php',
'PhabricatorAuthProviderOAuth1JIRA' => 'applications/auth/provider/PhabricatorAuthProviderOAuth1JIRA.php',
+ 'PhabricatorAuthProviderOAuth1MediaWiki' => 'applications/auth/provider/PhabricatorAuthProviderOAuth1MediaWiki.php',
'PhabricatorAuthProviderOAuth1Twitter' => 'applications/auth/provider/PhabricatorAuthProviderOAuth1Twitter.php',
'PhabricatorAuthProviderOAuth2' => 'applications/auth/provider/PhabricatorAuthProviderOAuth2.php',
'PhabricatorAuthProviderOAuthAmazon' => 'applications/auth/provider/PhabricatorAuthProviderOAuthAmazon.php',
@@ -4076,6 +4077,7 @@
'PhabricatorAuthProviderOAuth1' => 'PhabricatorAuthProviderOAuth',
'PhabricatorAuthProviderOAuth1Bitbucket' => 'PhabricatorAuthProviderOAuth1',
'PhabricatorAuthProviderOAuth1JIRA' => 'PhabricatorAuthProviderOAuth1',
+ 'PhabricatorAuthProviderOAuth1MediaWiki' => 'PhabricatorAuthProviderOAuth1',
'PhabricatorAuthProviderOAuth1Twitter' => 'PhabricatorAuthProviderOAuth1',
'PhabricatorAuthProviderOAuth2' => 'PhabricatorAuthProviderOAuth',
'PhabricatorAuthProviderOAuthAmazon' => 'PhabricatorAuthProviderOAuth2',
diff --git a/src/applications/auth/provider/PhabricatorAuthProviderOAuth1.php b/src/applications/auth/provider/PhabricatorAuthProviderOAuth1.php
--- a/src/applications/auth/provider/PhabricatorAuthProviderOAuth1.php
+++ b/src/applications/auth/provider/PhabricatorAuthProviderOAuth1.php
@@ -52,9 +52,11 @@
$client_code = $this->getAuthCSRFCode($request);
- $callback_uri = $adapter->getCallbackURI();
- $callback_uri = $callback_uri.$client_code.'/';
- $adapter->setCallbackURI($callback_uri);
+ if ($adapter->shouldAddCSRFTokenToCallbackURI()) {
+ $callback_uri = $adapter->getCallbackURI();
+ $callback_uri = $callback_uri.$client_code.'/';
+ $adapter->setCallbackURI($callback_uri);
+ }
$uri = $adapter->getClientRedirectURI();
@@ -75,8 +77,9 @@
// NOTE: You can get here via GET, this should probably be a bit more
// user friendly.
-
- $this->verifyAuthCSRFCode($request, $controller->getExtraURIData());
+ if ($adapter->shouldAddCSRFTokenToCallbackURI()) {
+ $this->verifyAuthCSRFCode($request, $controller->getExtraURIData());
+ }
$token = $request->getStr('oauth_token');
$verifier = $request->getStr('oauth_verifier');
diff --git a/src/applications/auth/provider/PhabricatorAuthProviderOAuth1MediaWiki.php b/src/applications/auth/provider/PhabricatorAuthProviderOAuth1MediaWiki.php
new file mode 100644
--- /dev/null
+++ b/src/applications/auth/provider/PhabricatorAuthProviderOAuth1MediaWiki.php
@@ -0,0 +1,212 @@
+<?php
+
+final class PhabricatorAuthProviderOAuth1MediaWiki
+ extends PhabricatorAuthProviderOAuth1 {
+
+ const PROPERTY_MEDIAWIKI_NAME = 'oauth1:mediawiki:name';
+ const PROPERTY_MEDIAWIKI_URI = 'oauth1:mediawiki:uri';
+ const PROPERTY_PRIVATE_KEY = 'oauth1:mediawiki:key:private';
+ const PROPERTY_PUBLIC_KEY = 'oauth1:mediawiki:key:public';
+
+ public function readFormValuesFromProvider() {
+ $config = $this->getProviderConfig();
+ return array(
+ self::PROPERTY_MEDIAWIKI_NAME =>
+ $this->getProviderDomain(),
+ self::PROPERTY_MEDIAWIKI_URI =>
+ $config->getProperty(self::PROPERTY_MEDIAWIKI_URI),
+ self::PROPERTY_CONSUMER_KEY =>
+ $config->getProperty(self::PROPERTY_CONSUMER_KEY),
+ self::PROPERTY_CONSUMER_SECRET =>
+ $config->getProperty(self::PROPERTY_CONSUMER_SECRET),
+ );
+ }
+
+ public function readFormValuesFromRequest(AphrontRequest $request) {
+ $is_setup = $this->isSetup();
+ if ($is_setup) {
+ $name = $request->getStr(self::PROPERTY_MEDIAWIKI_NAME);
+ } else {
+ $name = $this->getProviderDomain();
+ }
+
+ return array(
+ self::PROPERTY_MEDIAWIKI_NAME => $name,
+ self::PROPERTY_MEDIAWIKI_URI =>
+ $request->getStr(self::PROPERTY_MEDIAWIKI_URI),
+ self::PROPERTY_CONSUMER_KEY =>
+ $request->getStr(self::PROPERTY_CONSUMER_KEY),
+ self::PROPERTY_CONSUMER_SECRET =>
+ $request->getStr(self::PROPERTY_CONSUMER_SECRET),
+ );
+ }
+
+ public function getProviderName() {
+ return pht('MediaWiki');
+ }
+
+ protected function getProviderConfigurationHelp() {
+ $login_uri = PhabricatorEnv::getURI($this->getLoginURI());
+
+ return pht(
+ "To configure MediaWiki OAuth, create a new \"consumer\" here:".
+ "\n\n".
+ "https://www.mediawiki.org/wiki/".
+ "Special:OAuthConsumerRegistration/propose".
+ "\n\n".
+ "When creating your application, use these settings:".
+ "\n\n".
+ " - **Callback URL:** Set this to: `%s`".
+ "\n\n".
+ "After you register the consumer, a **Consumer Key** and ".
+ "**Consumer Secret** will be provided to you by MediaWiki. ".
+ "To complete the configuration, copy the provided keys into ".
+ "the corresponding fields above.",
+ $login_uri);
+ }
+
+ protected function newOAuthAdapter() {
+ $config = $this->getProviderConfig();
+
+ return id(new PhutilAuthAdapterOAuthMediaWiki())
+ ->setAdapterDomain($config->getProviderDomain())
+ ->setMediaWikiBaseURI(
+ $config->getProperty(self::PROPERTY_MEDIAWIKI_URI));
+ }
+
+ protected function getLoginIcon() {
+ return 'MediaWiki';
+ }
+
+ private function isSetup() {
+ return !$this->getProviderConfig()->getID();
+ }
+
+ public function processEditForm(
+ AphrontRequest $request,
+ array $values) {
+ $errors = array();
+ $issues = array();
+
+ $is_setup = $this->isSetup();
+
+ $key_name = self::PROPERTY_MEDIAWIKI_NAME;
+ $key_uri = self::PROPERTY_MEDIAWIKI_URI;
+ $key_secret = self::PROPERTY_CONSUMER_SECRET;
+ $key_consumer = self::PROPERTY_CONSUMER_KEY;
+
+ if (!strlen($values[$key_uri])) {
+ $errors[] = pht('MediaWiki base URI is required.');
+ $issues[$key_uri] = pht('Required');
+ } else {
+ $uri = new PhutilURI($values[$key_uri]);
+ if (!$uri->getProtocol()) {
+ $errors[] = pht(
+ 'MediaWiki base URI should include protocol '
+ .'(like "https://").');
+ $issues[$key_uri] = pht('Invalid');
+ }
+ }
+
+ if (!$errors) {
+ $config = $this->getProviderConfig();
+ if ($is_setup) {
+ $config->setProviderDomain($values[$key_name]);
+ $config->setProperty($key_name, $values[$key_name]);
+ }
+
+ $config->setProperty($key_uri, $values[$key_uri]);
+ $config->setProperty($key_secret, $values[$key_secret]);
+ $config->setProperty($key_consumer, $values[$key_consumer]);
+ }
+
+ return array($errors, $issues, $values);
+ }
+
+ public function extendEditForm(
+ AphrontRequest $request,
+ AphrontFormView $form,
+ array $values,
+ array $issues) {
+
+ $is_setup = $this->isSetup();
+
+ $e_required = $request->isFormPost() ? null : true;
+
+ $v_name = $values[self::PROPERTY_MEDIAWIKI_NAME];
+ if ($is_setup) {
+ $e_name = idx($issues, self::PROPERTY_MEDIAWIKI_NAME, $e_required);
+ } else {
+ $e_name = null;
+ }
+
+ $v_uri = $values[self::PROPERTY_MEDIAWIKI_URI];
+ $e_uri = idx($issues, self::PROPERTY_MEDIAWIKI_URI, $e_required);
+
+ $config = $this->getProviderConfig();
+
+ if ($is_setup) {
+ $form
+ ->appendRemarkupInstructions(
+ pht(
+ "**MediaWiki Instance Name**\n\n".
+ "Choose a permanent name for this instance of MediaWiki.".
+ "Phabricator uses this name internally to keep track of ".
+ "this instance of MediaWiki, in case the URL changes later.".
+ "\n\n".
+ "Use lowercase letters, digits, and period. For example: ".
+ "\n\n`mediawiki`, `mediawiki.mycompany` ".
+ "or `mediawiki.engineering` are reasonable names."))
+ ->appendChild(
+ id(new AphrontFormTextControl())
+ ->setLabel(pht('MediaWiki Instance Name'))
+ ->setValue($v_name)
+ ->setName(self::PROPERTY_MEDIAWIKI_NAME)
+ ->setError($e_name));
+ } else {
+ $form
+ ->appendChild(
+ id(new AphrontFormStaticControl())
+ ->setLabel(pht('MediaWiki Instance Name'))
+ ->setValue($v_name));
+ }
+
+ $form
+ ->appendChild(
+ id(new AphrontFormTextControl())
+ ->setLabel(pht('MediaWiki Base URI'))
+ ->setValue($v_uri)
+ ->setName(self::PROPERTY_MEDIAWIKI_URI)
+ ->setCaption(pht('The URI where MediaWiki is installed.'))
+ ->setError($e_uri))
+ ->appendRemarkupInstructions(
+ pht(
+ 'NOTE: Copy the keys generated by the MediaWiki OAuth'.
+ ' consumer registration and paste them here.'))
+ ->appendChild(
+ id(new AphrontFormTextControl())
+ ->setLabel(pht('Consumer Key'))
+ ->setName(self::PROPERTY_CONSUMER_KEY)
+ ->setValue(
+ $config->getProperty(self::PROPERTY_CONSUMER_KEY)))
+ ->appendChild(
+ id(new AphrontFormTextControl())
+ ->setLabel(pht('Secret Key'))
+ ->setName(self::PROPERTY_CONSUMER_SECRET)
+ ->setValue(
+ $config->getProperty(self::PROPERTY_CONSUMER_SECRET)));
+ }
+
+ public static function getMediaWikiProvider() {
+ $providers = self::getAllEnabledProviders();
+
+ foreach ($providers as $provider) {
+ if ($provider instanceof PhabricatorAuthProviderOAuth1MediaWiki) {
+ return $provider;
+ }
+ }
+
+ return null;
+ }
+
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Mar 28, 1:10 AM (2 w, 5 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7725018
Default Alt Text
D9203.id23487.diff (10 KB)
Attached To
Mode
D9203: Configurable MediaWiki oauth1 provider
Attached
Detach File
Event Timeline
Log In to Comment