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