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..6f7d630c03 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
@@ -93,7 +93,7 @@ public String getEmail() {
* Value is always html escaped.
*/
public String getUrl() {
- return StringEscapeUtils.escapeHtml4(this.pojo.getUrl());
+ return StringEscapeUtils.escapeHtml4(this.pojo.getSafeUrl());
}
@@ -147,7 +147,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..8318c28e34 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
@@ -184,11 +184,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
deleted file mode 100644
index d722328dcf..0000000000
--- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/TrackbackLinkbackCommentValidator.java
+++ /dev/null
@@ -1,75 +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.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.
- */
-public class TrackbackLinkbackCommentValidator implements CommentValidator {
-
- private ResourceBundle bundle = ResourceBundle.getBundle("ApplicationResources");
-
- @Override
- public String getName() {
- return bundle.getString("comment.validator.trackbackLinkbackName");
- }
-
- @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;
- }
-
-}
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..903b56ffb8
--- /dev/null
+++ b/app/src/main/java/org/apache/roller/weblogger/util/CommentAuthorUrl.java
@@ -0,0 +1,39 @@
+/*
+ * 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 org.apache.commons.validator.routines.UrlValidator;
+
+/**
+ * Normalizes comment author URLs before they are rendered as links.
+ */
+public final class CommentAuthorUrl {
+
+ private static final UrlValidator VALIDATOR =
+ new UrlValidator(new String[] {"http", "https"});
+
+ private CommentAuthorUrl() {
+ }
+
+ public static String normalize(String value) {
+ if (value == null || value.isBlank()) {
+ return null;
+ }
+ String normalized = value.trim();
+ return VALIDATOR.isValid(normalized) ? normalized : null;
+ }
+}
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 66072c23f0..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
@@ -464,11 +457,6 @@ error.general=ERROR: Unexpected Exception [{0}] has been logged.
error.password.mismatch=Wrong username and password combination
error.unmatched.openid=Unknown or invalid OpenID URL
-error.trackback=Error sending trackback. Possible cause: incorrect \
-trackback URL. {0}
-error.trackbackNotAllowed=Error sending trackback. The site administrator \
-does not permit sending tracbacks to the URL you specified.
-
error.title.403=Access Denied
error.text.403=You do not have the privileges necessary to access the requested page.
@@ -1592,17 +1580,6 @@ weblogEdit.pinnedToMain.tooltip=Pin blog entry to top of front page weblog \
weblogEdit.searchDescription=Search Description
weblogEdit.searchDescription.tooltip=Short description of blog entry that gets \
placed in HTML header (if coded by your blog template) for SEO.
-weblogEdit.trackback=Trackback
-weblogEdit.sendTrackback=Send Trackback
-weblogEdit.trackbackUrl=Trackback URL
-
-weblogEdit.trackbackSuccess=Trackback succeeded.
-weblogEdit.trackbackFailure=Trackback failed, remote server said "{0}"
-weblogEdit.trackbackErrorTransport=Trackback failed, could not reach trackback URL. Are you sure you put in the right URL?
-weblogEdit.trackbackErrorResponse=Trackback failed, error in sending. Response was {0} - {1}
-weblogEdit.trackbackErrorParsing=Trackback failed, URL indicated success but response message was improperly formatted. Response was: {0}
-weblogEdit.trackbackError404=Trackback failed, could not reach trackback URL. Are you sure you put in the right URL?
-
weblogEdit.hasComments=Comments [{1}]
weblogEdit.enclosureURL=Enclosure URL
@@ -1758,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 360c1e9dda..cd51674d94 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
@@ -252,19 +250,15 @@ configForm.allowNewUsers=Erlaube das Anlegen neuer Benutzer?
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
@@ -340,8 +334,6 @@ error.text.403=Sie verf\u00FCgen nicht die notwendigen Rechte um auf die angefor
error.text.404=Die von Ihnen angeforderte Seite konnte auf diesem Server nicht gefunden werden.
error.title.403=Zugriff verweigert
error.title.404=Sorry! Wir haben das von Ihnen angeforderte Dokument nicht gefunden
-error.trackback=Fehler beim Senden des Trackbacks. M\u00F6gliche Ursache: Die Trackback-URL ist fehlerhaft. {0}
-error.trackbackNotAllowed=Fehler beim Abschicken des Trackbacks. Die Systemadministration erlaubt das Senden von Trackbacks an die von Ihnen angegebene URL nicht.
#---------------------------------------------------------------- Error messages
error.untranslated={0}
#---------------------------------------------------------------- Error messages
@@ -786,7 +778,6 @@ weblogEdit.rightToLeft=Text von rechts-nach-links lesen
weblogEdit.save=Als Entwurf speichern
weblogEdit.scheduled=geplant
weblogEdit.scheduledEntries=Geplante Eintr\u00E4ge
-weblogEdit.sendTrackback=Sende Trackback
weblogEdit.status=Status
weblogEdit.submitForReview=Zur Durchsicht einreichen
weblogEdit.submittedForReview=Eintrag zur Durchsicht eingereicht
@@ -798,14 +789,6 @@ weblogEdit.title=Titel
weblogEdit.title.editEntry=Eintrag bearbeiten
weblogEdit.title.newEntry=Neuer Eintrag
# ------------------------------------------------------------- User settings
-weblogEdit.trackback=Trackback
-weblogEdit.trackbackError404=Trackback fehlgeschlagen, Trackback URL konnte nicht erreicht werden. Sind Sie sicher, dass Sie die richtige URL eingegeben haben?
-weblogEdit.trackbackErrorParsing=Trackback fehlgeschlagen, URL ist korrekt, aber die Fehlerantwort war falsch formatiert. Antwort: {0}
-weblogEdit.trackbackErrorResponse=Trackback fehlgeschlagen, Fehlerantwort: {0} - {1}
-weblogEdit.trackbackErrorTransport=Trackback fehlgeschlagen, Trackback URL konnte nicht erreicht werden. Sind Sie sicher, dass Sie die richtige URL eingegeben haben?
-weblogEdit.trackbackFailure=Trackback fehlgeschlagen, Remote-Server meldet "{0}"
-weblogEdit.trackbackSuccess=Trackbacks erfolgt
-weblogEdit.trackbackUrl=Trackback URL
# ------------------------------------------------------------- Weblog edit
weblogEdit.unsaved=Nicht gesichert
weblogEdit.updateTime=Letzter Update
diff --git a/app/src/main/resources/ApplicationResources_es.properties b/app/src/main/resources/ApplicationResources_es.properties
index b8dcbb0b36..9f7facb6e7 100644
--- a/app/src/main/resources/ApplicationResources_es.properties
+++ b/app/src/main/resources/ApplicationResources_es.properties
@@ -138,10 +138,7 @@ configForm.allowNewUsers=\u00BFPermitir nuevos usuarios?
configForm.registrationUrl=URL de registro externo
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?
@@ -187,8 +184,6 @@ error.upload.filemax=Fichero mayor que el m\u00E1ximo permitido\: {0} MB
error.upload.forbiddenFile=Puede cargar s\u00F3lo ficheros acabados en {0}
error.general=ERROR\: Excepci\u00F3n inesperada [{0}] ha sido registrada.
error.password.mismatch=Nombre de usuario o contrase\u00F1a incorrectos
-error.trackback=Error al enviar referencia. Posible causa\: URL de referencia incorrecta. {0}
-error.trackbackNotAllowed=Error al enviar referencia. El administrador del sitio ha deshabilitado el env\u00EDo de referencias a la URL especificada.
error.title.403=Acceso denegado (404)
error.text.403=No tiene los privilegios necesarios para acceder a la p\u00E1gina solicitada
error.title.404=\!Lo sentimos\! No se ha podido encontrar su documento (404)
@@ -485,9 +480,6 @@ weblogEdit.pluginsToApply=Plugins que aplicar
weblogEdit.miscSettings=Ajustes de configuraci\u00F3n miscel\u00E1neos
weblogEdit.rightToLeft=El texto se lee de derecha a izquierda
weblogEdit.pinnedToMain=Poner en principal
-weblogEdit.trackback=Referencia
-weblogEdit.sendTrackback=Enviar referencia
-weblogEdit.trackbackUrl=URL de la referencia
weblogEdit.hasComments=Comentarios [{0}]
weblogEdit.mediaCastFailedFetchingInfo=No se puede contactar con el servidor MediaCast. Compruebe el nombre del host en la URL.
weblogEdit.mediaCastUrlMalformed=La URL de MediaCast no estaba bien formada.
diff --git a/app/src/main/resources/ApplicationResources_fr.properties b/app/src/main/resources/ApplicationResources_fr.properties
index 124fd323d7..9804c6ee48 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
@@ -268,15 +266,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,11 +352,6 @@ error.general=ERREUR : une erreur inattendue [{0}] est survenue.
error.password.mismatch=Votre nom d'utilisateur ou votre mot de passe est incorrect.
-error.trackback=Une erreur est survenue durant l'envoi du trackback, probablement due à \
-une adresse URL incorrecte. {0}
-#FIXME
-error.trackbackNotAllowed=Une erreur est survenue durant l'envoi du trackback. \
-L'administrateur de ce site a interdit l'envoi de trackbacks à l'adresse URL que vous avez spécifiée.
errorPage.title=Erreur inattendue
errorPage.message=Une erreur inattendue est survenue durant l'execution de Roller. Celle ci a été enregistrée \
@@ -971,9 +960,6 @@ weblogEdit.miscSettings=Paramètres avancés
weblogEdit.rightToLeft=Lecture de droite à gauche
weblogEdit.pinnedToMain=Collé à la page principale
-weblogEdit.trackback=Trackback
-weblogEdit.sendTrackback=Envoyer un trackback
-weblogEdit.trackbackUrl=URL du trackback
weblogEdit.hasComments=Commentaires [{0}]
#FIXME ALLL THOSE DOWNTHERE - WHAT IS ENCLOSURE
@@ -1116,7 +1102,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 8802be030d..0808e96582 100644
--- a/app/src/main/resources/ApplicationResources_ja.properties
+++ b/app/src/main/resources/ApplicationResources_ja.properties
@@ -210,10 +210,7 @@ configForm.registrationUrl=\u5916\u90E8\u5411\u3051\u767B\u9332URL
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
@@ -291,9 +288,6 @@ error.upload.forbiddenFile=\u5F62\u5F0F{0}\u306E\u30A2\u30C3\u30D7\u30ED\u30FC\u
error.general=\u4E0D\u660E\u306A\u4F8B\u5916[{0}]\u304C\u8A18\u9332\u3055\u308C\u307E\u3057\u305F
error.password.mismatch=\u30E6\u30FC\u30B6\u540D\u304B\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u8AA4\u3063\u3066\u3044\u307E\u3059
-error.trackback=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u306E\u9001\u4FE1\u30A8\u30E9\u30FC: \u8003\u3048\u3089\u308C\u308B\u539F\u56E0: \u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AFURL\u306B\u8AA4\u308A\u304C\u3042\u308A\u307E\u3059 {0}
-error.trackbackNotAllowed=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u306E\u9001\u4FE1\u30A8\u30E9\u30FC\uFF1A \
-\u30B5\u30A4\u30C8\u30AA\u30FC\u30CA\u30FC\u306F\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u9001\u4FE1\u3092\u8A31\u53EF\u3057\u3066\u3044\u307E\u305B\u3093
error.title.403=\u30A2\u30AF\u30BB\u30B9\u304C\u62D2\u5426\u3055\u308C\u307E\u3057\u305F
error.text.403=\u3042\u306A\u305F\u306B\u306F\u3053\u306E\u30DA\u30FC\u30B8\u3078\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u305F\u3081\u306E\u6A29\u9650\u304C\u4E0E\u3048\u3089\u308C\u3066\u3044\u307E\u305B\u3093
@@ -728,9 +722,6 @@ 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
-weblogEdit.trackback=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF
-weblogEdit.sendTrackback=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u3092\u9001\u4FE1\u3059\u308B
-weblogEdit.trackbackUrl=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AFURL
# -------------------------------------------------------- Weblog entries Pager
@@ -955,7 +946,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
@@ -1035,8 +1025,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
@@ -1138,12 +1126,10 @@ themeEditor.setCustomTheme.success=\u5171\u6709\u30C6\u30FC\u30DE {0} \u304C\u30
planetGroups.column.subscriptions=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3
mediaFileImageChooser.subtitle=\u753B\u50CF\u306E\u9078\u629E
mediaFileView.filesOfSize=\u30B5\u30A4\u30BA\u304C {0} {1} {2} \u306E\u30D5\u30A1\u30A4\u30EB
-weblogEdit.trackbackErrorResponse=\u9001\u4FE1\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u305F\u305F\u3081\u3001\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30EC\u30B9\u30DD\u30F3\u30B9\u306F\u3001\u3053\u306E\u3088\u3046\u306A\u5185\u5BB9\u3067\u3057\u305F {0} - {1}
mediaFile.delete.error=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB {0} \u3092\u524A\u9664\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
statCount.weblogEntryCommentCountType=\u30A8\u30F3\u30C8\u30EA\u30FC\u306E\u30B3\u30E1\u30F3\u30C8\u6570
configForm.allowAnalyticsCodeOverride=\u500B\u3005\u306E\u30D6\u30ED\u30B0\u3067\u306E\u4E0A\u66F8\u304D\u3092\u8A31\u53EF\u3057\u307E\u3059\u304B?
yourWebsites.theme=\u30C6\u30FC\u30DE
-weblogEdit.trackbackErrorTransport=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AFURL\u306B\u5230\u9054\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002URL\u306F\u6B63\u3057\u3044\u3067\u3059\u304B?
configForm.defaultAnalyticsTrackingCode=\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30C8\u30E9\u30C3\u30AD\u30F3\u30B0\u30FB\u30B3\u30FC\u30C9
mediaFileView.sortBy=\u3053\u306E\u5C5E\u6027\u3067\u30BD\u30FC\u30C8\:
MediaFile.error.nameNull=\u540D\u524D\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059
@@ -1203,7 +1189,6 @@ generic.changes.saved=\u5909\u66F4\u304C\u4FDD\u5B58\u3055\u308C\u307E\u3057\u30
error.commentPostFailedEmailAddress=\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u304C\u4E0D\u6B63\u3067\u3059\u3002
ConfigForm.title=Planet \u30BF\u30A4\u30C8\u30EB\t
mediaFileView.viewFolder=\u3053\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u8868\u793A\:
-weblogEdit.trackbackFailure=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30EA\u30E2\u30FC\u30C8\u30FB\u30B5\u30FC\u30D0\u306F\u3001\u3053\u306E\u3088\u3046\u306B\u8FD4\u7B54\u3057\u307E\u3057\u305F "{0}"
mediaFile.move.confirm=\u9078\u629E\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u79FB\u52D5\u3057\u3066\u3088\u308D\u3057\u3044\u3067\u3059\u304B?
pingTarget.updated=Ping\u30BF\u30FC\u30B2\u30C3\u30C8 "{0}" \u304C\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F
generic.name=\u540D\u524D
@@ -1289,7 +1274,6 @@ pageRemoves.subtitle=\u30DA\u30FC\u30B8\u524A\u9664\u306E\u78BA\u8A8D
userAdmin.userSaved=\u30E6\u30FC\u30B6\u60C5\u5831\u304C\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F
mediaFileEdit.subtitle=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB {0} \u306E\u7DE8\u96C6
mediaFileView.le=<\=
-weblogEdit.trackbackError404=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AFURL\u306B\u5230\u9054\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002URL\u306F\u6B63\u3057\u3044\u3067\u3059\u304B?
macro.weblog.url=URL\:
weblogEdit.enclosureURL.tooltip=\u3053\u306E\u30D6\u30ED\u30B0\u30FB\u30A8\u30F3\u30C8\u30EA\u30FC\u306ERSS\u3068Atom\u30D5\u30A3\u30FC\u30C9\u306B\u57CB\u3081\u8FBC\u307E\u308C\u308B\u3001Podcast\u307E\u305F\u306F\u4ED6\u306E\u30DE\u30EB\u30C1\u30E1\u30C7\u30A3\u30A2URL
mediaFile.includeInGallery.error=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB {0} \u3092\u30AE\u30E3\u30E9\u30EA\u30FC\u306B\u8FFD\u52A0\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
@@ -1315,7 +1299,6 @@ maintenance.prompt.reset=\u30D6\u30ED\u30B0\u306E\u30A2\u30AF\u30BB\u30B9\u30AB\
userRegister.tip.openid.hybrid=\u30E6\u30FC\u30B6\u540D\u3068\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u4F7F\u3063\u3066\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u304B\u3001OpenID\u3092\u4F7F\u3063\u3066\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u304B\u3001\u9078\u629E\u3067\u304D\u307E\u3059\u3002\u5F8C\u8005\u3092\u9078\u629E\u3059\u308B\u5834\u5408\u306F\u3001\u30D1\u30B9\u30EF\u30FC\u30C9\u6B04\u3092\u7A7A\u767D\u306E\u307E\u307E\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
mediaFileSidebar.actions=\u30A2\u30AF\u30B7\u30E7\u30F3
bookmarksForm.deleteFolder=\u30D5\u30A9\u30EB\u30C0\u306E\u524A\u9664
-weblogEdit.trackbackErrorParsing=URL\u306F\u6B63\u5E38\u3067\u3059\u304C\u3001\u30EC\u30B9\u30DD\u30F3\u30B9\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u4E0D\u6B63\u306A\u5F62\u5F0F\u3067\u3042\u3063\u305F\u305F\u3081\u3001\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30EC\u30B9\u30DD\u30F3\u30B9\u306F\u3001\u3053\u306E\u3088\u3046\u306A\u5185\u5BB9\u3067\u3057\u305F\: {0}
installer.databaseUpgradeNeededExplanation=Roller\u306F\u30BF\u30A4\u30D7 [{0}] \u306E\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3078\u306E\u63A5\u7D9A\u306B\u6210\u529F\u3057\u3001\u30C6\u30FC\u30D6\u30EB\u3092\u767A\u898B\u3057\u307E\u3057\u305F\u304C\u3001\u30C6\u30FC\u30D6\u30EB\u306E\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u304C\u5FC5\u8981\u3067\u3059\u3002
mediaFileView.noFiles=\u3053\u306E\u30D5\u30A9\u30EB\u30C0\u306F\u7A7A\u3067\u3059\u3002
mediaFileAdd.pageTip=\u3053\u306E\u30DA\u30FC\u30B8\u3067\u306F\u3001\u6700\u59275\u3064\u307E\u3067\u306E\u65B0\u3057\u3044\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3067\u304D\u307E\u3059\u3002\u4EE5\u4E0B\u306E\u30D5\u30A9\u30FC\u30E0\u306B\u5165\u529B\u3055\u308C\u305F\u5185\u5BB9\u306F\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u308B\u5168\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002
@@ -1339,7 +1322,6 @@ commonPingTargets.error.disabling=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u7121
stylesheetEdit.revert=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u5FA9\u5143
weblogEdit.submitForReview=\u30EC\u30D3\u30E5\u30FC\u4F9D\u983C\u3092\u9001\u4FE1
mediaFileView.filesOfType=\u30BF\u30A4\u30D7\u304C {0} \u306E\u30D5\u30A1\u30A4\u30EB
-weblogEdit.trackbackSuccess=\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF\u306B\u6210\u529F\u3057\u307E\u3057\u305F\u3002
categoriesForm.imageUrl=\u753B\u50CF\u306EURL
userAdmin.tip.openIdUrl=Open ID\u8B58\u5225\u5B50(URL\u5F62\u5F0F)\u3002
macro.weblog.searchalert=\u691C\u7D22\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
diff --git a/app/src/main/resources/ApplicationResources_ko.properties b/app/src/main/resources/ApplicationResources_ko.properties
index 0de377cae7..baa3249e99 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.
@@ -279,16 +277,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?
@@ -380,9 +374,6 @@ error.upload.forbiddenFile=\ud5c8\uc6a9\ub41c \ud655\uc7a5\uc790\uc640 \ud5c8\uc
error.general=\uc624\ub958: \uc608\uae30\uce58 \uc54a\uc740 \uc624\ub958 [{0}]\uc774(\uac00) \ub85c\uadf8\uc5d0 \uae30\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
error.password.mismatch=\uc0ac\uc6a9\uc790\uba85\uacfc \ube44\ubc00\ubc88\ud638 \uc870\ud569 \uc624\ub958
-error.trackback=\ud2b8\ub799\ubc31 \uc804\uc1a1 \uc624\ub958. \uc608\uc0c1 \uc6d0\uc778: \ubd80\uc815\ud655\ud55c \ud2b8\ub799\ubc31 URL. {0}
-error.trackbackNotAllowed=\ud2b8\ub799\ubc31 \uc804\uc1a1 \uc624\ub958. \uc0ac\uc774\ud2b8 \uad00\ub9ac\uc790\uac00 \uadc0\ud558\uac00 \uc124\uc815\ud55c URL\ub85c\uc758 \
-\ud2b8\ub799\ubc31 \uc804\uc1a1\uc744 \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
errorPage.title=\uc608\uae30\uce58 \uc54a\uc740 \uc624\ub958
errorPage.message=\uc2dc\uc2a4\ud15c\uc774 \uc608\uae30\uce58 \uc54a\uc740 \uc624\ub958\ub97c \ubc1c\uacac\ud558\uc5ec \ub85c\uadf8\uc5d0 \uae30\ub85d\ud558\uc600\uc2b5\ub2c8\ub2e4.
@@ -1082,16 +1073,7 @@ weblogEdit.miscSettings=\uace0\uae09 \ud658\uacbd \uc124\uc815 \uc815\ubcf4
weblogEdit.rightToLeft=\ud14d\uc2a4\ud2b8\ub294 \uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd\uc73c\ub85c
weblogEdit.pinnedToMain=\uba54\uc778\uc73c\ub85c \uace0\uc815
-weblogEdit.trackback=\ud2b8\ub799\ubc31
-weblogEdit.sendTrackback=\ud2b8\ub799\ubc31 \uc804\uc1a1
-weblogEdit.trackbackUrl=\ud2b8\ub799\ubc31 URL
-weblogEdit.trackbackSuccess=\ud2b8\ub799\ubc31\uc774 \uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4.
-weblogEdit.trackbackFailure=\ud2b8\ub799\ubc31\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc6d0\uaca9 \uc11c\ubc84\uc758 \uc751\ub2f5: "{0}"
-weblogEdit.trackbackErrorTransport=\ud2b8\ub799\ubc31\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \ud2b8\ub799\ubc31 URL\uc5d0 \uc811\uadfc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc124\uc815\ud55c URL\uc744 \ub2e4\uc2dc \ud655\uc778\ud574 \uc8fc\uc2ed\uc2dc\uc624.
-weblogEdit.trackbackErrorResponse=\ud2b8\ub799\ubc31 \uc804\uc1a1 \uc911 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \uc751\ub2f5\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4: {0} - {1}
-weblogEdit.trackbackErrorParsing=\ud2b8\ub799\ubc31\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. URL\uc5d0 \uc811\uadfc\ud558\uc600\uc73c\ub098, \uc751\ub2f5 \uba54\uc2dc\uc9c0\uac00 \uc801\uc808\ud55c \ud3ec\ub9f7\uc774 \uc544\ub2d9\ub2c8\ub2e4. \uc751\ub2f5\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4: {0}
-weblogEdit.trackbackError404=\ud2b8\ub799\ubc31\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \ud2b8\ub799\ubc31 URL\uc5d0 \uc811\uadfc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc124\uc815\ud55c URL\uc744 \ub2e4\uc2dc \ud655\uc778\ud574 \uc8fc\uc2ed\uc2dc\uc624.
weblogEdit.hasComments=\uc758\uacac, [{1}]
@@ -1335,4 +1317,4 @@ user.account.activation.mail.content=\
welcome.user.account.activated=\uadc0\ud558\uc758 \uc0ac\uc6a9\uc790 \uacc4\uc815\uc774 \ud65c\uc131\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
welcome.user.account.not.activated=\uc2dc\uc2a4\ud15c\uc5d0 \ub85c\uadf8\uc778\ud558\uc2dc\ub824\uba74, \
\uc804\uc790\uc6b0\ud3b8\uc744 \ud1b5\ud574 \uadc0\ud558\uc5d0\uac8c \uc804\uc1a1\ub41c \ub9c1\ud06c\ub97c \ud074\ub9ad\ud568\uc73c\ub85c\uc368, \
-\uadc0\ud558\uc758 \uc0ac\uc6a9\uc790 \uacc4\uc815\uc744 \ud65c\uc131\ud654\uc2dc\ucf1c\uc57c \ud569\ub2c8\ub2e4.
\ No newline at end of file
+\uadc0\ud558\uc758 \uc0ac\uc6a9\uc790 \uacc4\uc815\uc744 \ud65c\uc131\ud654\uc2dc\ucf1c\uc57c \ud569\ub2c8\ub2e4.
diff --git a/app/src/main/resources/ApplicationResources_ru.properties b/app/src/main/resources/ApplicationResources_ru.properties
index ce5c69559c..96909a3fc5 100644
--- a/app/src/main/resources/ApplicationResources_ru.properties
+++ b/app/src/main/resources/ApplicationResources_ru.properties
@@ -159,9 +159,7 @@ configForm.registrationUrl=\u0410\u0434\u0440\u0435\u0441 \u0432\u043D\u0435\u04
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?
@@ -236,10 +234,6 @@ error.upload.forbiddenFile=\u041C\u043E\u0436\u043D\u043E \u0437\u0430\u0433\u04
error.general=\u041E\u0448\u0438\u0431\u043A\u0430: \u0417\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u043D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 [{0}]
error.password.mismatch=\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u044F \u0438\u043C\u0435\u043D\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0438 \u043F\u0430\u0440\u043E\u043B\u044F
-error.trackback=\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0438 trackback. \u0412\u043E\u0437\u043C\u043E\u0436\u043D\u0430\u044F \u043F\u0440\u0438\u0447\u0438\u043D\u0430:\u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0430\u044F \
-trackback URL. {0}
-error.trackbackNotAllowed=\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0438 trackback.\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440 \u0441\u0430\u0439\u0442\u0430 \ \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C
-tracbacks \u043F\u043E URL, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C\u0443 \u0412\u0430\u043C\u0438.
error.title.403=\u0414\u043E\u0441\u0442\u0443\u043F \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D (403)
error.text.403=\u0423 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0430\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 \ \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u043E\u0439 \u0412\u0430\u043C\u0438
@@ -705,12 +699,6 @@ weblogEdit.miscSettings = \u0420\u0430\u0437\u043D\u044B\u0435 \u043D\u0430\u044
weblogEdit.rightToLeft = \u0422\u0435\u043A\u0441\u0442 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0441\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E
weblogEdit.pinnedToMain = \u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u044F\u0435\u0442\u0441\u044F \u043A \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C\u0443
-weblogEdit.trackback = Trackback
-weblogEdit.trackbacks = Trackbacks
-weblogEdit.sendTrackback = \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C Trackback
-weblogEdit.trackbackUrl = Trackback URL
-weblogEdit.trackbackResults = Trackback \u043E\u0442\u0432\u0435\u0442\u0430 (\u043A\u043E\u0434 \u043E\u0448\u0438\u0431\u043A\u0438 0, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \
-\u0423\u0441\u043F\u0435\u0445): < br / > < br / > {0}
weblogEdit.comment=\u041A\u043E\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439
diff --git a/app/src/main/resources/ApplicationResources_zh_CN.properties b/app/src/main/resources/ApplicationResources_zh_CN.properties
index 93ac844968..a5fa212005 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
@@ -345,16 +343,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,9 +455,6 @@ 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.trackback=\u53D1\u9001\u5F15\u7528\u65F6\u51FA\u9519\u3002\u53EF\u80FD\u539F\u56E0\uFF1A\u5F15\u7528URL\u65E0\u6548\u3002 {0}
-
-error.trackbackNotAllowed=\u53D1\u9001\u5F15\u7528\u65F6\u51FA\u9519\u3002\u7AD9\u70B9\u7BA1\u7406\u5458\u4E0D\u5141\u8BB8\u5411\u6307\u5B9A\u7684URL\u53D1\u9001\u5F15\u7528\u3002
error.title.403=\u62D2\u7EDD\u8BBF\u95EE
@@ -1589,16 +1580,7 @@ weblogEdit.pinnedToMain.tooltip=\u5C06\u535A\u5BA2\u6587\u7AE0\u5728\u4E3B\u9875
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.trackback=\u5F15\u7528
-weblogEdit.sendTrackback=\u53D1\u9001\u5F15\u7528
-weblogEdit.trackbackUrl=\u5F15\u7528URL
-weblogEdit.trackbackSuccess=\u5F15\u7528\u6210\u529F\u3002
-weblogEdit.trackbackFailure=\u5F15\u7528\u5931\u8D25\uFF0C\u56DE\u5E94\u6D88\u606F "{0}"
-weblogEdit.trackbackErrorTransport=\u5F15\u7528\u5931\u8D25\uFF0C\u65E0\u6CD5\u6253\u5F00\u5F15\u7528URL\uFF0C\u5730\u5740\u662F\u5426\u6B63\u786E\uFF1F
-weblogEdit.trackbackErrorResponse=\u5F15\u7528\u5931\u8D25\uFF0C\u56DE\u5E94\u6D88\u606F {0} - {1}
-weblogEdit.trackbackErrorParsing=\u5F15\u7528\u5931\u8D25\uFF0C\u76EE\u6807\u8FD4\u56DE\u7684\u4FE1\u606F\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u8FD4\u56DE\u4FE1\u606F: {0}
-weblogEdit.trackbackError404=\u5F15\u7528\u5931\u8D25\uFF0C\u65E0\u6CD5\u6253\u5F00\u5F15\u7528URL\uFF0C\u5730\u5740\u662F\u5426\u6B63\u786E\uFF1F
weblogEdit.hasComments=\u8BC4\u8BBA [{1}]
@@ -1877,5 +1859,3 @@ 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..fef263699e 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
@@ -273,12 +273,12 @@
-
+
:
-
+
+ value="#comment.safeUrl"/>
diff --git a/app/src/main/webapp/WEB-INF/velocity/weblog.vm b/app/src/main/webapp/WEB-INF/velocity/weblog.vm
index 212f376562..2a4aad32ef 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)
@@ -114,30 +113,6 @@ Show RSS, Atom and RSD auto-discovery links as HTML link elements.
#end
-#**
- * 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
-#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
@@ -1042,4 +1017,3 @@ Include Javascript code needed for expanding folder macros (undocumented).
-
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 9be0d2c0fb..ce424ec29d 100644
--- a/app/src/main/webapp/themes/base.css
+++ b/app/src/main/webapp/themes/base.css
@@ -212,11 +212,6 @@ div#searchAgain {
border: 1px solid #999;
font-size: 1em;
}
-div.trackbackUrl {
- background: transparent;
- margin: 0px 10px 10px 10px;
- text-align: left;
-}
#nextEntry {
text-align: right;
}
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 @@
#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 @@
#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..cb40b389d9
--- /dev/null
+++ b/app/src/test/java/org/apache/roller/weblogger/pojos/wrapper/WeblogEntryCommentWrapperTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.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 omitsUnsupportedOrMalformedAuthorUrls() {
+ WeblogEntryComment comment = new WeblogEntryComment();
+ WeblogEntryCommentWrapper wrapper = WeblogEntryCommentWrapper.wrap(comment, null);
+
+ comment.setUrl("javascript:alert(1)");
+ assertNull(wrapper.getUrl());
+ assertNull(comment.getSafeUrl());
+
+ comment.setUrl("//example.org/profile");
+ assertNull(wrapper.getUrl());
+
+ comment.setUrl("not a url");
+ assertNull(wrapper.getUrl());
+
+ comment.setUrl(" ");
+ assertNull(wrapper.getUrl());
+ }
+}
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..d7f85d47a8
--- /dev/null
+++ b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/IncomingTrackbackRemovalTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.weblogger.ui.rendering.model.ConfigModel;
+import org.apache.roller.weblogger.ui.rendering.model.URLModel;
+import org.apache.roller.weblogger.util.BannedwordslistChecker;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class IncomingTrackbackRemovalTest {
+
+ @Test
+ void incomingTrackbackClassesAndHelpersAreRemoved() {
+ 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(ClassNotFoundException.class, () -> Class.forName(
+ "org.apache.roller.weblogger.ui.rendering.plugins.comments.TrackbackLinkbackCommentValidator"));
+ assertThrows(NoSuchMethodException.class,
+ () -> URLModel.class.getMethod("trackback", String.class));
+ assertThrows(NoSuchMethodException.class,
+ () -> ConfigModel.class.getMethod("getTrackbacksEnabled"));
+ assertThrows(NoSuchMethodException.class,
+ () -> BannedwordslistChecker.class.getMethod(
+ "checkTrackback",
+ org.apache.roller.weblogger.pojos.WeblogEntryComment.class));
+ }
+
+ @Test
+ void deploymentAndRuntimeConfigurationDoNotExposeTrackbacks() throws Exception {
+ assertFileDoesNotContain("src/main/webapp/WEB-INF/web.xml", "trackback");
+ assertResourceDoesNotContain(
+ "org/apache/roller/weblogger/config/runtimeConfigDefs.xml", "trackback");
+ assertFileDoesNotContain(
+ "src/main/webapp/WEB-INF/velocity/weblog.vm", "trackback");
+ }
+
+ private void assertFileDoesNotContain(String path, String value) throws Exception {
+ String content = Files.readString(Path.of(path), StandardCharsets.UTF_8);
+ assertFalse(content.toLowerCase().contains(value), path);
+ }
+
+ 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
- }
-
-
-}