diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java b/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java index 06861d5314..727788cd63 100644 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java +++ b/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java @@ -23,6 +23,7 @@ import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.roller.util.UUIDGenerator; +import org.apache.roller.weblogger.util.CommentAuthorUrl; /** @@ -130,6 +131,13 @@ public String getUrl() { public void setUrl(String url) { this.url = url; } + + /** + * URL of the comment writer when it can be safely rendered as a link. + */ + public String getSafeUrl() { + return CommentAuthorUrl.normalize(this.url); + } /** diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/wrapper/WeblogEntryCommentWrapper.java b/app/src/main/java/org/apache/roller/weblogger/pojos/wrapper/WeblogEntryCommentWrapper.java index 639b31b53b..073bbe75e3 100644 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/wrapper/WeblogEntryCommentWrapper.java +++ b/app/src/main/java/org/apache/roller/weblogger/pojos/wrapper/WeblogEntryCommentWrapper.java @@ -38,12 +38,17 @@ public final class WeblogEntryCommentWrapper { // url strategy to use for any url building private final URLStrategy urlStrategy; + + private final String safeUrl; // this is private so that we can force the use of the .wrap(pojo) method private WeblogEntryCommentWrapper(WeblogEntryComment toWrap, URLStrategy strat) { this.pojo = toWrap; this.urlStrategy = strat; + String normalizedUrl = toWrap.getSafeUrl(); + this.safeUrl = normalizedUrl == null + ? "" : StringEscapeUtils.escapeHtml4(normalizedUrl); } @@ -93,7 +98,7 @@ public String getEmail() { * Value is always html escaped. */ public String getUrl() { - return StringEscapeUtils.escapeHtml4(this.pojo.getUrl()); + return safeUrl; } @@ -147,7 +152,7 @@ public String getRemoteHost() { /** - * Get the http referrer of the comment poster, used for trackbacks. + * Get the HTTP referrer of the comment poster. * * Value is always html escaped. */ diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java index 693be62ab1..ee12cb7d09 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java @@ -56,7 +56,6 @@ public class WeblogRequestMapper implements RequestMapper { private static final String RSD_SERVLET = "/roller-ui/rendering/rsd"; private static final String COMMENT_SERVLET = "/roller-ui/rendering/comment"; - private static final String TRACKBACK_SERVLET = "/roller-ui/rendering/trackback"; // url patterns that are not allowed to be considered weblog handles @@ -259,45 +258,24 @@ private String calculateForwardUrl(HttpServletRequest request, StringBuilder forwardUrl = new StringBuilder(64); - // POST urls, like comment and trackback servlets + // POST URLs for the comment servlet if("POST".equals(request.getMethod())) { - // posting to permalink, this means comment or trackback - if(context.equals("entry")) { - // trackback requests are required to have an "excerpt" param - if(request.getParameter("excerpt") != null) { + // Comment requests post content to a permalink. + if("entry".equals(context) && request.getParameter("content") != null) { - forwardUrl.append(TRACKBACK_SERVLET); - forwardUrl.append('/'); - forwardUrl.append(handle); - if(locale != null) { - forwardUrl.append('/'); - forwardUrl.append(locale); - } - forwardUrl.append('/'); - forwardUrl.append(context); - if(data != null) { - forwardUrl.append('/'); - forwardUrl.append(data); - } - - // comment requests are required to have a "content" param - } else if(request.getParameter("content") != null) { - - forwardUrl.append(COMMENT_SERVLET); + forwardUrl.append(COMMENT_SERVLET); + forwardUrl.append('/'); + forwardUrl.append(handle); + if(locale != null) { forwardUrl.append('/'); - forwardUrl.append(handle); - if(locale != null) { - forwardUrl.append('/'); - forwardUrl.append(locale); - } + forwardUrl.append(locale); + } + forwardUrl.append('/'); + forwardUrl.append(context); + if(data != null) { forwardUrl.append('/'); - forwardUrl.append(context); - if(data != null) { - forwardUrl.append('/'); - forwardUrl.append(data); - } + forwardUrl.append(data); } - } else { // someone posting data where they aren't supposed to return null; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/ConfigModel.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/ConfigModel.java index fb86421ee4..3a912075f4 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/ConfigModel.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/ConfigModel.java @@ -101,11 +101,6 @@ public boolean getCommentEmailNotify() { return getBooleanProperty("users.comments.emailnotify"); } - public boolean getTrackbacksEnabled() { - return getBooleanProperty("users.trackbacks.enabled"); - } - - /** Get Roller version string */ public String getRollerVersion() { return WebloggerFactory.getWeblogger().getVersion(); @@ -146,4 +141,3 @@ private boolean getBooleanProperty(String name) { } } - diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java index 7ca561a884..a548bd8ac4 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java @@ -137,6 +137,16 @@ public String action(String action, String namespace) { public String getCommentAuthenticator() { return getSite()+"/CommentAuthenticatorServlet?weblog="+weblog.getHandle(); } + + /** + * Retained temporarily so older custom templates continue to render. + * + * @deprecated This endpoint is no longer available. + */ + @Deprecated(since = "6.1.6", forRemoval = true) + public String trackback(String anchor) { + return ""; + } public String themeResource(String theme, String filePath) { @@ -184,11 +194,6 @@ public String comments(String anchor) { } - public String trackback(String anchor) { - return urlStrategy.getWeblogEntryURL(weblog, locale, anchor, true); - } - - public String date(String dateString) { return urlStrategy.getWeblogCollectionURL(weblog, locale, null, dateString, null, -1, true); } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/TrackbackLinkbackCommentValidator.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/TrackbackLinkbackCommentValidator.java index d722328dcf..f2efdc83e2 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/TrackbackLinkbackCommentValidator.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/TrackbackLinkbackCommentValidator.java @@ -1,9 +1,10 @@ /* * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. 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 + * 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 * @@ -11,65 +12,29 @@ * 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. For additional information regarding - * copyright in this work, please see the NOTICE file in the top level - * directory of this distribution. + * limitations under the License. */ - package org.apache.roller.weblogger.ui.rendering.plugins.comments; -import java.io.IOException; -import java.net.MalformedURLException; -import java.util.ResourceBundle; - import org.apache.roller.util.RollerConstants; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.config.WebloggerRuntimeConfig; import org.apache.roller.weblogger.pojos.WeblogEntryComment; -import org.apache.roller.weblogger.util.LinkbackExtractor; import org.apache.roller.weblogger.util.RollerMessages; /** - * Validates comment if comment's URL links back to the comment's entry, - * intended for use with trackbacks only. + * No-op retained temporarily for installations that still name this plugin. + * + * @deprecated The associated protocol endpoint is no longer available. */ +@Deprecated(since = "6.1.6", forRemoval = true) public class TrackbackLinkbackCommentValidator implements CommentValidator { - - private ResourceBundle bundle = ResourceBundle.getBundle("ApplicationResources"); - + @Override public String getName() { - return bundle.getString("comment.validator.trackbackLinkbackName"); + return "Compatibility comment validator"; } - + @Override public int validate(WeblogEntryComment comment, RollerMessages messages) { - - // linkback validation can be toggled at runtime, so check if it's enabled - // if it's disabled then just return a score of 100 - if(!WebloggerRuntimeConfig.getBooleanProperty("site.trackbackVerification.enabled")) { - return RollerConstants.PERCENT_100; - } - - int ret = 0; - LinkbackExtractor linkback = null; - try { - linkback = new LinkbackExtractor( - comment.getUrl(), - WebloggerFactory.getWeblogger().getUrlStrategy().getWeblogEntryURL( - comment.getWeblogEntry().getWebsite(), - null, - comment.getWeblogEntry().getAnchor(), - true)); - } catch (MalformedURLException ignored1) { - } catch (IOException ignored2) {} - - if (linkback != null && linkback.getExcerpt() != null) { - ret = RollerConstants.PERCENT_100; - } else { - messages.addError("comment.validator.trackbackLinkbackMessage"); - } - return ret; + return RollerConstants.PERCENT_100; } - } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java index 677a8f97aa..2e2b5bd7df 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java @@ -32,7 +32,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.commons.validator.routines.UrlValidator; import org.apache.roller.util.RollerConstants; import org.apache.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.config.WebloggerConfig; @@ -49,6 +48,7 @@ import org.apache.roller.weblogger.ui.rendering.plugins.comments.DefaultCommentAuthenticator; import org.apache.roller.weblogger.ui.rendering.util.WeblogCommentRequest; import org.apache.roller.weblogger.ui.rendering.util.WeblogEntryCommentForm; +import org.apache.roller.weblogger.util.CommentAuthorUrl; import org.apache.roller.weblogger.util.GenericThrottle; import org.apache.roller.weblogger.util.IPBanList; import org.apache.roller.weblogger.util.MailUtil; @@ -231,21 +231,10 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) comment.setName(commentRequest.getName()); comment.setEmail(commentRequest.getEmail()); - // Validate url - if (StringUtils.isNotEmpty(commentRequest.getUrl())) { - String theUrl = commentRequest.getUrl().trim().toLowerCase(); - StringBuilder url = new StringBuilder(); - if (theUrl.startsWith("http://")) { - url.append(theUrl); - } else if (theUrl.startsWith("https://")) { - url.append(theUrl); - } else { - url.append("http://").append(theUrl); - } - comment.setUrl(url.toString()); - } else { - comment.setUrl(""); - } + String submittedCommentUrl = StringUtils.trimToEmpty(commentRequest.getUrl()); + String normalizedCommentUrl = CommentAuthorUrl.normalizeInput(submittedCommentUrl); + comment.setUrl(normalizedCommentUrl != null + ? normalizedCommentUrl : submittedCommentUrl); comment.setContent(commentRequest.getContent()); comment.setNotify(commentRequest.isNotify()); @@ -288,9 +277,8 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) log.debug("Email Adddress is invalid : " + commentRequest.getEmail()); // if there is an URL it must be valid - } else if (StringUtils.isNotEmpty(comment.getUrl()) - && !new UrlValidator(new String[] { "http", "https" }) - .isValid(comment.getUrl())) { + } else if (StringUtils.isNotEmpty(submittedCommentUrl) + && normalizedCommentUrl == null) { error = messageUtils.getString("error.commentPostFailedURL"); log.debug("URL is invalid : " + comment.getUrl()); // if this is a real comment post then authenticate request diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java deleted file mode 100644 index 2b43a4e755..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. 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. For additional information regarding - * copyright in this work, please see the NOTICE file in the top level - * directory of this distribution. - */ - -package org.apache.roller.weblogger.ui.rendering.servlets; - -import java.io.IOException; -import java.io.PrintWriter; -import java.sql.Timestamp; -import java.util.Date; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.util.RollerConstants; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.config.WebloggerRuntimeConfig; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.business.WeblogEntryManager; -import org.apache.roller.weblogger.pojos.WeblogEntryComment; -import org.apache.roller.weblogger.pojos.WeblogEntryComment.ApprovalStatus; -import org.apache.roller.weblogger.pojos.WeblogEntry; -import org.apache.roller.weblogger.pojos.Weblog; -import org.apache.roller.weblogger.ui.rendering.plugins.comments.CommentValidationManager; -import org.apache.roller.weblogger.ui.rendering.plugins.comments.TrackbackLinkbackCommentValidator; -import org.apache.roller.weblogger.ui.rendering.util.WeblogTrackbackRequest; -import org.apache.roller.weblogger.util.I18nMessages; -import org.apache.roller.weblogger.util.MailUtil; -import org.apache.roller.weblogger.util.RollerMessages; -import org.apache.roller.weblogger.util.cache.CacheManager; - - -/** - * Roller's Trackback server implementation. POSTing to this Servlet will add a - * Trackback to a Weblog Entry. For more info on Trackback, read the spec: - * MT Trackback. - */ -public class TrackbackServlet extends HttpServlet { - - private static Log logger = LogFactory.getLog(TrackbackServlet.class); - - private CommentValidationManager commentValidationManager = null; - - - @Override - public void init(ServletConfig config) throws ServletException { - commentValidationManager = new CommentValidationManager(); - - // add trackback verification validator just for trackbacks - commentValidationManager.addCommentValidator(new TrackbackLinkbackCommentValidator()); - } - - - /** - * Handle incoming http GET requests. - * - * The TrackbackServlet does not support GET requests, it's a 404. - */ - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - - response.sendError(HttpServletResponse.SC_NOT_FOUND); - } - - - /** - * Service incoming POST requests. - * - * Here we handle incoming trackback posts. - */ - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - String error = null; - PrintWriter pw = response.getWriter(); - - Weblog weblog = null; - WeblogEntry entry = null; - - RollerMessages messages = new RollerMessages(); - - WeblogTrackbackRequest trackbackRequest = null; - if (!WebloggerRuntimeConfig.getBooleanProperty("users.trackbacks.enabled")) { - error = "Trackbacks are disabled for this site"; - } else { - - try { - trackbackRequest = new WeblogTrackbackRequest(request); - - if ((trackbackRequest.getTitle() == null) || - "".equals(trackbackRequest.getTitle())) { - trackbackRequest.setTitle(trackbackRequest.getUrl()); - } - - if (trackbackRequest.getExcerpt() == null) { - trackbackRequest.setExcerpt(""); - } else if (trackbackRequest.getExcerpt().length() >= RollerConstants.TEXTWIDTH_255) { - trackbackRequest.setExcerpt(trackbackRequest.getExcerpt().substring(0, - RollerConstants.TEXTWIDTH_255 - 3)+"..."); - } - - // lookup weblog specified by comment request - weblog = WebloggerFactory.getWeblogger().getWeblogManager() - .getWeblogByHandle(trackbackRequest.getWeblogHandle()); - - if (weblog == null) { - throw new WebloggerException("unable to lookup weblog: "+ - trackbackRequest.getWeblogHandle()); - } - - // lookup entry specified by comment request - WeblogEntryManager weblogMgr = WebloggerFactory.getWeblogger().getWeblogEntryManager(); - entry = weblogMgr.getWeblogEntryByAnchor(weblog, trackbackRequest.getWeblogAnchor()); - - if (entry == null) { - throw new WebloggerException("unable to lookup entry: "+ - trackbackRequest.getWeblogAnchor()); - } - - } catch (Exception e) { - // some kind of error parsing the request or looking up weblog - logger.debug("error creating trackback request", e); - error = e.getMessage(); - } - } - - if (error != null) { - pw.println(this.getErrorResponse(error)); - return; - } - - try { - // check if trackbacks are allowed for this entry - // this checks site-wide settings, weblog settings, and entry settings - if (entry != null && entry.getCommentsStillAllowed() && entry.isPublished()) { - - // Track trackbacks as comments - WeblogEntryComment comment = new WeblogEntryComment(); - comment.setContent("[Trackback] "+trackbackRequest.getExcerpt()); - comment.setName(trackbackRequest.getBlogName()); - comment.setUrl(trackbackRequest.getUrl()); - comment.setWeblogEntry(entry); - comment.setRemoteHost(request.getRemoteHost()); - comment.setNotify(Boolean.FALSE); - comment.setPostTime(new Timestamp(new Date().getTime())); - - // run new trackback through validators - int validationScore = commentValidationManager.validateComment(comment, messages); - logger.debug("Comment Validation score: " + validationScore); - - if (validationScore == RollerConstants.PERCENT_100 && weblog.getCommentModerationRequired()) { - // Valid comments go into moderation if required - comment.setStatus(ApprovalStatus.PENDING); - } else if (validationScore == RollerConstants.PERCENT_100) { - // else they're approved - comment.setStatus(ApprovalStatus.APPROVED); - } else { - // Invalid comments are marked as spam - comment.setStatus(ApprovalStatus.SPAM); - } - - // save, commit, send response - if (!ApprovalStatus.SPAM.equals(comment.getStatus()) || - !WebloggerRuntimeConfig.getBooleanProperty("trackbacks.ignoreSpam.enabled")) { - - WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager(); - mgr.saveComment(comment); - WebloggerFactory.getWeblogger().flush(); - - // only invalidate the cache if comment isn't moderated - if(!weblog.getCommentModerationRequired()) { - // Clear all caches associated with comment - CacheManager.invalidate(comment); - } - - // Send email notifications - MailUtil.sendEmailNotification(comment, messages, - I18nMessages.getMessages(trackbackRequest.getLocaleInstance()), - validationScore == RollerConstants.PERCENT_100); - - if (ApprovalStatus.PENDING.equals(comment.getStatus())) { - pw.println(this.getSuccessResponse("Trackback submitted to moderator")); - } else { - pw.println(this.getSuccessResponse("Trackback accepted")); - } - } - - } else if (entry!=null) { - error = "Comments and Trackbacks are disabled for the entry specified."; - } else { - error = "Entry not specified."; - } - - } catch (Exception e) { - error = e.getMessage(); - if ( error == null ) { - error = e.getClass().getName(); - } - } - - if(error!= null) { - pw.println(this.getErrorResponse(error)); - } - - } - - - private String getSuccessResponse(String message) { - - StringBuilder output = new StringBuilder(); - - output.append(""); - output.append(""); - output.append("0"); - output.append(""); - output.append(message); - output.append(""); - output.append(""); - - return output.toString(); - } - - - private String getErrorResponse(String message) { - - StringBuilder output = new StringBuilder(); - - output.append(""); - output.append(""); - output.append("1"); - output.append("ERROR: "); - output.append(message); - output.append(""); - output.append(""); - - return output.toString(); - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogTrackbackRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogTrackbackRequest.java deleted file mode 100644 index 11807c6b5f..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogTrackbackRequest.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. 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. For additional information regarding - * copyright in this work, please see the NOTICE file in the top level - * directory of this distribution. - */ - -package org.apache.roller.weblogger.ui.rendering.util; - -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import javax.servlet.http.HttpServletRequest; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.business.WeblogEntryManager; -import org.apache.roller.weblogger.pojos.WeblogEntry; - - -/** - * Represents a request to post a weblog entry trackback. - */ -public class WeblogTrackbackRequest extends WeblogRequest { - - private static Log log = LogFactory.getLog(WeblogTrackbackRequest.class); - - private static final String TRACKBACK_SERVLET = "/roller-ui/rendering/trackback"; - - // lightweight attributes - private String blogName = null; - private String url = null; - private String excerpt = null; - private String title = null; - private String weblogAnchor = null; - - // heavyweight attributes - private WeblogEntry weblogEntry = null; - - - public WeblogTrackbackRequest() {} - - - public WeblogTrackbackRequest(HttpServletRequest request) - throws InvalidRequestException { - - // let our parent take care of their business first - // parent determines weblog handle and locale if specified - super(request); - - String servlet = request.getServletPath(); - - // we only want the path info left over from after our parents parsing - String pathInfo = this.getPathInfo(); - - // was this request bound for the comment servlet? - if(servlet == null || !TRACKBACK_SERVLET.equals(servlet)) { - throw new InvalidRequestException("not a weblog trackback request, "+ - request.getRequestURL()); - } - - - /* - * parse path info. we expect ... - * - * /entry/ - permalink - */ - if(pathInfo != null && !pathInfo.isBlank()) { - - // we should only ever get 2 path elements - String[] pathElements = pathInfo.split("/"); - if(pathElements.length == 2) { - - String context = pathElements[0]; - if("entry".equals(context)) { - this.weblogAnchor = URLDecoder.decode(pathElements[1], StandardCharsets.UTF_8); - } else { - throw new InvalidRequestException("bad path info, "+ - request.getRequestURL()); - } - - } else { - throw new InvalidRequestException("bad path info, "+ - request.getRequestURL()); - } - - } else { - // bad request - throw new InvalidRequestException("bad path info, "+ - request.getRequestURL()); - } - - - /* - * parse request parameters - * - * the only params we currently care about are: - * blog_name - comment author - * url - comment referring url - * excerpt - comment contents - * title - comment title - */ - if(request.getParameter("blog_name") != null) { - this.blogName = request.getParameter("blog_name"); - } - - if(request.getParameter("url") != null) { - this.url = request.getParameter("url"); - } - - if(request.getParameter("excerpt") != null) { - this.excerpt = request.getParameter("excerpt"); - } - - if(request.getParameter("title") != null) { - this.title = request.getParameter("title"); - } - - // a little bit of validation, trackbacks enforce that all params - // must have a value, so any nulls equals a bad request - if(this.blogName == null || this.url == null || - this.excerpt == null || this.title == null) { - throw new InvalidRequestException("bad request data. did not "+ - "receive values for all trackback params (blog_name, url, excerpt, title)"); - } - - if(log.isDebugEnabled()) { - log.debug("name = "+this.blogName); - log.debug("url = "+this.url); - log.debug("excerpt = "+this.excerpt); - log.debug("title = "+this.title); - log.debug("weblogAnchor = "+this.weblogAnchor); - } - } - - public String getBlogName() { - return blogName; - } - - public void setBlogName(String blogName) { - this.blogName = blogName; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getExcerpt() { - return excerpt; - } - - public void setExcerpt(String excerpt) { - this.excerpt = excerpt; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getWeblogAnchor() { - return weblogAnchor; - } - - public void setWeblogAnchor(String weblogAnchor) { - this.weblogAnchor = weblogAnchor; - } - - public WeblogEntry getWeblogEntry() { - - if(weblogEntry == null && weblogAnchor != null) { - try { - WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager(); - weblogEntry = wmgr.getWeblogEntryByAnchor(getWeblog(), weblogAnchor); - } catch (WebloggerException ex) { - log.error("Error getting weblog entry "+weblogAnchor, ex); - } - } - - return weblogEntry; - } - - public void setWeblogEntry(WeblogEntry weblogEntry) { - this.weblogEntry = weblogEntry; - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/util/BannedwordslistChecker.java b/app/src/main/java/org/apache/roller/weblogger/util/BannedwordslistChecker.java index 46ec921800..cd8e41bfbc 100644 --- a/app/src/main/java/org/apache/roller/weblogger/util/BannedwordslistChecker.java +++ b/app/src/main/java/org/apache/roller/weblogger/util/BannedwordslistChecker.java @@ -27,7 +27,7 @@ import org.apache.roller.weblogger.pojos.Weblog; /** - * Checks comment, trackbacks and referrers for spam. + * Checks comments and referrers for spam. * @author Lance Lavandowska * @author Dave Johnson */ @@ -49,17 +49,6 @@ public static boolean checkComment(WeblogEntryComment comment) { return false; } - /** - * Test trackback comment, applying all bannedwordslists, if configured - * @return True if comment matches bannedwordslist term - */ - public static boolean checkTrackback(WeblogEntryComment comment) { - if (WebloggerConfig.getBooleanProperty("site.bannedwordslist.enable.trackbacks")) { - return testComment(comment); - } - return false; - } - /** * Test referrer URL, applying bannedwordslist and website bannedwordslist only if configured * @return True if comment matches bannedwordslist term @@ -101,4 +90,3 @@ private static boolean testComment(WeblogEntryComment c) { return ret; } } - diff --git a/app/src/main/java/org/apache/roller/weblogger/util/CommentAuthorUrl.java b/app/src/main/java/org/apache/roller/weblogger/util/CommentAuthorUrl.java new file mode 100644 index 0000000000..c3cd5c1163 --- /dev/null +++ b/app/src/main/java/org/apache/roller/weblogger/util/CommentAuthorUrl.java @@ -0,0 +1,113 @@ +/* + * 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. + */ +package org.apache.roller.weblogger.util; + +import java.net.IDN; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Locale; + +/** + * Normalizes comment author URLs before they are rendered as links. + */ +public final class CommentAuthorUrl { + + private CommentAuthorUrl() { + } + + public static String normalize(String value) { + if (value == null || value.isBlank()) { + return null; + } + String normalized = value.trim(); + try { + URI uri = new URI(normalized); + String scheme = uri.getScheme(); + if (scheme == null + || !(scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) + || uri.isOpaque() + || !hasValidAuthority(uri)) { + return null; + } + return normalized; + } catch (IllegalArgumentException | URISyntaxException ignored) { + return null; + } + } + + /** + * Normalizes user-entered URLs, retaining the long-standing behavior of + * supplying an HTTP scheme when one was omitted. + */ + public static String normalizeInput(String value) { + if (value == null || value.isBlank()) { + return null; + } + String normalized = value.trim(); + String lowerCase = normalized.toLowerCase(Locale.ROOT); + if (!lowerCase.startsWith("http://") && !lowerCase.startsWith("https://")) { + normalized = "http://" + normalized; + } + return normalize(normalized); + } + + private static boolean hasValidAuthority(URI uri) { + String authority = uri.getRawAuthority(); + if (authority == null || authority.isBlank() || uri.getRawUserInfo() != null) { + return false; + } + + if (authority.startsWith("[")) { + int closingBracket = authority.indexOf(']'); + if (closingBracket < 2 || uri.getHost() == null) { + return false; + } + return hasValidPort(authority.substring(closingBracket + 1)); + } + + String host = authority; + int colon = authority.lastIndexOf(':'); + if (colon >= 0) { + if (authority.indexOf(':') != colon + || !hasValidPort(authority.substring(colon))) { + return false; + } + host = authority.substring(0, colon); + } + + try { + return !IDN.toASCII(host).isBlank(); + } catch (IllegalArgumentException ignored) { + return false; + } + } + + private static boolean hasValidPort(String suffix) { + if (suffix.isEmpty()) { + return true; + } + if (suffix.charAt(0) != ':' || suffix.length() == 1) { + return false; + } + try { + int port = Integer.parseInt(suffix.substring(1)); + return port >= 0 && port <= 65535; + } catch (NumberFormatException ignored) { + return false; + } + } +} diff --git a/app/src/main/java/org/apache/roller/weblogger/util/LinkbackExtractor.java b/app/src/main/java/org/apache/roller/weblogger/util/LinkbackExtractor.java deleted file mode 100644 index d43378e74d..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/util/LinkbackExtractor.java +++ /dev/null @@ -1,393 +0,0 @@ -/* -* Licensed to the Apache Software Foundation (ASF) under one or more -* contributor license agreements. 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. For additional information regarding -* copyright in this work, please see the NOTICE file in the top level -* directory of this distribution. -*/ -package org.apache.roller.weblogger.util; - -import com.rometools.rome.feed.synd.SyndEntry; -import com.rometools.rome.feed.synd.SyndFeed; -import com.rometools.rome.io.FeedException; -import com.rometools.rome.io.SyndFeedInput; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Arrays; -import java.util.List; - -import javax.swing.text.MutableAttributeSet; -import javax.swing.text.html.HTML; -import javax.swing.text.html.HTMLEditorKit; -import javax.swing.text.html.HTML.Tag; -import javax.swing.text.html.HTMLEditorKit.Parser; -import javax.swing.text.html.HTMLEditorKit.ParserCallback; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - - -/** - * Parses HTML file for referring linkback title and excerpt. - * - * @author David M Johnson - */ -public class LinkbackExtractor -{ - private static Log mLogger = LogFactory.getFactory().getInstance( - LinkbackExtractor.class); - private boolean mFound = false; - private String mTitle = ""; - private String mRssLink = null; - private String mExcerpt = null; - private String mPermalink = null; - private int mStart = 0; - private int mEnd = 0; - private String mRequestURL = null; - private String mRequestURLWWW = null; - private String mRefererURL; - - private static final int MAX_EXCERPT_CHARS = 500; - private static final int DESIRED_TITLE_LENGTH = 50; - - //------------------------------------------------------------------------ - /** - * Extract referring page title, excerpt, and permalink. - * - * @param refererURL - * @param requestURL - */ - public LinkbackExtractor(String refererURL, String requestURL) throws IOException { - try { - extractByParsingHtml(refererURL, requestURL); - if (mRssLink != null) { - extractByParsingRss(mRssLink, requestURL); - } - } catch (Exception e) { - if (mLogger.isDebugEnabled()) { - mLogger.debug("Extracting linkback", e); - } - } - } - - //------------------------------------------------------------------------ - private void extractByParsingHtml(String refererURL, String requestURL) throws IOException { - URL url = new URL(refererURL); - InputStream is = url.openStream(); - - mRefererURL = refererURL; - - if (requestURL.startsWith("http://www.")) { - mRequestURLWWW = requestURL; - mRequestURL = "http://" + mRequestURLWWW.substring(11); - } else { - mRequestURL = requestURL; - mRequestURLWWW = "http://www." + mRequestURL.substring(7); - } - - // Trick gets Swing's HTML parser by making its protected getParser() method public - // Ignore inaccurate Sonar complaint about useless overriding method: - // http://jira.codehaus.org/browse/SONARJAVA-287 - Parser parser = (new HTMLEditorKit() { - @Override - public Parser getParser() { - return super.getParser(); - } - }).getParser(); - - // Read HTML file into string - StringBuilder sb = new StringBuilder(); - InputStreamReader isr = new InputStreamReader(is); - BufferedReader br = new BufferedReader(isr); - try { - String line; - while ((line = br.readLine()) != null) { - sb.append(line); - } - } finally { - br.close(); - } - - // Parse HTML string to find title and start and end position - // of the referring excerpt. - StringReader sr = new StringReader(sb.toString()); - parser.parse(sr, new LinkbackCallback(), true); - - if (mStart != 0 && mEnd != 0 && mEnd > mStart) { - mExcerpt = sb.toString().substring(mStart, mEnd); - mExcerpt = Utilities.removeHTML(mExcerpt); - - if (mExcerpt.length() > MAX_EXCERPT_CHARS) { - mExcerpt = mExcerpt.substring(0, MAX_EXCERPT_CHARS) + "..."; - } - } - - if (mTitle.startsWith(">") && mTitle.length() > 1) { - mTitle = mTitle.substring(1); - } - } - - //------------------------------------------------------------------------ - private void extractByParsingRss(String rssLink, String requestURL) - throws FeedException, IOException { - SyndFeedInput feedInput = new SyndFeedInput(); - SyndFeed feed = feedInput.build( - new InputStreamReader(new URL(rssLink).openStream())); - String feedTitle = feed.getTitle(); - - int count = 0; - - if (mLogger.isDebugEnabled()) { - mLogger.debug("Feed parsed, title: " + feedTitle); - } - - for (Object objItem : feed.getEntries()) { - count++; - SyndEntry item = (SyndEntry) objItem; - if (item.getDescription().getValue().contains(requestURL)) { - mFound = true; - mPermalink = item.getLink(); - if (feedTitle != null && !feedTitle.isBlank()) { - mTitle = feedTitle + ": " + item.getTitle(); - } else { - mTitle = item.getTitle(); - } - mExcerpt = item.getDescription().getValue(); - mExcerpt = Utilities.removeHTML(mExcerpt); - if (mExcerpt.length() > MAX_EXCERPT_CHARS) { - mExcerpt = mExcerpt.substring(0, MAX_EXCERPT_CHARS) + "..."; - } - break; - } - } - - if (mLogger.isDebugEnabled()) { - mLogger.debug("Parsed " + count + " articles, found linkback=" + mFound); - } - } - - //------------------------------------------------------------------------ - /** - * Returns the excerpt. - * - * @return String - */ - public String getExcerpt() { - return mExcerpt; - } - - //------------------------------------------------------------------------ - /** - * Returns the title. - * - * @return String - */ - public String getTitle() { - return mTitle; - } - - //------------------------------------------------------------------------ - /** - * Returns the permalink. - * - * @return String - */ - public String getPermalink() { - return mPermalink; - } - - //------------------------------------------------------------------------ - /** - * Sets the permalink. - * - * @param permalink - * The permalink to set - */ - public void setPermalink(String permalink) - { - mPermalink = permalink; - } - - ///////////////////////////////////////////////////////////////////////// - - /** - * Parser callback that finds title and excerpt. As we walk through the HTML - * tags, we keep track of the most recently encountered divider tag in the - * mStart field. Once we find the referring permalink, we set the mFound - * flag. After that, we look for the next divider tag and save it's position - * in the mEnd field. - */ - private final class LinkbackCallback extends ParserCallback - { - // Dividers - private Tag[] mDivTags = { Tag.TD, Tag.DIV, Tag.SPAN, - Tag.BLOCKQUOTE, Tag.P, Tag.LI, - Tag.BR, Tag.HR, Tag.PRE, Tag.H1, - Tag.H2, Tag.H3, Tag.H4, Tag.H5, - Tag.H6 }; - - private List mList = Arrays.asList(mDivTags); - - private Tag mCurrentTag = null; - - /** - * Look for divider tags and for the permalink. - * - * @param tag - * HTML tag - * @param atts - * Attributes of that tag - * @param pos - * Tag's position in file - */ - @Override - public void handleStartTag(Tag tag, MutableAttributeSet atts, int pos) - { - if (mList.contains(tag) && !mFound) - { - mStart = pos; - } - else if (mList.contains(tag) && mFound && mEnd == 0) - { - mEnd = pos; - } - else if (tag.equals(Tag.A)) - { - String href = (String) atts.getAttribute(HTML.Attribute.HREF); - if (href == null) { - return; - } - int hashPos = href.lastIndexOf('#'); - if (hashPos != -1) - { - href = href.substring(0, hashPos); - } - if (href != null - && (href.equals(mRequestURL) || href - .equals(mRequestURLWWW))) - { - mFound = true; - } - } - mCurrentTag = tag; - } - - /** - * Needed to handle SPAN tag. - */ - @Override - public void handleSimpleTag(Tag tag, MutableAttributeSet atts, int pos) - { - if (mList.contains(tag) && mFound && mEnd == 0) - { - mEnd = pos; - } - else if (tag.equals(Tag.LINK)) - { - // Look out for RSS autodiscovery link - String title = (String) atts.getAttribute(HTML.Attribute.TITLE); - String type = (String) atts.getAttribute(HTML.Attribute.TYPE); - if (title != null && type != null - && type.equals("application/rss+xml") - && title.equals("RSS")) - { - mRssLink = (String) atts.getAttribute(HTML.Attribute.HREF); - - if (mLogger.isDebugEnabled()) - { - mLogger.debug("Found RSS link " + mRssLink); - } - - if (mRssLink.startsWith("/") && mRssLink.length() > 1) - { - try - { - URL url = new URL(mRefererURL); - mRssLink = url.getProtocol() + "://" - + url.getHost() + ":" + url.getPort() - + mRssLink; - } - catch (MalformedURLException e) - { - mRssLink = null; - if (mLogger.isDebugEnabled()) - { - mLogger.debug("Determining RSS URL", e); - } - } - } - else if (!mRssLink.startsWith("http")) - { - int slash = mRefererURL.lastIndexOf('/'); - if (slash != -1) - { - mRssLink = mRefererURL.substring(0, slash) + "/" - + mRssLink; - } - } - if (mLogger.isDebugEnabled()) - { - mLogger.debug("Qualified RSS link is " + mRssLink); - } - } - } - } - - /** - * Stop at the very first divider tag after the permalink. - * - * @param tag - * End tag - * @param pos - * Position in HTML file - */ - @Override - public void handleEndTag(Tag tag, int pos) - { - if (mList.contains(tag) && mFound && mEnd == 0) - { - mEnd = pos; - } - else if (mList.contains(tag) && !mFound) - { - mStart = pos; - } - else - { - mCurrentTag = null; - } - } - - /** - * Get the page title - */ - @Override - public void handleText(char[] data, int pos) - { - if (mCurrentTag != null && mCurrentTag.equals(Tag.TITLE)) - { - String newText = new String(data); - if (mTitle.length() < DESIRED_TITLE_LENGTH) - { - mTitle += newText; - } - } - } - } -} - diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties index d407e74842..61c2302152 100644 --- a/app/src/main/resources/ApplicationResources.properties +++ b/app/src/main/resources/ApplicationResources.properties @@ -225,9 +225,6 @@ comment.validator.excessSizeMessage=Comment has more than {0} characters comment.validator.bannedwordslistName=Banned Words Comment Validator comment.validator.bannedwordslistMessage=Comment contains banned/ignored words -comment.validator.trackbackLinkbackName=Trackback Linkback Comment Validator -comment.validator.trackbackLinkbackMessage=Trackback from site/page that does not link to your weblog entry - comment.validator.akismetName=Akismet Comment Validator comment.validator.akismetMessage=Akismet service (akismet.com) says comment is spam @@ -346,17 +343,13 @@ configForm.pageMaxEntries=Max number of entries to allow per page configForm.newsfeedMaxEntries=Number of entries to provide in feeds configForm.styledFeeds=Display styled feeds for browsers -configForm.commentSettings=Comment and Trackback Settings +configForm.commentSettings=Comment Settings configForm.enableComments=Allow weblog comments? configForm.ignoreSpamComments=Don''t save comments thought to be spam -configForm.enableTrackbacks=Allow weblog trackbacks? -configForm.ignoreSpamTrackbacks=Don''t save trackbacks thought to be spam configForm.commentHtmlAllowed=Allow html in comments? configForm.commentPlugins=Enabled comment formatting plugins configForm.emailComments=Allow email notification of comments? configForm.moderationRequired=Require comment moderation for all weblogs -configForm.enableTrackbackValidation=Enable verification of trackback links? - configForm.fileUploadSettings=File Upload Settings configForm.enableFileUploads=Enable File Uploads? (only enable if you trust all users not to upload malicious content) configForm.allowedExtensions=Allowed Extensions @@ -1742,7 +1735,7 @@ websiteSettings.formatting=Formatting websiteSettings.spamPrevention=Spam Prevention websiteSettings.ignoreUrls=List of words and regex expressions listed one per \ -line to be added to the banned words list used to check comments, trackbacks and referrers. +line to be added to the banned words list used to check comments and referrers. websiteSettings.bannedWordsList=Words banned in comments (regex allowed) websiteSettings.acceptedBannedwordslist=Accepted {0} string and {1} regex banned-words list rules websiteSettings.error.processingBannedwordslist=Error processing banned-words list: {0} diff --git a/app/src/main/resources/ApplicationResources_de.properties b/app/src/main/resources/ApplicationResources_de.properties index fe4a956b5b..6551a6cadf 100644 --- a/app/src/main/resources/ApplicationResources_de.properties +++ b/app/src/main/resources/ApplicationResources_de.properties @@ -178,8 +178,6 @@ comment.validator.excessLinksMessage=Der Kommentar enth\u00E4lt mehr als {0} Lin comment.validator.excessLinksName=Linkanzahl Kommentarpr\u00FCfung comment.validator.excessSizeMessage=Der Kommentar hat mehr als {0} Zeichen comment.validator.excessSizeName=Gr\u00F6\u00DFen\u00FCberschreitung Kommentarpr\u00FCfung -comment.validator.trackbackLinkbackMessage=Trackback von Webseite, der nicht auf Ihren Weblogeintrag verlinkt -comment.validator.trackbackLinkbackName=Trackback R\u00FCcklink Kommentarpr\u00FCfung commentManagement.bulkDeletePrompt1=Ihre Abfrage lieferte {0} Kommentare, commentManagement.bulkDeletePrompt2=Alle l\u00F6schen? commentManagement.columnApproved=Zugelassen @@ -249,22 +247,19 @@ commonPingTargets.subtitle=Management der allgemeinen Ping Ziele f\u00FCr alle W configForm.absoluteUrl=Absolute URL zur Site (falls notwendig) configForm.requireEmailActivation=Neue Benutzer m\u00FCssen Ihren Zugang per E-Mail aktivieren configForm.allowNewUsers=Erlaube das Anlegen neuer Benutzer? +configForm.commentSettings=Kommentareinstellungen configForm.allowedExtensions=Zul\u00E4ssige Dateierweiterungen configForm.commentHtmlAllowed=HTML in Kommentaren erlauben? configForm.commentPlugins=An-/Abschalten von Plugins zur Kommentarformatierung -configForm.commentSettings=Kommentar und Trackback Einstellungen configForm.editorPages=Bearbeitungsseiten configForm.emailComments=E-Mailbenachrichtung bei Kommentaren? configForm.enableComments=Kommentare in Weblogs erlauben? configForm.enableFileUploads=Datei Uploads erlauben? -configForm.enableTrackbackValidation=\u00DCberpr\u00FCfung von Trackback Links einschalten? -configForm.enableTrackbacks=Weblog Trackbacks erlauben? configForm.fileUploadSettings=Datei Upload Einstellungen configForm.forbiddenExtensions=Verbotene Dateierweiterungen configForm.frontpageWeblogAggregated=Aggregierte systemweite Startseite einschalten configForm.frontpageWeblogHandle=Handle des Weblogs, welches als Startseiten Blog verwendet werden soll configForm.ignoreSpamComments=Als Spam klassifizierte Kommentare nicht speichern -configForm.ignoreSpamTrackbacks=Als Spam klassifizierte Trackbacks nicht speichern configForm.maxDirSize=Maximale Verzeichnisgr\u00F6\u00DFe (MB) configForm.maxFileSize=Maximale Dateigr\u00F6\u00DFe (MB) configForm.moderationRequired=Erzwinge Kommentarmoderation f\u00FCr alle Weblogs diff --git a/app/src/main/resources/ApplicationResources_es.properties b/app/src/main/resources/ApplicationResources_es.properties index 342867e270..2ed4a598ae 100644 --- a/app/src/main/resources/ApplicationResources_es.properties +++ b/app/src/main/resources/ApplicationResources_es.properties @@ -136,12 +136,10 @@ configForm.suspendPingProcessing=\u00BFSuspender todo el procesamiento ping? configForm.userSettings=Configuraci\u00F3n de usuario configForm.allowNewUsers=\u00BFPermitir nuevos usuarios? configForm.registrationUrl=URL de registro externo +configForm.commentSettings=Configuraci\u00F3n de comentarios configForm.editorPages=P\u00E1ginas de editor configForm.emailComments=\u00BFNotificaci\u00F3n de comentarios por correo electr\u00F3nico? -configForm.commentSettings=Configuraci\u00F3n de comentarios y referencias configForm.enableComments=\u00BFPermitir comentarios de weblog? -configForm.enableTrackbacks=\u00BFPermitir referencias de weblog? -configForm.enableTrackbackValidation=\u00BFHabilitar verificaci\u00F3n de los enlaces de referencias? configForm.newsfeedMaxEntries=N\u00FAmero m\u00E1ximo de entradas configForm.fileUploadSettings=Configuraci\u00F3n de subida de ficheros configForm.enableFileUploads=\u00BFPermitir subir ficheros? diff --git a/app/src/main/resources/ApplicationResources_fr.properties b/app/src/main/resources/ApplicationResources_fr.properties index 33bd4b07b4..5e5165ae31 100644 --- a/app/src/main/resources/ApplicationResources_fr.properties +++ b/app/src/main/resources/ApplicationResources_fr.properties @@ -156,8 +156,6 @@ comment.validator.bannedwordslistName=Validation de la liste noire comment.validator.bannedwordslistMessage=Ce commentaire contient certains mots figurant sur la liste noire. #FIXME -comment.validator.trackbackLinkbackName=Trackback Linkback Comment Validator -comment.validator.trackbackLinkbackMessage=Trackback from site/page that does not link to your weblog entry comment.validator.akismetName=Validation de commentaires Akismet comment.validator.akismetMessage=Le service Akismet (akismet.com) indique que ce commentaire est un spam @@ -261,6 +259,7 @@ configForm.userSettings=Paramètres utilisateur configForm.requireEmailActivation=Les nouveaux utilisateurs doivent activer leur compte par courriel configForm.allowNewUsers=Autoriser de nouveaux utilisateurs configForm.registrationUrl=URL externe d'enregistrement +configForm.commentSettings=Paramètres des commentaires configForm.editorPages=Pages utilisées comme éditeur de texte. configForm.weblogSettings=Paramètres d'affichage du blog @@ -268,15 +267,11 @@ configForm.pageMaxEntries=Nombre maximum d'entrées par page configForm.newsfeedMaxEntries=Nombre d'entrées dans les fils d'information configForm.styledFeeds=Afficher les fils d'information stylisés pour les navigateurs -configForm.commentSettings=Paramètres de commentaires et trackbacks configForm.enableComments=Autoriser les commentaires sur ce blog configForm.ignoreSpamComments=Ne pas enregistrer les commentaires considérés comme spam -configForm.enableTrackbacks=Autoriser les trackbacks ? -configForm.ignoreSpamTrackbacks=Ne pas enregistrer les trackbacks considérés comme spam #FIXME configForm.emailComments=Envoyer une notification de commentaire par courriel configForm.moderationRequired=Modération de commentaires requise pour tous les blogs -configForm.enableTrackbackValidation=Activer la vérification des trackback #FIXME configForm.fileUploadSettings=Paramètres de transfert de fichiers @@ -358,6 +353,7 @@ error.general=ERREUR : une erreur inattendue [{0}] est survenue. error.password.mismatch=Votre nom d'utilisateur ou votre mot de passe est incorrect. + errorPage.title=Erreur inattendue errorPage.message=Une erreur inattendue est survenue durant l'execution de Roller. Celle ci a été enregistrée \ dans le fichier journal de l'application. @@ -1107,7 +1103,7 @@ websiteSettings.formatting=Formatage websiteSettings.spamPrevention=Prevention de spam websiteSettings.ignoreUrls=Liste de mots ou expressions régulières à ajouter \ -à la liste noire utilisée pour vérifier les commentaires, trackbacks et réferrants. \ +à la liste noire utilisée pour vérifier les commentaires et réferrants. \ Veuillez ajouter une seule expression ou mot par ligne. websiteSettings.acceptedBannedwordslist={0} mots ou phrases et {1} expression(s) régulière(s) ajouté(s) à la liste noire. diff --git a/app/src/main/resources/ApplicationResources_ja.properties b/app/src/main/resources/ApplicationResources_ja.properties index 599a609e29..8cbf63d2da 100644 --- a/app/src/main/resources/ApplicationResources_ja.properties +++ b/app/src/main/resources/ApplicationResources_ja.properties @@ -207,13 +207,11 @@ configForm.suspendPingProcessing=Ping\u51E6\u7406\u3092\u4E00\u6642\u7684\u306B\ configForm.userSettings=\u30E6\u30FC\u30B6\u8A2D\u5B9A configForm.allowNewUsers=\u65B0\u898F\u30E6\u30FC\u30B6\u3092\u8A31\u53EF configForm.registrationUrl=\u5916\u90E8\u5411\u3051\u767B\u9332URL +configForm.commentSettings=\u30B3\u30E1\u30F3\u30C8\u8A2D\u5B9A configForm.editorPages=\u30A8\u30C7\u30A3\u30BF\u30DA\u30FC\u30B8\u6307\u5B9A configForm.emailComments=\u65B0\u3057\u3044\u30B3\u30E1\u30F3\u30C8\u306E\u30E1\u30FC\u30EB\u901A\u77E5\u3092\u8A31\u53EF -configForm.commentSettings=\u30B3\u30E1\u30F3\u30C8\u3068\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u8A2D\u5B9A configForm.enableComments=\u30B3\u30E1\u30F3\u30C8\u3092\u8A31\u53EF -configForm.enableTrackbacks=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u3092\u8A31\u53EF -configForm.enableTrackbackValidation=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u30FB\u30EA\u30F3\u30AF\u306E\u691C\u8A3C\u3092\u884C\u3046 configForm.moderationRequired=\u3059\u3079\u3066\u306E\u30D6\u30ED\u30B0\u3067\u30B3\u30E1\u30F3\u30C8\u3092\u627F\u8A8D\u5236\u306B\u3059\u308B configForm.newsfeedMaxEntries=\u30D5\u30A3\u30FC\u30C9\u306B\u542B\u3081\u308B\u30A8\u30F3\u30C8\u30EA\u6570 @@ -725,6 +723,7 @@ weblogEdit.miscSettings=\u8A73\u7D30\u8A2D\u5B9A weblogEdit.rightToLeft=\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u65B9\u5411\u3092\u53F3\u304B\u3089\u5DE6\u3068\u3059\u308B weblogEdit.pinnedToMain=\u30E1\u30A4\u30F3\u30DA\u30FC\u30B8\u3078\u56FA\u5B9A\u3059\u308B + # -------------------------------------------------------- Weblog entries Pager weblogEntriesPager.latest.home=\u30E1\u30A4\u30F3 @@ -948,7 +947,6 @@ WeblogConfig.error.descriptionSize=\u8A73\u7D30\u306F255\u6587\u5B57\u4EE5\u5185 Category.error.descriptionSize=\u8A73\u7D30\u306F255\u6587\u5B57\u4EE5\u5185\u3067\u306A\u3051\u308C\u3070\u3044\u3051\u307E\u305B\u3093 tabbedmenu.design=\u30C7\u30B6\u30A4\u30F3 configForm.ignoreSpamComments=\u30B9\u30D1\u30E0\u3068\u601D\u308F\u308C\u308B\u30B3\u30E1\u30F3\u30C8\u306F\u4FDD\u5B58\u3057\u306A\u3044 -configForm.ignoreSpamTrackbacks=\u30B9\u30D1\u30E0\u3068\u601D\u308F\u308C\u308B\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u306F\u4FDD\u5B58\u3057\u306A\u3044 pageForm.subtitle=\u30D6\u30ED\u30B0{1}\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8{0}\u3092\u7DE8\u96C6 stylesheetEdit.subtitle=\u30AB\u30B9\u30BF\u30E0\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u7DE8\u96C6 CreateWeblog.error.emailAddressSize=\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F255\u6587\u5B57\u4EE5\u5185\u3067\u306A\u3051\u308C\u3070\u3044\u3051\u307E\u305B\u3093 @@ -1028,8 +1026,6 @@ categoryForm.error.duplicateName=\u30AB\u30C6\u30B4\u30EA\u540D\u300C{0}\u300D\u Category.error.imageBad=\u6307\u5B9A\u3055\u308C\u305F\u753B\u50CF\u306EURL\u306F\u7121\u52B9\u306A\u30A2\u30C9\u30EC\u30B9\u3067\u3059 comment.validator.excessLinksName=\u30B3\u30E1\u30F3\u30C8\u306E\u30EA\u30F3\u30AF\u6570\u30D0\u30EA\u30C7\u30FC\u30BF comment.validator.excessSizeName=\u30B3\u30E1\u30F3\u30C8\u306E\u9577\u3055\u30D0\u30EA\u30C7\u30FC\u30BF -comment.validator.trackbackLinkbackName=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u30FB\u30EA\u30F3\u30AF\u30D0\u30C3\u30AF\u30B3\u30E1\u30F3\u30C8\u30D0\u30EA\u30C7\u30FC\u30BF -comment.validator.trackbackLinkbackMessage=\u30D6\u30ED\u30B0\u30A8\u30F3\u30C8\u30EA\u3078\u30EA\u30F3\u30AF\u3055\u308C\u3066\u3044\u306A\u3044\u30B5\u30A4\u30C8\u306A\u3044\u3057\u30DA\u30FC\u30B8\u304B\u3089\u306E\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF commentManagement.bulkDeletePrompt1=\u30AF\u30A8\u30EA\u306B\u8A72\u5F53\u3059\u308B{0}\u306E\u30B3\u30E1\u30F3\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002 commentManagement.readmore=\u3059\u3079\u3066\u306E\u30B3\u30E1\u30F3\u30C8\u3092\u898B\u308B commentServlet.commentAccepted=\u30B3\u30E1\u30F3\u30C8\u304C\u66F8\u304D\u8FBC\u307E\u308C\u307E\u3057\u305F\u3002 diff --git a/app/src/main/resources/ApplicationResources_ko.properties b/app/src/main/resources/ApplicationResources_ko.properties index bf51cd18d5..adb3155f7c 100644 --- a/app/src/main/resources/ApplicationResources_ko.properties +++ b/app/src/main/resources/ApplicationResources_ko.properties @@ -171,8 +171,6 @@ comment.validator.excessSizeName=\uc758\uacac \uc720\ud6a8\uc131 \uac80\uc0ac: \ comment.validator.excessSizeMessage=\uc758\uacac\uc774 {0}\uac1c \uc774\uc0c1\uc758 \uae00\uc790\ub97c \ud3ec\ud568\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. comment.validator.bannedwordslistName=\uc758\uacac \uc720\ud6a8\uc131 \uac80\uc0ac: \ube14\ub799\ub9ac\uc2a4\ud2b8 comment.validator.bannedwordslistMessage=\uc758\uacac\uc774 \ube14\ub799\ub9ac\uc2a4\ud2b8\uc5d0 \ud3ec\ud568\ub41c \ub2e8\uc5b4\ub4e4\uc744 \ud3ec\ud568\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. -comment.validator.trackbackLinkbackName=\uc758\uacac \uc720\ud6a8\uc131 \uac80\uc0ac: \ud2b8\ub799\ubc31 \ub9c1\ud06c\ubc31 -comment.validator.trackbackLinkbackMessage=\uadc0\ud558\uc758 \uc6f9\ub85c\uadf8 \uae30\uc0ac\uc5d0 \uc5f0\uacb0\ub418\uc9c0 \uc54a\ub294 \uc0ac\uc774\ud2b8\ub098 \ud398\uc774\uc9c0\ub85c\ubd80\ud130\uc758 \ud2b8\ub799\ubc31\uc785\ub2c8\ub2e4. comment.validator.akismetName=\uc758\uacac\uc720\ud6a8\uc131 \uac80\uc0ac: Akismet \uc11c\ube44\uc2a4 comment.validator.akismetMessage=Akismet \uc11c\ube44\uc2a4(akismet.com)\uc5d0\uc11c\ub294 \uc774 \uc758\uacac\uc744 \uc2a4\ud338\uc73c\ub85c \uc5ec\uae30\uace0 \uc788\uc2b5\ub2c8\ub2e4. @@ -272,6 +270,7 @@ configForm.userSettings=\uc0ac\uc6a9\uc790 \ud658\uacbd \uc124\uc815 \uc815\ubcf configForm.requireEmailActivation=\uc0c8 \uc0ac\uc6a9\uc790\uac00 \uc804\uc790\uc6b0\ud3b8\uc744 \ud1b5\ud574 \uacc4\uc815 \ud65c\uc131\ud654 \ud544\uc694 configForm.allowNewUsers=\uc0c8 \uc0ac\uc6a9\uc790\ub4e4\uc744 \ud5c8\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? configForm.registrationUrl=\uc678\ubd80 \ub4f1\ub85d URL +configForm.commentSettings=\uc758\uacac \ud658\uacbd \uc124\uc815 \uc815\ubcf4 configForm.editorPages=\ud3b8\uc9d1 \ud398\uc774\uc9c0\ub4e4 configForm.weblogSettings=\uc6f9\ub85c\uadf8 \ub80c\ub354\ub9c1 \ud658\uacbd \uc124\uc815 \uc815\ubcf4 @@ -279,16 +278,12 @@ configForm.pageMaxEntries=\ud398\uc774\uc9c0 \ub2f9 \ud5c8\uc6a9\ub418\ub294 \uc configForm.newsfeedMaxEntries=\ub274\uc2a4 \ud53c\ub4dc\ub4e4\uc5d0\uc11c \uc81c\uacf5\ub418\ub294 \uc6f9\ub85c\uadf8 \uae30\uc0ac\uc758 \uac1c\uc218 configForm.styledFeeds=\ube0c\ub77c\uc6b0\uc800\ub4e4\uc744 \uc704\ud574 \uc2a4\ud0c0\uc77c\ud654\ub41c \ub274\uc2a4 \ud53c\ub4dc\ub4e4\uc758 \ud45c\uc2dc -configForm.commentSettings=\uc758\uacac\uacfc \ud2b8\ub799\ubc31 \ud658\uacbd \uc124\uc815 \uc815\ubcf4 configForm.enableComments=\uc6f9\ub85c\uadf8 \uc758\uacac\ub4e4\uc744 \ud5c8\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? configForm.ignoreSpamComments=\uc2a4\ud338\uc73c\ub85c \uc5ec\uaca8\uc9c0\ub294 \uc758\uacac \uc800\uc7a5 \uc548\ud568. -configForm.enableTrackbacks=\uc6f9\ub85c\uadf8 \ud2b8\ub799\ubc31\ub4e4\uc744 \ud5c8\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -configForm.ignoreSpamTrackbacks=\uc2a4\ud338\uc73c\ub85c \uc5ec\uaca8\uc9c0\ub294 \ud2b8\ub799\ubc31 \uc800\uc7a5 \uc548\ud568. configForm.commentHtmlAllowed=\uc758\uacac\uc5d0 HTML \ud0dc\uadf8\ub97c \ud5c8\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? configForm.commentPlugins=\uc758\uacac \ud3ec\ub9f7 \uc801\uc6a9 \ud50c\ub7ec\uadf8\uc778 \ud65c\uc131\ud654/\ube44\ud65c\uc131\ud654 configForm.emailComments=\uc758\uacac\ub4e4\uc5d0 \ub300\ud574 \uc804\uc790\uc6b0\ud3b8 \ud1b5\uc9c0\ub97c \uc0ac\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? configForm.moderationRequired=\ubaa8\ub4e0 \uc6f9\ub85c\uadf8\ub4e4\uc758 \uc758\uacac \uc870\uc815\uc744 \ud544\uc218\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -configForm.enableTrackbackValidation=\ud2b8\ub799\ubc31 \ub9c1\ud06c\ub4e4\uc758 \uac80\uc99d\uc744 \ud65c\uc131\ud654\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? configForm.fileUploadSettings=\ud30c\uc77c \uc5c5\ub85c\ub4dc \ud658\uacbd \uc124\uc815 \uc815\ubcf4 configForm.enableFileUploads=\ud30c\uc77c \uc5c5\ub85c\ub4dc\ub97c \ud65c\uc131\ud654\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? @@ -1080,6 +1075,7 @@ weblogEdit.rightToLeft=\ud14d\uc2a4\ud2b8\ub294 \uc624\ub978\ucabd\uc5d0\uc11c \ weblogEdit.pinnedToMain=\uba54\uc778\uc73c\ub85c \uace0\uc815 + weblogEdit.hasComments=\uc758\uacac, [{1}] weblogEdit.enclosureURL=\uac10\uc2f8\uc9c4 URL diff --git a/app/src/main/resources/ApplicationResources_ru.properties b/app/src/main/resources/ApplicationResources_ru.properties index 7375cbe854..985c487cb4 100644 --- a/app/src/main/resources/ApplicationResources_ru.properties +++ b/app/src/main/resources/ApplicationResources_ru.properties @@ -156,12 +156,11 @@ configForm.suspendPingProcessing=\u041F\u0440\u0438\u043E\u0441\u0442\u0430\u043 configForm.userSettings=\u041D\u0430\u0441\u0440\u043E\u0439\u043A\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 configForm.allowNewUsers=\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0445? configForm.registrationUrl=\u0410\u0434\u0440\u0435\u0441 \u0432\u043D\u0435\u0448\u043D\u0435\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 +configForm.commentSettings=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432 configForm.editorPages=\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 configForm.emailComments=\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u044F\u0442\u044C \u043F\u043E Email \u043E \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u044F\u0445? -configForm.commentSettings=\u041D\u0430\u0442\u0440\u043E\u0439\u043A\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432 \u0438 Trackback configForm.enableComments=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438? -configForm.enableTrackbacks=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C trackbacks? configForm.fileUploadSettings=\u041D\u0430\u0441\u0440\u043E\u0439\u043A\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0444\u0430\u0439\u043B\u043E\u0432 configForm.enableFileUploads=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0443? diff --git a/app/src/main/resources/ApplicationResources_zh_CN.properties b/app/src/main/resources/ApplicationResources_zh_CN.properties index 1000dd54d1..0b606873fd 100644 --- a/app/src/main/resources/ApplicationResources_zh_CN.properties +++ b/app/src/main/resources/ApplicationResources_zh_CN.properties @@ -224,8 +224,6 @@ comment.validator.excessSizeMessage=\u8BC4\u8BBA\u5185\u5BB9\u8D85\u8FC7 {0} \u4 comment.validator.bannedwordslistName=\u7981\u7528\u8BCD\u8BC4\u8BBA\u68C0\u67E5\u5668 comment.validator.bannedwordslistMessage=\u8BC4\u8BBA\u4E2D\u5305\u542B\u7981\u7528/\u5FFD\u7565\u7684\u8BCD\u6C47 -comment.validator.trackbackLinkbackName=\u8BC4\u8BBA\u5F15\u7528\u68C0\u67E5 -comment.validator.trackbackLinkbackMessage=\u5F15\u7528\u672A\u94FE\u63A5\u5230\u672C\u535A\u5BA2\u7684\u7F51\u9875 comment.validator.akismetName=\u8BC4\u8BBA\u8FC7\u6EE4\u9650\u5236 comment.validator.akismetMessage=\u8BC4\u8BBA\u5185\u5BB9\u88AB\u8FC7\u6EE4\u670D\u52A1\u65B9(akismet.com)\u8BA4\u5B9A\u4E3A\u5783\u573E\u4FE1\u606F @@ -333,6 +331,7 @@ configForm.userSettings=\u7528\u6237\u8BBE\u7F6E configForm.requireEmailActivation=\u8981\u6C42\u65B0\u7528\u6237\u901A\u8FC7\u7535\u5B50\u90AE\u4EF6\u6FC0\u6D3B\u8D26\u53F7 configForm.allowNewUsers=\u662F\u5426\u5141\u8BB8\u65B0\u7528\u6237\u6CE8\u518C\uFF1F configForm.registrationUrl=\u5916\u90E8\u6CE8\u518CURL +configForm.commentSettings=\u8BC4\u8BBA\u8BBE\u7F6E configForm.editorPages=\u7F16\u8F91\u5668\u9875\u9762 configForm.webServicesSettings=Web\u670D\u52A1\u8BBE\u7F6E @@ -345,16 +344,12 @@ configForm.pageMaxEntries=\u6BCF\u9875\u663E\u793A\u7684\u6587\u7AE0\u6570\u91CF configForm.newsfeedMaxEntries=\u65B0\u95FB\u6E90\u63D0\u4F9B\u7684\u6587\u7AE0\u6570\u91CF\u4E0A\u9650 configForm.styledFeeds=\u5728\u6D4F\u89C8\u5668\u4E2D\u663E\u793A\u5E26\u6837\u5F0F\u7684\u65B0\u95FB\u6E90 -configForm.commentSettings=\u8BC4\u8BBA\u548C\u5F15\u7528\u8BBE\u7F6E configForm.enableComments=\u5141\u8BB8\u6587\u7AE0\u8BC4\u8BBA\uFF1F configForm.ignoreSpamComments=\u4E0D\u4FDD\u5B58\u5783\u573E\u8BC4\u8BBA -configForm.enableTrackbacks=\u5141\u8BB8\u535A\u5BA2\u5F15\u7528\uFF1F -configForm.ignoreSpamTrackbacks=\u4E0D\u4FDD\u5B58\u5783\u573E\u5F15\u7528 configForm.commentHtmlAllowed=\u5141\u8BB8\u8BC4\u8BBA\u4E2D\u4F7F\u7528HTML\uFF1F configForm.commentPlugins=\u542F\u7528/\u7981\u7528\u8BC4\u8BBA\u683C\u5F0F\u5316\u63D2\u4EF6 configForm.emailComments=\u5C06\u8BC4\u8BBA\u53D1\u9001\u7535\u5B50\u90AE\u4EF6\u901A\u77E5\uFF1F configForm.moderationRequired=\u6240\u6709\u535A\u5BA2\u9700\u8981\u7BA1\u7406\u8BC4\u8BBA -configForm.enableTrackbackValidation=\u542F\u7528\u5F15\u7528\u94FE\u63A5\u6838\u67E5\uFF1F configForm.fileUploadSettings=\u6587\u4EF6\u4E0A\u4F20\u8BBE\u7F6E configForm.enableFileUploads=\u542F\u7528\u6587\u4EF6\u4E0A\u4F20\uFF1F @@ -461,6 +456,8 @@ error.general=\u5DF2\u8BB0\u5165\u9519\u8BEF\u65E5\u5FD7: [{0}] error.password.mismatch=\u7528\u6237\u540D\u6216\u5BC6\u7801\u51FA\u9519 error.unmatched.openid=OpenID\u7684URL\u672A\u77E5\u6216\u65E0\u6548 + + error.title.403=\u62D2\u7EDD\u8BBF\u95EE error.text.403=\u4F60\u6CA1\u6709\u8BBF\u95EE\u6307\u5B9A\u9875\u9762\u7684\u6743\u9650\u3002 @@ -1585,6 +1582,7 @@ weblogEdit.searchDescription=\u641C\u7D22\u63CF\u8FF0 weblogEdit.searchDescription.tooltip=\u7528\u4E8E SEO \u7684\u653E\u7F6E\u4E8E HTML \u6807\u5934\u4E2D\u7684\u535A\u5BA2\u6587\u7AE0\u7684\u7B80\u77ED\u63CF\u8FF0\uFF08\u5982\u679C\u6709\u5728\u535A\u5BA2\u6A21\u677F\u4EE3\u7801\u4E2D\u8BBE\u7F6E\uFF09\u3002 + weblogEdit.hasComments=\u8BC4\u8BBA [{1}] weblogEdit.enclosureURL=\u5D4C\u5165URL @@ -1861,3 +1859,4 @@ error.activate.user.invalidActivationCode=\u6FC0\u6D3B\u7801\u65E0\u6548\u3002\u user.account.activation.mail.subject=Roller\uFF1A\u4F60\u7684\u8D26\u53F7\u6FC0\u6D3B\u7801 user.account.activation.mail.content=

\u8981\u6FC0\u6D3B\u4F60\u7684Roller\u8D26\u6237[{1}]\uFF0C\u8BF7\u70B9\u51FB\u4EE5\u4E0B\u94FE\u63A5\uFF1A

{2}

+ diff --git a/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties b/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties index 8fba942175..8a1dc9b726 100644 --- a/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties +++ b/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties @@ -152,7 +152,7 @@ search.enabled=true search.index.comments=true #---------------------------------- -# comments and trackbacks +# comments # comment throttling comment.throttle.enabled=false @@ -192,9 +192,6 @@ org.apache.roller.weblogger.business.plugins.comment.HTMLSubsetPlugin # enables site full bannedwordslist check on comment posts (default: true) site.bannedwordslist.enable.comments=true -# enables site full bannedwordslist check at time of trackback post (default: true) -site.bannedwordslist.enable.trackbacks=true - # enables partial bannedwordslist check (not including bannedwordslist.txt) for each incoming referrer site.bannedwordslist.enable.referrers=false @@ -388,7 +385,7 @@ salt.ignored.urls=mediaFileAdd!save.rol,mediaFileEdit!save.rol,bookmarksImport!s #--------------------------------------------------------------------- # LDAP authentication properties -- valid only if LDAP authentication # authentication.method via authentication.method setting. -# See also comments and trackbacks section above for addition LDAP +# See also the comments section above for additional LDAP # config options. # Set these properties for a custom LDAP schema (optional) diff --git a/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml b/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml index 0071170338..12091fe1c5 100644 --- a/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml +++ b/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml @@ -151,7 +151,7 @@ - + @@ -162,14 +162,6 @@ boolean false - - boolean - true - - - boolean - true - boolean false @@ -187,11 +179,6 @@ boolean false - - boolean - false - - diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp index f13a8d59e6..45aa119c96 100644 --- a/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp @@ -273,14 +273,22 @@ - + +
 :  - + + value="#safeCommentUrl" escapeHtml="true"/>
+ +
+  :  + +
+
 :  diff --git a/app/src/main/webapp/WEB-INF/velocity/weblog.vm b/app/src/main/webapp/WEB-INF/velocity/weblog.vm index 212f376562..b80804dac4 100644 --- a/app/src/main/webapp/WEB-INF/velocity/weblog.vm +++ b/app/src/main/webapp/WEB-INF/velocity/weblog.vm @@ -22,7 +22,6 @@ These are the documented macros in order defined in this file: #includeTemplate($weblog $pageName) #showAutodiscoveryLinks($weblog) - #showTrackbackAutodiscovery($entry) #showMetaDescription() #showAnalyticsTrackingCode($weblog) @@ -115,29 +114,12 @@ Show RSS, Atom and RSD auto-discovery links as HTML link elements. #** - * Display a trackback auto-discovery RDF comment for a WeblogEntry, but only - * if trackbacks are enabled and comments are allowed for the entry. - **# -#macro( showTrackbackAutodiscovery $entry ) -#if($config.trackbacksEnabled && $model.weblog.allowComments && $entry.commentsStillAllowed) - -#end +Deprecated no-op retained temporarily for custom template compatibility. +*# +#macro(showTrackbackAutodiscovery $entry) #end + #** Adds a meta description tag, suitable for use in HTML header sections. This tag is frequently used by search engines to provide a short description for links returned. The description value will set to the @@ -1041,5 +1023,3 @@ Include Javascript code needed for expanding folder macros (undocumented). #end - - diff --git a/app/src/main/webapp/WEB-INF/web.xml b/app/src/main/webapp/WEB-INF/web.xml index 0418832da1..9117f74bf5 100644 --- a/app/src/main/webapp/WEB-INF/web.xml +++ b/app/src/main/webapp/WEB-INF/web.xml @@ -95,12 +95,11 @@ FORWARD - IPBanFilter /roller-ui/rendering/comment/* - /roller-ui/rendering/trackback/* FORWARD @@ -229,12 +228,6 @@ 7 - - TrackbackServlet - org.apache.roller.weblogger.ui.rendering.servlets.TrackbackServlet - 7 - - RSDServlet org.apache.roller.weblogger.ui.rendering.servlets.RSDServlet @@ -368,11 +361,6 @@ /roller-ui/rendering/comment/* - - TrackbackServlet - /roller-ui/rendering/trackback/* - - RSDServlet /roller-ui/rendering/rsd/* diff --git a/app/src/main/webapp/robots.txt b/app/src/main/webapp/robots.txt index 1d9bb7ccc0..b442054874 100644 --- a/app/src/main/webapp/robots.txt +++ b/app/src/main/webapp/robots.txt @@ -4,6 +4,5 @@ Disallow: /roller- Disallow: /theme Disallow: /language Disallow: /resources -Disallow: /trackback Disallow: /comment -Disallow: /main.do \ No newline at end of file +Disallow: /main.do diff --git a/app/src/main/webapp/themes/base.css b/app/src/main/webapp/themes/base.css index 7f5f104b42..ce424ec29d 100644 --- a/app/src/main/webapp/themes/base.css +++ b/app/src/main/webapp/themes/base.css @@ -212,7 +212,7 @@ div#searchAgain { border: 1px solid #999; font-size: 1em; } -#nextEntry { +#nextEntry { text-align: right; } #previousEntry { diff --git a/app/src/main/webapp/themes/basic/_day.vm b/app/src/main/webapp/themes/basic/_day.vm index 8d3a75612d..a798ccdbd0 100644 --- a/app/src/main/webapp/themes/basic/_day.vm +++ b/app/src/main/webapp/themes/basic/_day.vm @@ -30,7 +30,6 @@ $text.get("macro.weblog.comments") [$commentCount] #end

- #showTrackbackAutodiscovery($entry)
#end diff --git a/app/src/main/webapp/themes/basicmobile/_day.vm b/app/src/main/webapp/themes/basicmobile/_day.vm index 8d3a75612d..a798ccdbd0 100644 --- a/app/src/main/webapp/themes/basicmobile/_day.vm +++ b/app/src/main/webapp/themes/basicmobile/_day.vm @@ -30,7 +30,6 @@ $text.get("macro.weblog.comments") [$commentCount] #end

- #showTrackbackAutodiscovery($entry) #end diff --git a/app/src/test/java/org/apache/roller/weblogger/pojos/wrapper/WeblogEntryCommentWrapperTest.java b/app/src/test/java/org/apache/roller/weblogger/pojos/wrapper/WeblogEntryCommentWrapperTest.java new file mode 100644 index 0000000000..fe8a1f77ed --- /dev/null +++ b/app/src/test/java/org/apache/roller/weblogger/pojos/wrapper/WeblogEntryCommentWrapperTest.java @@ -0,0 +1,72 @@ +/* + * 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. + */ +package org.apache.roller.weblogger.pojos.wrapper; + +import org.apache.roller.weblogger.pojos.WeblogEntryComment; +import org.apache.roller.weblogger.util.CommentAuthorUrl; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +class WeblogEntryCommentWrapperTest { + + @Test + void exposesEscapedHttpAndHttpsAuthorUrls() { + WeblogEntryComment comment = new WeblogEntryComment(); + comment.setUrl(" https://example.org/profile?a=1&b=2 "); + + WeblogEntryCommentWrapper wrapper = WeblogEntryCommentWrapper.wrap(comment, null); + + assertEquals("https://example.org/profile?a=1&b=2", wrapper.getUrl()); + assertEquals("https://example.org/profile?a=1&b=2", comment.getSafeUrl()); + } + + @Test + void acceptsLocalAndInternationalizedAuthorUrls() { + assertEquals("http://localhost:8080/profile", + CommentAuthorUrl.normalize("http://localhost:8080/profile")); + assertEquals("https://intranet/profile", + CommentAuthorUrl.normalize("https://intranet/profile")); + assertEquals("http://my_host.example.com/profile", + CommentAuthorUrl.normalize("http://my_host.example.com/profile")); + assertEquals("https://例え.テスト/profile", + CommentAuthorUrl.normalize("https://例え.テスト/profile")); + assertEquals("http://Example.org/CaseSensitive", + CommentAuthorUrl.normalizeInput("Example.org/CaseSensitive")); + } + + @Test + void omitsUnsupportedOrMalformedAuthorUrls() { + WeblogEntryComment comment = new WeblogEntryComment(); + comment.setUrl("javascript:alert(1)"); + assertEquals("", WeblogEntryCommentWrapper.wrap(comment, null).getUrl()); + assertNull(comment.getSafeUrl()); + + comment.setUrl("//example.org/profile"); + assertEquals("", WeblogEntryCommentWrapper.wrap(comment, null).getUrl()); + + comment.setUrl("not a url"); + assertEquals("", WeblogEntryCommentWrapper.wrap(comment, null).getUrl()); + + comment.setUrl(" "); + assertEquals("", WeblogEntryCommentWrapper.wrap(comment, null).getUrl()); + + assertNull(CommentAuthorUrl.normalize("https://user@example.org/profile")); + assertNull(CommentAuthorUrl.normalize("https://example.org:99999/profile")); + } +} diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/rendering/IncomingTrackbackRemovalTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/IncomingTrackbackRemovalTest.java new file mode 100644 index 0000000000..a7491fc3c8 --- /dev/null +++ b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/IncomingTrackbackRemovalTest.java @@ -0,0 +1,101 @@ +/* + * 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. + */ +package org.apache.roller.weblogger.ui.rendering; + +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.roller.util.RollerConstants; +import org.apache.roller.weblogger.ui.rendering.model.ConfigModel; +import org.apache.roller.weblogger.ui.rendering.model.URLModel; +import org.apache.roller.weblogger.ui.rendering.plugins.comments.TrackbackLinkbackCommentValidator; +import org.apache.roller.weblogger.util.BannedwordslistChecker; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class IncomingTrackbackRemovalTest { + + @Test + void incomingTrackbackEndpointsAndSettingsAreRemoved() { + assertThrows(ClassNotFoundException.class, () -> Class.forName( + "org.apache.roller.weblogger.ui.rendering.servlets.TrackbackServlet")); + assertThrows(ClassNotFoundException.class, () -> Class.forName( + "org.apache.roller.weblogger.ui.rendering.util.WeblogTrackbackRequest")); + assertThrows(NoSuchMethodException.class, + () -> ConfigModel.class.getMethod("getTrackbacksEnabled")); + assertThrows(NoSuchMethodException.class, + () -> BannedwordslistChecker.class.getMethod( + "checkTrackback", + org.apache.roller.weblogger.pojos.WeblogEntryComment.class)); + } + + @Test + @SuppressWarnings("removal") + void legacyExtensionPointsRemainHarmlessForOneRelease() throws Exception { + assertEquals("", new URLModel().trackback("entry")); + assertEquals(RollerConstants.PERCENT_100, + new TrackbackLinkbackCommentValidator().validate(null, null)); + assertFileContains( + "src/main/webapp/WEB-INF/velocity/weblog.vm", + "#macro(showTrackbackAutodiscovery $entry)\n#end"); + } + + @Test + void deploymentAndRuntimeConfigurationDoNotExposeTrackbacks() throws Exception { + assertFileDoesNotContain("src/main/webapp/WEB-INF/web.xml", "trackback"); + assertResourceDoesNotContain( + "org/apache/roller/weblogger/config/runtimeConfigDefs.xml", "trackback"); + assertFileDoesNotContain("../docs/roller-user-guide.adoc", "trackback"); + assertFileDoesNotContain("../docs/roller-template-guide.adoc", "trackback"); + } + + private void assertFileDoesNotContain(String path, String value) throws Exception { + String content = Files.readString(resolveAppPath(path), StandardCharsets.UTF_8); + assertFalse(content.toLowerCase().contains(value), path); + } + + private void assertFileContains(String path, String value) throws Exception { + String content = Files.readString(resolveAppPath(path), StandardCharsets.UTF_8); + assertTrue(content.contains(value), path); + } + + private Path resolveAppPath(String path) throws Exception { + Path current = Path.of(getClass().getProtectionDomain() + .getCodeSource().getLocation().toURI()).toAbsolutePath(); + while (current != null) { + if (Files.isDirectory(current.resolve("src/main"))) { + return current.resolve(path).normalize(); + } + current = current.getParent(); + } + throw new IllegalStateException("Unable to locate the app module"); + } + + private void assertResourceDoesNotContain(String path, String value) throws Exception { + try (InputStream input = getClass().getClassLoader().getResourceAsStream(path)) { + assertNotNull(input, path); + String content = new String(input.readAllBytes(), StandardCharsets.UTF_8); + assertFalse(content.toLowerCase().contains(value), path); + } + } +} diff --git a/app/src/test/java/org/apache/roller/weblogger/util/LinkbackExtractorTest.java b/app/src/test/java/org/apache/roller/weblogger/util/LinkbackExtractorTest.java deleted file mode 100644 index 8153864b74..0000000000 --- a/app/src/test/java/org/apache/roller/weblogger/util/LinkbackExtractorTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. 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. For additional information regarding - * copyright in this work, please see the NOTICE file in the top level - * directory of this distribution. - */ - -package org.apache.roller.weblogger.util; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * Test linkback extractor. - */ -public class LinkbackExtractorTest { - - public void testLinkbackExtractor() throws Exception { - String[][] testrefs = new String[][] - { - // Second URL contains a link to the first - { - "http://cassandra.apache.org/", - "https://rollerweblogger.org/roller/entry/composite_keys_in_cassandra" - }, - { - "http://roller.apache.org/downloads/downloads.html", - "https://rollerweblogger.org/project/date/20140627" - } - }; - - LinkbackExtractor le = new LinkbackExtractor(testrefs[0][0],testrefs[0][1]); - assertEquals("Apache Cassandra", le.getTitle()); - - le = new LinkbackExtractor(testrefs[1][0],testrefs[1][1]); - assertEquals("Apache Roller", le.getTitle()); - - // todo: le.getPermalink() and le.getExcerpt() working - } - - -} diff --git a/docs/examples/configs/tomcat/mod_jk.conf b/docs/examples/configs/tomcat/mod_jk.conf index b2dfe973c6..6f6572a5d7 100644 --- a/docs/examples/configs/tomcat/mod_jk.conf +++ b/docs/examples/configs/tomcat/mod_jk.conf @@ -7,7 +7,6 @@ JkMount /roller/xmlrpc ajp13 JkMount /roller/page/* ajp13 JkMount /roller/comments/* ajp13 JkMount /roller/preview/* ajp13 -JkMount /roller/trackback/* ajp13 JkMount /roller/ExportServlet ajp13 JkMount /roller/auth/* ajp13 JkMount /roller/rss/* ajp13 diff --git a/docs/roller-template-guide.adoc b/docs/roller-template-guide.adoc index b121dd0c77..4caeeeb246 100644 --- a/docs/roller-template-guide.adoc +++ b/docs/roller-template-guide.adoc @@ -843,9 +843,6 @@ Every possible type of Roller URL is supported: |String |Absolute URL of a resource within a Roller theme. -|$url.trackback(String anchor) -|String -|Trackback URL for entry specified by anchor. |=== === $utils @@ -1858,21 +1855,6 @@ Generated HTML and CSS classes used No style-able markup is produced. -`#showTrackbackAutodiscovery($entry)` - -Arguments: - -*$entry:* WeblogEntry object - -Synopsis: - -Show trackback autodiscovery code for a specified weblog entry, suitable -for use within a day template. - -Generated HTML and CSS classes used - -No style-able markup is produced. - `#showAtomFeedsList($weblog)` Arguments: diff --git a/docs/roller-user-guide.adoc b/docs/roller-user-guide.adoc index e047748c91..050b4ce1a7 100644 --- a/docs/roller-user-guide.adoc +++ b/docs/roller-user-guide.adoc @@ -54,8 +54,6 @@ comments are allowed. * *Comment*. A comment posted by a visitor to a weblog and regarding one specific weblog post. A comment has an email address, a publication timestamp and some content. -* *Trackback*. A comment posted by a remote weblog regarding one -specific weblog post. Trackbacks are stored as comments by Roller. * *Templates*. Each Roller weblog is defined by a set of HTML and CSS templates that provide the layout and styles for the weblog. Normally templates are authored using Velocity template language, but other @@ -611,13 +609,10 @@ URL is _http://jroller.com/fredsblog_), then your parameters would be: * *BlogID*: fredsblog * *URL*: http://jroller.com/roller-services/xmlrpc -== Working with comments and trackbacks +== Working with comments -Roller supports weblog comments and _trackbacks_, which provide a way -for other bloggers to add comments to your blog remotely. By default -comments and trackbacks are enabled, but you can turn them off on your -weblog’s Weblog Settings page of your weblog. Note that turning off -comments will disable both comments and trackbacks. +Roller supports weblog comments, which are enabled by default. You can +turn them off on your weblog’s Weblog Settings page. === Comment notification via email @@ -705,21 +700,20 @@ available in the context of a weblog. === *Preventing weblog spam* -There are two forms of comment spam that can affect your weblog: +Comment spam can affect your weblog: ** _Comment spam_: spam that arrives via the comment form on your weblog. Sometimes spam comments are added by a human and sometimes by a computer program known as a _spambot._ -** _Trackback spam_: spam that arrives via trackbacks sent by a spambot. -Fortunately, there are counter-measures for each type of spam. Here are +Fortunately, there are counter-measures. Here are Roller’s built in spam prevention measures: * _Pluggable comment authentication_. By default, Roller asks each commenter a simple math question to ensure that they are a person and not a spam robot. Your site administrator can turn this off or replace it with another form of authentication. -* _Pluggable comment validation_. Roller includes five comment +* _Pluggable comment validation_. Roller includes four comment validators below. Your site administrator can adjust the settings for these validators and can enable/disable them as needed by overriding Roller’s configuration properties (see the Installation Guide for more @@ -730,8 +724,6 @@ as spam (default: on) characters as spam (default: on) ** Bannedwordslist validator marks comments containing any of your site’s designated bad words as spam (default: on) -** Trackback verification validator will check incoming trackbacks to -ensure that they link to you. ** Akismet validator allows you to use the Akismet.com spam prevention service. * _Comment throttling_. If your site is being abused by a spam robot @@ -747,11 +739,11 @@ comments on your weblog. None of the measures are 100% effective. If you are really concerned about displaying offensive content on your weblog even for a short time, then enable comment moderation on your weblog. -Roller uses a _bannedwordslist_, a lists of words which are used to check -incoming comments, trackbacks and requestors for spam URLs. If the name, -URL or content of a comment or trackback includes one of the bannedwordslist -words or matches one of the expressions then that comment or trackback -is marked as spam and is not displayed on your weblog, unless you use +Roller uses a _bannedwordslist_, a list of words used to check incoming +comments and requestors for spam URLs. If the name, URL or content of a +comment includes one of the bannedwordslist words or matches one of the +expressions, then that comment is marked as spam and is not displayed on your +weblog, unless you use the comment management page to unmark it. Actually, there are three levels of bannedwordslist: @@ -764,8 +756,8 @@ edited by a global administrator via the Server Admin page. ** Level 3 bannedwordslist: Weblog specific bannedwordslist, which you control in the Weblog Settings page of your weblog. -Incoming comments and trackbacks are checked against all three levels of -bannedwordslist. Incoming web page requests, however, are only checked against +Incoming comments are checked against all three levels of bannedwordslist. +Incoming web page requests, however, are only checked against the levels 2 and 3 bannedwordslist and will receive a 403 (forbidden) message if found. @@ -936,7 +928,7 @@ enabled by default on a new weblog entry. image::user-guide-spam.png[] * **Ignore incoming URLs that contain any of these words - **you can use -this to filter out what commentors, trackbacks, and referrers (web page +this to filter out what commenters and referrers (web page requestors) are accepted. See Section [link:#5.5.Preventing%20weblog%20spam%20%7Coutline[5.5]]for more information on spam prevention. @@ -1254,8 +1246,6 @@ users. * *Allow weblog comments*: By un-setting this you can turn off weblog comments on all weblogs in the system. -* *Allow trackbacks*: By un-setting this you can turn off incoming -trackbacks on all weblogs in the system. * *Autoformat comments*: If this is on, Roller will auto-format comments by adding in line-breaks where appropriate. * *Escape comment HTML*: By setting this, you can disallow HTML in @@ -1265,11 +1255,6 @@ some forms of cross-site scripting. notification of new comments. This won’t work unless you configured Roller properly for sending email as described in the Roller installation guide. -* *Enable verification of trackback links*: Trackback verification -checks each incoming trackback to verify that the site sending the -trackback actually links to the specific weblog entry that is the target -of the trackback. - image::user-guide-28-feed.png[] * *Default number of entries*: default number of entries to appear in