blob: b572cae86a24633582e27746e6f91d32a3c88026 [file] [log] [blame]
<%--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
--%>
<%@ page import="org.apache.log4j.*" %>
<%@ page import="java.util.*" %>
<%@ page import="org.apache.wiki.*" %>
<%@ page import="org.apache.wiki.util.HttpUtil" %>
<%@ page import="org.apache.wiki.api.exceptions.RedirectException" %>
<%@ page import="org.apache.wiki.filters.SpamFilter" %>
<%@ page import="org.apache.wiki.htmltowiki.HtmlStringToWikiTranslator" %>
<%@ page import="org.apache.wiki.pages.PageLock" %>
<%@ page import="org.apache.wiki.preferences.Preferences" %>
<%@ page import="org.apache.wiki.ui.EditorManager" %>
<%@ page import="org.apache.wiki.util.TextUtil" %>
<%@ page import="org.apache.wiki.workflow.DecisionRequiredException" %>
<%@ page errorPage="/Error.jsp" %>
<%@ taglib uri="http://jspwiki.apache.org/tags" prefix="wiki" %>
<%!
Logger log = Logger.getLogger("JSPWiki");
String findParam( PageContext ctx, String key ) {
ServletRequest req = ctx.getRequest();
String val = req.getParameter( key );
if( val == null ) {
val = (String)ctx.findAttribute( key );
}
return val;
}
%>
<%
WikiEngine wiki = WikiEngine.getInstance( getServletConfig() );
// Create wiki context and check for authorization
WikiContext wikiContext = wiki.createContext( request, WikiContext.EDIT );
if( !wiki.getAuthorizationManager().hasAccess( wikiContext, response ) ) {
return;
}
if( wikiContext.getCommand().getTarget() == null ) {
response.sendRedirect( wikiContext.getURL( wikiContext.getRequestContext(), wikiContext.getName() ) );
return;
}
String pagereq = wikiContext.getName();
WikiSession wikiSession = wikiContext.getWikiSession();
String user = wikiSession.getUserPrincipal().getName();
String action = request.getParameter("action");
String ok = request.getParameter("ok");
String preview = request.getParameter("preview");
String cancel = request.getParameter("cancel");
String append = request.getParameter("append");
String edit = request.getParameter("edit");
String author = TextUtil.replaceEntities( findParam( pageContext, "author" ) );
String changenote = findParam( pageContext, "changenote" );
String text = EditorManager.getEditedText( pageContext );
String link = TextUtil.replaceEntities( findParam( pageContext, "link") );
String spamhash = findParam( pageContext, SpamFilter.getHashFieldName(request) );
String captcha = (String)session.getAttribute("captcha");
if ( !wikiSession.isAuthenticated() && wikiSession.isAnonymous() && author != null ) {
user = TextUtil.replaceEntities( findParam( pageContext, "author" ) );
}
//
// WYSIWYG editor sends us its greetings
//
String htmlText = findParam( pageContext, "htmlPageText" );
if( htmlText != null && cancel == null ) {
text = new HtmlStringToWikiTranslator().translate(htmlText,wikiContext);
}
WikiPage wikipage = wikiContext.getPage();
WikiPage latestversion = wiki.getPageManager().getPage( pagereq );
if( latestversion == null ) {
latestversion = wikiContext.getPage();
}
//
// Set the response type before we branch.
//
response.setContentType("text/html; charset="+wiki.getContentEncoding() );
response.setHeader( "Cache-control", "max-age=0" );
response.setDateHeader( "Expires", new Date().getTime() );
response.setDateHeader( "Last-Modified", new Date().getTime() );
//log.debug("Request character encoding="+request.getCharacterEncoding());
//log.debug("Request content type+"+request.getContentType());
log.debug("preview="+preview+", ok="+ok);
if( ok != null || captcha != null ) {
log.info("Saving page "+pagereq+". User="+user+", host="+HttpUtil.getRemoteAddress(request) );
//
// Check for session expiry
//
if( !SpamFilter.checkHash(wikiContext,pageContext) ) {
return;
}
WikiPage modifiedPage = (WikiPage)wikiContext.getPage().clone();
// FIXME: I am not entirely sure if the JSP page is the
// best place to check for concurrent changes. It certainly
// is the best place to show errors, though.
String h = SpamFilter.getSpamHash( latestversion, request );
if( !h.equals(spamhash) ) {
//
// Someone changed the page while we were editing it!
//
log.info("Page changed, warning user.");
session.setAttribute( EditorManager.REQ_EDITEDTEXT, EditorManager.getEditedText(pageContext) );
response.sendRedirect( wiki.getURL(WikiContext.CONFLICT, pagereq, null, false) );
return;
}
//
// We expire ALL locks at this moment, simply because someone has already broken it.
//
PageLock lock = wiki.getPageManager().getCurrentLock( wikipage );
wiki.getPageManager().unlockPage( lock );
session.removeAttribute( "lock-"+pagereq );
//
// Set author information and other metadata
//
modifiedPage.setAuthor( user );
if( changenote == null ) {
changenote = (String) session.getAttribute("changenote");
}
session.removeAttribute("changenote");
if( changenote != null && changenote.length() > 0 ) {
modifiedPage.setAttribute( WikiPage.CHANGENOTE, changenote );
} else {
modifiedPage.removeAttribute( WikiPage.CHANGENOTE );
}
//
// Figure out the actual page text
//
if( text == null ) {
throw new ServletException( "No parameter text set!" );
}
//
// If this is an append, then we just append it to the page.
// If it is a full edit, then we will replace the previous contents.
//
try {
wikiContext.setPage( modifiedPage );
if( captcha != null ) {
wikiContext.setVariable( "captcha", Boolean.TRUE );
session.removeAttribute( "captcha" );
}
if( append != null ) {
StringBuffer pageText = new StringBuffer(wiki.getPageManager().getText( pagereq ));
pageText.append( text );
wiki.getPageManager().saveText( wikiContext, pageText.toString() );
} else {
wiki.getPageManager().saveText( wikiContext, text );
}
} catch( DecisionRequiredException ex ) {
String redirect = wikiContext.getURL(WikiContext.VIEW,"ApprovalRequiredForPageChanges");
response.sendRedirect( redirect );
return;
} catch( RedirectException ex ) {
// FIXME: Cut-n-paste code.
wikiContext.getWikiSession().addMessage( ex.getMessage() ); // FIXME: should work, but doesn't
session.setAttribute( "message", ex.getMessage() );
session.setAttribute(EditorManager.REQ_EDITEDTEXT, EditorManager.getEditedText(pageContext));
session.setAttribute("author",user);
session.setAttribute("link",link != null ? link : "" );
if( htmlText != null ) session.setAttribute( EditorManager.REQ_EDITEDTEXT, text );
session.setAttribute("changenote", changenote != null ? changenote : "" );
session.setAttribute(SpamFilter.getHashFieldName(request), spamhash);
response.sendRedirect( ex.getRedirect() );
return;
}
response.sendRedirect(wiki.getViewURL(pagereq));
return;
} else if( preview != null ) {
log.debug("Previewing "+pagereq);
session.setAttribute(EditorManager.REQ_EDITEDTEXT, EditorManager.getEditedText(pageContext));
session.setAttribute("author",user);
session.setAttribute("link",link != null ? link : "" );
if( htmlText != null ) {
session.setAttribute( EditorManager.REQ_EDITEDTEXT, text );
}
session.setAttribute("changenote", changenote != null ? changenote : "" );
response.sendRedirect( wiki.getURL(WikiContext.PREVIEW,pagereq,null,false) );
return;
} else if( cancel != null ) {
log.debug("Cancelled editing "+pagereq);
PageLock lock = (PageLock) session.getAttribute( "lock-"+pagereq );
if( lock != null ) {
wiki.getPageManager().unlockPage( lock );
session.removeAttribute( "lock-"+pagereq );
}
response.sendRedirect( wiki.getViewURL(pagereq) );
return;
}
session.removeAttribute( EditorManager.REQ_EDITEDTEXT );
log.info("Editing page "+pagereq+". User="+user+", host="+HttpUtil.getRemoteAddress(request) );
//
// Determine and store the date the latest version was changed. Since
// the newest version is the one that is changed, we need to track
// that instead of the edited version.
//
String lastchange = SpamFilter.getSpamHash( latestversion, request );
pageContext.setAttribute( "lastchange", lastchange, PageContext.REQUEST_SCOPE );
//
// Attempt to lock the page.
//
PageLock lock = wiki.getPageManager().lockPage( wikipage, user );
if( lock != null ) {
session.setAttribute( "lock-"+pagereq, lock );
}
String contentPage = wiki.getTemplateManager().findJSP( pageContext, wikiContext.getTemplate(), "EditTemplate.jsp" );
%><wiki:Include page="<%=contentPage%>" />