From 1159c155a48ee28a0fae2ac2f0898dc41c4cb97e Mon Sep 17 00:00:00 2001
From: jrandom <jrandom>
Date: Sun, 13 Nov 2005 07:55:38 +0000
Subject: [PATCH] * migrate the post/preview over to the new system * honor the
 "force new thread" and "refuse replies (from everyone but me)" functionality

---
 .../src/net/i2p/syndie/sml/HTMLRenderer.java  |   2 +-
 .../i2p/syndie/sml/ThreadedHTMLRenderer.java  |  16 +-
 .../src/net/i2p/syndie/web/BaseServlet.java   |   3 +-
 .../src/net/i2p/syndie/web/PostServlet.java   | 276 ++++++++++++++++++
 apps/syndie/jsp/post.jsp                      | 181 ------------
 apps/syndie/jsp/web.xml                       |   9 +
 6 files changed, 297 insertions(+), 190 deletions(-)
 create mode 100644 apps/syndie/java/src/net/i2p/syndie/web/PostServlet.java
 delete mode 100644 apps/syndie/jsp/post.jsp

diff --git a/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java b/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java
index 847947b5e0..05d6d7f75e 100644
--- a/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java
+++ b/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java
@@ -1017,7 +1017,7 @@ public class HTMLRenderer extends EventReceiverImpl {
         if (asReply && _entry != null) {
             StringBuffer rv = new StringBuffer(128);
             rv.append("post.jsp?").append(ArchiveViewerBean.PARAM_BLOG).append("=").append(Base64.encode(blog.getData()));
-            rv.append('&').append(ArchiveViewerBean.PARAM_IN_REPLY_TO).append('=');
+            rv.append('&').append(PostServlet.PARAM_PARENT).append('=');
             rv.append(Base64.encode("entry://" + _entry.getURI().getKeyHash().toBase64() + "/" + _entry.getURI().getEntryId()));
             if (subject != null)
                 rv.append('&').append(ArchiveViewerBean.PARAM_SUBJECT).append('=').append(Base64.encode(subject));
diff --git a/apps/syndie/java/src/net/i2p/syndie/sml/ThreadedHTMLRenderer.java b/apps/syndie/java/src/net/i2p/syndie/sml/ThreadedHTMLRenderer.java
index 179324fe96..9c34631b8a 100644
--- a/apps/syndie/java/src/net/i2p/syndie/sml/ThreadedHTMLRenderer.java
+++ b/apps/syndie/java/src/net/i2p/syndie/sml/ThreadedHTMLRenderer.java
@@ -229,23 +229,25 @@ public class ThreadedHTMLRenderer extends HTMLRenderer {
                  (refuseReplies == null) || (!Boolean.valueOf(refuseReplies).booleanValue()) ) {
                 out.write("<!-- body reply begin -->\n");
                 out.write("<form action=\"post.jsp\" method=\"POST\" enctype=\"multipart/form-data\">\n");
-                out.write("<input type=\"hidden\" name=\"inReplyTo\" value=\"");
+                out.write("<input type=\"hidden\" name=\"" + PostServlet.PARAM_PARENT + "\" value=\"");
                 out.write(Base64.encode(post.toString()));
                 out.write("\" />");
-                out.write("<input type=\"hidden\" name=\"entrysubject\" value=\"re: ");
+                out.write("<input type=\"hidden\" name=\"" + PostServlet.PARAM_SUBJECT + "\" value=\"");
+                if (subject.indexOf("re: ") == -1)
+                    out.write("re: ");
                 out.write(HTMLRenderer.sanitizeTagParam(subject));
                 out.write("\" />");
                 out.write("<tr class=\"postReply\">\n");
-                out.write("<td colspan=\"3\">Reply: (<a href=\"smlref.jsp\" title=\"SML cheatsheet\">SML reference</a>)</td>\n</tr>\n");
+                out.write("<td colspan=\"3\">Reply: (<a href=\"smlref.jsp\" title=\"SML cheatsheet\" target=\"_blank\">SML reference</a>)</td>\n</tr>\n");
                 out.write("<tr class=\"postReplyText\">\n");
-                out.write("<td colspan=\"3\"><textarea name=\"entrytext\" rows=\"2\" cols=\"100\"></textarea></td>\n");
+                out.write("<td colspan=\"3\"><textarea name=\"" + PostServlet.PARAM_TEXT + "\" rows=\"2\" cols=\"100\"></textarea></td>\n");
                 out.write("</tr>\n");
                 out.write("<tr class=\"postReplyOptions\">\n");
                 out.write(" <td colspan=\"3\">\n");
                 out.write(" <input type=\"submit\" value=\"Preview...\" name=\"Post\" />\n");
-                out.write(" Tags: <input type=\"text\" size=\"10\" name=\"entrytags\" />\n");
-                out.write(" in a new thread? <input type=\"checkbox\" name=\"replyInNewThread\" />\n");
-                out.write(" allow replies? <input type=\"checkbox\" name=\"allowReplies\" checked=\"true\" />\n");
+                out.write(" Tags: <input type=\"text\" size=\"10\" name=\"" + PostServlet.PARAM_TAGS + "\" />\n");
+                out.write(" in a new thread? <input type=\"checkbox\" name=\"" + PostServlet.PARAM_IN_NEW_THREAD + "\" value=\"true\" />\n");
+                out.write(" refuse replies? <input type=\"checkbox\" name=\"" + PostServlet.PARAM_REFUSE_REPLIES + "\" value=\"true\" />\n");
                 out.write(" attachment: <input type=\"file\" name=\"entryfile0\" />\n");
                 out.write(" </td>\n</tr>\n</form>\n");
                 out.write("<!-- body reply end -->\n");
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java
index b220c07538..e102895c1c 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java
@@ -386,7 +386,7 @@ public abstract class BaseServlet extends HttpServlet {
             out.write(user.getUsername());
             out.write("</a>\n");
             out.write("(<a href=\"switchuser.jsp\" title=\"Log in as another user\">switch</a>)\n");
-            out.write("<a href=\"post.jsp\" title=\"Post a new thread\">Post a new thread</a>\n");
+            out.write("<a href=\"" + getPostURI() + "\" title=\"Post a new thread\">Post a new thread</a>\n");
             out.write("<a href=\"addresses.jsp\" title=\"View your addressbook\">Addressbook</a>\n");
         } else {
             out.write("<form action=\"" + req.getRequestURI() + "\" method=\"GET\">\n");
@@ -429,6 +429,7 @@ public abstract class BaseServlet extends HttpServlet {
     
     private static final String CONTROL_TARGET = "threads.jsp";
     protected String getControlTarget() { return CONTROL_TARGET; }
+    protected String getPostURI() { return "post.jsp"; }
     
     protected void renderControlBar(User user, HttpServletRequest req, PrintWriter out, ThreadIndex index) throws IOException {
         out.write("<form action=\"");
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/PostServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/PostServlet.java
new file mode 100644
index 0000000000..1a869728c8
--- /dev/null
+++ b/apps/syndie/java/src/net/i2p/syndie/web/PostServlet.java
@@ -0,0 +1,276 @@
+package net.i2p.syndie.web;
+
+import java.io.*;
+import java.util.*;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletException;
+
+import org.mortbay.servlet.MultiPartRequest;
+
+import net.i2p.I2PAppContext;
+import net.i2p.client.naming.*;
+import net.i2p.data.*;
+import net.i2p.syndie.*;
+import net.i2p.syndie.data.*;
+import net.i2p.syndie.sml.*;
+
+/**
+ * Post and preview form
+ *
+ */
+public class PostServlet extends BaseServlet {
+    public static final String PARAM_ACTION = "action";
+    public static final String ACTION_CONFIRM = "confirm";
+    
+    public static final String PARAM_SUBJECT = "entrysubject";
+    public static final String PARAM_TAGS = "entrytags";
+    public static final String PARAM_INCLUDENAMES = "includenames";
+    public static final String PARAM_TEXT = "entrytext";
+    public static final String PARAM_HEADERS = "entryheaders";
+    
+    public static final String PARAM_PARENT = "parentURI";
+    public static final String PARAM_IN_NEW_THREAD = "replyInNewThread";
+    public static final String PARAM_REFUSE_REPLIES = "refuseReplies";
+    
+    public static final String PARAM_REMOTE_ARCHIVE = "archive";
+    
+    private static final String ATTR_POST_BEAN = "post";
+    
+    protected void renderServletDetails(User user, HttpServletRequest req, PrintWriter out, ThreadIndex index, 
+                                        int threadOffset, BlogURI visibleEntry, Archive archive) throws IOException {
+        if (!user.getAuthenticated()) {
+            out.write("<tr><td colspan=\"3\">You must be logged in to post</td></tr>\n");
+        } else {
+            PostBean post = getPostBean(user, req);
+            String action = req.getParameter(PARAM_ACTION);
+            if (!empty(action) && ACTION_CONFIRM.equals(action)) {
+                postEntry(user, req, archive, post, out);
+            } else {
+                String contentType = req.getContentType();
+                if (!empty(contentType) && (contentType.indexOf("boundary=") != -1)) {
+                    previewPostedData(user, req, archive, contentType, post, out);
+                } else {
+                    displayNewForm(user, req, post, out);
+                }
+            }
+        }
+    }
+    
+    private void previewPostedData(User user, HttpServletRequest rawRequest, Archive archive, String contentType, PostBean post, PrintWriter out) throws IOException {
+        // not confirmed but they posted stuff... gobble up what they give
+        // and display it as a prview (then we show the confirm form
+        
+        out.write("<tr><td colspan=\"3\">");
+        
+        post.reinitialize();
+        post.setUser(user);
+        
+        MultiPartRequest req = new MultiPartRequest(rawRequest);
+        
+        boolean inNewThread = getInNewThread(req.getString(PARAM_IN_NEW_THREAD));
+        boolean refuseReplies = getRefuseReplies(req.getString(PARAM_REFUSE_REPLIES));
+        
+        String entrySubject = req.getString(PARAM_SUBJECT);
+        String entryTags = req.getString(PARAM_TAGS);
+        String entryText = req.getString(PARAM_TEXT);
+        String entryHeaders = req.getString(PARAM_HEADERS);
+        String style = ""; //req.getString("style");
+        if ( (style != null) && (style.trim().length() > 0) ) {
+          if (entryHeaders == null) entryHeaders = HTMLRenderer.HEADER_STYLE + ": " + style;
+          else entryHeaders = entryHeaders + '\n' + HTMLRenderer.HEADER_STYLE + ": " + style;
+        }
+        String replyTo = req.getString(PARAM_PARENT);
+        if ( (replyTo != null) && (replyTo.trim().length() > 0) ) {
+          byte r[] = Base64.decode(replyTo);
+          if (r != null) {
+            if (entryHeaders == null) entryHeaders = HTMLRenderer.HEADER_IN_REPLY_TO + ": " + new String(r, "UTF-8");
+            else entryHeaders = entryHeaders + '\n' + HTMLRenderer.HEADER_IN_REPLY_TO + ": " + new String(r, "UTF-8");
+          } else {
+            replyTo = null;
+          }
+        }
+        
+        if ( (entryHeaders == null) || (entryHeaders.trim().length() <= 0) )
+            entryHeaders = ThreadedHTMLRenderer.HEADER_FORCE_NEW_THREAD + ": " + inNewThread + '\n' +
+                           ThreadedHTMLRenderer.HEADER_REFUSE_REPLIES + ": " + refuseReplies;
+        else
+            entryHeaders = entryHeaders.trim() + '\n' +
+                           ThreadedHTMLRenderer.HEADER_FORCE_NEW_THREAD + ": " + inNewThread + '\n' +
+                           ThreadedHTMLRenderer.HEADER_REFUSE_REPLIES + ": " + refuseReplies;
+        
+        String includeNames = req.getString(PARAM_INCLUDENAMES);
+        if ( (includeNames != null) && (includeNames.trim().length() > 0) ) {
+          PetNameDB db = user.getPetNameDB();
+          if (entryHeaders == null) entryHeaders = "";
+          for (Iterator iter = db.getNames().iterator(); iter.hasNext(); ) {
+            PetName pn = db.getByName((String)iter.next());
+            if ( (pn != null) && (pn.getIsPublic()) ) {
+              entryHeaders = entryHeaders.trim() + '\n' + HTMLRenderer.HEADER_PETNAME + ": " + 
+                             pn.getName() + "\t" + pn.getNetwork() + "\t" + pn.getProtocol() + "\t" + pn.getLocation();
+            }
+          }
+        }
+        
+        post.setSubject(entrySubject);
+        post.setTags(entryTags);
+        post.setText(entryText);
+        post.setHeaders(entryHeaders);
+
+        for (int i = 0; i < 32; i++) {
+          String filename = req.getFilename("entryfile" + i);
+          if ( (filename != null) && (filename.trim().length() > 0) ) {
+            Hashtable params = req.getParams("entryfile" + i);
+            String type = "application/octet-stream";
+            for (Iterator iter = params.keySet().iterator(); iter.hasNext(); ) {
+              String cur = (String)iter.next();
+              if ("content-type".equalsIgnoreCase(cur)) {
+                type = (String)params.get(cur);
+                break;
+              }
+            }
+            post.addAttachment(filename.trim(), req.getInputStream("entryfile" + i), type);
+          }
+        }
+
+        post.renderPreview(out);
+        out.write("<hr /><span class=\"b_postConfirm\"><form action=\"" + getPostURI() + "\" method=\"POST\">\n");
+        out.write("Please confirm that the above is ok");
+        if (BlogManager.instance().authorizeRemote(user)) { 
+            out.write(", and select what additional archives you want the post transmitted to.");
+            out.write("Otherwise, just hit your browser's back arrow and make changes.\n");
+            out.write("<select class=\"b_postConfirm\" name=\"" + PARAM_REMOTE_ARCHIVE + "\">\n");
+            out.write("<option name=\"\">-None-</option>\n");
+            PetNameDB db = user.getPetNameDB();
+            TreeSet names = new TreeSet();
+            for (Iterator iter = db.getNames().iterator(); iter.hasNext(); ) {
+              String name = (String)iter.next();
+              PetName pn = db.getByName(name);
+              if ("syndiearchive".equals(pn.getProtocol()))
+                names.add(pn.getName());
+            }
+            for (Iterator iter = names.iterator(); iter.hasNext(); ) {
+              String name = (String)iter.next();
+              out.write("<option value=\"" + HTMLRenderer.sanitizeTagParam(name) + "\">"
+                        + HTMLRenderer.sanitizeString(name) + "</option>\n");
+            }
+            
+            out.write("</select><br />\n");
+        }
+        out.write("</span><input class=\"b_postConfirm\" type=\"submit\" name=\"" + PARAM_ACTION 
+                  + "\" value=\"" + ACTION_CONFIRM + "\" />\n");
+        
+        out.write("</td></tr>\n");
+    }
+    
+    private void postEntry(User user, HttpServletRequest req, Archive archive, PostBean post, PrintWriter out) throws IOException {
+        String remArchive = req.getParameter(PARAM_REMOTE_ARCHIVE);
+        post.setArchive(remArchive);
+        BlogURI uri = post.postEntry(); 
+        if (uri != null) {
+            out.write("<tr><td colspan=\"3\"><span class=\"b_postMsgOk\">Entry <a class=\"b_postOkLink\" href=\"threads.jsp?regenerateIndex=true&post=" +
+                      uri.getKeyHash().toBase64() + "/" + uri.getEntryId() + "\">posted</a>!</span></td></tr>");
+        } else {
+            out.write("<tr><td colspan=\"3\"><span class=\"b_postMsgErro\">There was an unknown error posting the entry...</span></td></tr>");
+        }
+    }
+    
+    private void displayNewForm(User user, HttpServletRequest req, PostBean post, PrintWriter out) throws IOException {
+        // logged in and not confirmed because they didn't send us anything!  
+        // give 'em a new form
+        
+        post.reinitialize();
+        post.setUser(user);
+        
+        out.write("<form action=\"" + getPostURI() + "\" method=\"POST\" enctype=\"multipart/form-data\">\n");
+        out.write("<tr><td colspan=\"3\">\n");
+        out.write("<span class=\"b_postField\">Post subject:</span> ");
+        out.write("<input type=\"text\" class=\"b_postSubject\" size=\"80\" name=\"" + PARAM_SUBJECT 
+                  + "\" value=\"" + getParam(req,PARAM_SUBJECT) + "\" /><br />\n");
+        out.write("<span class=\"b_postField\">Post tags:</span> ");
+        out.write("<input type=\"text\" class=\"b_postTags\" size=\"20\" name=\"" + PARAM_TAGS 
+                  + "\" value=\"" + getParam(req, PARAM_TAGS) + "\" /><br />\n");
+        out.write("<span class=\"b_postField\">Include public names?</span> ");
+        out.write("<input class=\"b_postNames\" type=\"checkbox\" name=\"" + PARAM_INCLUDENAMES 
+                  + "\" value=\"true\" /><br />\n");
+        out.write("<span class=\"b_postField\">Post content (in raw <a href=\"smlref.jsp\" target=\"_blank\">SML</a>, no headers):</span><br />\n");
+        out.write("<textarea class=\"b_postText\" rows=\"6\" cols=\"80\" name=\"" + PARAM_TEXT + "\">" + getParam(req, PARAM_TEXT) + "</textarea><br />\n");
+        out.write("<span class=\"b_postField\">SML post headers:</span><br />\n");
+        out.write("<textarea class=\"b_postHeaders\" rows=\"3\" cols=\"80\" name=\"" + PARAM_HEADERS + "\">" + getParam(req, PARAM_HEADERS) + "</textarea><br />\n");
+        
+        
+        String parentURI = req.getParameter(PARAM_PARENT);
+        if ( (parentURI != null) && (parentURI.trim().length() > 0) )
+            out.write("<input type=\"hidden\" name=\"" + PARAM_PARENT + " value=\"" + parentURI + "\" />\n");
+
+        out.write(" Tags: <input type=\"text\" size=\"10\" name=\"" + PARAM_TAGS + "\" value=\"" + getParam(req, PARAM_TAGS) + "\" />\n");
+        
+        boolean inNewThread = getInNewThread(req);
+        boolean refuseReplies = getRefuseReplies(req);
+
+        out.write(" in a new thread? <input type=\"checkbox\" value=\"true\" name=\"" + PARAM_IN_NEW_THREAD + 
+                  (inNewThread ? "\" checked=\"true\" " : "\" " ) + " />\n");
+        out.write(" refuse replies? <input type=\"checkbox\" value=\"true\" name=\"" + PARAM_REFUSE_REPLIES + 
+                  (refuseReplies ? "\" checked=\"true\" " : "\" " ) + " />\n");
+        
+        out.write(ATTACHMENT_FIELDS);
+
+        out.write("<hr />\n");
+        out.write("<input class=\"b_postPreview\" type=\"submit\" name=\"Post\" value=\"Preview...\" /> ");
+        out.write("<input class=\"b_postReset\" type=\"reset\" value=\"Cancel\" />\n");
+        
+        if (parentURI != null) {
+            out.write("<hr /><span id=\"parentText\" class=\"b_postParent\">");
+            post.renderReplyPreview(out, DataHelper.getUTF8(Base64.decode(parentURI)));
+            out.write("</span><hr/>\n");
+        } 
+        
+        out.write("</td></tr>\n");
+        out.write("</form>\n");
+    }
+    
+    private boolean getInNewThread(HttpServletRequest req) {
+        return getInNewThread(req.getParameter(PARAM_IN_NEW_THREAD));
+    }
+    private boolean getInNewThread(String val) {
+        boolean rv = false;
+        String inNewThread = val;
+        if ( (inNewThread != null) && (Boolean.valueOf(inNewThread).booleanValue()) )
+            rv = true;
+        return rv;
+    }
+    private boolean getRefuseReplies(HttpServletRequest req) {
+        return getRefuseReplies(req.getParameter(PARAM_REFUSE_REPLIES));
+    }
+    private boolean getRefuseReplies(String val) {
+        boolean rv = false;
+        String refuseReplies = val;
+        if ( (refuseReplies != null) && (Boolean.valueOf(refuseReplies).booleanValue()) )
+            rv = true;
+        return rv;
+    }
+    
+    private PostBean getPostBean(User user, HttpServletRequest req) {
+        PostBean bean = (PostBean)req.getSession().getAttribute(ATTR_POST_BEAN);
+        if (bean == null) {
+            bean = new PostBean();
+            req.getSession().setAttribute(ATTR_POST_BEAN, bean);
+        }
+        return bean;
+    }
+    
+    private String getParam(HttpServletRequest req, String param) {
+        String val = req.getParameter(param);
+        if (val == null) val = "";
+        return val;
+    }
+    
+    private static final String ATTACHMENT_FIELDS = ""
+        + "<span class=\"b_postField\">Attachment 0:</span> <input class=\"b_postField\" type=\"file\" name=\"entryfile0\" /><br />"
+        + "<span class=\"b_postField\">Attachment 1:</span> <input class=\"b_postField\" type=\"file\" name=\"entryfile1\" /><br />"
+        + "<span class=\"b_postField\">Attachment 2:</span> <input class=\"b_postField\" type=\"file\" name=\"entryfile2\" /><br />"
+        + "<span class=\"b_postField\">Attachment 3:</span> <input class=\"b_postField\" type=\"file\" name=\"entryfile3\" /><br />\n";
+
+}
diff --git a/apps/syndie/jsp/post.jsp b/apps/syndie/jsp/post.jsp
deleted file mode 100644
index 96be47a360..0000000000
--- a/apps/syndie/jsp/post.jsp
+++ /dev/null
@@ -1,181 +0,0 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="net.i2p.data.Base64, net.i2p.client.naming.PetName, net.i2p.client.naming.PetNameDB, net.i2p.syndie.web.*, net.i2p.syndie.sml.*, net.i2p.syndie.data.*, net.i2p.syndie.*, org.mortbay.servlet.MultiPartRequest, java.util.*" %><% 
-request.setCharacterEncoding("UTF-8"); 
-%><jsp:useBean scope="session" class="net.i2p.syndie.User" id="user" 
-/><jsp:useBean scope="session" class="net.i2p.syndie.web.PostBean" id="post" 
-/><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<html>
-<head>
-<title>SyndieMedia post</title>
-<link href="style.jsp" rel="stylesheet" type="text/css" >
-</head>
-<body>
-<table border="1" cellpadding="0" cellspacing="0" width="100%">
-<tr class="b_toplogo"><td colspan="5" valign="top" align="left" class="b_toplogo"><jsp:include page="_toplogo.jsp" /></td></tr>
-<tr><td valign="top" align="left" rowspan="2" class="b_leftnav"><jsp:include page="_leftnav.jsp" /></td>
-    <jsp:include page="_topnav.jsp" />
-    <td valign="top" align="left" rowspan="2" class="b_rightnav"><jsp:include page="_rightnav.jsp" /></td></tr>
-<tr class="b_content"><td valign="top" align="left" colspan="3" class="b_content"><%
-
-if (!user.getAuthenticated()) { 
-  %><span class="b_postMsgErr">You must be logged in to post</span><%
-} else {
-  String confirm = request.getParameter("action");
-  if ( (confirm != null) && (confirm.equalsIgnoreCase("confirm")) ) {
-    String archive = request.getParameter("archive");
-    post.setArchive(archive);
-    BlogURI uri = post.postEntry(); 
-    if (uri != null) {
-      %><span class="b_postMsgOk">Blog entry <a class="b_postOkLink" href="threads.jsp?regenerateIndex=true&post=<%=user.getBlog().toBase64() + '/' + uri.getEntryId()%>">posted</a>!</span><%
-    } else {
-      %><span class="b_postMsgErro">There was an unknown error posting the entry...</span><%
-    }
-    post.reinitialize();
-    post.setUser(user);
-  } else {
-    // logged in but not confirmed...
-    String contentType = request.getContentType();
-    if ((contentType != null) && (contentType.indexOf("boundary=") != -1) ) {
-        // not confirmed but they posted stuff... gobble up what they give
-        // and display it as a preview (then we show the confirm form)
-        post.reinitialize();
-        post.setUser(user);
-        
-        MultiPartRequest req = new MultiPartRequest(request);
-        String entrySubject = req.getString("entrysubject");
-        String entryTags = req.getString("entrytags");
-        String entryText = req.getString("entrytext");
-        String entryHeaders = req.getString("entryheaders");
-        String style = req.getString("style");
-        if ( (style != null) && (style.trim().length() > 0) ) {
-          if (entryHeaders == null) entryHeaders = HTMLRenderer.HEADER_STYLE + ": " + style;
-          else entryHeaders = entryHeaders + '\n' + HTMLRenderer.HEADER_STYLE + ": " + style;
-        }
-        String replyTo = req.getString(ArchiveViewerBean.PARAM_IN_REPLY_TO);
-        if ( (replyTo != null) && (replyTo.trim().length() > 0) ) {
-          byte r[] = Base64.decode(replyTo);
-          if (r != null) {
-            if (entryHeaders == null) entryHeaders = HTMLRenderer.HEADER_IN_REPLY_TO + ": " + new String(r, "UTF-8");
-            else entryHeaders = entryHeaders + '\n' + HTMLRenderer.HEADER_IN_REPLY_TO + ": " + new String(r, "UTF-8");
-          } else {
-            replyTo = null;
-          }
-        }
-        String includeNames = req.getString("includenames");
-        if ( (includeNames != null) && (includeNames.trim().length() > 0) ) {
-          PetNameDB db = user.getPetNameDB();
-          if (entryHeaders == null) entryHeaders = "";
-          for (Iterator iter = db.getNames().iterator(); iter.hasNext(); ) {
-            PetName pn = db.getByName((String)iter.next());
-            if ( (pn != null) && (pn.getIsPublic()) ) {
-              entryHeaders = entryHeaders + '\n' + HTMLRenderer.HEADER_PETNAME + ": " + 
-                             pn.getName() + "\t" + pn.getNetwork() + "\t" + pn.getProtocol() + "\t" + pn.getLocation();
-            }
-          }
-        }
-        
-        post.setSubject(entrySubject);
-        post.setTags(entryTags);
-        post.setText(entryText);
-        post.setHeaders(entryHeaders);
-
-        for (int i = 0; i < 32; i++) {
-          String filename = req.getFilename("entryfile" + i);
-          if ( (filename != null) && (filename.trim().length() > 0) ) {
-            Hashtable params = req.getParams("entryfile" + i);
-            String type = "application/octet-stream";
-            for (Iterator iter = params.keySet().iterator(); iter.hasNext(); ) {
-              String cur = (String)iter.next();
-              if ("content-type".equalsIgnoreCase(cur)) {
-                type = (String)params.get(cur);
-                break;
-              }
-            }
-            post.addAttachment(filename.trim(), req.getInputStream("entryfile" + i), type);
-          }
-        }
-
-        post.renderPreview(out);
-        %><hr /><span class="b_postConfirm"><form action="post.jsp" method="POST">
-Please confirm that the above is ok<% if (BlogManager.instance().authorizeRemote(user)) { %>, and select what additional archives you 
-want the post transmitted to.  Otherwise, just hit your browser's back arrow and
-make changes. 
-<select class="b_postConfirm" name="archive">
-<option name="">-None-</option>
-<% 
-PetNameDB db = user.getPetNameDB();
-TreeSet names = new TreeSet();
-for (Iterator iter = db.getNames().iterator(); iter.hasNext(); ) {
-  String name = (String)iter.next();
-  PetName pn = db.getByName(name);
-  if ("syndiearchive".equals(pn.getProtocol()))
-    names.add(pn.getName());
-}
-for (Iterator iter = names.iterator(); iter.hasNext(); ) {
-  String name = (String)iter.next();
-  out.write("<option value=\"" + HTMLRenderer.sanitizeTagParam(name) + "\">" + HTMLRenderer.sanitizeString(name) + "</option>\n");
-}
-%>
-</select><br /><% } %></span>
-<input class="b_postConfirm" type="submit" name="action" value="Confirm" /><%
-    } else {
-      // logged in and not confirmed because they didn't send us anything!  
-      // give 'em a new form
-
-      post.reinitialize();
-      post.setUser(user);
-
-      String entrySubject = request.getParameter("replySubject");
-      String entryTags = request.getParameter("replyTags");
-      String parentURI = request.getParameter("parentURI");
-      if (entrySubject != null)
-        post.setSubject(new String(Base64.decode(entrySubject), "UTF-8"));
-      if (entryTags != null)
-        post.setTags(new String(Base64.decode(entryTags), "UTF-8"));
-
-      if (parentURI != null) {
-        parentURI = new String(Base64.decode(parentURI), "UTF-8");
-        BlogURI parent = null;
-        try { 
-          parent = new BlogURI(parentURI);
-          %><span class="b_postField">Replying to
-            <a href="thread.jsp?post=<%=parent.getKeyHash().toBase64() + '/' + parent.getEntryId()%>">parent</a>
-            (text <a href="#parentText">below</a>).</span><br />
-        <%
-        } catch (Exception e) {}
-        
-      }
-%><form action="post.jsp" method="POST" enctype="multipart/form-data"> 
-<span class="b_postField">Post subject:</span> <input class="b_postSubject" type="text" size="80" name="entrysubject" value="<%=post.getSubject()%>" /><br />
-<span class="b_postField">Post tags:</span> <input class="b_postTags" type="text" size="20" name="entrytags" value="<%=post.getTags()%>" /><br />
-<span class="b_postField">Post style:</span> <select class="b_postStyle" name="style">
- <option value="default" selected="true">Default</option>
- <option value="meta">Meta (hide everything but the metadata)</option>
-</select><br />
-<span class="b_postField">Include public names?</span> <input class="b_postNames" type="checkbox" name="includenames" value="true" /><br />
-<span class="b_postField">Post content (in raw <a href="smlref.jsp" target="_blank">SML</a>, no headers):</span><br />
-<textarea class="b_postText" rows="6" cols="80" name="entrytext"><%=post.getText()%></textarea><br />
-<span class="b_postField">SML post headers:</span><br />
-<textarea class="b_postHeaders" rows="3" cols="80" name="entryheaders"><%=post.getHeaders()%></textarea><br /><%
-String s = request.getParameter(ArchiveViewerBean.PARAM_IN_REPLY_TO);
-if ( (s != null) && (s.trim().length() > 0) ) {%>
-<input type="hidden" name="<%=ArchiveViewerBean.PARAM_IN_REPLY_TO%>" value="<%=request.getParameter(ArchiveViewerBean.PARAM_IN_REPLY_TO)%>" />
-<% } %>
-<span class="b_postField">Attachment 0:</span> <input class="b_postField" type="file" name="entryfile0" /><br />
-<span class="b_postField">Attachment 1:</span> <input class="b_postField" type="file" name="entryfile1" /><br />
-<span class="b_postField">Attachment 2:</span> <input class="b_postField" type="file" name="entryfile2" /><br />
-<span class="b_postField">Attachment 3:</span> <input class="b_postField" type="file" name="entryfile3" /><br />
-<hr />
-<input class="b_postPreview" type="submit" name="Post" value="Preview..." /> <input class="b_postReset" type="reset" value="Cancel" />
-<%
-      if (parentURI != null) {
-        %><hr /><span id="parentText" class="b_postParent"><%
-        post.renderReplyPreview(out, parentURI);
-        %></span><hr /><%
-      }
-
-    } // end of the 'logged in, not confirmed, nothing posted' section
-  } // end of the 'logged in, not confirmed' section
-} // end of the 'logged in' section
-%></td></tr>
-</table>
-</body>
diff --git a/apps/syndie/jsp/web.xml b/apps/syndie/jsp/web.xml
index 17ce102634..d086bcf1b8 100644
--- a/apps/syndie/jsp/web.xml
+++ b/apps/syndie/jsp/web.xml
@@ -34,6 +34,11 @@
      <servlet-class>net.i2p.syndie.web.AddressesServlet</servlet-class>
     </servlet>
      
+    <servlet>
+     <servlet-name>net.i2p.syndie.web.PostServlet</servlet-name>
+     <servlet-class>net.i2p.syndie.web.PostServlet</servlet-class>
+    </servlet>
+     
     <servlet>
 	 <servlet-name>net.i2p.syndie.UpdaterServlet</servlet-name>
 	 <servlet-class>net.i2p.syndie.UpdaterServlet</servlet-class>
@@ -72,6 +77,10 @@
       <servlet-name>net.i2p.syndie.web.AddressesServlet</servlet-name>
       <url-pattern>/addresses.jsp</url-pattern>
     </servlet-mapping>
+    <servlet-mapping> 
+      <servlet-name>net.i2p.syndie.web.PostServlet</servlet-name>
+      <url-pattern>/post.jsp</url-pattern>
+    </servlet-mapping>
     
     <session-config>
         <session-timeout>
-- 
GitLab