1 18 19 package org.apache.roller.ui.rendering.servlets; 20 21 import java.io.IOException ; 22 import java.io.PrintWriter ; 23 import java.sql.Timestamp ; 24 import java.util.Date ; 25 import javax.servlet.ServletException ; 26 import javax.servlet.http.HttpServlet ; 27 import javax.servlet.http.HttpServletRequest ; 28 import javax.servlet.http.HttpServletResponse ; 29 import org.apache.commons.logging.Log; 30 import org.apache.commons.logging.LogFactory; 31 import org.apache.roller.RollerException; 32 import org.apache.roller.config.RollerRuntimeConfig; 33 import org.apache.roller.model.RollerFactory; 34 import org.apache.roller.model.UserManager; 35 import org.apache.roller.model.WeblogManager; 36 import org.apache.roller.pojos.CommentData; 37 import org.apache.roller.pojos.WeblogEntryData; 38 import org.apache.roller.pojos.WebsiteData; 39 import org.apache.roller.ui.rendering.util.WeblogTrackbackRequest; 40 import org.apache.roller.util.LinkbackExtractor; 41 import org.apache.roller.util.SpamChecker; 42 import org.apache.roller.util.URLUtilities; 43 import org.apache.roller.util.cache.CacheManager; 44 import org.apache.struts.util.RequestUtils; 45 46 47 55 public class TrackbackServlet extends HttpServlet { 56 57 private static Log logger = LogFactory.getLog(TrackbackServlet.class); 58 59 60 65 public void doGet(HttpServletRequest request, HttpServletResponse response) 66 throws IOException , ServletException { 67 68 response.sendError(HttpServletResponse.SC_NOT_FOUND); 69 } 70 71 72 77 public void doPost(HttpServletRequest request, HttpServletResponse response) 78 throws ServletException , IOException { 79 80 String error = null; 81 PrintWriter pw = response.getWriter(); 82 83 WebsiteData weblog = null; 84 WeblogEntryData entry = null; 85 86 WeblogTrackbackRequest trackbackRequest = null; 87 if(!RollerRuntimeConfig.getBooleanProperty("users.trackbacks.enabled")) { 88 error = "Trackbacks are disabled for this site"; 89 } else { 90 91 try { 92 trackbackRequest = new WeblogTrackbackRequest(request); 93 94 if((trackbackRequest.getTitle() == null) || 95 "".equals(trackbackRequest.getTitle())) { 96 trackbackRequest.setTitle(trackbackRequest.getUrl()); 97 } 98 99 if(trackbackRequest.getExcerpt() == null) { 100 trackbackRequest.setExcerpt(""); 101 } else if(trackbackRequest.getExcerpt().length() >= 255) { 102 trackbackRequest.setExcerpt(trackbackRequest.getExcerpt().substring(0, 252)+"..."); 103 } 104 105 UserManager uMgr = RollerFactory.getRoller().getUserManager(); 107 weblog = uMgr.getWebsiteByHandle(trackbackRequest.getWeblogHandle()); 108 109 if(weblog == null) { 110 throw new RollerException("unable to lookup weblog: "+ 111 trackbackRequest.getWeblogHandle()); 112 } 113 114 WeblogManager weblogMgr = RollerFactory.getRoller().getWeblogManager(); 116 entry = weblogMgr.getWeblogEntryByAnchor(weblog, trackbackRequest.getWeblogAnchor()); 117 118 if(entry == null) { 119 throw new RollerException("unable to lookup entry: "+ 120 trackbackRequest.getWeblogAnchor()); 121 } 122 123 } catch (Exception e) { 124 logger.debug("error creating page request", e); 126 error = e.getMessage(); 127 } 128 } 129 130 if(error != null) { 131 pw.println(this.getErrorResponse(error)); 132 return; 133 } 134 135 try { 136 boolean siteAllows = weblog.getAllowComments().booleanValue(); 137 boolean verified = true; 138 139 if (entry!=null && siteAllows && entry.getCommentsStillAllowed()) { 140 141 CommentData comment = new CommentData(); 143 comment.setContent("[Trackback] "+trackbackRequest.getExcerpt()); 144 comment.setName(trackbackRequest.getBlogName()); 145 comment.setUrl(trackbackRequest.getUrl()); 146 comment.setWeblogEntry(entry); 147 comment.setNotify(Boolean.FALSE); 148 comment.setPostTime(new Timestamp (new Date ().getTime())); 149 150 SpamChecker checker = new SpamChecker(); 152 if (checker.checkTrackback(comment)) { 153 comment.setSpam(Boolean.TRUE); 154 logger.debug("Trackback blacklisted: "+comment.getUrl()); 155 error = "REJECTED: trackback contains spam words"; 156 } 157 else if (RollerRuntimeConfig.getBooleanProperty( 159 "site.trackbackVerification.enabled")) { 160 161 LinkbackExtractor linkback = new LinkbackExtractor( 163 comment.getUrl(), URLUtilities.getWeblogEntryURL(weblog, null, entry.getAnchor(), true)); 164 if (linkback.getExcerpt() == null) { 165 comment.setPending(Boolean.TRUE); 166 comment.setApproved(Boolean.FALSE); 167 verified = false; 168 error = "REJECTED: trackback failed verification"; 170 logger.debug("Trackback failed verification: "+comment.getUrl()); 171 } 172 } 173 174 if (error == null) { 175 if (verified && weblog.getCommentModerationRequired()) { 177 comment.setPending(Boolean.TRUE); 178 comment.setApproved(Boolean.FALSE); 179 } else if (verified) { 180 comment.setPending(Boolean.FALSE); 181 comment.setApproved(Boolean.TRUE); 182 } 183 184 WeblogManager mgr = RollerFactory.getRoller().getWeblogManager(); 186 mgr.saveComment(comment); 187 RollerFactory.getRoller().flush(); 188 189 CacheManager.invalidate(comment); 191 192 String rootURL = RollerRuntimeConfig.getAbsoluteContextURL(); 194 if (rootURL == null || rootURL.trim().length()==0) { 195 rootURL = RequestUtils.serverURL(request) + request.getContextPath(); 196 } 197 CommentServlet.sendEmailNotification(comment, rootURL); 198 199 if(comment.getPending().booleanValue()) { 200 pw.println(this.getSuccessResponse("Trackback submitted to moderator")); 201 } else { 202 pw.println(this.getSuccessResponse("Trackback accepted")); 203 } 204 } 205 206 } else if (entry!=null) { 207 error = "Comments and Trackbacks are disabled for the entry you specified."; 208 } else { 209 error = "Entry not specified."; 210 } 211 212 } catch (Exception e) { 213 error = e.getMessage(); 214 if ( error == null ) { 215 error = e.getClass().getName(); 216 } 217 } 218 219 if(error!= null) { 220 pw.println(this.getErrorResponse(error)); 221 } 222 223 } 224 225 226 private String getSuccessResponse(String message) { 227 228 StringBuffer output = new StringBuffer (); 229 230 output.append("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>"); 231 output.append("<response>"); 232 output.append("<error>0</error>"); 233 output.append("<message>"); 234 output.append(message); 235 output.append("</message>"); 236 output.append("</response>"); 237 238 return output.toString(); 239 } 240 241 242 private String getErrorResponse(String message) { 243 244 StringBuffer output = new StringBuffer (); 245 246 output.append("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>"); 247 output.append("<response>"); 248 output.append("<error>1</error>"); 249 output.append("<message>ERROR: "); 250 output.append(message); 251 output.append("</message>"); 252 output.append("</response>"); 253 254 return output.toString(); 255 } 256 257 } | Popular Tags |