Gergő Tisza has uploaded a new change for review.
https://gerrit.wikimedia.org/r/204059
Change subject: Autocreate some local accounts when global account is created
......................................................................
Autocreate some local accounts when global account is created
Add $wgCentralAuthAutoCreateWikis site config option;
run a job on global account creation to create an attached
local account on all listed wikis.
Bug: T74469
Bug: T94885
Change-Id: I3937b9e6d0df1ef608d64388167a3b37a3ea5de3
---
M CentralAuth.php
M includes/CentralAuthPlugin.php
A includes/CreateLocalAccountJob.php
3 files changed, 117 insertions(+), 0 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/CentralAuth
refs/changes/59/204059/1
diff --git a/CentralAuth.php b/CentralAuth.php
index a5e9b1e..13089cf 100644
--- a/CentralAuth.php
+++ b/CentralAuth.php
@@ -134,6 +134,16 @@
$wgCentralAuthAutoLoginWikis = array();
/**
+ * List of wiki IDs on which an attached local account should be created
automatically when the
+ * global account is created.
+ *
+ * The wiki ID is typically the database name, except when table prefixes are
+ * used, in which case it is the database name, a hyphen separator, and then
+ * the table prefix.
+ */
+$wgCentralAuthAutoCreateWikis = array();
+
+/**
* Local filesystem path to the icon returned by Special:CentralAutoLogin
* Should be a 20x20px PNG.
*/
@@ -275,6 +285,7 @@
$wgAutoloadClasses['CentralAuthPlugin'] =
"$caBase/includes/CentralAuthPlugin.php";
$wgAutoloadClasses['CentralAuthHooks'] =
"$caBase/includes/CentralAuthHooks.php";
$wgAutoloadClasses['CentralAuthSuppressUserJob'] =
"$caBase/includes/SuppressUserJob.php";
+$wgAutoloadClasses['CentralAuthCreateLocalAccountJob'] =
"$caBase/includes/CreateLocalAccountJob.php";
$wgAutoloadClasses['WikiSet'] = "$caBase/includes/WikiSet.php";
$wgAutoloadClasses['SpecialCentralAutoLogin'] =
"$caBase/includes/specials/SpecialCentralAutoLogin.php";
$wgAutoloadClasses['CentralAuthUserArray'] =
"$caBase/includes/CentralAuthUserArray.php";
@@ -335,6 +346,7 @@
$wgJobClasses['LocalRenameUserJob'] = 'LocalRenameUserJob';
$wgJobClasses['LocalUserMergeJob'] = 'LocalUserMergeJob';
$wgJobClasses['LocalPageMoveJob'] = 'LocalPageMoveJob';
+$wgJobClasses['CentralAuthCreateLocalAccountJob'] =
'CentralAuthCreateLocalAccountJob';
$wgHooks['SetupAfterCache'][] = 'CentralAuthHooks::onSetupAfterCache';
$wgHooks['AuthPluginSetup'][] = 'CentralAuthHooks::onAuthPluginSetup';
diff --git a/includes/CentralAuthPlugin.php b/includes/CentralAuthPlugin.php
index fb903a9..5a893bd 100644
--- a/includes/CentralAuthPlugin.php
+++ b/includes/CentralAuthPlugin.php
@@ -270,6 +270,7 @@
// @fixme is this even vaguely reliable? pah
$central->register( $password, $email );
$central->attach( wfWikiID(), 'new' );
+ $this->autoCreateAccounts( $central );
}
// Note: If $wgCentralAuthPreventUnattached is enabled,
// accounts where a global does not exist, but there are
@@ -326,4 +327,27 @@
public function getUserInstance( User &$user ) {
return CentralAuthUser::getInstance( $user );
}
+
+ /**
+ * Sets up jobs to create and attach a local account for the given user
on every wiki listed in
+ * $wgCentralAuthAutoCreateWikis.
+ * @param CentralAuthUser $centralUser
+ */
+ private function autoCreateAccounts( CentralAuthUser $centralUser ) {
+ global $wgCentralAuthAutoCreateWikis;
+
+ $name = $centralUser->getName();
+ $thisWiki = wfWikiID();
+ foreach ( $wgCentralAuthAutoCreateWikis as $wiki ) {
+ if ( $wiki === $thisWiki ) {
+ continue;
+ }
+ $job = Job::factory(
+ 'CentralAuthCreateLocalAccountJob',
+ Title::makeTitleSafe( NS_USER, $name ),
+ array( 'name' => $name, 'from' => $thisWiki )
+ );
+ JobQueueGroup::singleton( $wiki )->push( $job );
+ }
+ }
}
diff --git a/includes/CreateLocalAccountJob.php
b/includes/CreateLocalAccountJob.php
new file mode 100644
index 0000000..6ca07e5
--- /dev/null
+++ b/includes/CreateLocalAccountJob.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * Creates a local account and connects it to the global account.
+ * Used to ensure that all users have an attached local account on certain
wikis which have some
+ * special "central" role (such as $wgMWOAuthCentralWiki for the OAuth
extension).
+ * @see $wgCentralAuthAutoCreateWikis
+ */
+class CentralAuthCreateLocalAccountJob extends Job {
+ /**
+ * @param Title $title Not used
+ * @param array $params name => user name, from => wiki where the job
is created
+ */
+ public function __construct( $title, $params ) {
+ parent::__construct( 'CentralAuthCreateLocalAccountJob',
$title, $params );
+ }
+
+ /**
+ * Try to create and attach the user.
+ * Largely follows CentralAuthHooks::attemptAddUser() which cannot be
directly reused because
+ * it assumes a web context.
+ * @throws Exception
+ * @return bool Success
+ */
+ public function run() {
+ global $wgAuth;
+
+ $username = $this->params['name'];
+ $from = $this->params['from'];
+ $wiki = wfWikiID();
+
+ $user = User::newFromName( $username );
+ $centralUser = CentralAuthUser::getInstance( $user );
+
+ if ( !$wgAuth->autoCreate() ) {
+ // denied by configuration
+ return true;
+ } elseif ( $user->getId() !== 0 ) {
+ wfDebugLog( 'CentralAuth', __CLASS__ . ": tried to
create local account for $username "
+ . "on $wiki from $from but one already
exists\n" );
+ return true;
+ } elseif ( !$centralUser->exists() ) {
+ wfDebugLog( 'CentralAuth', __CLASS__ . ": tried to
create local account for $username "
+ . "on $wiki from $from but no global account
exists\n" );
+ return true;
+ } elseif ( $centralUser->attachedOn( $wiki ) ) {
+ wfDebugLog( 'CentralAuth', __CLASS__ . ": tried to
create local account for $username "
+ . "on $wiki from $from but an attached local
account already exists\n" );
+ return true;
+ }
+
+ $user->loadDefaults( $username );
+
+ $abortMessage = '';
+ if ( !Hooks::run( 'AbortAutoAccount', array( $user,
&$abortMessage ) ) ) {
+ wfDebugLog( 'CentralAuth', __CLASS__ . ": tried to
create local account for $username "
+ . "on $wiki from $from but denied by other
extension: $abortMessage\n" );
+ return true;
+ } elseif ( $user->getName() !== $username ) {
+ throw new Exception( "AbortAutoAccount hook tried to
change the user name" );
+ }
+
+ $status = $user->addToDatabase();
+ if ( !$status->isOK() ) {
+ wfDebugLog( 'CentralAuth', __CLASS__ . ": tried to
create local account for $username "
+ . "on $wiki from $from but
User::addToDatabase() failed with status: "
+ . $status->getWikiText() . "\n" );
+ return false;
+ }
+
+ $wgAuth->initUser( $user, true );
+
+ Hooks::run( 'AuthPluginAutoCreate', array( $user ) );
+
+ # Update user count
+ $statsUpdate = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
+ $statsUpdate->doUpdate();
+
+ return true;
+ }
+}
--
To view, visit https://gerrit.wikimedia.org/r/204059
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3937b9e6d0df1ef608d64388167a3b37a3ea5de3
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/CentralAuth
Gerrit-Branch: master
Gerrit-Owner: Gergő Tisza <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits