The purpose of these patches is described in the parent article at Project:Config:Wiki#Patch_to_enable_anonymous_edits_on_a_per-page_basis. Both need to be applied for the described behaviour to take effect. A version of the patch for earlier versions of MediaWiki (1.6.5) is also available.
EditPage.php
This patch was prepared against MediaWiki 1.9.2.
--- EditPage.php.orig 2007-02-05 10:14:58.000000000 +1100 +++ EditPage.php 2007-02-10 19:26:14.000000000 +1100 @@ -280,7 +280,7 @@ */ function edit() { global $wgOut, $wgUser, $wgRequest, $wgTitle; - global $wgEmailConfirmToEdit; + global $wgEmailConfirmToEdit, $wgGroupPermissions; if ( ! wfRunHooks( 'AlternateEdit', array( &$this ) ) ) return; @@ -303,21 +303,10 @@ if ( ! $this->mTitle->userCanEdit() ) { wfDebug( "$fname: user can't edit\n" ); - $wgOut->readOnlyPage( $this->getContent(), true ); - wfProfileOut( $fname ); - return; - } - wfDebug( "$fname: Checking blocks\n" ); - if ( !$this->preview && !$this->diff && $wgUser->isBlockedFrom( $this->mTitle, !$this->save ) ) { - # When previewing, don't check blocked state - will get caught at save time. - # Also, check when starting edition is done against slave to improve performance. - wfDebug( "$fname: user is blocked\n" ); - $this->blockedPage(); - wfProfileOut( $fname ); - return; - } - if ( !$wgUser->isAllowed('edit') ) { - if ( $wgUser->isAnon() ) { + if ( !$wgUser->isAllowed('edit') && $wgUser->isAnon() && + $wgGroupPermissions['user' ]['edit'] && + !array_diff($this->mTitle->getRestrictions('edit'), + array('*', 'user')) ) { wfDebug( "$fname: user must log in\n" ); $this->userNotLoggedInPage(); wfProfileOut( $fname ); @@ -329,6 +318,16 @@ return; } } + wfDebug( "$fname: Checking blocks\n" ); + if ( !$this->preview && !$this->diff && $wgUser->isBlockedFrom( $this->mTitle, !$this->save ) ) { + # When previewing, don't check blocked state - will get caught at save time. + # Also, check when starting edition is done against slave to improve performance. + wfDebug( "$fname: user is blocked\n" ); + $this->blockedPage(); + wfProfileOut( $fname ); + return; + } + if ($wgEmailConfirmToEdit && !$wgUser->isEmailConfirmed()) { wfDebug("$fname: user must confirm e-mail address\n"); $this->userNotConfirmedPage(); @@ -653,14 +652,16 @@ return true; } - if ( !$wgUser->isAllowed('edit') ) { - if ( $wgUser->isAnon() ) { + if ( ! $this->mTitle->userCanEdit() ) { + if ( !$wgUser->isAllowed('edit') && $wgUser->isAnon() && + $wgGroupPermissions['user' ]['edit'] && + !array_diff($this->mTitle->getRestrictions('edit'), + array('*', 'user')) ) { $this->userNotLoggedInPage(); wfProfileOut( "$fname-checks" ); wfProfileOut( $fname ); return false; - } - else { + } else { $wgOut->readOnlyPage(); wfProfileOut( "$fname-checks" ); wfProfileOut( $fname );
Title.php
This patch was also prepared against MediaWiki 1.9.2.
--- Title.php.orig 2007-02-05 10:14:59.000000000 +1100 +++ Title.php 2007-02-10 19:13:10.000000000 +1100 @@ -1033,7 +1033,8 @@ if( $action == 'edit' || $action == '' ) { $r = $this->getRestrictions( 'edit' ); - foreach( $wgRestrictionLevels as $level ) { + if (in_array('*', $r)) { + } else foreach( $wgRestrictionLevels as $level ) { if( in_array( $level, $r ) && $level != '' ) { return( true ); } @@ -1042,7 +1043,8 @@ if( $action == 'move' || $action == '' ) { $r = $this->getRestrictions( 'move' ); - foreach( $wgRestrictionLevels as $level ) { + if (in_array('*', $r)) { + } else foreach( $wgRestrictionLevels as $level ) { if( in_array( $level, $r ) && $level != '' ) { return( true ); } @@ -1117,17 +1119,6 @@ return false; } - foreach( $this->getRestrictions($action) as $right ) { - // Backwards compatibility, rewrite sysop -> protect - if ( $right == 'sysop' ) { - $right = 'protect'; - } - if( '' != $right && !$wgUser->isAllowed( $right ) ) { - wfProfileOut( $fname ); - return false; - } - } - if( $action == 'move' && !( $this->isMovable() && $wgUser->isAllowed( 'move' ) ) ) { wfProfileOut( $fname ); @@ -1135,11 +1126,16 @@ } if( $action == 'create' ) { - if( ( $this->isTalkPage() && !$wgUser->isAllowed( 'createtalk' ) ) || - ( !$this->isTalkPage() && !$wgUser->isAllowed( 'createpage' ) ) ) { - wfProfileOut( $fname ); - return false; - } + $action .= $this->isTalkPage() ? 'talk' : 'page'; + } + + # Must come after the 'create' mapping + $rGroups = $this->getRestrictions($action); + $eGroups = $wgUser->getEffectiveGroups(); + if ( (($rGroups && !array_intersect($rGroups, $eGroups)) || + !$wgUser->isAllowed($action)) && !in_array('*', $rGroups) ) { + wfProfileOut( $fname ); + return false; } wfProfileOut( $fname ); @@ -1328,8 +1324,10 @@ $temp = explode( '=', trim( $restrict ) ); if(count($temp) == 1) { // old format should be treated as edit/move restriction - $this->mRestrictions["edit"] = explode( ',', trim( $temp[0] ) ); - $this->mRestrictions["move"] = explode( ',', trim( $temp[0] ) ); + if ($temp[0] != '') { + $this->mRestrictions["edit"] = explode( ',', trim( $temp[0] ) ); + $this->mRestrictions["move"] = explode( ',', trim( $temp[0] ) ); + } } else { $this->mRestrictions[$temp[0]] = explode( ',', trim( $temp[1] ) ); }










