blob: 9ffa0f5dcc44d3202bb9aefc96da4c9256a43bc2 [file] [log] [blame]
<%@ page import="org.apache.log4j.*" %>
<%@ page import="org.apache.commons.lang.*" %>
<%@ page import="com.ecyrd.jspwiki.*" %>
<%@ page import="com.ecyrd.jspwiki.filters.*" %>
<%@ page import="java.util.*" %>
<%@ page import="com.ecyrd.jspwiki.tags.WikiTagBase" %>
<%@ page import="com.ecyrd.jspwiki.ui.EditorManager" %>
<%@ page import="com.ecyrd.jspwiki.auth.AuthorizationManager" %>
<%@ page import="java.security.Permission" %>
<%@ page import="java.security.Principal" %>
<%@ page import="com.ecyrd.jspwiki.auth.permissions.WikiPermission" %>
<%@ page import="com.ecyrd.jspwiki.htmltowiki.HtmlStringToWikiTranslator" %>
<%@ page import="com.ecyrd.jspwiki.auth.authorize.DefaultGroupManager" %>
<%@ page import="com.ecyrd.jspwiki.auth.permissions.PagePermission" %>
<%@ page errorPage="/Error.jsp" %>
<%@ taglib uri="/WEB-INF/jspwiki.tld" prefix="wiki" %>
<%!
public void jspInit()
{
wiki = WikiEngine.getInstance( getServletConfig() );
}
Category log = Category.getInstance("JSPWiki");
WikiEngine wiki;
%>
<%
WikiContext wikiContext = wiki.createContext( request, WikiContext.EDIT );
WikiSession wikiSession = wikiContext.getWikiSession();
String user = wikiSession.getUserPrincipal().getName();
if ( !wikiSession.isAuthenticated() && wikiSession.isAnonymous() )
{
user = request.getParameter( "author" );
}
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 = request.getParameter( "author" );
String text = EditorManager.getEditedText( pageContext );
//
// Context is created; continue
//
String pagereq = wikiContext.getPage().getName();
NDC.push( wiki.getApplicationName()+":"+pagereq );
//
// WYSIWYG editor sends us its greetings
//
String htmlText = request.getParameter( "htmlPageText" );
if( htmlText != null && cancel == null )
{
text = new HtmlStringToWikiTranslator().translate(htmlText,wikiContext);
}
WikiPage wikipage = wikiContext.getPage();
Permission requiredPermission = null;
WikiPage latestversion = wiki.getPage( pagereq );
if( latestversion == null )
{
latestversion = wikiContext.getPage();
}
//
// Figure out which is the proper permission for this
// particular editing action.
//
if( wiki.pageExists( wikipage ) )
{
requiredPermission = new PagePermission( wikipage, "edit" );
}
else
{
if ( pagereq.startsWith( DefaultGroupManager.GROUP_PREFIX ) )
{
requiredPermission = WikiPermission.CREATE_GROUPS;
}
else
{
requiredPermission = WikiPermission.CREATE_PAGES;
}
}
AuthorizationManager mgr = wiki.getAuthorizationManager();
if( !mgr.checkPermission( wikiSession,
requiredPermission ) )
{
log.info("User "+user+" has no access - redirecting to login page.");
String msg = "You do not seem to have the permissions for this operation. Would you like to login as another user?";
wikiContext.setVariable( "msg", msg );
String pageurl = wiki.encodeName( pagereq );
response.sendRedirect( wiki.getBaseURL()+"Login.jsp?page="+pageurl );
return;
}
pageContext.setAttribute( WikiTagBase.ATTR_CONTEXT,
wikiContext,
PageContext.REQUEST_SCOPE );
//
// 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 )
{
log.info("Saving page "+pagereq+". User="+user+", host="+request.getRemoteAddr() );
// 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.
long pagedate = Long.parseLong(request.getParameter("edittime"));
Date change = latestversion.getLastModified();
if( change != null && change.getTime() != pagedate )
{
//
// Someone changed the page while we were editing it!
//
log.info("Page changed, warning user.");
pageContext.forward( "PageModified.jsp" );
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
//
wikiContext.getPage().setAuthor( user );
//
// 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
{
if( append != null )
{
StringBuffer pageText = new StringBuffer(wiki.getText( pagereq ));
pageText.append( text );
wiki.saveText( wikiContext, pageText.toString() );
}
else
{
wiki.saveText( wikiContext, text );
}
}
catch( RedirectException ex )
{
session.setAttribute("msg", ex.getMessage());
response.sendRedirect( ex.getRedirect() );
return;
}
response.sendRedirect(wiki.getViewURL(pagereq));
return;
}
else if( preview != null )
{
log.debug("Previewing "+pagereq);
pageContext.forward( "Preview.jsp" );
}
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;
}
log.info("Editing page "+pagereq+". User="+user+", host="+request.getRemoteAddr() );
//
// 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.
//
long lastchange = 0;
Date d = latestversion.getLastModified();
if( d != null ) lastchange = d.getTime();
pageContext.setAttribute( "lastchange",
Long.toString( 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%>" />
<%
NDC.pop();
NDC.remove();
%>