/** * Sets up the messenger account for our use if it hasn't been already. * Based on code from AbuseFilter * https://mediawiki.org/wiki/Extension:AbuseFilter * * @return User */ public static function getMessengerUser() { global $wgMassMessageAccountUsername; // Function kinda copied from the AbuseFilter $user = User::newFromName($wgMassMessageAccountUsername); $user->load(); if ($user->getId() && $user->mPassword == '') { // We've already stolen the account return $user; } if (!$user->getId()) { $user->addToDatabase(); $user->saveSettings(); // Increment site_stats.ss_users $ssu = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssu->doUpdate(); } else { // Someone already created the account, lets take it over. $user->setPassword(null); $user->setEmail(null); $user->saveSettings(); } // Make the user a bot so it doesn't look weird $user->addGroup('bot'); return $user; }
public function execute() { if (!class_exists('CentralAuthUser')) { $this->error("CentralAuth isn't enabled on this wiki\n", 1); } $username = $this->getArg(0); $user = User::newFromName($username); if ($user === false) { $this->error("'{$username}' is an invalid username\n", 1); } // Normalize username $username = $user->getName(); if ($user->getId()) { $this->error("User '{$username}' already exists\n", 1); } else { global $wgAuth; $central = CentralAuthUser::getInstance($user); if (!$central->exists()) { $this->error("No such global user: '******'\n", 1); } $user->loadDefaults($username); $user->addToDatabase(); $wgAuth->initUser($user, true); $wgAuth->updateUser($user); # Notify hooks (e.g. Newuserlog) Hooks::run('AuthPluginAutoCreate', array($user)); # Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); $this->output("User '{$username}' created\n"); } }
function go_auth() { global $wgUser, $wgLanguageCode, $wgRequest, $wgOut; // For a few special pages, don't do anything. $title = $wgRequest->getVal('title'); $lg = Language::factory($wgLanguageCode); if ($title == $lg->specialPage("Userlogout") || $title == $lg->specialPage("Userlogin")) { return true; } $data = go_getsession(); if ($wgUser->IsAnon() || $data && $wgUser->getName() != $data['username']) { if (isset($data['user_id'])) { $wgUser = User::newFromName($data['username']); // Create a new account if the user does not exists if ($wgUser->getID() == 0) { // Create the user $wgUser->addToDatabase(); $wgUser->setRealName($data['username']); //$wgUser->setEmail($data['GO_SESSION']['email']); $wgUser->setPassword(md5($data['username'] . 'zout')); // do something random $wgUser->setToken(); $wgUser->saveSettings(); // Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); } $wgUser->setOption("rememberpassword", 1); $wgUser->setCookies(); $wgOut->returnToMain(); } } return true; }
public function execute() { $username = $this->getArg(0); $password = $this->getArg(1); $this->output(wfWikiID() . ": Creating and promoting User:{$username}..."); $user = User::newFromName($username); if (!is_object($user)) { $this->error("invalid username.", true); } elseif (0 != $user->idForName()) { $this->error("account exists.", true); } # Try to set the password try { $user->setPassword($password); } catch (PasswordError $pwe) { $this->error($pwe->getText(), true); } # Insert the account into the database $user->addToDatabase(); $user->saveSettings(); # Promote user if ($this->hasOption('sysop')) { $user->addGroup('sysop'); } if ($this->hasOption('bureaucrat')) { $user->addGroup('bureaucrat'); } # Increment site_stats.ss_users $ssu = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssu->doUpdate(); $this->output("done.\n"); }
public function execute() { $name = $this->getArg(); $delete = $this->getOption('delete', false); $ns = $this->getOption('ns', NS_MAIN); $dbw = wfGetDB(DB_MASTER); $dbw->begin(); $tbl_pag = $dbw->tableName('page'); $tbl_rec = $dbw->tableName('recentchanges'); $tbl_rev = $dbw->tableName('revision'); # Get page ID $this->output("Searching for \"{$name}\"..."); $title = Title::newFromText($name, $ns); if ($title) { $id = $title->getArticleID(); $real = $title->getPrefixedText(); $isGoodArticle = $title->isContentPage(); $this->output("found \"{$real}\" with ID {$id}.\n"); # Get corresponding revisions $this->output("Searching for revisions..."); $res = $dbw->query("SELECT rev_id FROM {$tbl_rev} WHERE rev_page = {$id}"); $revs = array(); foreach ($res as $row) { $revs[] = $row->rev_id; } $count = count($revs); $this->output("found {$count}.\n"); # Delete the page record and associated recent changes entries if ($delete) { $this->output("Deleting page record..."); $dbw->query("DELETE FROM {$tbl_pag} WHERE page_id = {$id}"); $this->output("done.\n"); $this->output("Cleaning up recent changes..."); $dbw->query("DELETE FROM {$tbl_rec} WHERE rc_cur_id = {$id}"); $this->output("done.\n"); } $dbw->commit(); # Delete revisions as appropriate if ($delete && $count) { $this->output("Deleting revisions..."); $this->deleteRevisions($revs); $this->output("done.\n"); $this->purgeRedundantText(true); } # Update stats as appropriate if ($delete) { $this->output("Updating site stats..."); $ga = $isGoodArticle ? -1 : 0; // if it was good, decrement that too $stats = new SiteStatsUpdate(0, -$count, $ga, -1); $stats->doUpdate(); $this->output("done.\n"); } } else { $this->output("not found in database.\n"); $dbw->commit(); } }
/** * constructor */ function wfSpecialStatistics() { global $wgUser, $wgOut, $wgLang, $wgRequest; $fname = 'wfSpecialStatistics'; $action = $wgRequest->getVal('action'); $dbr =& wfGetDB(DB_SLAVE); extract($dbr->tableNames('page', 'site_stats', 'user', 'user_groups')); $row = $dbr->selectRow('site_stats', '*', false, $fname); $views = $row->ss_total_views; $edits = $row->ss_total_edits; $good = $row->ss_good_articles; # This code is somewhat schema-agnostic, because I'm changing it in a minor release -- TS if (isset($row->ss_total_pages) && $row->ss_total_pages == -1) { # Update schema $u = new SiteStatsUpdate(0, 0, 0); $u->doUpdate(); $row = $dbr->selectRow('site_stats', '*', false, $fname); } if (isset($row->ss_total_pages)) { $total = $row->ss_total_pages; } else { $sql = "SELECT COUNT(page_namespace) AS total FROM {$page}"; $res = $dbr->query($sql, $fname); $pageRow = $dbr->fetchObject($res); $total = $pageRow->total; } if (isset($row->ss_users)) { $users = $row->ss_users; } else { $sql = "SELECT MAX(user_id) AS total FROM {$user}"; $res = $dbr->query($sql, $fname); $userRow = $dbr->fetchObject($res); $users = $userRow->total; } $sql = "SELECT COUNT(*) AS total FROM {$user_groups} WHERE ug_group='sysop'"; $res = $dbr->query($sql, $fname); $row = $dbr->fetchObject($res); $admins = $row->total; if ($action == 'raw') { $wgOut->disable(); header('Pragma: nocache'); echo "total={$total};good={$good};views={$views};edits={$edits};users={$users};admins={$admins}\n"; return; } else { $text = '==' . wfMsg('sitestats') . "==\n"; $text .= wfMsg('sitestatstext', $wgLang->formatNum($total), $wgLang->formatNum($good), $wgLang->formatNum($views), $wgLang->formatNum($edits), $wgLang->formatNum(sprintf('%.2f', $total ? $edits / $total : 0)), $wgLang->formatNum(sprintf('%.2f', $edits ? $views / $edits : 0))); $text .= "\n==" . wfMsg('userstats') . "==\n"; $text .= wfMsg('userstatstext', $wgLang->formatNum($users), $wgLang->formatNum($admins), '[[' . wfMsg('administrators') . ']]', $wgLang->formatNum(sprintf('%.2f', $admins / $users * 100))); $wgOut->addWikiText($text); } }
public static function onOpauthUserAuthorized($provider, $uid, $info, $raw) { global $wgUser, $wgOut; // Called when user was successfully authenticated from Opauth // This function should compare UID with internal storage and decide to create new account for this user // or load existing user from database if (OpauthLogin::isUidLinked($uid, $provider)) { // Login existing user into system $user = OpauthLogin::getUidUser($uid, $provider); wfRunHooks('OpauthLoginUserAuthorized', array($user, $provider, $uid, $info)); } else { // Create new user from external data, $info refers to https://github.com/opauth/opauth/wiki/Auth-response /** * We set UID based string as user name in mediawiki to avoid * user nicknames override and collisions problems. We store external user name into * "real name" field of user object. This should be supported in skin. */ $user = User::newFromName(md5($provider . $uid) . '_' . $uid, false); $user->setRealName($info['name']); if (array_key_exists('email', $info)) { if (!OpauthLogin::isEmailCollate($info['email'])) { $user->setEmail($info['email']); } } $user->setPassword(md5($info['name'] . time())); $user->setToken(); $user->confirmEmail(); // Mark email address as confirmed by default $user->addToDatabase(); // Commit changes to database OpauthLogin::addUidLink($uid, $provider, $user->getId()); // Update site stats $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); // Run AddNewAccount hook for proper handling wfRunHooks('AddNewAccount', array($user, false)); wfRunHooks('OpauthLoginUserCreated', array($user, $provider, $info, $uid)); } // Replace current user with new one $wgUser = $user; $wgUser->setCookies(null, null, true); if (array_key_exists('opauth_returnto', $_SESSION) && isset($_SESSION['opauth_returnto'])) { $returnToTitle = Title::newFromText($_SESSION['opauth_returnto']); unset($_SESSION['opauth_returnto']); $wgOut->redirect($returnToTitle->getFullURL()); return true; } $wgOut->redirect(Title::newMainPage()->getFullURL()); return true; }
static function load($recache = false) { if (self::$loaded && !$recache) { return; } $dbr =& wfGetDB(DB_SLAVE); self::$row = $dbr->selectRow('site_stats', '*', false, __METHOD__); # This code is somewhat schema-agnostic, because I'm changing it in a minor release -- TS if (!isset(self::$row->ss_total_pages) && self::$row->ss_total_pages == -1) { # Update schema $u = new SiteStatsUpdate(0, 0, 0); $u->doUpdate(); self::$row = $dbr->selectRow('site_stats', '*', false, __METHOD__); } }
/** * @param $recache bool */ static function load($recache = false) { if (self::$loaded && !$recache) { return; } self::$row = self::loadAndLazyInit(); # This code is somewhat schema-agnostic, because I'm changing it in a minor release -- TS if (!isset(self::$row->ss_total_pages) && self::$row->ss_total_pages == -1) { # Update schema $u = new SiteStatsUpdate(0, 0, 0); $u->doUpdate(); self::$row = self::doLoad(wfGetDB(DB_SLAVE)); } self::$loaded = true; }
/** * @param $user User * @param $mungedUsername String * @return bool */ public static function attemptAddUser($user, $mungedUsername) { /** * @var $wgAuth LdapAuthenticationPlugin */ global $wgAuth; if (!$wgAuth->autoCreate()) { $wgAuth->printDebug("Cannot automatically create accounts.", NONSENSITIVE); return false; } $wgAuth->printDebug("User does not exist in local database; creating.", NONSENSITIVE); // Checks passed, create the user $user->loadDefaults($mungedUsername); $user->addToDatabase(); $wgAuth->initUser($user, true); $user->setCookies(); wfSetupSession(); # Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); # Notify hooks (e.g. Newuserlog) wfRunHooks('AuthPluginAutoCreate', array($user)); return true; }
/** * Actually add a user to the database. * Give it a User object that has been initialised with a name. * * This is a custom version of similar code in SpecialUserLogin's LoginForm with differences * due to the fact that this code doesn't require a password, etc. * * @param $u User object. * @param $autocreate boolean -- true if this is an autocreation via auth plugin * @return User object. * @private */ function initUser($u, $autocreate) { global $wgAuth, $wgExternalAuthType; if ($wgExternalAuthType) { $u = ExternalUser::addUser($u, $this->mPassword, $this->mEmail, $this->mRealName); if (is_object($u)) { $this->mExtUser = ExternalUser::newFromName($this->mName); } } else { $u->addToDatabase(); } // No passwords for FBConnect accounts //if ( $wgAuth->allowPasswordChange() ) { // $u->setPassword( $this->mPassword ); //} $u->setEmail($this->mEmail); $u->setRealName($this->mRealName); $u->setToken(); $wgAuth->initUser($u, $autocreate); if (is_object($this->mExtUser)) { $this->mExtUser->linkToLocal($u->getId()); $email = $this->mExtUser->getPref('emailaddress'); if ($email && !$this->mEmail) { $u->setEmail($email); } } //$u->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 ); $u->setOption('marketingallowed', $this->mMarketingOptIn ? 1 : 0); $u->setOption('skinoverwrite', 1); $u->saveSettings(); # Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); return $u; }
private function userSignup() { // Get user input and check the environment $this->mUserDataChecker->run(); // Throw if data getting or environment checks have failed which indicates that account creation is impossible $checker_error = $this->mUserDataChecker->getError(); if ( $checker_error ) { throw new Exception( $checker_error ); } $user = $this->mUserDataChecker->mUser; $user->setEmail( $this->mUserDataChecker->mEmail ); $user->setRealName( $this->mUserDataChecker->mRealname ); $abortError = ''; if ( !wfRunHooks( 'AbortNewAccount', array( $user, &$abortError ) ) ) { // Hook point to add extra creation throttles and blocks wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" ); throw new Exception( $abortError ); } global $wgAccountCreationThrottle; global $wgUser, $wgRequest; if ( $wgAccountCreationThrottle && $wgUser->isPingLimitable() ) { $key = wfMemcKey( 'acctcreate', 'ip', $wgRequest->getIP() ); $value = $wgMemc->incr( $key ); if ( !$value ) { $wgMemc->set( $key, 1, 86400 ); } if ( $value > $wgAccountCreationThrottle ) { throw new Exception( wfMsg( 'ses-throttlehit' ) ); } } global $wgAuth; $addedUser = $wgAuth->addUser( $user, $this->mUserDataChecker->mPassword, $this->mUserDataChecker->mEmail, $this->mUserDataChecker->mRealname ); if ( !$addedUser ) { throw new Exception( 'externaldberror' ); } $user->addToDatabase(); if ( $wgAuth->allowPasswordChange() ) { $user->setPassword( $this->mUserDataChecker->mPassword ); } $user->setToken(); $wgAuth->initUser( $user, false ); $user->setOption( 'rememberpassword', $this->mUserDataChecker->mRemember ? 1 : 0 ); $user->saveSettings(); # Update user count $ssUpdate = new SiteStatsUpdate( 0, 0, 0, 0, 1 ); $ssUpdate->doUpdate(); global $wgLoginLanguageSelector; $language = $this->mUserDataChecker->mLanguage; if ( $wgLoginLanguageSelector && $language ) { $user->setOption( 'language', $language ); } global $wgEmailAuthentication; if ( $wgEmailAuthentication && User::isValidEmailAddr( $user->getEmail() ) ) { $status = $user->sendConfirmationMail(); if ( !$status->isGood() ) { throw new Exception( wfMsg( 'ses-emailfailed' ) . "\n" . $status->getMessage() ); } } $user->saveSettings(); wfRunHooks( 'AddNewAccount', array( $user ) ); }
/** * Actually add a user to the database. * Give it a User object that has been initialised with a name. * * @param $u User object. * @param $autocreate boolean -- true if this is an autocreation via auth plugin * @return User object. * @private */ function initUser($u, $autocreate) { global $wgAuth; $u->addToDatabase(); if ($wgAuth->allowPasswordChange()) { $u->setPassword($this->mPassword); } $u->setEmail($this->mEmail); $u->setRealName($this->mRealName); $u->setToken(); $wgAuth->initUser($u, $autocreate); $u->setOption('rememberpassword', $this->mRemember ? 1 : 0); $u->saveSettings(); # Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); return $u; }
function casLogin($user, &$result) { global $CASAuth; global $casIsSetUp; global $IP, $wgLanguageCode, $wgRequest, $wgOut; if (isset($_REQUEST["title"])) { $lg = Language::factory($wgLanguageCode); if ($_REQUEST["title"] == $lg->specialPage("Userlogin")) { // Setup for a web request require_once "{$IP}/includes/WebStart.php"; // Load phpCAS require_once $CASAuth["phpCAS"] . "/CAS.php"; if (!$casIsSetUp) { return false; } //Will redirect to CAS server if not logged in phpCAS::forceAuthentication(); // Get username $username = casNameLookup(phpCAS::getUser()); $email = casEmailLookup(phpCAS::getUser()); // If we are restricting users AND the user is not in // the allowed users list, lets block the login if ($CASAuth["RestrictUsers"] == true && !in_array($username, $CASAuth["AllowedUsers"])) { // redirect user to the RestrictRedirect page $wgOut->redirect($CASAuth["RestrictRedirect"]); return true; } // Get MediaWiki user $u = User::newFromName($username); // Create a new account if the user does not exists if ($u->getID() == 0 && $CASAuth["CreateAccounts"]) { // Create the user $u->addToDatabase(); $u->setRealName($username); $u->setEmail($email); // PwdSecret is used to salt the username for an hmac // hash which becomes the password $u->setPassword(hash_hmac('sha256', $username, $CASAuth["PwdSecret"])); $u->setToken(); $u->saveSettings(); // Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); } // Login successful if ($CASAuth["RememberMe"]) { $u->setOption("rememberpassword", 1); } $u->setCookies(); $user = $u; // Redirect if a returnto parameter exists $returnto = $wgRequest->getVal("returnto"); if ($returnto) { $target = Title::newFromText($returnto); if ($target) { //action=purge is used to purge the cache $wgOut->redirect($target->getFullUrl('action=purge')); } } } else { if ($_REQUEST["title"] == $lg->specialPage("Userlogout")) { // Logout casLogout(); } } } // Back to MediaWiki home after login return true; }
* @author Rob Church <*****@*****.**> */ #ubuntu specific directory: require_once '/var/www/wiki/maintenance/commandLine.inc'; if (!count($args) == 2) { echo "Please provide a username and password for the new account.\n"; die(1); } $username = $args[0]; $password = $args[1]; echo wfWikiID() . ": Creating wiki User:{$username}..."; # Validate username and check it doesn't exist $user = User::newFromName($username); if (!is_object($user)) { echo "invalid username.\n"; die(1); } elseif (0 != $user->idForName()) { echo "Wiki account exists.\n"; die(0); } # Insert the account into the database $user->addToDatabase(); $user->setPassword($password); $user->setToken(); #this may be readded as an option but probably not # Promote user #$user->addGroup( 'sysop' ); # Increment site_stats.ss_users $ssu = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssu->doUpdate(); echo "done.\n";
function doPOST() { global $wgUser, $wgAuth; switch ($this->action) { default: throw new InvalidPOSTParamException(wfMsg('uadm-formsubmissionerrormsg')); case 'emailwelcomepreview': $this->pwdaction = 'emailwelcome'; $newParams = array('preview' => 'welcome') + $this->mParams; $newParams = array_intersect_key($newParams, $this->getParamsGET()); return $this->getURL($newParams); case 'adduser': break; } $this->validatePOSTParams(); if ($this->domain != 'local' && $this->domain != '') { if (!$wgAuth->canCreateAccounts()) { return $this->getPOSTRedirectURL(false, wfMsg('uadm-createextacctfailmsg')); } } $logRights = new LogPage('rights'); $user = new User(); $user->setName($wgAuth->getCanonicalName($this->username)); $user->setRealName($this->realname); $user->setEmail($this->email); $successWikiText = array(); $successWikiText[] = wfMsg('uadm-newusersuccessmsg', $this->username); $userPassword = ''; switch ($this->pwdaction) { case 'manual': try { $user->setPassword($this->password1); $userPassword = $this->password1; } catch (PasswordError $pe) { return $this->getPOSTRedirectURL(false, wfMsg('uadm-passworderrormsg') . $pe->getText()); } $successWikiText[] = wfMsg('uadm-passwordchangesuccessmsg', $this->username); break; case 'emailwelcome': $result = self::mailWelcomeAndPassword($user); if ($result->isGood()) { return $this->getPOSTRedirectURL(false, wfMsg('uadm-mailerror', $result->getMessage())); } $successWikiText[] = wfMsg('uadm-welcomeemailsuccessmsg', $this->username, $this->email); break; } $user->setToken(); $wgAuth->initUser($user, false); $abortError = ''; if (!wfRunHooks('AbortNewAccount', array($user, &$abortError))) { return $this->getPOSTRedirectURL(false, wfMsg('uadm-hookblocknewusermsg', $abortError)); } if (!$wgAuth->addUser($user, $userPassword, $this->email, $this->realname)) { return $this->getPOSTRedirectURL(false, wfMsg('uadm-wgauthaddfailmsg', $abortError)); } $user->addToDatabase(); $user->addNewUserLogEntry(); if (count($this->groups) > 0) { $userrightsPage = new UserrightsPage(); $userrightsPage->doSaveUserGroups($user, $this->groups, array(), $this->newuserreasonmsg); wfRunHooks('UserRights', array($user, $add, $remove)); $successWikiText[] = wfMsg('uadm-changestogroupsuccessmsg', $this->username); } $successWikiText = implode('<br/>', $successWikiText); wfRunHooks('AddNewAccount', array($user, true)); $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); # password log entry switch ($this->pwdaction) { case 'manual': $logRights->addEntry('uadm-changeduserpasswordlog', $user->getUserPage(), $this->newuserreasonmsg, array()); break; case 'emailwelcome': $logRights->addEntry('uadm-emailwelcomelog', $user->getUserPage(), $this->newuserreasonmsg, array()); break; } // Redirect to EditUser special page instead of AddUser to allow editing of // user just added return $this->getSpecialPageURL('EditUser', $this->username, array('statusmsg' => base64_encode($successWikiText), 'statusok' => true, 'returnto' => $this->returnto)); }
function delete_post() { $wiki_page = $this->rDB->tableName('page'); $wiki_revision = $this->rDB->tableName('revision'); $wiki_text = $this->rDB->tableName('text'); $sql = "SELECT wr.rev_text_id, wt.old_text, wp.page_len\n FROM {$wiki_page} wp\n JOIN {$wiki_revision} wr\n ON wp.page_latest=wr.rev_id\n JOIN {$wiki_text} wt\n ON wr.rev_text_id=wt.old_id\n WHERE wp.page_id = {$this->pageID}\n LIMIT 1"; $res = $this->rDB->query($sql); $r = $this->rDB->fetchObject($res); self::text_size($this->old_post_text); $old_len = $this->size; $page_len = $r->page_len - $old_len; $this->wDB->begin(); $this->wDB->update('page', array('page_len' => $page_len), array('page_id' => $this->pageID), ''); $new_post_text = str_replace("<!-- " . md5($this->old_p_wiki_hidden) . " -->" . $this->old_post_text, '', $r->old_text); $this->wDB->update('text', array('old_text' => $new_post_text), array('old_id' => $r->rev_text_id), ''); $search_text = preg_replace("#\\<\\!--(.+?)--\\>#is", ' ', $new_post_text); $this->wDB->update('searchindex', array('si_text' => $search_text), array('si_page' => $this->pageID), ''); /* $this->wDB->update( 'revision', array('rev_deleted' => 1, ), array('rev_id' => $this->old_p_wiki_ver_id), '' ); */ $this->wDB->commit(); // ( $views, $edits, $good, $pages = 0, $users = 0 ) $u = new SiteStatsUpdate(+1, -1, 0); $u->doUpdate(); }
/** * @private */ function addNewAccountInternal() { global $wgUser, $wgOut; global $wgEnableSorbs, $wgProxyWhitelist; global $wgMemc, $wgAccountCreationThrottle; global $wgAuth, $wgMinimalPasswordLength; // If the user passes an invalid domain, something is fishy if (!$wgAuth->validDomain($this->mDomain)) { $this->mainLoginForm(wfMsg('wrongpassword')); return false; } // If we are not allowing users to login locally, we should // be checking to see if the user is actually able to // authenticate to the authentication server before they // create an account (otherwise, they can create a local account // and login as any domain user). We only need to check this for // domains that aren't local. if ('local' != $this->mDomain && '' != $this->mDomain) { if (!$wgAuth->canCreateAccounts() && (!$wgAuth->userExists($this->mName) || !$wgAuth->authenticate($this->mName, $this->mPassword))) { $this->mainLoginForm(wfMsg('wrongpassword')); return false; } } if (wfReadOnly()) { $wgOut->readOnlyPage(); return false; } if (!$wgUser->isAllowedToCreateAccount()) { $this->userNotPrivilegedMessage(); return false; } $ip = wfGetIP(); if ($wgEnableSorbs && !in_array($ip, $wgProxyWhitelist) && $wgUser->inSorbsBlacklist($ip)) { $this->mainLoginForm(wfMsg('sorbs_create_account_reason') . ' (' . htmlspecialchars($ip) . ')'); return; } $name = trim($this->mName); $u = User::newFromName($name, 'creatable'); if (is_null($u)) { $this->mainLoginForm(wfMsg('noname')); return false; } if (0 != $u->idForName()) { $this->mainLoginForm(wfMsg('userexists')); return false; } if (0 != strcmp($this->mPassword, $this->mRetype)) { $this->mainLoginForm(wfMsg('badretype')); return false; } if (!$wgUser->isValidPassword($this->mPassword)) { $this->mainLoginForm(wfMsg('passwordtooshort', $wgMinimalPasswordLength)); return false; } $abortError = ''; if (!wfRunHooks('AbortNewAccount', array($u, &$abortError))) { // Hook point to add extra creation throttles and blocks wfDebug("LoginForm::addNewAccountInternal: a hook blocked creation\n"); $this->mainLoginForm($abortError); return false; } if ($wgAccountCreationThrottle) { $key = wfMemcKey('acctcreate', 'ip', $ip); $value = $wgMemc->incr($key); if (!$value) { $wgMemc->set($key, 1, 86400); } if ($value > $wgAccountCreationThrottle) { $this->throttleHit($wgAccountCreationThrottle); return false; } } if (!$wgAuth->addUser($u, $this->mPassword)) { $this->mainLoginForm(wfMsg('externaldberror')); return false; } # Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); return $this->initUser($u); }
protected function acceptRequest(IContextSource $context) { global $wgAuth, $wgAccountRequestTypes, $wgConfirmAccountSaveInfo; global $wgAllowAccountRequestFiles, $wgConfirmAccountFSRepos; $accReq = $this->accountReq; // convenience # Now create user and check if the name is valid $user = User::newFromName($this->userName, 'creatable'); if (!$user) { return array('accountconf_invalid_name', wfMsgHtml('noname')); } # Check if account name is already in use if (0 != $user->idForName() || $wgAuth->userExists($user->getName())) { return array('accountconf_user_exists', wfMsgHtml('userexists')); } $dbw = wfGetDB(DB_MASTER); $dbw->begin(); # Make a random password $p = User::randomPassword(); # Insert the new user into the DB... $tokenExpires = $accReq->getEmailTokenExpires(); $authenticated = $accReq->getEmailAuthTimestamp(); $params = array('real_name' => $accReq->getRealName(), 'newpassword' => User::crypt($p), 'email' => $accReq->getEmail(), 'email_authenticated' => $dbw->timestampOrNull($authenticated), 'email_token_expires' => $dbw->timestamp($tokenExpires), 'email_token' => $accReq->getEmailToken()); $user = User::createNew($user->getName(), $params); # Grant any necessary rights (exclude blank or dummy groups) $group = self::getGroupFromType($this->type); if ($group != '' && $group != 'user' && $group != '*') { $user->addGroup($group); } $acd_id = null; // used for rollback cleanup # Save account request data to credentials system if ($wgConfirmAccountSaveInfo) { $key = $accReq->getFileStorageKey(); # Copy any attached files to new storage group if ($wgAllowAccountRequestFiles && $key) { $repoOld = new FSRepo($wgConfirmAccountFSRepos['accountreqs']); $repoNew = new FSRepo($wgConfirmAccountFSRepos['accountcreds']); $pathRel = UserAccountRequest::relPathFromKey($key); $oldPath = $repoOld->getZonePath('public') . '/' . $pathRel; $triplet = array($oldPath, 'public', $pathRel); $status = $repoNew->storeBatch(array($triplet)); // copy! if (!$status->isOK()) { $dbw->rollback(); # DELETE new rows in case there was a COMMIT somewhere $this->acceptRequest_rollback($dbw, $user->getId(), $acd_id); return array('accountconf_copyfailed', $context->getOutput()->parse($status->getWikiText())); } } $acd_id = $dbw->nextSequenceValue('account_credentials_acd_id_seq'); # Move request data into a separate table $dbw->insert('account_credentials', array('acd_user_id' => $user->getID(), 'acd_real_name' => $accReq->getRealName(), 'acd_email' => $accReq->getEmail(), 'acd_email_authenticated' => $dbw->timestampOrNull($authenticated), 'acd_bio' => $accReq->getBio(), 'acd_notes' => $accReq->getNotes(), 'acd_urls' => $accReq->getUrls(), 'acd_ip' => $accReq->getIP(), 'acd_filename' => $accReq->getFileName(), 'acd_storage_key' => $accReq->getFileStorageKey(), 'acd_areas' => $accReq->getAreas('flat'), 'acd_registration' => $dbw->timestamp($accReq->getRegistration()), 'acd_accepted' => $dbw->timestamp(), 'acd_user' => $this->admin->getID(), 'acd_comment' => $this->reason, 'acd_id' => $acd_id), __METHOD__); if (is_null($acd_id)) { $acd_id = $dbw->insertId(); // set $acd_id to ID inserted } } # Add to global user login system (if there is one) if (!$wgAuth->addUser($user, $p, $accReq->getEmail(), $accReq->getRealName())) { $dbw->rollback(); # DELETE new rows in case there was a COMMIT somewhere $this->acceptRequest_rollback($dbw, $user->getId(), $acd_id); return array('accountconf_externaldberror', wfMsgHtml('externaldberror')); } # OK, now remove the request from the queue $accReq->remove(); # Commit this if we make past the CentralAuth system # and the groups are added. Next step is sending out an # email, which we cannot take back... $dbw->commit(); # Prepare a temporary password email... if ($this->reason != '') { $msg = "confirmaccount-email-body2-pos{$this->type}"; # If the user is in a group and there is a welcome for that group, use it if ($group && !wfEmptyMsg($msg)) { $ebody = wfMsgExt($msg, array('parsemag', 'content'), $user->getName(), $p, $this->reason); # Use standard if none found... } else { $ebody = wfMsgExt('confirmaccount-email-body2', array('parsemag', 'content'), $user->getName(), $p, $this->reason); } } else { $msg = "confirmaccount-email-body-pos{$this->type}"; # If the user is in a group and there is a welcome for that group, use it if ($group && !wfEmptyMsg($msg)) { $ebody = wfMsgExt($msg, array('parsemag', 'content'), $user->getName(), $p, $this->reason); # Use standard if none found... } else { $ebody = wfMsgExt('confirmaccount-email-body', array('parsemag', 'content'), $user->getName(), $p, $this->reason); } } # Actually send out the email (@TODO: rollback on failure including $wgAuth) $result = $user->sendMail(wfMsgForContent('confirmaccount-email-subj'), $ebody); /* if ( !$result->isOk() ) { # DELETE new rows in case there was a COMMIT somewhere $this->acceptRequest_rollback( $dbw, $user->getId(), $acd_id ); return array( 'accountconf_mailerror', wfMsg( 'mailerror', $context->getOutput()->parse( $result->getWikiText() ) ) ); } */ # Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); # Safe to hook/log now... wfRunHooks('AddNewAccount', array($user, false)); $user->addNewUserLogEntry(); # Clear cache for notice of how many account requests there are ConfirmAccount::clearAccountRequestCountCache(); # Delete any attached file and don't stop the whole process if this fails if ($wgAllowAccountRequestFiles) { $key = $accReq->getFileStorageKey(); if ($key) { $repoOld = new FSRepo($wgConfirmAccountFSRepos['accountreqs']); $pathRel = UserAccountRequest::relPathFromKey($key); $oldPath = $repoOld->getZonePath('public') . '/' . $pathRel; if (file_exists($oldPath)) { unlink($oldPath); // delete! } } } # Start up the user's userpages if set to do so. # Will not append, so previous content will be blanked. $this->createUserPage($user); # Greet the new user if set to do so. $this->createUserTalkPage($user); return array(true, null); }
/** * Adds an user to the database * @param String $uUser Json encoded new user * @return string json encoded response */ public static function addUser($sUsername, $sPassword, $sRePassword, $sEmail, $sRealname, $aGroups = array()) { $res = $resDelGroups = $resInsGroups = $resERealUser = false; if (wfReadOnly()) { global $wgReadOnly; return FormatJson::encode(array('success' => false, 'message' => array(wfMessage('bs-readonly', $wgReadOnly)->plain()))); } if (BsCore::checkAccessAdmission('wikiadmin') === false) { return true; } //This is to overcome username case issues with custom AuthPlugin (i.e. LDAPAuth) //LDAPAuth woud otherwise turn the username to first-char-upper-rest-lower-case //At the end of this method we switch $_SESSION['wsDomain'] back again $tmpDomain = isset($_SESSION['wsDomain']) ? $_SESSION['wsDomain'] : ''; $_SESSION['wsDomain'] = 'local'; $aResponse = array('success' => false, 'errors' => array(), 'message' => array()); $sUsername = ucfirst($sUsername); if (User::isCreatableName($sUsername) === false) { $aResponse['errors'][] = array('id' => 'username', 'message' => wfMessage('bs-usermanager-invalid-uname')->plain()); } if ($sEmail != '' && Sanitizer::validateEmail($sEmail) === false) { $aResponse['errors'][] = array('id' => 'email', 'message' => wfMessage('bs-usermanager-invalid-email-gen')->plain()); } if ($sPassword == '') { $aResponse['errors'][] = array('id' => 'pass', 'message' => wfMessage('bs-usermanager-enter-pwd')->plain()); } if (strpos($sRealname, '\\')) { $aResponse['errors'][] = array('id' => 'realname', 'message' => wfMessage('bs-usermanager-invalid-realname')->plain()); } if ($sPassword != $sRePassword) { $aResponse['errors'][] = array('id' => 'repass', 'message' => wfMessage('badretype')->plain()); } if (strtolower($sUsername) == strtolower($sPassword)) { $aResponse['errors'][] = array('id' => 'pass', 'message' => wfMessage('password-name-match')->plain()); } $oNewUser = User::newFromName($sUsername); if ($oNewUser == null) { //Should not be neccessary as we check for username validity above $aResponse['errors'][] = array('id' => 'username', 'message' => wfMessage('bs-usermanager-invalid-uname')->plain()); } if ($oNewUser instanceof User) { if ($oNewUser->getId() != 0) { $aResponse['errors'][] = array('id' => 'username', 'message' => wfMessage('bs-usermanager-user-exists')->plain()); } if ($oNewUser->isValidPassword($sPassword) == false) { //TODO: $oNewUser->getPasswordValidity() returns a message key in case of error. Maybe we sould return this message. $aResponse['errors'][] = array('id' => 'pass', 'message' => wfMessage('bs-usermanager-invalid-pwd')->plain()); } } if (!empty($aResponse['errors'])) { //In case that any error occurred return FormatJson::encode($aResponse); } $oNewUser->addToDatabase(); $oNewUser->setPassword($sPassword); $oNewUser->setEmail($sEmail); $oNewUser->setRealName($sRealname); $oNewUser->setToken(); $oNewUser->saveSettings(); $dbw = wfGetDB(DB_MASTER); $resDelGroups = $dbw->delete('user_groups', array('ug_user' => $oNewUser->getId())); $resInsGroups = true; if (is_array($aGroups)) { foreach ($aGroups as $sGroup) { if (in_array($sGroup, self::$excludegroups)) { continue; } $resInsGroups = $dbw->insert('user_groups', array('ug_user' => $oNewUser->getId(), 'ug_group' => addslashes($sGroup))); } } if ($resDelGroups === false || $resInsGroups === false) { $aAnswer['success'] = false; $aAnswer['message'][] = wfMessage('bs-usermanager-db-error')->plain(); } $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); $aResponse['success'] = true; $aResponse['message'][] = wfMessage('bs-usermanager-user-added')->plain(); $_SESSION['wsDomain'] = $tmpDomain; $oUserManager = BsExtensionManager::getExtension('UserManager'); wfRunHooks('BSUserManagerAfterAddUser', array($oUserManager, $oNewUser, array('username' => $sUsername, 'email' => $sEmail, 'password' => $sPassword, 'realname' => $sRealname))); return FormatJson::encode($aResponse); }
function executeScript($type) { global $wgOut, $wgRequest, $wgUser; wfLoadExtensionMessages('Maintenance'); @set_time_limit(0); //if we can, disable the time limit $this->setHeaders(); $wgOut->addHTML($wgUser->getSkin()->makeKnownLinkObj($this->getTitle(), wfMsgHtml('maintenance-backlink')) . '<br />'); switch ($type) { case 'changePassword': $name = $wgRequest->getText('wpName'); $password = $wgRequest->getText('wpPassword'); $user = User::newFromName($name); if (!is_object($user) || !$user->getId()) { $wgOut->addWikiMsg('maintenance-invalidname'); return; } $dbw = wfGetDB(DB_MASTER); $user->setPassword($password); $user->saveSettings(); $wgOut->addWikiMsg('maintenance-success', $type); break; case 'createAndPromote': $name = $wgRequest->getText('wpName'); $password = $wgRequest->getText('wpPassword'); $bcrat = $wgRequest->getCheck('wpBcrat'); $user = User::newFromName($name); if (!is_object($user)) { $wgOut->addWikiMsg('maintenance-invalidname'); return; } elseif (0 != $user->idForName()) { $wgOut->addWikiMsg('maintenance-userexists'); return; } $user->addToDatabase(); $user->setPassword($password); $user->saveSettings(); $user->addGroup('sysop'); if ($bcrat) { $user->addGroup('bureaucrat'); } $ssu = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssu->doUpdate(); $wgOut->addWikiMsg('maintenance-success', $type); break; case 'deleteBatch': $reason = $wgRequest->getText('wpReason', ''); $interval = 0; $pages = $wgRequest->getText('wpDelete'); $dbw = wfGetDB(DB_MASTER); $lines = explode("\n", $pages); foreach ($lines as &$line) { $line = trim($line); if ($line == '') { continue; } $page = Title::newFromText($line); if (is_null($page)) { $wgOut->addWikiMsg('maintenance-invalidtitle', $line); continue; } if (!$page->exists()) { $wgOut->addWikiMsg('maintenance-titlenoexist', $line); continue; } $return = '* ' . $page->getPrefixedText(); // Switch the user here from the current user to Delete page script $OldUser = $wgUser; $wgUser = User::newFromName('Delete page script'); // Begin transaction $dbw->begin(); if ($page->getNamespace() == NS_IMAGE) { $art = new ImagePage($page); $img = wfFindFile($art->mTitle); if (!$img || !$img->delete($reason)) { $return .= '... ' . wfMsg('maintenance-failed'); } } else { $art = new Article($page); } $success = $art->doDeleteArticle($reason); // Commit changes to the database $dbw->commit(); // ...and switch user back to the old user $wgUser = $OldUser; if ($success) { $return .= '... ' . wfMsg('maintenance-deleted'); } else { $return .= '... ' . wfMsg('maintenance-failed'); } $wgOut->addWikiText($return); waitForSlaves(5); } $wgOut->addWikiMsg('maintenance-success', $type); break; case 'deleteRevision': $delete = $wgRequest->getText('wpDelete'); $revisions = explode("\n", $delete); $wgOut->addWikiMsg('maintenance-revdelete', implode(', ', $revisions), wfWikiID()); $affected = 0; // Switch the user here from the current user to Delete page script $OldUser = $wgUser; $wgUser = User::newFromName('Delete page script'); $dbw = wfGetDB(DB_MASTER); foreach ($revisions as $revID) { $dbw->insertSelect('archive', array('page', 'revision'), array('ar_namespace' => 'page_namespace', 'ar_title' => 'page_title', 'ar_comment' => 'rev_comment', 'ar_user' => 'rev_user', 'ar_user_text' => 'rev_user_text', 'ar_timestamp' => 'rev_timestamp', 'ar_minor_edit' => 'rev_minor_edit', 'ar_rev_id' => 'rev_id', 'ar_text_id' => 'rev_text_id'), array('rev_id' => $revID, 'page_id = rev_page'), __METHOD__); if (!$dbw->affectedRows()) { $wgOut->addWikiMsg('maintenance-revnotfound', array($revID)); } else { $affected += $dbw->affectedRows(); $dbw->delete('revision', array('rev_id' => $revID)); } } // ...and switch user back to the old user $wgUser = $OldUser; $wgOut->addWikiMsg('maintenance-success', $type); break; case 'purgeDeletedText': # Data should come off the master, wrapped in a transaction $dbw = wfGetDB(DB_MASTER); $dbw->begin(); # compute table names $tbl_arc = $dbw->tableName('archive'); $tbl_rev = $dbw->tableName('revision'); $tbl_txt = $dbw->tableName('text'); # Delete as appropriate $dbw->query("TRUNCATE TABLE {$tbl_arc}"); // list of "valid" text ids $new_ids = array(); $new_start = 0; // list of "existing" text ids $old_ids = array(); $old_start = 0; // index id $id = 1; // list of ids to be deleted $del_ids = array(); while ($id > 0 && count($del_ids) < 1000) { // get some new "valid" text ids if (count($new_ids) == 0) { $res = $dbw->query("SELECT DISTINCTROW rev_text_id FROM {$tbl_rev} ORDER BY rev_text_id ASC LIMIT {$new_start},100"); while ($row = $dbw->fetchObject($res)) { $new_ids[$row->rev_text_id] = $row->rev_text_id; } if (count($new_ids) == 0) { $id = 0; } else { $new_start += count($new_ids); } } // get some new "existing" text ids if (count($old_ids) == 0) { $res = $dbw->query("SELECT DISTINCTROW old_id FROM {$tbl_txt} ORDER BY old_id ASC LIMIT {$old_start},100"); while ($row = $dbw->fetchObject($res)) { $old_ids[$row->old_id] = $row->old_id; } if (count($old_ids) == 0) { $id = 0; } else { $old_start += count($old_ids); } } // for all ids, check that existing ids are valid while (count($new_ids) > 0 && count($old_ids) > 0) { if (isset($new_ids[$id])) { unset($new_ids[$id]); } else { if (isset($old_ids[$id])) { $del_ids[] = $id; } } unset($old_ids[$id]); $id += 1; } } // print result foreach ($del_ids as $del_id) { $wgOut->addHTML(strval($del_id) . '<br/>'); } // delete rows if (count($del_ids) > 0) { $set = implode(', ', $del_ids); $dbw->query("DELETE FROM {$tbl_txt} WHERE old_id IN ( {$set} )"); } // this solution consummes too much memory //# Get "active" text records from the revisions table //$res = $dbw->query( "SELECT DISTINCTROW rev_text_id FROM $tbl_rev" ); //while( $row = $dbw->fetchObject( $res ) ) { // $cur[] = $row->rev_text_id; //} //# Get the IDs of all text records not in these sets //$set = implode( ', ', $cur ); //$res = $dbw->query( "SELECT old_id FROM $tbl_txt WHERE old_id NOT IN ( $set )" ); //$old = array(); //while( $row = $dbw->fetchObject( $res ) ) { // $old[] = $row->old_id; //} //$count = count( $old ); //# Delete as appropriate //if( $count ) { // $set = implode( ', ', $old ); // $dbw->query( "DELETE FROM $tbl_txt WHERE old_id IN ( $set )" ); //} // this solution is too slow //$res = $dbw->query( "SELECT DISTINCTROW old_id FROM $tbl_txt WHERE NOT EXISTS (SELECT * FROM $tbl_rev WHERE $tbl_rev.rev_text_id = $tbl_txt.old_id)" ); //while( $row = $dbw->fetchObject( $res ) ) { // $old_id = $row->old_id; // $wgOut->addHTML( strval($old_id).'<br/>' ); //} # done $dbw->commit(); $wgOut->addWikiMsg('maintenance-success', $type); break; case 'eval': $temp = error_reporting(E_ALL); ob_start(); $str = eval($wgRequest->getText('wpCode', 'return;')); $ext = ob_get_clean(); error_reporting(0); if ($ext) { $wgOut->addHTML(nl2br($ext) . '<hr />'); } if (!$str) { // do nothing } elseif (is_string($str)) { $wgOut->addHTML(nl2br($str) . '<hr />'); } else { $wgOut->addHTML(nl2br(var_export($str, true)) . '<hr />'); } $wgOut->addWikiMsg('maintenance-success', $type); break; case 'initEditCount': global $wgDBservers; $dbw = wfGetDB(DB_MASTER); $user = $dbw->tableName('user'); $revision = $dbw->tableName('revision'); $dbver = $dbw->getServerVersion(); $dbr = wfGetDB(DB_SLAVE); $chunkSize = 100; $lastUser = $dbr->selectField('user', 'MAX(user_id)', '', __FUNCTION__); $start = microtime(true); $migrated = 0; for ($min = 0; $min <= $lastUser; $min += $chunkSize) { $max = $min + $chunkSize; $result = $dbr->query("SELECT\r\n\t\t\t\t\t\t\tuser_id,\r\n\t\t\t\t\t\t\tCOUNT(rev_user) AS user_editcount\r\n\t\t\t\t\t\tFROM {$user}\r\n\t\t\t\t\t\tLEFT OUTER JOIN {$revision} ON user_id=rev_user\r\n\t\t\t\t\t\tWHERE user_id > {$min} AND user_id <= {$max}\r\n\t\t\t\t\t\tGROUP BY user_id", 'initEditCount'); while ($row = $dbr->fetchObject($result)) { $dbw->update('user', array('user_editcount' => $row->user_editcount), array('user_id' => $row->user_id), 'initEditCount'); ++$migrated; } $dbr->freeResult($result); waitForSlaves(10); } $wgOut->addWikiMsg('maintenance-success', $type); break; case 'initStats': $dbr = wfGetDB(DB_SLAVE); $edits = $dbr->selectField('revision', 'COUNT(*)', '', __METHOD__); $edits += $dbr->selectField('archive', 'COUNT(*)', '', __METHOD__); $wgOut->addWikiMsg('maintenance-stats-edits', $edits); global $wgContentNamespaces; $good = $dbr->selectField('page', 'COUNT(*)', array('page_namespace' => $wgContentNamespaces, 'page_is_redirect' => 0, 'page_len > 0'), __METHOD__); $wgOut->addWikiMsg('maintenance-stats-articles', $good); $pages = $dbr->selectField('page', 'COUNT(*)', '', __METHOD__); $wgOut->addWikiMsg('maintenance-stats-pages', $pages); $users = $dbr->selectField('user', 'COUNT(*)', '', __METHOD__); $wgOut->addWikiMsg('maintenance-stats-users', $users); $admin = $dbr->selectField('user_groups', 'COUNT(*)', array('ug_group' => 'sysop'), __METHOD__); $wgOut->addWikiMsg('maintenance-stats-admins', $admin); $image = $dbr->selectField('image', 'COUNT(*)', '', __METHOD__); $wgOut->addWikiMsg('maintenance-stats-images', $image); if (!$wgRequest->getCheck('wpNoview')) { $views = $dbr->selectField('page', 'SUM(page_counter)', '', __METHOD__); $wgOut->addWikiMsg('maintenance-stats-views', $views); } $wgOut->addWikiMsg('maintenance-stats-update'); $dbw = wfGetDB(DB_MASTER); $values = array('ss_total_edits' => $edits, 'ss_good_articles' => $good, 'ss_total_pages' => $pages, 'ss_users' => $users, 'ss_admins' => $admin, 'ss_images' => $image); $conds = array('ss_row_id' => 1); $views = array('ss_total_views' => isset($views) ? $views : 0); if ($wgRequest->getCheck('wpUpdate')) { $dbw->update('site_stats', $values, $conds, __METHOD__); } else { $dbw->delete('site_stats', $conds, __METHOD__); $dbw->insert('site_stats', array_merge($values, $conds, $views), __METHOD__); } $wgOut->addWikiMsg('maintenance-success', $type); break; case 'moveBatch': $reason = $wgRequest->getText('wpReason', ''); $interval = 0; $pages = $wgRequest->getText('wpMove'); $dbw = wfGetDB(DB_MASTER); $lines = explode("\n", $pages); foreach ($lines as $line) { $parts = array_map('trim', explode('|', $line)); if (count($parts) != 2) { continue; } $source = Title::newFromText($parts[0]); $dest = Title::newFromText($parts[1]); if (is_null($source) || is_null($dest)) { continue; } $wgOut->addWikiText('* ' . wfMsg('maintenance-move', array($source->getPrefixedText(), $dest->getPrefixedText()))); $dbw->begin(); $err = $source->moveTo($dest, false, $reason); if ($err !== true) { $wgOut->addWikiText('** ' . wfMsg('maintenance-movefail', array($err))); } $dbw->commit(); waitForSlaves(5); } $wgOut->addWikiMsg('maintenance-success', $type); break; case 'reassignEdits': $wpFrom = $wgRequest->getVal('wpFrom'); $wpTo = $wgRequest->getVal('wpTo'); if (User::isIP($wpFrom)) { $from = new User(); $from->setId(0); $from->setName($wpFrom); } else { $from = User::newFromName($wpFrom); } if (User::isIP($wpTo)) { $to = new User(); $to->setId(0); $to->setName($wpTo); } else { $to = User::newFromName($wpTo); } if ($to->getId() || $wgRequest->getCheck('wpForce')) { $report = $wgRequest->getCheck('wpReport'); $dbw = wfGetDB(DB_MASTER); $dbw->immediateBegin(); $rcond = $from->getId() ? array('rev_user' => $from->getId()) : array('rev_user_text' => $from->getName()); $res = $dbw->select('revision', 'COUNT(*) AS count', $rcond, 'Maintenance::reassignEdits'); $row = $dbw->fetchObject($res); $cur = $row->count; $wgOut->addWikiMsg('maintenance-re-ce', $cur); $acond = $from->getId() ? array('ar_user' => $from->getId()) : array('ar_user_text' => $from->getName()); $res = $dbw->select('archive', 'COUNT(*) AS count', $acond, 'Maintenance::reassignEdits'); $row = $dbw->fetchObject($res); $del = $row->count; $wgOut->addWikiMsg('maintenance-re-de', $del); if (!$wgRequest->getCheck('wpRc')) { $ccond = $from->getId() ? array('rc_user' => $from->getId()) : array('rc_user_text' => $from->getName()); $res = $dbw->select('recentchanges', 'COUNT(*) AS count', $ccond, 'Maintenance::reassignEdits'); $row = $dbw->fetchObject($res); $rec = $row->count; $wgOut->addWikiMsg('maintenance-re-rce', $rec); } else { $rec = 0; } $total = $cur + $del + $rec; $wgOut->addWikiMsg('maintenance-re-total', $total); if (!$report) { $rspec = array('rev_user' => $to->getId(), 'rev_user_text' => $to->getName()); $res = $dbw->update('revision', $rspec, $rcond, 'Maintenance::reassignEdits'); $aspec = array('ar_user' => $to->getId(), 'ar_user_text' => $to->getName()); $res = $dbw->update('archive', $aspec, $acond, 'Maintenance::reassignEdits'); if (!$wgRequest->getCheck('wpRc')) { $cspec = array('rc_user' => $to->getId(), 'rc_user_text' => $to->getName()); $res = $dbw->update('recentchanges', $cspec, $ccond, 'Maintenance::reassignEdits'); } } $dbw->immediateCommit(); if ($report) { $wgOut->addWikiMsg('maintenance-re-rr', wfMsg('maintenance-re-report')); } } else { $ton = $to->getName(); $wgOut->addWikiMsg('maintenance-re-nf', $ton); } $wgOut->addWikiMsg('maintenance-success', $type); break; case 'runJobs': $maxJobs = 10000; $dbw = wfGetDB(DB_MASTER); $n = 0; while ($dbw->selectField('job', 'count(*)', '', 'runJobs.php')) { $offset = 0; for (;;) { $job = Job::pop($offset); if ($job == false) { break; } waitForSlaves(5); $wgOut->addWikiText("* " . $job->id . " " . $job->toString()); $offset = $job->id; if (!$job->run()) { $wgOut->addWikiText("** " . wfMsg('maintenance-error', array($job->error))); } if ($maxJobs && ++$n > $maxJobs) { break 2; } } } $wgOut->addWikiMsg('maintenance-success', $type); break; case 'showJobs': $dbw = wfGetDB(DB_MASTER); $count = $dbw->selectField('job', 'count(*)', '', 'runJobs.php'); $wgOut->addHTML($count); $wgOut->addWikiMsg('maintenance-success', $type); break; case 'stats': global $wgMemc; if (get_class($wgMemc) == 'FakeMemCachedClient') { $wgOut->addWikiMsg('maintenance-memc-fake'); return; } $wgOut->addWikiText('<h2>' . wfMsg('maintenance-memc-requests') . '</h2>'); $session = intval($wgMemc->get(wfMemcKey('stats', 'request_with_session'))); $noSession = intval($wgMemc->get(wfMemcKey('stats', 'request_without_session'))); $total = $session + $noSession; $requests = sprintf(wfMsg('maintenance-memc-withsession') . " %-10d %6.2f%%\n", $session, $session / $total * 100) . '<br />'; $requests .= sprintf(wfMsg('maintenance-memc-withoutsession') . " %-10d %6.2f%%\n", $noSession, $noSession / $total * 100) . '<br />'; $requests .= sprintf(wfMsg('maintenance-memc-total') . " %-10d %6.2f%%\n", $total, 100) . '<br />'; $wgOut->addWikiText($requests); $wgOut->addWikiText('<h2>' . wfMsg('maintenance-memc-parsercache') . '</h2>'); $hits = intval($wgMemc->get(wfMemcKey('stats', 'pcache_hit'))); $invalid = intval($wgMemc->get(wfMemcKey('stats', 'pcache_miss_invalid'))); $expired = intval($wgMemc->get(wfMemcKey('stats', 'pcache_miss_expired'))); $absent = intval($wgMemc->get(wfMemcKey('stats', 'pcache_miss_absent'))); $stub = intval($wgMemc->get(wfMemcKey('stats', 'pcache_miss_stub'))); $total = $hits + $invalid + $expired + $absent + $stub; $pcache = sprintf(wfMsg('maintenance-memc-hits') . " %-10d %6.2f%%\n", $hits, $hits / $total * 100) . '<br />'; $pcache .= sprintf(wfMsg('maintenance-memc-invalid') . " %-10d %6.2f%%\n", $invalid, $invalid / $total * 100) . '<br />'; $pcache .= sprintf(wfMsg('maintenance-memc-expired') . " %-10d %6.2f%%\n", $expired, $expired / $total * 100) . '<br />'; $pcache .= sprintf(wfMsg('maintenance-memc-absent') . " %-10d %6.2f%%\n", $absent, $absent / $total * 100) . '<br />'; $pcache .= sprintf(wfMsg('maintenance-memc-stub') . " %-10d %6.2f%%\n", $stub, $stub / $total * 100) . '<br />'; $pcache .= sprintf(wfMsg('maintenance-memc-total') . " %-10d %6.2f%%\n", $total, 100) . '<br />'; $wgOut->addWikiText($pcache); $hits = intval($wgMemc->get(wfMemcKey('stats', 'image_cache_hit'))); $misses = intval($wgMemc->get(wfMemcKey('stats', 'image_cache_miss'))); $updates = intval($wgMemc->get(wfMemcKey('stats', 'image_cache_update'))); $total = $hits + $misses; $wgOut->addWikiText('<h2>' . wfMsg('maintenance-memc-imagecache') . '</h2>'); $icache = sprintf(wfMsg('maintenance-memc-hits') . " %-10d %6.2f%%\n", $hits, $hits / $total * 100) . '<br />'; $icache .= sprintf(wfMsg('maintenance-memc-misses') . " %-10d %6.2f%%\n", $misses, $misses / $total * 100) . '<br />'; $icache .= sprintf(wfMsg('maintenance-memc-updates') . " %-10d\n", $updates) . '<br />'; $wgOut->addWikiText($icache); $hits = intval($wgMemc->get(wfMemcKey('stats', 'diff_cache_hit'))); $misses = intval($wgMemc->get(wfMemcKey('stats', 'diff_cache_miss'))); $uncacheable = intval($wgMemc->get(wfMemcKey('stats', 'diff_uncacheable'))); $total = $hits + $misses + $uncacheable; $wgOut->addWikiText('<h2>' . wfMsg('maintenance-memc-diffcache') . '</h2>'); $dcache = sprintf(wfMsg('maintenance-memc-hits') . " %-10d %6.2f%%\n", $hits, $hits / $total * 100) . '<br />'; $dcache .= sprintf(wfMsg('maintenance-memc-misses') . " %-10d %6.2f%%\n", $misses, $misses / $total * 100) . '<br />'; $dcache .= sprintf(wfMsg('maintenance-memc-uncacheable') . " %-10d %6.2f%%\n", $uncacheable, $uncacheable / $total * 100) . '<br />'; $wgOut->addWikiText($dcache); $wgOut->addWikiMsg('maintenance-success', $type); break; case 'sql': $db = wfGetDB(DB_MASTER); $q = $wgRequest->getText('wpQuery', ''); $db->begin(); try { $r = $db->query($q, 'Maintenance::sql.php'); } catch (DBQueryError $e) { global $wgShowSQLErrors; $temp = $wgShowSQLErrors; $wgShowSQLErrors = true; $wgOut->addWikiText('<pre style="overflow: auto">' . $e->getText() . '</pre>'); $wgShowSQLErrors = $temp; $r = false; } if ($r === true) { $wgOut->addWikiMsg('maintenance-sql-aff', $db->affectedRows()); } elseif ($r instanceof ResultWrapper) { $res = array(); for ($i = 0; $i < $r->numRows(); $i++) { $row = $r->fetchRow(); $res[] = $row; foreach ($row as $key => $meh) { $names[] = $key; } } $names = array_unique($names); $rtable = '<table class="wikitable"><tr>'; foreach ($names as $name) { if (is_numeric($name)) { continue; } $rtable .= '<th>' . $name . '</th>'; } $rtable .= '</tr>'; foreach ($res as $data) { $rtable .= '<tr>'; foreach ($data as $key => $value) { if (is_numeric($key)) { continue; } $rtable .= '<td><nowiki>' . $value . '</nowiki></td>'; } $rtable .= '</tr>'; } $rtable .= '</table>'; $wgOut->addWikiMsg('maintenance-sql-res', $r->numRows(), $rtable); $db->freeResult($r); } $db->commit(); $wgOut->addWikiMsg('maintenance-success', $type); break; default: $wgOut->addWikiMsg('maintenance-invalidtype'); return; } }
/** * Updater callback to create the AbuseFilter user after the user tables have been updated. * @param $updater DatabaseUpdater */ public static function createAbuseFilterUser($updater) { $user = User::newFromName(wfMessage('abusefilter-blocker')->inContentLanguage()->text()); if ($user && !$updater->updateRowExists('create abusefilter-blocker-user')) { if (!$user->getId()) { $user->addToDatabase(); $user->saveSettings(); # Increment site_stats.ss_users $ssu = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssu->doUpdate(); } else { // Sorry dude, we need this account. $user->setPassword(null); $user->setEmail(null); $user->saveSettings(); } $updater->insertUpdateRow('create abusefilter-blocker-user'); # Promote user so it doesn't look too crazy. $user->addGroup('sysop'); } }
function createUser( $openid, $sreg, $ax, $name ) { global $wgUser, $wgAuth; $user = User::newFromName( $name ); # Check permissions if ( !$user->isAllowed( 'createaccount' ) ) { wfDebug( "OpenID: User is not allowed to create an account.\n" ); return null; } elseif ( $user->isBlockedFromCreateAccount() ) { wfDebug( "OpenID: User is blocked.\n" ); return null; } if ( !$user ) { wfDebug( "OpenID: Error adding new user.\n" ); return null; } $user->addToDatabase(); if ( !$user->getId() ) { wfDebug( "OpenID: Error adding new user.\n" ); } else { $wgAuth->initUser( $user ); $wgAuth->updateUser( $user ); $wgUser = $user; # new user account: not opened by mail wfRunHooks( 'AddNewAccount', array( $user, false ) ); $user->addNewUserLogEntry(); # Update site stats $ssUpdate = new SiteStatsUpdate( 0, 0, 0, 0, 1 ); $ssUpdate->doUpdate(); self::addUserUrl( $user, $openid ); $this->updateUser( $user, $sreg, $ax, true ); $user->saveSettings(); return $user; } }
public function execute() { $username = $this->getArg(0); $password = $this->getArg(1); $force = $this->hasOption('force'); $inGroups = array(); $user = User::newFromName($username); if (!is_object($user)) { $this->error("invalid username.", true); } $exists = 0 !== $user->idForName(); if ($exists && !$force) { $this->error("Account exists. Perhaps you want the --force option?", true); } elseif (!$exists && !$password) { $this->error("Argument <password> required!", false); $this->maybeHelp(true); } elseif ($exists) { $inGroups = $user->getGroups(); } $groups = array_filter(self::$permitRoles, array($this, 'hasOption')); if ($this->hasOption('custom-groups')) { $customGroupsText = $this->getOption('custom-groups'); if ($customGroupsText !== '') { $customGroups = explode(',', $customGroupsText); foreach ($customGroups as $customGroup) { $groups[] = trim($customGroup); } } } $promotions = array_diff($groups, $inGroups); if ($exists && !$password && count($promotions) === 0) { $this->output("Account exists and nothing to do.\n"); return; } elseif (count($promotions) !== 0) { $promoText = "User:{$username} into " . implode(', ', $promotions) . "...\n"; if ($exists) { $this->output(wfWikiID() . ": Promoting {$promoText}"); } else { $this->output(wfWikiID() . ": Creating and promoting {$promoText}"); } } if ($password) { # Try to set the password try { $user->setPassword($password); if ($exists) { $this->output("Password set.\n"); $user->saveSettings(); } } catch (PasswordError $pwe) { $this->error($pwe->getText(), true); } } if (!$exists) { # Insert the account into the database $user->addToDatabase(); $user->saveSettings(); } # Promote user array_map(array($user, 'addGroup'), $promotions); if (!$exists) { # Increment site_stats.ss_users $ssu = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssu->doUpdate(); } $this->output("done.\n"); }
/** * Actually add a user to the database. * Give it a User object that has been initialised with a name. * * @param $u User object. * @param $autocreate boolean -- true if this is an autocreation via auth plugin * @return boolean true on success; false otherwise * @private */ function initUser(User &$u, $autocreate) { global $wgAuth, $wgExternalAuthType; if ($wgExternalAuthType) { if (ExternalUser_Wikia::addUser($u, $this->mPassword, $this->mEmail, $this->mRealName)) { $this->mExtUser = ExternalUser_Wikia::newFromName($this->mUsername); } else { // Terminate on failure. return false; } } else { $u->addToDatabase(); } if ($wgAuth->allowPasswordChange()) { $u->setPassword($this->mPassword); } $u->setEmail($this->mEmail); $u->setRealName($this->mRealName); $u->setToken(); $wgAuth->initUser($u, $autocreate); if (is_object($this->mExtUser)) { $this->mExtUser->linkToLocal($u->getId()); $email = $this->mExtUser->getPref('emailaddress'); if ($email && !$this->mEmail) { $u->setEmail($email); } } $u->setGlobalPreference('rememberpassword', $this->mRemember ? 1 : 0); $u->setGlobalPreference('marketingallowed', $this->mMarketingOptIn ? 1 : 0); $u->setGlobalAttribute('registrationCountry', $this->mRegistrationCountry); $u->setGlobalPreference('skinoverwrite', 1); $u->saveSettings(); # Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); return true; }
/** * constructor */ function wfSpecialStatistics() { global $wgOut, $wgLang, $wgRequest, $wgUser; $fname = 'wfSpecialStatistics'; $action = $wgRequest->getVal('action'); $dbr =& wfGetDB(DB_SLAVE); extract($dbr->tableNames('page', 'site_stats', 'user', 'user_groups')); $row = $dbr->selectRow('site_stats', '*', false, $fname); $views = $row->ss_total_views; $edits = $row->ss_total_edits; $good = $row->ss_good_articles; $images = $row->ss_images; # This code is somewhat schema-agnostic, because I'm changing it in a minor release -- TS if (isset($row->ss_total_pages) && $row->ss_total_pages == -1) { # Update schema $u = new SiteStatsUpdate(0, 0, 0); $u->doUpdate(); $row = $dbr->selectRow('site_stats', '*', false, $fname); } if (isset($row->ss_total_pages)) { $total = $row->ss_total_pages; } else { $sql = "SELECT COUNT(page_namespace) AS total FROM {$page}"; $res = $dbr->query($sql, $fname); $pageRow = $dbr->fetchObject($res); $total = $pageRow->total; } if (isset($row->ss_users)) { $users = $row->ss_users; } else { $sql = "SELECT MAX(user_id) AS total FROM {$user}"; $res = $dbr->query($sql, $fname); $userRow = $dbr->fetchObject($res); $users = $userRow->total; } $admins = $dbr->selectField('user_groups', 'COUNT(*)', array('ug_group' => 'sysop'), $fname); $numJobs = $dbr->selectField('job', 'COUNT(*)', '', $fname); if ($action == 'raw') { $wgOut->disable(); header('Pragma: nocache'); echo "total={$total};good={$good};views={$views};edits={$edits};users={$users};admins={$admins};images={$images};jobs={$numJobs}\n"; return; } else { $text = '==' . wfMsg('sitestats') . "==\n"; $text .= wfMsg('sitestatstext', $wgLang->formatNum($total), $wgLang->formatNum($good), $wgLang->formatNum($views), $wgLang->formatNum($edits), $wgLang->formatNum(sprintf('%.2f', $total ? $edits / $total : 0)), $wgLang->formatNum(sprintf('%.2f', $edits ? $views / $edits : 0)), $wgLang->formatNum($numJobs), $wgLang->formatNum($images)); $text .= "\n==" . wfMsg('userstats') . "==\n"; $text .= wfMsg('userstatstext', $wgLang->formatNum($users), $wgLang->formatNum($admins), '[[' . wfMsgForContent('grouppage-sysop') . ']]', $wgLang->formatNum(sprintf('%.2f', $admins / $users * 100)), User::makeGroupLinkWiki('sysop')); $wgOut->addWikiText($text); global $wgDisableCounters, $wgMiserMode, $wgUser, $wgLang, $wgContLang; if (!$wgDisableCounters && !$wgMiserMode) { $sql = "SELECT page_namespace, page_title, page_counter FROM {$page} WHERE page_is_redirect = 0 AND page_counter > 0 ORDER BY page_counter DESC"; $sql = $dbr->limitResult($sql, 10, 0); $res = $dbr->query($sql, $fname); if ($res) { $wgOut->addHtml('<h2>' . wfMsgHtml('statistics-mostpopular') . '</h2>'); $skin =& $wgUser->getSkin(); $wgOut->addHtml('<ol>'); while ($row = $dbr->fetchObject($res)) { # <jld> $ns = $row->page_namespace; if (!$wgUser->isAllowedEx($ns, "~", "browse")) { continue; } #if ( ! $wgUser->isAllowed( hnpClass::buildPermissionKey($ns,"~","browse") ) ) continue; # </jld> $link = $skin->makeKnownLinkObj(Title::makeTitleSafe($row->page_namespace, $row->page_title)); $dirmark = $wgContLang->getDirMark(); $wgOut->addHtml('<li>' . $link . $dirmark . ' [' . $wgLang->formatNum($row->page_counter) . ']</li>'); } $wgOut->addHtml('</ol>'); $dbr->freeResult($res); } } } }
/** * @return User */ public static function getFilterUser() { $user = User::newFromName(wfMessage('abusefilter-blocker')->inContentLanguage()->text()); $user->load(); if ($user->getId() && $user->mPassword == '') { // Already set up. return $user; } // Not set up. Create it. if (!$user->getId()) { print 'Trying to create account -- user id is ' . $user->getId(); $user->addToDatabase(); $user->saveSettings(); // Increment site_stats.ss_users $ssu = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssu->doUpdate(); } else { // Take over the account $user->setPassword(null); $user->setEmail(null); $user->saveSettings(); } // Promote user so it doesn't look too crazy. $user->addGroup('sysop'); return $user; }
/** * Actually add a user to the database. * Give it a User object that has been initialised with a name. * * @param $tempUser User object. * @param $autocreate boolean -- true if this is an autocreation via auth plugin * @return User object. * @private */ function initUser( $tempUser, $autocreate = false ) { global $wgAuth; $tempUser->addToDatabase(); if ( $wgAuth->allowPasswordChange() ) { $tempUser->setPassword( $this->mPassword ); } $tempUser->setEmail( $this->mEmail ); $tempUser->setRealName( $this->mRealName ); $tempUser->setToken(); $wgAuth->initUser( $tempUser, $autocreate ); if ( $this->mExtUser ) { $this->mExtUser->linkToLocal( $tempUser->getId() ); $email = $this->mExtUser->getPref( 'emailaddress' ); if ( $email && !$this->mEmail ) { $tempUser->setEmail( $email ); } } $tempUser->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 ); $tempUser->saveSettings(); # Update user count $ssUpdate = new SiteStatsUpdate( 0, 0, 0, 0, 1 ); $ssUpdate->doUpdate(); $this->addToSourceTracking( $tempUser ); return $tempUser; }
/** * Create the first user account, grant it sysop and bureaucrat rights * * @return Status */ protected function createSysop() { $name = $this->getVar('_AdminName'); $user = User::newFromName($name); if (!$user) { // We should've validated this earlier anyway! return Status::newFatal('config-admin-error-user', $name); } if ($user->idForName() == 0) { $user->addToDatabase(); try { $user->setPassword($this->getVar('_AdminPassword')); } catch (PasswordError $pwe) { return Status::newFatal('config-admin-error-password', $name, $pwe->getMessage()); } $user->addGroup('sysop'); $user->addGroup('bureaucrat'); if ($this->getVar('_AdminEmail')) { $user->setEmail($this->getVar('_AdminEmail')); } $user->saveSettings(); // Update user count $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); } $status = Status::newGood(); if ($this->getVar('_Subscribe') && $this->getVar('_AdminEmail')) { $this->subscribeToMediaWikiAnnounce($status); } return $status; }
function createUser($openid, $sreg, $ax, $name) { global $wgAuth; $user = User::newFromName($name); if (!$user) { wfDebug("OpenID: Error adding new user.\n"); return null; } $user->addToDatabase(); $user->addNewUserLogEntry(); if (!$user->getId()) { wfDebug("OpenID: Error adding new user.\n"); } else { $wgAuth->initUser($user); $wgAuth->updateUser($user); # Update site stats $ssUpdate = new SiteStatsUpdate(0, 0, 0, 0, 1); $ssUpdate->doUpdate(); self::addUserUrl($user, $openid); $this->updateUser($user, $sreg, $ax, true); $user->saveSettings(); return $user; } }