예제 #1
0
 /**
  * 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");
     }
 }
예제 #3
0
파일: GOAuth.php 프로젝트: ajaboa/crmpuan
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;
}
예제 #4
0
 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");
 }
예제 #5
0
파일: nukePage.php 프로젝트: yusufchang/app
 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;
 }
예제 #8
0
 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__);
     }
 }
예제 #9
0
 /**
  * @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;
 }
예제 #11
0
 /**
  * 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;
 }
예제 #12
0
	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 ) );
	}
예제 #13
0
 /**
  * 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;
 }
예제 #14
0
파일: CASAuth.php 프로젝트: jordane/CASAuth
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;
}
예제 #15
0
 * @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";
예제 #16
0
 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();
 }
예제 #18
0
 /**
  * @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);
 }
예제 #21
0
 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;
     }
 }
예제 #22
0
 /**
  * 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;
		}
	}
예제 #24
0
 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");
 }
예제 #25
0
 /**
  * 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;
 }
예제 #26
0
/**
* 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);
            }
        }
    }
}
예제 #27
0
 /**
  * @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;
	}
예제 #29
0
 /**
  * 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;
 }
예제 #30
0
 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;
     }
 }