summaryrefslogtreecommitdiff
path: root/includes/specials/SpecialRestrictUser.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/specials/SpecialRestrictUser.php')
-rw-r--r--includes/specials/SpecialRestrictUser.php189
1 files changed, 189 insertions, 0 deletions
diff --git a/includes/specials/SpecialRestrictUser.php b/includes/specials/SpecialRestrictUser.php
new file mode 100644
index 00000000..761e0cd6
--- /dev/null
+++ b/includes/specials/SpecialRestrictUser.php
@@ -0,0 +1,189 @@
+<?php
+
+function wfSpecialRestrictUser( $par = null ) {
+ global $wgOut, $wgRequest;
+ $user = $userOrig = null;
+ if( $par ) {
+ $userOrig = $par;
+ } elseif( $wgRequest->getVal( 'user' ) ) {
+ $userOrig = $wgRequest->getVal( 'user' );
+ } else {
+ $wgOut->addHTML( RestrictUserForm::selectUserForm() );
+ return;
+ }
+ $isIP = User::isIP( $userOrig );
+ $user = $isIP ? $userOrig : User::getCanonicalName( $userOrig );
+ $uid = User::idFromName( $user );
+ if( !$uid && !$isIP ) {
+ $err = '<strong class="error">' . wfMsgHtml( 'restrictuser-notfound' ) . '</strong>';
+ $wgOut->addHTML( RestrictUserForm::selectUserForm( $userOrig, $err ) );
+ return;
+ }
+ $wgOut->addHTML( RestrictUserForm::selectUserForm( $user ) );
+
+ UserRestriction::purgeExpired();
+ $old = UserRestriction::fetchForUser( $user, true );
+
+ RestrictUserForm::pageRestrictionForm( $uid, $user, $old );
+ RestrictUserForm::namespaceRestrictionForm( $uid, $user, $old );
+
+ // Renew it after possible changes in previous two functions
+ $old = UserRestriction::fetchForUser( $user, true );
+ if( $old ) {
+ $wgOut->addHTML( RestrictUserForm::existingRestrictions( $old ) );
+ }
+}
+
+class RestrictUserForm {
+ public static function selectUserForm( $val = null, $error = null ) {
+ global $wgScript, $wgTitle;
+ $s = Xml::fieldset( wfMsg( 'restrictuser-userselect' ) ) . "<form action=\"{$wgScript}\">";
+ if( $error )
+ $s .= '<p>' . $error . '</p>';
+ $s .= Xml::hidden( 'title', $wgTitle->getPrefixedDbKey() );
+ $form = array( 'restrictuser-user' => Xml::input( 'user', false, $val ) );
+ $s .= Xml::buildForm( $form, 'restrictuser-go' );
+ $s .= "</form></fieldset>";
+ return $s;
+ }
+
+ public static function existingRestrictions( $restrictions ) {
+ //TODO: autoload?
+ require_once( dirname( __FILE__ ) . '/SpecialListUserRestrictions.php' );
+ $s = Xml::fieldset( wfMsg( 'restrictuser-existing' ) ) . '<ul>';
+ foreach( $restrictions as $r )
+ $s .= UserRestrictionsPager::formatRestriction( $r );
+ $s .= "</ul></fieldset>";
+ return $s;
+ }
+
+ public static function pageRestrictionForm( $uid, $user, $oldRestrictions ) {
+ global $wgOut, $wgTitle, $wgRequest, $wgUser;
+ $error = '';
+ $success = false;
+ if( $wgRequest->wasPosted() && $wgRequest->getVal( 'type' ) == UserRestriction::PAGE &&
+ $wgUser->matchEditToken( $wgRequest->getVal( 'edittoken' ) ) ) {
+
+ $title = Title::newFromText( $wgRequest->getVal( 'page' ) );
+ if( !$title ) {
+ $error = array( 'restrictuser-badtitle', $wgRequest->getVal( 'page' ) );
+ } elseif( UserRestriction::convertExpiry( $wgRequest->getVal( 'expiry' ) ) === false ) {
+ $error = array( 'restrictuser-badexpiry', $wgRequest->getVal( 'expiry' ) );
+ } else {
+ foreach( $oldRestrictions as $r ) {
+ if( $r->isPage() && $r->getPage()->equals( $title ) )
+ $error = array( 'restrictuser-duptitle' );
+ }
+ }
+ if( !$error ) {
+ self::doPageRestriction( $uid, $user );
+ $success = array('restrictuser-success', $user);
+ }
+ }
+ $useRequestValues = $wgRequest->getVal( 'type' ) == UserRestriction::PAGE;
+ $wgOut->addHTML( Xml::fieldset( wfMsg( 'restrictuser-legend-page' ) ) );
+
+ self::printSuccessError( $success, $error );
+
+ $wgOut->addHTML( Xml::openElement( 'form', array( 'action' => $wgTitle->getLocalUrl(),
+ 'method' => 'post' ) ) );
+ $wgOut->addHTML( Xml::hidden( 'type', UserRestriction::PAGE ) );
+ $wgOut->addHTML( Xml::hidden( 'edittoken', $wgUser->editToken() ) );
+ $wgOut->addHTML( Xml::hidden( 'user', $user ) );
+ $form = array();
+ $form['restrictuser-title'] = Xml::input( 'page', false,
+ $useRequestValues ? $wgRequest->getVal( 'page' ) : false );
+ $form['restrictuser-expiry'] = Xml::input( 'expiry', false,
+ $useRequestValues ? $wgRequest->getVal( 'expiry' ) : false );
+ $form['restrictuser-reason'] = Xml::input( 'reason', false,
+ $useRequestValues ? $wgRequest->getVal( 'reason' ) : false );
+ $wgOut->addHTML( Xml::buildForm( $form, 'restrictuser-submit' ) );
+ $wgOut->addHTML( "</form></fieldset>" );
+ }
+
+ public static function printSuccessError( $success, $error ) {
+ global $wgOut;
+ if ( $error )
+ $wgOut->wrapWikiMsg( '<strong class="error">$1</strong>', $error );
+ if ( $success )
+ $wgOut->wrapWikiMsg( '<strong class="success">$1</strong>', $success );
+ }
+
+ public static function doPageRestriction( $uid, $user ) {
+ global $wgUser, $wgRequest;
+ $r = new UserRestriction();
+ $r->setType( UserRestriction::PAGE );
+ $r->setPage( Title::newFromText( $wgRequest->getVal( 'page' ) ) );
+ $r->setSubjectId( $uid );
+ $r->setSubjectText( $user );
+ $r->setBlockerId( $wgUser->getId() );
+ $r->setBlockerText( $wgUser->getName() );
+ $r->setReason( $wgRequest->getVal( 'reason' ) );
+ $r->setExpiry( UserRestriction::convertExpiry( $wgRequest->getVal( 'expiry' ) ) );
+ $r->setTimestamp( wfTimestampNow( TS_MW ) );
+ $r->commit();
+ $logExpiry = $wgRequest->getVal( 'expiry' ) ? $wgRequest->getVal( 'expiry' ) : Block::infinity();
+ $l = new LogPage( 'restrict' );
+ $l->addEntry( 'restrict', Title::makeTitle( NS_USER, $user ), $r->getReason(),
+ array( $r->getType(), $r->getPage()->getFullText(), $logExpiry) );
+ }
+
+ public static function namespaceRestrictionForm( $uid, $user, $oldRestrictions ) {
+ global $wgOut, $wgTitle, $wgRequest, $wgUser, $wgContLang;
+ $error = '';
+ $success = false;
+ if( $wgRequest->wasPosted() && $wgRequest->getVal( 'type' ) == UserRestriction::NAMESPACE &&
+ $wgUser->matchEditToken( $wgRequest->getVal( 'edittoken' ) ) ) {
+ $ns = $wgRequest->getVal( 'namespace' );
+ if( $wgContLang->getNsText( $ns ) === false )
+ $error = wfMsgExt( 'restrictuser-badnamespace', 'parseinline' );
+ elseif( UserRestriction::convertExpiry( $wgRequest->getVal( 'expiry' ) ) === false )
+ $error = wfMsgExt( 'restrictuser-badexpiry', 'parseinline', $wgRequest->getVal( 'expiry' ) );
+ else
+ foreach( $oldRestrictions as $r )
+ if( $r->isNamespace() && $r->getNamespace() == $ns )
+ $error = wfMsgExt( 'restrictuser-dupnamespace', 'parse' );
+ if( !$error ) {
+ self::doNamespaceRestriction( $uid, $user );
+ $success = array('restrictuser-success', $user);
+ }
+ }
+ $useRequestValues = $wgRequest->getVal( 'type' ) == UserRestriction::NAMESPACE;
+ $wgOut->addHTML( Xml::fieldset( wfMsg( 'restrictuser-legend-namespace' ) ) );
+
+ self::printSuccessError( $success, $error );
+
+ $wgOut->addHTML( Xml::openElement( 'form', array( 'action' => $wgTitle->getLocalUrl(),
+ 'method' => 'post' ) ) );
+ $wgOut->addHTML( Xml::hidden( 'type', UserRestriction::NAMESPACE ) );
+ $wgOut->addHTML( Xml::hidden( 'edittoken', $wgUser->editToken() ) );
+ $wgOut->addHTML( Xml::hidden( 'user', $user ) );
+ $form = array();
+ $form['restrictuser-namespace'] = Xml::namespaceSelector( $wgRequest->getVal( 'namespace' ) );
+ $form['restrictuser-expiry'] = Xml::input( 'expiry', false,
+ $useRequestValues ? $wgRequest->getVal( 'expiry' ) : false );
+ $form['restrictuser-reason'] = Xml::input( 'reason', false,
+ $useRequestValues ? $wgRequest->getVal( 'reason' ) : false );
+ $wgOut->addHTML( Xml::buildForm( $form, 'restrictuser-submit' ) );
+ $wgOut->addHTML( "</form></fieldset>" );
+ }
+
+ public static function doNamespaceRestriction( $uid, $user ) {
+ global $wgUser, $wgRequest;
+ $r = new UserRestriction();
+ $r->setType( UserRestriction::NAMESPACE );
+ $r->setNamespace( $wgRequest->getVal( 'namespace' ) );
+ $r->setSubjectId( $uid );
+ $r->setSubjectText( $user );
+ $r->setBlockerId( $wgUser->getId() );
+ $r->setBlockerText( $wgUser->getName() );
+ $r->setReason( $wgRequest->getVal( 'reason' ) );
+ $r->setExpiry( UserRestriction::convertExpiry( $wgRequest->getVal( 'expiry' ) ) );
+ $r->setTimestamp( wfTimestampNow( TS_MW ) );
+ $r->commit();
+ $logExpiry = $wgRequest->getVal( 'expiry' ) ? $wgRequest->getVal( 'expiry' ) : Block::infinity();
+ $l = new LogPage( 'restrict' );
+ $l->addEntry( 'restrict', Title::makeTitle( NS_USER, $user ), $r->getReason(),
+ array( $r->getType(), $r->getNamespace(), $logExpiry ) );
+ }
+}