X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FEditPage.php;h=3a4d7619a3207f2a62565d6521f38db1b7871176;hb=44d31b681fc83aecc819a78662a5d75a4a8655b7;hp=b0cb2d6ae907c6ce9332d7a5a358454d78258b3f;hpb=394638f0423799592f1313c891ac0a69804d5ac7;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/EditPage.php b/includes/EditPage.php index b0cb2d6ae9..3a4d7619a3 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -53,7 +53,7 @@ class EditPage { if ( !$wgUseMetadataEdit ) return ; if ( $wgMetadataWhitelist == '' ) return ; $s = '' ; - $t = $this->mArticle->getContent ( true ) ; + $t = $this->mArticle->getContent(); # MISSING : filtering @@ -90,7 +90,7 @@ class EditPage { $sat = array () ; # stand-alone-templates; must be lowercase $wl_title = Title::newFromText ( $wgMetadataWhitelist ) ; $wl_article = new Article ( $wl_title ) ; - $wl = explode ( "\n" , $wl_article->getContent(true) ) ; + $wl = explode ( "\n" , $wl_article->getContent() ) ; foreach ( $wl AS $x ) { $isentry = false ; @@ -142,10 +142,10 @@ class EditPage { } /** - * This is the function that gets called for "action=edit". It - * sets up various member variables, then passes execution to + * This is the function that gets called for "action=edit". It + * sets up various member variables, then passes execution to * another function, usually showEditForm() - * + * * The edit form is self-submitting, so that when things like * preview and edit conflicts occur, we get the same form back * with the extra stuff added. Only when the final submission @@ -154,10 +154,10 @@ class EditPage { */ function edit() { global $wgOut, $wgUser, $wgRequest, $wgTitle; - + if ( ! wfRunHooks( 'AlternateEdit', array( &$this ) ) ) return; - + $fname = 'EditPage::edit'; wfProfileIn( $fname ); wfDebug( "$fname: enter\n" ); @@ -176,7 +176,7 @@ class EditPage { if ( ! $this->mTitle->userCanEdit() ) { wfDebug( "$fname: user can't edit\n" ); - $wgOut->readOnlyPage( $this->mArticle->getContent( true ), true ); + $wgOut->readOnlyPage( $this->mArticle->getContent(), true ); wfProfileOut( $fname ); return; } @@ -185,7 +185,7 @@ class EditPage { # 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->blockedIPpage(); + $wgOut->blockedPage(); wfProfileOut( $fname ); return; } @@ -197,11 +197,17 @@ class EditPage { return; } else { wfDebug( "$fname: read-only page\n" ); - $wgOut->readOnlyPage( $this->mArticle->getContent( true ), true ); + $wgOut->readOnlyPage( $this->mArticle->getContent(), true ); wfProfileOut( $fname ); return; } } + if ( !$this->mTitle->userCan( 'create' ) && !$this->mTitle->exists() ) { + wfDebug( "$fname: no create permission\n" ); + $this->noCreatePermission(); + wfProfileOut( $fname ); + return; + } if ( wfReadOnly() ) { wfDebug( "$fname: read-only mode is engaged\n" ); if( $this->save || $this->preview ) { @@ -209,7 +215,7 @@ class EditPage { } else if ( $this->diff ) { $this->formtype = 'diff'; } else { - $wgOut->readOnlyPage( $this->mArticle->getContent( true ) ); + $wgOut->readOnlyPage( $this->mArticle->getContent() ); wfProfileOut( $fname ); return; } @@ -232,11 +238,11 @@ class EditPage { } wfProfileIn( "$fname-business-end" ); - + $this->isConflict = false; // css / js subpages of user pages get a special treatment $this->isCssJsSubpage = $wgTitle->isCssJsSubpage(); - + /* Notice that we can't use isDeleted, because it returns true if article is ever deleted * no matter it's current state */ @@ -257,7 +263,7 @@ class EditPage { } } } - + if(!$this->mTitle->getArticleID() && ('initial' == $this->formtype || $this->firsttime )) { # new article $this->showIntro(); } @@ -277,7 +283,7 @@ class EditPage { return; } } - + # First time through: get contents, set time for conflict # checking, etc. if ( 'initial' == $this->formtype || $this->firsttime ) { @@ -297,9 +303,10 @@ class EditPage { */ function previewOnOpen() { global $wgUser; - return $wgUser->getOption( 'previewonfirst' ) || - ( $this->mTitle->getNamespace() == NS_CATEGORY && - !$this->mTitle->exists() ); + return $this->section != 'new' && + ( ( $wgUser->getOption( 'previewonfirst' ) && $this->mTitle->exists() ) || + ( $this->mTitle->getNamespace() == NS_CATEGORY && + !$this->mTitle->exists() ) ); } /** @@ -333,7 +340,7 @@ class EditPage { } else { $this->preview = $request->getCheck( 'wpPreview' ); $this->diff = $request->getCheck( 'wpDiff' ); - + if( !$this->preview ) { if ( $this->tokenOk( $request ) ) { # Some browsers will not report any submit button @@ -357,7 +364,7 @@ class EditPage { if( !preg_match( '/^\d{14}$/', $this->starttime )) { $this->starttime = null; } - + $this->recreate = $request->getCheck( 'wpRecreate' ); $this->minoredit = $request->getCheck( 'wpMinoredit' ); @@ -386,7 +393,7 @@ class EditPage { $this->live = $request->getCheck( 'live' ); $this->editintro = $request->getText( 'editintro' ); - + wfProfileOut( $fname ); } @@ -423,7 +430,7 @@ class EditPage { } } if($addstandardintro) { - if ( $wgUser->isLoggedIn() ) + if ( $wgUser->isLoggedIn() ) $wgOut->addWikiText( wfMsg( 'newarticletext' ) ); else $wgOut->addWikiText( wfMsg( 'newarticletextanon' ) ); @@ -436,7 +443,7 @@ class EditPage { */ function attemptSave() { global $wgSpamRegex, $wgFilterCallback, $wgUser, $wgOut; - + $fname = 'EditPage::attemptSave'; wfProfileIn( $fname ); wfProfileIn( "$fname-checks" ); @@ -507,12 +514,20 @@ class EditPage { wfProfileOut( $fname ); return true; } - + wfProfileOut( "$fname-checks" ); - + # If article is new, insert it. $aid = $this->mTitle->getArticleID( GAID_FOR_UPDATE ); if ( 0 == $aid ) { + // Late check for create permission, just in case *PARANOIA* + if ( !$this->mTitle->userCan( 'create' ) ) { + wfDebug( "$fname: no create permission\n" ); + $this->noCreatePermission(); + wfProfileOut( $fname ); + return; + } + # Don't save a new article if it's blank. if ( ( '' == $this->textbox1 ) ) { $wgOut->redirect( $this->mTitle->getFullURL() ); @@ -523,7 +538,7 @@ class EditPage { $isComment=($this->section=='new'); $this->mArticle->insertNewArticle( $this->textbox1, $this->summary, $this->minoredit, $this->watchthis, false, $isComment); - + wfProfileOut( $fname ); return false; } @@ -533,10 +548,21 @@ class EditPage { $this->mArticle->clear(); # Force reload of dates, etc. $this->mArticle->forUpdate( true ); # Lock the article - if( ( $this->section != 'new' ) && - ($this->mArticle->getTimestamp() != $this->edittime ) ) - { + if( $this->mArticle->getTimestamp() != $this->edittime ) { $this->isConflict = true; + if( $this->section == 'new' ) { + if( $this->mArticle->getUserText() == $wgUser->getName() && + $this->mArticle->getComment() == $this->summary ) { + // Probably a duplicate submission of a new comment. + // This can happen when squid resends a request after + // a timeout but the first one actually went through. + wfDebug( "EditPage::editForm duplicate new section submission; trigger edit conflict!\n" ); + } else { + // New comment; suppress conflict. + $this->isConflict = false; + wfDebug( "EditPage::editForm conflict suppressed; new section\n" ); + } + } } $userid = $wgUser->getID(); @@ -574,12 +600,12 @@ class EditPage { } } } - + if ( $this->isConflict ) { wfProfileOut( $fname ); return true; } - + # All's well wfProfileIn( "$fname-sectionanchor" ); $sectionanchor = ''; @@ -625,8 +651,10 @@ class EditPage { */ function initialiseForm() { $this->edittime = $this->mArticle->getTimestamp(); - $this->textbox1 = $this->mArticle->getContent( true ); + $this->textbox1 = $this->mArticle->getContent(); $this->summary = ''; + if ( !$this->mArticle->exists() && $this->mArticle->mTitle->getNamespace() == NS_MEDIAWIKI ) + $this->textbox1 = wfMsgWeirdKey ( $this->mArticle->mTitle->getText() ) ; wfProxyCheck(); } @@ -637,13 +665,15 @@ class EditPage { * near the top, for captchas and the like. */ function showEditForm( $formCallback=null ) { - global $wgOut, $wgUser, $wgAllowAnonymousMinor, $wgLang, $wgContLang; + global $wgOut, $wgUser, $wgLang, $wgContLang; $fname = 'EditPage::showEditForm'; wfProfileIn( $fname ); $sk =& $wgUser->getSkin(); - + + wfRunHooks( 'EditPage::showEditForm:initial', array( &$this ) ) ; + $wgOut->setRobotpolicy( 'noindex,nofollow' ); # Enabled article-related sidebar, toplinks, etc. @@ -655,7 +685,7 @@ class EditPage { $wgOut->addWikiText( wfMsg( 'explainconflict' ) ); $this->textbox2 = $this->textbox1; - $this->textbox1 = $this->mArticle->getContent( true ); + $this->textbox1 = $this->mArticle->getContent(); $this->edittime = $this->mArticle->getTimestamp(); } else { @@ -671,7 +701,7 @@ class EditPage { if( !empty( $matches[2] ) ) { $this->summary = "/* ". trim($matches[2])." */ "; } - } + } } } else { $s = wfMsg( 'editing', $this->mTitle->getPrefixedText() ); @@ -754,7 +784,7 @@ class EditPage { $minoredithtml = ''; - if ( $wgUser->isLoggedIn() || $wgAllowAnonymousMinor ) { + if ( $wgUser->isAllowed('minoredit') ) { $minoredithtml = "minoredit?" checked='checked'":""). " accesskey='".wfMsg('accesskey-minoredit')."' id='wpMinoredit' />". @@ -798,7 +828,7 @@ class EditPage { if( !$this->preview && !$this->diff ) { $wgOut->setOnloadHandler( 'document.editform.wpTextbox1.focus()' ); } - $templates = $this->getTemplatesUsed(); + $templates = $this->formatTemplates(); global $wgLivePreview; if ( $wgLivePreview ) { @@ -812,7 +842,7 @@ class EditPage { $metadata = $this->mMetaData ; $metadata = htmlspecialchars( $wgContLang->recodeForEdit( $metadata ) ) ; $helppage = Title::newFromText( wfMsg( "metadata_page" ) ) ; - $top = wfMsg( 'metadata', $helppage->getInternalURL() ); + $top = wfMsg( 'metadata', $helppage->getLocalURL() ); $metadata = $top . "" ; } else $metadata = "" ; @@ -867,7 +897,16 @@ END " ); - $editbuttons = " + $wgOut->addWikiText( $copywarn ); + + $wgOut->addHTML( " +{$metadata} +{$editsummary} +{$checkboxhtml} +{$safemodehtml} +"); + + $wgOut->addHTML( "
@@ -875,22 +914,17 @@ END " title=\"".wfMsg('tooltip-preview')."\"/> {$cancel} | {$edithelp}
-"; - - $wgOut->addHTML( - wfMsgForContent( 'editpage-template', - array( - 'METADATA' => $metadata, - 'SUMMARY' => $editsummary, - 'CHECKBOXES' => $checkboxhtml . $safemodehtml, - 'BUTTONS' => $editbuttons, - 'EDITTOOLS' => $wgOut->parse( wfMsgForContent( 'edittools' ) ), - 'COPYRIGHTWARNING' => $wgOut->parse( $copywarn ), - 'TEMPLATES' => "
$templates
" - ) - ) - ); - + +" ); + + $wgOut->addWikiText( wfMsgForContent( 'edittools' ) ); + + $wgOut->addHTML( " +
+{$templates} +
+" ); + if ( $wgUser->isLoggedIn() ) { /** * To make it harder for someone to slip a user a page @@ -928,7 +962,7 @@ END wfProfileOut( $fname ); } - + /** * Append preview output to $wgOut. * Includes category rendering if this is a category page. @@ -952,37 +986,43 @@ END /** * Prepare a list of templates used by this page. Returns HTML. */ - function getTemplatesUsed() { + function formatTemplates() { global $wgUser; - $fname = 'EditPage::getTemplatesUsed'; + $fname = 'EditPage::formatTemplates'; wfProfileIn( $fname ); $sk =& $wgUser->getSkin(); - $templates = ''; - $articleTemplates = $this->mArticle->getUsedTemplates(); - if ( count( $articleTemplates ) > 0 ) { - $templates = '
'. wfMsg( 'templatesused' ) . ''; + $batch->execute(); + + # Construct the HTML + $outText = '
'. wfMsg( 'templatesused' ) . ''; } wfProfileOut( $fname ); - return $templates; + return $outText; } /** * Live Preview lets us fetch rendered preview page content and * add it to the page without refreshing the whole page. - * If not supported by the browser it will fall through to the normal form + * If not supported by the browser it will fall through to the normal form * submission method. - * - * This function outputs a script tag to support live preview, and - * returns an onclick handler which should be added to the attributes + * + * This function outputs a script tag to support live preview, and + * returns an onclick handler which should be added to the attributes * of the preview button */ function doLivePreviewScript() { @@ -996,7 +1036,7 @@ END 'editform.wpTextbox1.value,' . htmlspecialchars( '"' . $liveAction . '"' ) . ')"'; } - + function getLastDelete() { $dbr =& wfGetDB( DB_SLAVE ); $fname = 'EditPage::getLastDelete'; @@ -1033,7 +1073,7 @@ END * @todo document */ function getPreviewText() { - global $wgOut, $wgUser, $wgTitle, $wgParser, $wgAllowDiffPreview, $wgEnableDiffPreviewPreference; + global $wgOut, $wgUser, $wgTitle, $wgParser; $fname = 'EditPage::getPreviewText'; wfProfileIn( $fname ); @@ -1068,26 +1108,24 @@ END } else { # if user want to see preview when he edit an article if( $wgUser->getOption('previewonfirst') and ($this->textbox1 == '')) { - $this->textbox1 = $this->mArticle->getContent(true); + $this->textbox1 = $this->mArticle->getContent(); } $toparse = $this->textbox1; - + # If we're adding a comment, we need to show the # summary as the headline if($this->section=="new" && $this->summary!="") { $toparse="== {$this->summary} ==\n\n".$toparse; } - + if ( $this->mMetaData != "" ) $toparse .= "\n" . $this->mMetaData ; $parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $toparse ) ."\n\n", $wgTitle, $parserOptions ); - $previewHTML = $parserOutput->mText; - - $wgOut->addCategoryLinks($parserOutput->getCategoryLinks()); - $wgOut->addLanguageLinks($parserOutput->getLanguageLinks()); + $previewHTML = $parserOutput->getText(); + $wgOut->addParserOutputNoText( $parserOutput ); wfProfileOut( $fname ); return $previewhead . $previewHTML; @@ -1098,26 +1136,8 @@ END * @todo document */ function blockedIPpage() { - global $wgOut, $wgUser, $wgContLang; - - $wgOut->setPageTitle( wfMsg( 'blockedtitle' ) ); - $wgOut->setRobotpolicy( 'noindex,nofollow' ); - $wgOut->setArticleRelated( false ); - - $id = $wgUser->blockedBy(); - $reason = $wgUser->blockedFor(); - $ip = wfGetIP(); - - if ( is_numeric( $id ) ) { - $name = User::whoIs( $id ); - } else { - $name = $id; - } - $link = '[[' . $wgContLang->getNsText( NS_USER ) . - ":{$name}|{$name}]]"; - - $wgOut->addWikiText( wfMsg( 'blockedtext', $link, $reason, $ip, $name ) ); - $wgOut->returnToMain( false ); + global $wgOut; + $wgOut->blockedPage(); } /** @@ -1239,7 +1259,7 @@ END * The necessary JavaScript code can be found in style/wikibits.js. */ function getEditToolbar() { - global $wgStylePath, $wgLang, $wgMimeType, $wgJsMimeType; + global $wgStylePath, $wgContLang, $wgJsMimeType; /** * toolarray an array of arrays which each include the filename of @@ -1289,14 +1309,14 @@ END 'key' => 'H' ), array( 'image'=>'button_image.png', - 'open' => '[['.$wgLang->getNsText(NS_IMAGE).":", + 'open' => '[['.$wgContLang->getNsText(NS_IMAGE).":", 'close' => ']]', 'sample'=> wfMsg('image_sample'), 'tip' => wfMsg('image_tip'), 'key' => 'D' ), array( 'image' =>'button_media.png', - 'open' => '[['.$wgLang->getNsText(NS_MEDIA).':', + 'open' => '[['.$wgContLang->getNsText(NS_MEDIA).':', 'close' => ']]', 'sample'=> wfMsg('media_sample'), 'tip' => wfMsg('media_tip'), @@ -1423,7 +1443,7 @@ END ? $this->unmakesafe( $text ) : $text; } - + /** * Filter an output field through a Unicode armoring process if it is * going to an old browser with known broken Unicode editing issues. @@ -1439,7 +1459,7 @@ END ? $codedText : $this->makesafe( $codedText ); } - + /** * A number of web browsers are known to corrupt non-ASCII characters * in a UTF-8 text editing environment. To protect against this, @@ -1456,7 +1476,7 @@ END function makesafe( $invalue ) { // Armor existing references for reversability. $invalue = strtr( $invalue, array( "&#x" => "�" ) ); - + $bytesleft = 0; $result = ""; $working = 0; @@ -1485,7 +1505,7 @@ END } return $result; } - + /** * Reverse the previously applied transliteration of non-ASCII characters * back to UTF-8. Used to protect data from corruption by broken web browsers @@ -1505,11 +1525,11 @@ END $hexstring .= $invalue{$i}; $i++; } while( ctype_xdigit( $invalue{$i} ) && ( $i < strlen( $invalue ) ) ); - + // Do some sanity checks. These aren't needed for reversability, - // but should help keep the breakage down if the editor + // but should help keep the breakage down if the editor // breaks one of the entities whilst editing. - if ((substr($invalue,$i,1)==";") and (strlen($hexstring) <= 6)) { + if ((substr($invalue,$i,1)==";") and (strlen($hexstring) <= 6)) { $codepoint = hexdec($hexstring); $result .= codepointToUtf8( $codepoint ); } else { @@ -1522,7 +1542,12 @@ END // reverse the transform that we made for reversability reasons. return strtr( $result, array( "�" => "&#x" ) ); } - + + function noCreatePermission() { + global $wgOut; + $wgOut->setPageTitle( wfMsg( 'nocreatetitle' ) ); + $wgOut->addWikiText( wfMsg( 'nocreatetext' ) ); + } }