getHeaderNames() {
+ return wrapped.getHeaderNames();
+ }
+
+ @Override
+ public int getIntHeader(String name) {
+ return wrapped.getIntHeader(name);
+ }
+}
diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomServlet.java
new file mode 100644
index 0000000000..e30033ed24
--- /dev/null
+++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomServlet.java
@@ -0,0 +1,368 @@
+/*
+ * 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.webservices.atomprotocol;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Writer;
+import java.util.Collections;
+import java.util.Locale;
+
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import org.jdom2.Document;
+import org.jdom2.output.Format;
+import org.jdom2.output.XMLOutputter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.rometools.propono.atom.common.AtomService;
+import com.rometools.propono.atom.common.Categories;
+import com.rometools.propono.atom.server.AtomException;
+import com.rometools.propono.atom.server.AtomHandler;
+import com.rometools.propono.atom.server.AtomMediaResource;
+import com.rometools.propono.atom.server.AtomRequest;
+import com.rometools.rome.feed.atom.Content;
+import com.rometools.rome.feed.atom.Entry;
+import com.rometools.rome.feed.atom.Feed;
+import com.rometools.rome.feed.atom.Link;
+import com.rometools.rome.io.WireFeedOutput;
+import com.rometools.rome.io.impl.Atom10Generator;
+import com.rometools.rome.io.impl.Atom10Parser;
+import org.apache.roller.weblogger.util.Utilities;
+
+/**
+ * Forked from rome-propono's AtomServlet to remove the dependency on propono's
+ * servlet class, which has no Jakarta-compatible release. This servlet directly
+ * creates a {@link RollerAtomHandler} instead of going through propono's
+ * AtomHandlerFactory/FactoryFinder lookup.
+ *
+ * Handles Atom Publishing Protocol requests by parsing incoming XML into
+ * ROME Atom {@link Entry} objects, passing those to the handler, and
+ * serializing entries and feeds returned by the handler to the response.
+ */
+public class RollerAtomServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ /** Feed type supported by this servlet */
+ public static final String FEED_TYPE = "atom_1.0";
+
+ private static String contextDirPath = null;
+
+ private static final Logger LOG = LoggerFactory.getLogger(RollerAtomServlet.class);
+
+ static {
+ Atom10Parser.setResolveURIs(true);
+ }
+
+ /**
+ * Create an Atom request handler directly, bypassing propono's factory lookup.
+ */
+ private AtomHandler createAtomRequestHandler(final HttpServletRequest request, final HttpServletResponse response) {
+ return new RollerAtomHandler(request, response);
+ }
+
+ /**
+ * Handles an Atom GET by calling handler and writing results to response.
+ */
+ @Override
+ protected void doGet(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException {
+ LOG.debug("Entering");
+ final AtomHandler handler = createAtomRequestHandler(req, res);
+ final String userName = handler.getAuthenticatedUsername();
+ if (userName != null) {
+ final AtomRequest areq = new RollerAtomRequestImpl(req);
+ try {
+ if (handler.isAtomServiceURI(areq)) {
+ // return an Atom Service document
+ final AtomService service = handler.getAtomService(areq);
+ final Document doc = service.serviceToDocument();
+ res.setContentType("application/atomsvc+xml; charset=utf-8");
+ final Writer writer = res.getWriter();
+ final XMLOutputter outputter = new XMLOutputter();
+ outputter.setFormat(Format.getPrettyFormat());
+ outputter.output(doc, writer);
+ writer.close();
+ res.setStatus(HttpServletResponse.SC_OK);
+ } else if (handler.isCategoriesURI(areq)) {
+ final Categories cats = handler.getCategories(areq);
+ res.setContentType("application/xml");
+ final Writer writer = res.getWriter();
+ final Document catsDoc = new Document();
+ catsDoc.setRootElement(cats.categoriesToElement());
+ final XMLOutputter outputter = new XMLOutputter();
+ outputter.output(catsDoc, writer);
+ writer.close();
+ res.setStatus(HttpServletResponse.SC_OK);
+ } else if (handler.isCollectionURI(areq)) {
+ // return a collection
+ final Feed col = handler.getCollection(areq);
+ col.setFeedType(FEED_TYPE);
+ final WireFeedOutput wireFeedOutput = new WireFeedOutput();
+ final Document feedDoc = wireFeedOutput.outputJDom(col);
+ res.setContentType("application/atom+xml; charset=utf-8");
+ final Writer writer = res.getWriter();
+ final XMLOutputter outputter = new XMLOutputter();
+ outputter.setFormat(Format.getPrettyFormat());
+ outputter.output(feedDoc, writer);
+ writer.close();
+ res.setStatus(HttpServletResponse.SC_OK);
+ } else if (handler.isEntryURI(areq)) {
+ // return an entry
+ final Entry entry = handler.getEntry(areq);
+ if (entry != null) {
+ res.setContentType("application/atom+xml; type=entry; charset=utf-8");
+ final Writer writer = res.getWriter();
+ Atom10Generator.serializeEntry(entry, writer);
+ writer.close();
+ } else {
+ res.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ }
+ } else if (handler.isMediaEditURI(areq)) {
+ final AtomMediaResource entry = handler.getMediaResource(areq);
+ res.setContentType(entry.getContentType());
+ res.setContentLength((int) entry.getContentLength());
+ Utilities.copyInputToOutput(entry.getInputStream(), res.getOutputStream());
+ res.getOutputStream().flush();
+ res.getOutputStream().close();
+ } else {
+ res.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ }
+ } catch (final AtomException ae) {
+ res.sendError(ae.getStatus(), ae.getMessage());
+ LOG.debug("An error occurred while processing GET", ae);
+ } catch (final Exception e) {
+ res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+ LOG.debug("An error occurred while processing GET", e);
+ }
+ } else {
+ res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\"");
+ res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+ }
+ LOG.debug("Exiting");
+ }
+
+ /**
+ * Handles an Atom POST by calling handler to identify URI, reading/parsing
+ * data, calling handler and writing results to response.
+ */
+ @Override
+ protected void doPost(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException {
+ LOG.debug("Entering");
+ final AtomHandler handler = createAtomRequestHandler(req, res);
+ final String userName = handler.getAuthenticatedUsername();
+ if (userName != null) {
+ final AtomRequest areq = new RollerAtomRequestImpl(req);
+ try {
+ if (handler.isCollectionURI(areq)) {
+
+ final String contentType = req.getContentType();
+ if (contentType != null && contentType.startsWith("application/atom+xml")) {
+
+ // parse incoming entry
+ final Entry entry = Atom10Parser.parseEntry(
+ new BufferedReader(new InputStreamReader(req.getInputStream(), "UTF-8")),
+ null, Locale.US);
+
+ // call handler to post it
+ final Entry newEntry = handler.postEntry(areq, entry);
+
+ // set Location and Content-Location headers
+ for (final Object element : newEntry.getOtherLinks()) {
+ final Link link = (Link) element;
+ if ("edit".equals(link.getRel())) {
+ res.addHeader("Location", link.getHrefResolved());
+ break;
+ }
+ }
+ for (final Object element : newEntry.getAlternateLinks()) {
+ final Link link = (Link) element;
+ if ("alternate".equals(link.getRel())) {
+ res.addHeader("Content-Location", link.getHrefResolved());
+ break;
+ }
+ }
+
+ // write entry back out to response
+ res.setStatus(HttpServletResponse.SC_CREATED);
+ res.setContentType("application/atom+xml; type=entry; charset=utf-8");
+
+ final Writer writer = res.getWriter();
+ Atom10Generator.serializeEntry(newEntry, writer);
+ writer.close();
+
+ } else if (contentType != null) {
+
+ // get incoming title and slug from HTTP header
+ final String title = areq.getHeader("Title");
+
+ // create new entry for resource, set title and type
+ final Entry resource = new Entry();
+ resource.setTitle(title);
+ final Content content = new Content();
+ content.setType(areq.getContentType());
+ resource.setContents(Collections.singletonList(content));
+
+ // hand input stream off to handler to post file
+ final Entry newEntry = handler.postMedia(areq, resource);
+
+ // set Location and Content-Location headers
+ for (final Object element : newEntry.getOtherLinks()) {
+ final Link link = (Link) element;
+ if ("edit".equals(link.getRel())) {
+ res.addHeader("Location", link.getHrefResolved());
+ break;
+ }
+ }
+ for (final Object element : newEntry.getAlternateLinks()) {
+ final Link link = (Link) element;
+ if ("alternate".equals(link.getRel())) {
+ res.addHeader("Content-Location", link.getHrefResolved());
+ break;
+ }
+ }
+
+ res.setStatus(HttpServletResponse.SC_CREATED);
+ res.setContentType("application/atom+xml; type=entry; charset=utf-8");
+
+ final Writer writer = res.getWriter();
+ Atom10Generator.serializeEntry(newEntry, writer);
+ writer.close();
+
+ } else {
+ res.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "No content-type specified in request");
+ }
+
+ } else {
+ res.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid collection specified in request");
+ }
+ } catch (final AtomException ae) {
+ res.sendError(ae.getStatus(), ae.getMessage());
+ LOG.debug("An error occurred while processing POST", ae);
+ } catch (final Exception e) {
+ res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+ LOG.debug("An error occurred while processing POST", e);
+ }
+ } else {
+ res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\"");
+ res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+ }
+ LOG.debug("Exiting");
+ }
+
+ /**
+ * Handles an Atom PUT by calling handler to identify URI, reading/parsing
+ * data, calling handler and writing results to response.
+ */
+ @Override
+ protected void doPut(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException {
+ LOG.debug("Entering");
+ final AtomHandler handler = createAtomRequestHandler(req, res);
+ final String userName = handler.getAuthenticatedUsername();
+ if (userName != null) {
+ final AtomRequest areq = new RollerAtomRequestImpl(req);
+ try {
+ if (handler.isEntryURI(areq)) {
+
+ // parse incoming entry
+ final Entry unsavedEntry = Atom10Parser.parseEntry(
+ new BufferedReader(new InputStreamReader(req.getInputStream(), "UTF-8")),
+ null, Locale.US);
+
+ // call handler to put entry
+ handler.putEntry(areq, unsavedEntry);
+
+ res.setStatus(HttpServletResponse.SC_OK);
+
+ } else if (handler.isMediaEditURI(areq)) {
+
+ // hand input stream to handler
+ handler.putMedia(areq);
+
+ res.setStatus(HttpServletResponse.SC_OK);
+
+ } else {
+ res.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ }
+ } catch (final AtomException ae) {
+ res.sendError(ae.getStatus(), ae.getMessage());
+ LOG.debug("An error occurred while processing PUT", ae);
+ } catch (final Exception e) {
+ res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+ LOG.debug("An error occurred while processing PUT", e);
+ }
+ } else {
+ res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\"");
+ res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ }
+ LOG.debug("Exiting");
+ }
+
+ /**
+ * Handle Atom DELETE by calling appropriate handler.
+ */
+ @Override
+ protected void doDelete(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException {
+ LOG.debug("Entering");
+ final AtomHandler handler = createAtomRequestHandler(req, res);
+ final String userName = handler.getAuthenticatedUsername();
+ if (userName != null) {
+ final AtomRequest areq = new RollerAtomRequestImpl(req);
+ try {
+ if (handler.isEntryURI(areq)) {
+ handler.deleteEntry(areq);
+ res.setStatus(HttpServletResponse.SC_OK);
+ } else {
+ res.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ }
+ } catch (final AtomException ae) {
+ res.sendError(ae.getStatus(), ae.getMessage());
+ LOG.debug("An error occurred while processing DELETE", ae);
+ } catch (final Exception e) {
+ res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+ LOG.debug("An error occurred while processing DELETE", e);
+ }
+ } else {
+ res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\"");
+ res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ }
+ LOG.debug("Exiting");
+ }
+
+ /**
+ * Initialize servlet.
+ */
+ @Override
+ public void init(final ServletConfig config) throws ServletException {
+ super.init(config);
+ contextDirPath = getServletContext().getRealPath("/");
+ }
+
+ /**
+ * Get absolute path to Servlet context directory.
+ */
+ public static String getContextDirPath() {
+ return contextDirPath;
+ }
+}
diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java
deleted file mode 100644
index 344fac29d2..0000000000
--- a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2007 AOL, LLC.
- * Portions Copyright 2009 Apache Software Foundation
- *
- * Licensed 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.webservices.oauth;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.oauth.OAuth;
-import net.oauth.OAuthAccessor;
-import net.oauth.OAuthMessage;
-import net.oauth.OAuthProblemException;
-import net.oauth.server.OAuthServlet;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.roller.weblogger.business.OAuthManager;
-import org.apache.roller.weblogger.business.WebloggerFactory;
-
-/**
- * Access Token request handler
- *
- * @author Praveen Alavilli
- * @author Dave Johnson (adapted for Roller)
- */
-public class AccessTokenServlet extends HttpServlet {
- protected static final Log log = LogFactory.getFactory().getInstance(AccessTokenServlet.class);
-
- @Override
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- processRequest(request, response);
- }
- @Override
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- processRequest(request, response);
- }
-
- public void processRequest(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- try{
- OAuthMessage requestMessage = OAuthServlet.getMessage(request, null);
-
- OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();
- OAuthAccessor accessor = omgr.getAccessor(requestMessage);
- omgr.getValidator().validateMessage(requestMessage, accessor);
-
- // make sure token is authorized
- if (!Boolean.TRUE.equals(accessor.getProperty("authorized"))) {
- OAuthProblemException problem = new OAuthProblemException("permission_denied");
- throw problem;
- }
- // generate access token and secret
- if (accessor.accessToken == null) {
- omgr.generateAccessToken(accessor);
- WebloggerFactory.getWeblogger().flush();
- }
-
- response.setContentType("text/plain");
- try (OutputStream out = response.getOutputStream()) {
- OAuth.formEncode(OAuth.newList(
- "oauth_token", accessor.accessToken,
- "oauth_token_secret", accessor.tokenSecret), out);
- }
-
- } catch (Exception e){
- handleException(e, request, response, true);
- }
- }
-
- public void handleException(Exception e, HttpServletRequest request,
- HttpServletResponse response, boolean sendBody)
- throws IOException, ServletException {
- log.debug("ERROR authorizing token", e);
- String realm = (request.isSecure())?"https://":"http://";
- realm += request.getLocalName();
- OAuthServlet.handleException(response, e, realm, sendBody);
- }
-
-}
diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java
deleted file mode 100644
index 7f4787642b..0000000000
--- a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright 2007 AOL, LLC.
- * Portions Copyright 2009 Apache Software Foundation
- *
- * Licensed 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.webservices.oauth;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.oauth.OAuth;
-import net.oauth.OAuthAccessor;
-import net.oauth.OAuthMessage;
-import net.oauth.server.OAuthServlet;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.roller.weblogger.business.OAuthManager;
-import org.apache.roller.weblogger.business.WebloggerFactory;
-
-/**
- * Authorization request handler.
- *
- * @author Praveen Alavilli
- * @author Dave Johnson (adapted for Roller)
- */
-public class AuthorizationServlet extends HttpServlet {
- protected static final Log log = LogFactory.getFactory().getInstance(AuthorizationServlet.class);
-
- @Override
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
-
- try{
- OAuthMessage requestMessage = OAuthServlet.getMessage(request, null);
-
- OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();
- OAuthAccessor accessor = omgr.getAccessor(requestMessage);
-
- if (Boolean.TRUE.equals(accessor.getProperty("authorized"))) {
- // already authorized send the user back
- returnToConsumer(request, response, accessor);
- } else {
- sendToAuthorizePage(request, response, accessor);
- }
-
- } catch (Exception e){
- handleException(e, request, response, true);
- }
- }
-
- @Override
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
-
- try{
- OAuthMessage requestMessage = OAuthServlet.getMessage(request, null);
-
- OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();
- OAuthAccessor accessor = omgr.getAccessor(requestMessage);
-
- String userId = request.getParameter("userId");
- if (userId == null) {
- userId = request.getParameter("xoauth_requestor_id");
- }
-
- if (userId == null) {
- // no user associted with the key, must be site-wide key,
- // so get user to login and do the authorization process
- sendToAuthorizePage(request, response, accessor);
-
- } else {
-
- // if consumer key is for specific user, check username match
- String consumerUserId = (String)accessor.consumer.getProperty("userId");
- if (consumerUserId != null && !userId.equals(consumerUserId)) {
- throw new ServletException("ERROR: invalid or unspecified userId");
- }
-
- // set userId in accessor and mark it as authorized
- omgr.markAsAuthorized(accessor, userId);
- WebloggerFactory.getWeblogger().flush();
- }
-
- returnToConsumer(request, response, accessor);
-
- } catch (Exception e){
- handleException(e, request, response, true);
- }
- }
-
- private void sendToAuthorizePage(HttpServletRequest request,
- HttpServletResponse response, OAuthAccessor accessor)
- throws IOException, ServletException{
- String callback = request.getParameter("oauth_callback");
- if(callback == null || callback.length() <=0) {
- callback = "none";
- }
- String consumer_description = (String)accessor.consumer.getProperty("description");
- request.setAttribute("CONS_DESC", consumer_description);
- request.setAttribute("CALLBACK", callback);
- request.setAttribute("TOKEN", accessor.requestToken);
- request.getRequestDispatcher("/roller-ui/oauthAuthorize.rol").forward(request, response);
- }
-
- private void returnToConsumer(HttpServletRequest request,
- HttpServletResponse response, OAuthAccessor accessor)
- throws IOException, ServletException {
-
- // send the user back to site's callBackUrl
- String callback = request.getParameter("oauth_callback");
- if ("none".equals(callback)
- && accessor.consumer.callbackURL != null
- && accessor.consumer.callbackURL.length() > 0){
- // first check if we have something in our properties file
- callback = accessor.consumer.callbackURL;
- }
-
- if ( "none".equals(callback) ) {
- // no call back it must be a client
- response.setContentType("text/plain");
- try (PrintWriter out = response.getWriter()) {
- out.println("You have successfully authorized for consumer key '"
- + accessor.consumer.consumerKey
- + "'. Please close this browser window and click continue"
- + " in the client.");
- }
- } else {
- // if callback is not passed in, use the callback from config
- if(callback == null || callback.length() <=0 ) {
- callback = accessor.consumer.callbackURL;
- }
- String token = accessor.requestToken;
- if (token != null && callback != null) {
- callback = OAuth.addParameters(callback, "oauth_token", token);
- }
-
- response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
- response.setHeader("Location", callback);
- }
- }
-
- public void handleException(Exception e, HttpServletRequest request,
- HttpServletResponse response, boolean sendBody)
- throws IOException, ServletException {
- log.debug("ERROR authorizing token", e);
- String realm = (request.isSecure())?"https://":"http://";
- realm += request.getLocalName();
- OAuthServlet.handleException(response, e, realm, sendBody);
- }
-}
diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java
deleted file mode 100644
index 797252f8bb..0000000000
--- a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2007 AOL, LLC.
- * Portions Copyright 2009 Apache Software Foundation
- *
- * Licensed 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.webservices.oauth;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.oauth.OAuth;
-import net.oauth.OAuthAccessor;
-import net.oauth.OAuthConsumer;
-import net.oauth.OAuthMessage;
-import net.oauth.server.OAuthServlet;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.roller.weblogger.business.OAuthManager;
-import org.apache.roller.weblogger.business.WebloggerFactory;
-
-
-/**
- * Request token request handler
- *
- * @author Praveen Alavilli
- * @author Dave Johnson (adapted for Roller)
- */
-public class RequestTokenServlet extends HttpServlet {
- protected static final Log log = LogFactory.getFactory().getInstance(RequestTokenServlet.class);
-
- @Override
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- processRequest(request, response);
- }
-
- @Override
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- processRequest(request, response);
- }
-
- public void processRequest(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
-
- try {
- OAuthMessage requestMessage = OAuthServlet.getMessage(request, null);
- OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();
- OAuthAccessor accessor = omgr.getAccessor(requestMessage);
-
- if (accessor == null) {
-
- OAuthConsumer consumer = omgr.getConsumer(requestMessage);
- accessor = new OAuthAccessor(consumer);
- omgr.getValidator().validateMessage(requestMessage, accessor);
-
- {
- // Support the 'Variable Accessor Secret' extension
- // described in http://oauth.pbwiki.com/AccessorSecret
- String secret = requestMessage.getParameter("oauth_accessor_secret");
- if (secret != null) {
- accessor.setProperty(OAuthConsumer.ACCESSOR_SECRET, secret);
- }
- }
-
- // generate request_token and secret
- omgr.generateRequestToken(accessor);
- WebloggerFactory.getWeblogger().flush();
- }
-
- response.setContentType("text/plain");
- try (OutputStream out = response.getOutputStream()) {
- String token = accessor.requestToken != null ? accessor.requestToken: accessor.accessToken;
- OAuth.formEncode(OAuth.newList(
- "oauth_token", token,
- "oauth_token_secret", accessor.tokenSecret), out);
- }
-
- } catch (Exception e){
- handleException(e, request, response, true);
- }
-
- }
-
- public void handleException(Exception e, HttpServletRequest request,
- HttpServletResponse response, boolean sendBody)
- throws IOException, ServletException {
- log.debug("ERROR authorizing token", e);
- String realm = (request.isSecure())?"https://":"http://";
- realm += request.getLocalName();
- OAuthServlet.handleException(response, e, realm, sendBody);
- }
-}
diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/opensearch/OpenSearchServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/opensearch/OpenSearchServlet.java
index fe8e7b57a9..511866b28d 100644
--- a/app/src/main/java/org/apache/roller/weblogger/webservices/opensearch/OpenSearchServlet.java
+++ b/app/src/main/java/org/apache/roller/weblogger/webservices/opensearch/OpenSearchServlet.java
@@ -19,10 +19,10 @@
import java.io.IOException;
import java.io.PrintWriter;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.URLStrategy;
diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/tagdata/TagDataServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/tagdata/TagDataServlet.java
index e239839ebb..7712e156ec 100644
--- a/app/src/main/java/org/apache/roller/weblogger/webservices/tagdata/TagDataServlet.java
+++ b/app/src/main/java/org/apache/roller/weblogger/webservices/tagdata/TagDataServlet.java
@@ -22,10 +22,10 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.roller.weblogger.WebloggerException;
diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServlet.java
new file mode 100644
index 0000000000..62db6b427e
--- /dev/null
+++ b/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServlet.java
@@ -0,0 +1,213 @@
+/*
+ * 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.
+ */
+/*
+ * Derived from org.apache.xmlrpc.webserver.XmlRpcServlet
+ * in Apache XML-RPC 3.1.3. Forked into the Roller codebase because
+ * xmlrpc-server has no Jakarta Servlet compatible release.
+ */
+package org.apache.roller.weblogger.webservices.xmlrpc;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.Enumeration;
+
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.xmlrpc.XmlRpcConfig;
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.common.TypeConverterFactory;
+import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping;
+import org.apache.xmlrpc.server.PropertyHandlerMapping;
+import org.apache.xmlrpc.server.RequestProcessorFactoryFactory;
+import org.apache.xmlrpc.server.XmlRpcHandlerMapping;
+import org.apache.xmlrpc.server.XmlRpcServer;
+import org.apache.xmlrpc.util.ReflectionUtil;
+
+
+/**
+ * A servlet for processing XML-RPC requests, derived from the Apache XML-RPC
+ * library's {@code XmlRpcServlet}. The typical use is to configure it in
+ * {@code web.xml} with an {@code XmlRpcServlet.properties} resource on the
+ * classpath that maps handler names to implementation classes.
+ *
+ * The servlet accepts the following init parameters:
+ *
+ * | Name | Description |
+ * | enabledForExtensions | Sets the value of
+ * {@link XmlRpcConfig#isEnabledForExtensions()} to true. |
+ *
+ */
+public class RollerXmlRpcServlet extends HttpServlet {
+ private static final long serialVersionUID = 2348768267234L;
+ private static final Log log = LogFactory.getLog(RollerXmlRpcServlet.class);
+
+ /**
+ * Classpath location of the handler mapping properties file.
+ * Roller ships this at {@code org/apache/xmlrpc/webserver/XmlRpcServlet.properties}.
+ */
+ private static final String HANDLER_MAPPING_RESOURCE =
+ "org/apache/xmlrpc/webserver/XmlRpcServlet.properties";
+
+ private RollerXmlRpcServletServer server;
+ private AbstractReflectiveHandlerMapping.AuthenticationHandler authenticationHandler;
+ private RequestProcessorFactoryFactory requestProcessorFactoryFactory;
+ private TypeConverterFactory typeConverterFactory;
+
+ /**
+ * Returns the servlet's instance of {@link RollerXmlRpcServletServer}.
+ * @return The configurable server instance.
+ */
+ public RollerXmlRpcServletServer getXmlRpcServletServer() {
+ return server;
+ }
+
+ private void handleInitParameters(ServletConfig pConfig) throws ServletException {
+ for (Enumeration en = pConfig.getInitParameterNames(); en.hasMoreElements(); ) {
+ String name = (String) en.nextElement();
+ String value = pConfig.getInitParameter(name);
+ try {
+ if (!ReflectionUtil.setProperty(this, name, value)
+ && !ReflectionUtil.setProperty(server, name, value)
+ && !ReflectionUtil.setProperty(server.getConfig(), name, value)) {
+ throw new ServletException("Unknown init parameter " + name);
+ }
+ } catch (IllegalAccessException e) {
+ throw new ServletException("Illegal access to instance of " + server.getClass().getName()
+ + " while setting property " + name + ": " + e.getMessage(), e);
+ } catch (InvocationTargetException e) {
+ Throwable t = e.getTargetException();
+ throw new ServletException("Failed to invoke setter for property " + name
+ + " on instance of " + server.getClass().getName()
+ + ": " + t.getMessage(), t);
+ }
+ }
+ }
+
+ public void init(ServletConfig pConfig) throws ServletException {
+ super.init(pConfig);
+ try {
+ server = newXmlRpcServer(pConfig);
+ handleInitParameters(pConfig);
+ server.setHandlerMapping(newXmlRpcHandlerMapping());
+ } catch (XmlRpcException e) {
+ try {
+ log("Failed to create XmlRpcServer: " + e.getMessage(), e);
+ } catch (Throwable ignore) {
+ }
+ throw new ServletException(e);
+ }
+ }
+
+ /** Sets the servlet's {@link AbstractReflectiveHandlerMapping.AuthenticationHandler}. */
+ public void setAuthenticationHandler(AbstractReflectiveHandlerMapping.AuthenticationHandler pHandler) {
+ authenticationHandler = pHandler;
+ }
+
+ /** Returns the servlet's {@link AbstractReflectiveHandlerMapping.AuthenticationHandler}. */
+ public AbstractReflectiveHandlerMapping.AuthenticationHandler getAuthenticationHandler() {
+ return authenticationHandler;
+ }
+
+ /** Sets the servlet's {@link RequestProcessorFactoryFactory}. */
+ public void setRequestProcessorFactoryFactory(RequestProcessorFactoryFactory pFactory) {
+ requestProcessorFactoryFactory = pFactory;
+ }
+
+ /** Returns the servlet's {@link RequestProcessorFactoryFactory}. */
+ public RequestProcessorFactoryFactory getRequestProcessorFactoryFactory() {
+ return requestProcessorFactoryFactory;
+ }
+
+ /** Sets the servlet's {@link TypeConverterFactory}. */
+ public void setTypeConverterFactory(TypeConverterFactory pFactory) {
+ typeConverterFactory = pFactory;
+ }
+
+ /** Returns the servlet's {@link TypeConverterFactory}. */
+ public TypeConverterFactory getTypeConverterFactory() {
+ return typeConverterFactory;
+ }
+
+ /**
+ * Creates a new instance of {@link RollerXmlRpcServletServer} to process requests.
+ * @param pConfig The servlet's configuration.
+ * @throws XmlRpcException Creating the server failed.
+ */
+ protected RollerXmlRpcServletServer newXmlRpcServer(ServletConfig pConfig)
+ throws XmlRpcException {
+ return new RollerXmlRpcServletServer();
+ }
+
+ /**
+ * Creates a new handler mapping. Loads the property file from the classpath
+ * resource {@value #HANDLER_MAPPING_RESOURCE}.
+ */
+ protected XmlRpcHandlerMapping newXmlRpcHandlerMapping() throws XmlRpcException {
+ URL url = Thread.currentThread().getContextClassLoader()
+ .getResource(HANDLER_MAPPING_RESOURCE);
+ if (url == null) {
+ throw new XmlRpcException("Failed to locate resource " + HANDLER_MAPPING_RESOURCE);
+ }
+ try {
+ return newPropertyHandlerMapping(url);
+ } catch (IOException e) {
+ throw new XmlRpcException("Failed to load resource " + url + ": " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Creates a new instance of {@link PropertyHandlerMapping} by loading
+ * the property file from the given URL.
+ */
+ protected PropertyHandlerMapping newPropertyHandlerMapping(URL url) throws IOException, XmlRpcException {
+ PropertyHandlerMapping mapping = new PropertyHandlerMapping();
+ mapping.setAuthenticationHandler(authenticationHandler);
+ if (requestProcessorFactoryFactory != null) {
+ mapping.setRequestProcessorFactoryFactory(requestProcessorFactoryFactory);
+ }
+ if (typeConverterFactory != null) {
+ mapping.setTypeConverterFactory(typeConverterFactory);
+ } else {
+ mapping.setTypeConverterFactory(server.getTypeConverterFactory());
+ }
+ mapping.setVoidMethodEnabled(server.getConfig().isEnabledForExtensions());
+ mapping.load(Thread.currentThread().getContextClassLoader(), url);
+ return mapping;
+ }
+
+ /** Handles an XML-RPC POST request. */
+ public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse) throws IOException, ServletException {
+ server.execute(pRequest, pResponse);
+ }
+
+ public void log(String pMessage, Throwable pThrowable) {
+ server.getErrorLogger().log(pMessage, pThrowable);
+ }
+
+ public void log(String pMessage) {
+ log.info(pMessage);
+ }
+}
diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServletServer.java b/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServletServer.java
new file mode 100644
index 0000000000..3bed68a639
--- /dev/null
+++ b/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServletServer.java
@@ -0,0 +1,150 @@
+/*
+ * 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.
+ */
+/*
+ * Derived from org.apache.xmlrpc.webserver.XmlRpcServletServer
+ * in Apache XML-RPC 3.1.3. Forked into the Roller codebase because
+ * xmlrpc-server has no Jakarta Servlet compatible release.
+ */
+package org.apache.roller.weblogger.webservices.xmlrpc;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.common.ServerStreamConnection;
+import org.apache.xmlrpc.common.XmlRpcHttpRequestConfig;
+import org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl;
+import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig;
+import org.apache.xmlrpc.server.XmlRpcHttpServer;
+import org.apache.xmlrpc.server.XmlRpcHttpServerConfig;
+import org.apache.xmlrpc.util.HttpUtil;
+
+
+/**
+ * An extension of {@link org.apache.xmlrpc.server.XmlRpcServer}
+ * suitable for processing servlet requests.
+ */
+public class RollerXmlRpcServletServer extends XmlRpcHttpServer {
+
+ protected static class ServletStreamConnection implements ServerStreamConnection {
+ private final HttpServletRequest request;
+ private final HttpServletResponse response;
+
+ protected ServletStreamConnection(HttpServletRequest pRequest,
+ HttpServletResponse pResponse) {
+ request = pRequest;
+ response = pResponse;
+ }
+
+ /** Returns the servlet request. */
+ public HttpServletRequest getRequest() { return request; }
+
+ /** Returns the servlet response. */
+ public HttpServletResponse getResponse() { return response; }
+
+ public InputStream newInputStream() throws IOException {
+ return request.getInputStream();
+ }
+
+ public OutputStream newOutputStream() throws IOException {
+ response.setContentType("text/xml");
+ return response.getOutputStream();
+ }
+
+ public void close() throws IOException {
+ response.getOutputStream().close();
+ }
+ }
+
+ /**
+ * @param pRequest The request object.
+ */
+ protected XmlRpcHttpRequestConfigImpl newConfig(HttpServletRequest pRequest) {
+ return new XmlRpcHttpRequestConfigImpl();
+ }
+
+ protected XmlRpcHttpRequestConfigImpl getConfig(HttpServletRequest pRequest) {
+ XmlRpcHttpRequestConfigImpl result = newConfig(pRequest);
+ XmlRpcHttpServerConfig serverConfig = (XmlRpcHttpServerConfig) getConfig();
+ result.setBasicEncoding(serverConfig.getBasicEncoding());
+ result.setContentLengthOptional(serverConfig.isContentLengthOptional()
+ && (pRequest.getHeader("Content-Length") == null));
+ result.setEnabledForExtensions(serverConfig.isEnabledForExtensions());
+ result.setGzipCompressing(HttpUtil.isUsingGzipEncoding(pRequest.getHeader("Content-Encoding")));
+ result.setGzipRequesting(HttpUtil.isUsingGzipEncoding(pRequest.getHeaders("Accept-Encoding")));
+ result.setEncoding(pRequest.getCharacterEncoding());
+ result.setEnabledForExceptions(serverConfig.isEnabledForExceptions());
+ HttpUtil.parseAuthorization(result, pRequest.getHeader("Authorization"));
+ return result;
+ }
+
+ protected ServletStreamConnection newStreamConnection(HttpServletRequest pRequest,
+ HttpServletResponse pResponse) {
+ return new ServletStreamConnection(pRequest, pResponse);
+ }
+
+ /**
+ * Processes the servlet request.
+ * @param pRequest The servlet request being read.
+ * @param pResponse The servlet response being created.
+ * @throws IOException Reading the request or writing the response failed.
+ * @throws ServletException Processing the request failed.
+ */
+ public void execute(HttpServletRequest pRequest, HttpServletResponse pResponse)
+ throws ServletException, IOException {
+ XmlRpcHttpRequestConfigImpl config = getConfig(pRequest);
+ ServletStreamConnection ssc = newStreamConnection(pRequest, pResponse);
+ try {
+ super.execute(config, ssc);
+ } catch (XmlRpcException e) {
+ throw new ServletException(e);
+ }
+ }
+
+ /** Returns whether the request's content length is required. */
+ protected boolean isContentLengthRequired(XmlRpcStreamRequestConfig pConfig) {
+ if (!pConfig.isEnabledForExtensions()) {
+ // The spec requires a content-length.
+ return true;
+ }
+ boolean isRequired = !((XmlRpcHttpServerConfig) getConfig()).isContentLengthOptional();
+ if (pConfig instanceof XmlRpcHttpRequestConfig) {
+ isRequired |= !((XmlRpcHttpRequestConfig) pConfig).isContentLengthOptional();
+ }
+ return isRequired;
+ }
+
+ protected OutputStream getOutputStream(XmlRpcStreamRequestConfig pConfig,
+ ServerStreamConnection pConnection,
+ int pSize) throws IOException {
+ if (pSize != -1) {
+ ((ServletStreamConnection) pConnection).getResponse().setContentLength(pSize);
+ }
+ return super.getOutputStream(pConfig, pConnection, pSize);
+ }
+
+ protected void setResponseHeader(ServerStreamConnection pConnection, String pHeader, String pValue) {
+ ((ServletStreamConnection) pConnection).getResponse().setHeader(pHeader, pValue);
+ }
+}
diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties
index 66072c23f0..6a0abebdce 100644
--- a/app/src/main/resources/ApplicationResources.properties
+++ b/app/src/main/resources/ApplicationResources.properties
@@ -338,7 +338,7 @@ configForm.editorPages=Editor Pages
configForm.webServicesSettings=Web Services Settings
configForm.enableAtomPub=Enable Atom Publishing Protocol
-configForm.AtomPubAuth=AtomPub authentication (basic, oauth, or wsse)
+configForm.AtomPubAuth=AtomPub authentication (basic or wsse)
configForm.enableXmlRpc=Enable Blogger / MetaWeblog API
configForm.weblogSettings=Weblog Rendering Settings
@@ -943,37 +943,6 @@ navigationBar.logout=Logout
navigationBar.login=Login
navigationBar.register=Register
-# ----------------------------------------------------------------- OAuth pages
-
-oauthKeys.title=OAuth Keys
-oauthKeys.description=OAuth key and secret for your account {0}
-oauthKeys.tip=You can authorize other sites and weblog client programs \
-to access your account to create and edit weblog posts, but only if those \
-sites and programs support OAuth.
-oauthKeys.consumerKey=Consumer Key
-oauthKeys.consumerSecret=Consumer Secret
-oauthKeys.userKeys=User Specific Secret and Key
-oauthKeys.userKeysTip=These keys are tied to your user account, use them to \
-authorize weblog clients that need access your account.
-oauthKeys.siteWideKeys=Site Wide Secret and Key
-oauthKeys.siteWideKeysTip=Since you are a site admin, you have access to the \
-site wide key and secret. You can provide them to other sites that need to \
-access accounts on this site. Users will still have to authenticate access \
-by logging in to Roller.
-oauthKeys.urls=OAuth URLs
-oauthKeys.urlsTip=These are the URLs that your weblog client will need to \
-perform OAuth authorization against Roller.
-oauthKeys.requestTokenURL=Request Token URL
-oauthKeys.authorizationURL=Authorization URL
-oauthKeys.accessTokenURL=Access Token URL
-
-
-oauthAuthorize.title=OAuth Authorization
-oauthAuthorize.description=Authorize OAuth access to user account {0}?
-oauthAuthorize.tip=A web site is asking to have access your account. Press \
-the button below to allow access or simply close this window to deny it.
-
-
# -------------------------------------------------------------- Page management
pagesForm.title=Templates
@@ -1845,10 +1814,6 @@ Feel like you''ve got more to say? Maybe another weblog is what you need.
yourWebsites.editProfile=Your Profile
yourWebsites.editProfile.desc=Change user info, password, timezone
-yourWebsites.oauthKeys=OAuth Credentials
-yourWebsites.oauthKeys.desc=Enable other sites and programs to access your \
-account remotely.
-
yourWebsites.globalAdmin=Server administration
yourWebsites.globalAdmin.desc=Make site-wide administration changes.
diff --git a/app/src/main/resources/ApplicationResources_ja.properties b/app/src/main/resources/ApplicationResources_ja.properties
index 8802be030d..7c3c5508fe 100644
--- a/app/src/main/resources/ApplicationResources_ja.properties
+++ b/app/src/main/resources/ApplicationResources_ja.properties
@@ -1073,7 +1073,6 @@ mediaFileAdd.includeGallery=\u30AE\u30E3\u30E9\u30EA\u30FC\u306B\u542B\u3081\u30
mediaFileView.create=\u4F5C\u6210
themeEditor.customThemeDescription=\u81EA\u5206\u3067\u30D6\u30ED\u30B0\u3092\u30C7\u30B6\u30A4\u30F3\u3057\u305F\u3044\u30AF\u30EA\u30A8\u30A4\u30C6\u30A3\u30D6\u306A\u30D6\u30ED\u30AC\u30FC\u306E\u305F\u3081\u306E\u9078\u629E\u80A2\u3067\u3059\u3002\u305F\u3060\u3057\u30D6\u30ED\u30B0\u306E\u30C7\u30B6\u30A4\u30F3\u3092\u81EA\u5206\u3067\u7BA1\u7406\u3059\u308B\u306B\u306F\u591A\u5C11\u306E\u624B\u9593\u304C\u304B\u304B\u308A\u307E\u3059\u3002
pagesForm.deleteselected=\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u3092\u524A\u9664
-yourWebsites.oauthKeys.desc=\u30EA\u30E2\u30FC\u30C8\u306E\u4ED6\u306E\u30B5\u30A4\u30C8\u304A\u3088\u3073\u30D7\u30ED\u30B0\u30E9\u30E0\u304B\u3089\u3001\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u53EF\u80FD\u306B\u3057\u307E\u3059\u3002
configForm.enableAtomPub=Atom \u30D1\u30D6\u30EA\u30C3\u30B7\u30F3\u30B0\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u3092\u6709\u52B9\u306B\u3059\u308B
Register.disabled=\u3053\u306E\u30B5\u30A4\u30C8\u306E\u7BA1\u7406\u8005\u306F\u3001\u73FE\u5728\u3001\u65B0\u898F\u30E6\u30FC\u30B6\u767B\u9332\u3092\u7121\u52B9\u306B\u3057\u3066\u3044\u307E\u3059\u3002\u554F\u984C\u304C\u3042\u308B\u5834\u5408\u306F\u3001\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044\u3002
weblogEdit.searchDescription=\u691C\u7D22\u30A8\u30F3\u30B8\u30F3\u7528\u306E\u6982\u8981
@@ -1101,7 +1100,6 @@ mediaFile.error.view.dirNameInvalid=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u540D\u
mediaFileAdd.tags=\u30BF\u30B0\uFF08\u30B9\u30DA\u30FC\u30B9\u3067\u5206\u5272\uFF09
themeEditor.yourThemeStyleSheet=\u5171\u6709\u30C6\u30FC\u30DE\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30FB\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\u3002
pageForm.useManualContentType=\u72EC\u81EA\u306EContent-Type\u3092\u4F7F\u7528\u3059\u308B
-oauthKeys.siteWideKeys=\u30B5\u30A4\u30C8\u5168\u4F53\u306E\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u304A\u3088\u3073\u30AD\u30FC
installer.errorUpgradingTablesExplanation=\u30C6\u30FC\u30D6\u30EB\u306E\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u30B9\u30AF\u30EA\u30D7\u30C8\u306B\u554F\u984C\u304C\u3042\u308B\u304B\u3001\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u306A\u3044\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u4F7F\u7528\u3055\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3042\u306A\u305F\u306F\u3001\u3053\u306E\u554F\u984C\u3092\u89E3\u6C7A\u3057\u3066Roller\u3092\u518D\u8D77\u52D5\u307E\u305F\u306F\u518D\u30C7\u30D7\u30ED\u30A4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u51E6\u7406\u4E2D\u306E\u6210\u529F/\u30A8\u30E9\u30FC\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u4EE5\u4E0B\u3067\u3059\:
userRegister.heading.authentication=\u3069\u306E\u3088\u3046\u306B\u8A8D\u8A3C\u3057\u307E\u3059\u304B?
mediaFileView.title=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB
@@ -1124,7 +1122,6 @@ mediaFileView.bytes=\u30D0\u30A4\u30C8
mediaFile.delete.confirm=\u9078\u629E\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u3066\u3088\u308D\u3057\u3044\u3067\u3059\u304B?
commentManagement.saveError=\u30B3\u30E1\u30F3\u30C8\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F
comments.ldapAuthenticatorUserName=\u3042\u306A\u305F\u306EActive Directory\u30E6\u30FC\u30B6\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
-oauthKeys.urlsTip=\u3053\u308C\u3089\u306F\u3001\u3042\u306A\u305F\u306E\u30D6\u30ED\u30B0\u30FB\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304CRoller\u306B\u5BFE\u3057\u3066OAuth\u8A8D\u8A3C\u3092\u5B9F\u884C\u3059\u308B\u305F\u3081\u306B\u5FC5\u8981\u3068\u306A\u308BURL\u3067\u3059\u3002
inviteMember.title=\u65B0\u3057\u3044\u30E1\u30F3\u30D0\u30FC\u306E\u62DB\u5F85
mediaFileSuccess.pageTip=\u30D5\u30A1\u30A4\u30EB\u304C\u6B63\u5E38\u306B\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u307E\u3057\u305F\u3002\u65B0\u3057\u304F\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u542B\u3080\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u3092\u4F5C\u6210\u3057\u305F\u3044\u5834\u5408\u306F\u3001\u4EE5\u4E0B\u306E\u30D5\u30A9\u30FC\u30E0\u3092\u4F7F\u3063\u3066\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30BF\u30A4\u30D7\u304C\u753B\u50CF\u306E\u5834\u5408\u306F\u30B5\u30E0\u30CD\u30A4\u30EB\u3068\u3057\u3066\u8FFD\u52A0\u3055\u308C\u307E\u3059\u3002\u30BF\u30A4\u30D7\u304C\u753B\u50CF\u4EE5\u5916\u306E\u5834\u5408\u306F\u3001\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3\uFF08\u4F8B\uFF1APodcast\uFF09\u3068\u3057\u3066\u542B\u3081\u308B\u304B\u3069\u3046\u304B\u9078\u629E\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002
websiteRemove.error=\u30D6\u30ED\u30B0 [{0}] \u306E\u524A\u9664\u30A8\u30E9\u30FC
@@ -1161,7 +1158,6 @@ planetGroupSubs.prompt.add=\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D
MediaFile.error.view=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u8868\u793A\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
mediaFileAdd.multipleNames=(\u8907\u6570\u306E\u540D\u524D)
macro.bookmark.urlFeed=\u30B5\u30A4\u30C8\u306ERSS\u30D5\u30A3\u30FC\u30C9\u306EURL
-oauthKeys.title=OAuth\u30AD\u30FC
commonPingTargets.error.enabling=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u6709\u52B9\u5316\u306B\u5931\u6557\u3057\u307E\u3057\u305F
inviteMember.notificationContent=\u3042\u306A\u305F\u306F\u3001\u30D6\u30ED\u30B0 "{0}" ({1}) \u3078\u306E\u53C2\u52A0\u3092\u62DB\u5F85\u3055\u308C\u307E\u3057\u305F\u3002\u4EE5\u4E0B\u306E\u30EA\u30F3\u30AF\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30E6\u30FC\u30B6 [{2}] \u3068\u3057\u3066\u30ED\u30B0\u30A4\u30F3\u3057\u3001\u3053\u306E\u62DB\u5F85 <{3}> \u3092\u627F\u8AFE\u3059\u308B\u304B\u62D2\u5426\u3057\u3066\u304F\u3060\u3055\u3044\u3002
mediaFileView.addDirectory=\u65B0\u3057\u3044\u30D5\u30A9\u30EB\u30C0\u3092\u8FFD\u52A0
@@ -1170,7 +1166,6 @@ pingTargetEdit.subtitle=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u7DE8\u96C6
installer.errorUpgradingTables=\u30C6\u30FC\u30D6\u30EB\u306E\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u306B\u5931\u6557
folderForm.updated=\u30D5\u30A9\u30EB\u30C0\u540D\u304C\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F
frontpageConfig.frontpageAggregated=\u30B5\u30A4\u30C8\u5168\u4F53\u304C\u96C6\u7D04\u3055\u308C\u305F\u30D5\u30ED\u30F3\u30C8\u30FB\u30DA\u30FC\u30B8\u3092\u6709\u52B9\u306B\u3059\u308B
-oauthAuthorize.title=OAuth\u306E\u8A8D\u53EF
mediaFileView.rootPageTip=\u3053\u306E\u30DA\u30FC\u30B8\u306B\u306F\u3001\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3068\u30C6\u30FC\u30DE\u306E\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA\u3092\u9078\u629E\u3057\u305F\u969B\u306B\u30B3\u30D4\u30FC\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u30D5\u30A9\u30EB\u30C0\u3092\u4F7F\u3063\u3066\u30D5\u30A1\u30A4\u30EB\u3092\u7BA1\u7406\u3067\u304D\u307E\u3059\u3002\u306A\u304A\u3001\u30D5\u30A1\u30A4\u30EB\u3092\u79FB\u52D5\u3057\u305F\u308A\u540D\u524D\u3092\u5909\u66F4\u3057\u3066\u3082URL\u306F\u5909\u308F\u3089\u306A\u3044\u305F\u3081\u30EA\u30F3\u30AF\u5207\u308C\u306E\u5FC3\u914D\u306F\u3042\u308A\u307E\u305B\u3093\u3002
mediaFileSuccess.type=\u30BF\u30A4\u30D7\:
mediaFileAddSuccess.title=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u5B8C\u4E86
@@ -1198,7 +1193,6 @@ mediaFile.update.success=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\
userRegister.tip.localeAndTimeZone=\u3042\u306A\u305F\u306B\u3068\u3063\u3066\u671B\u307E\u3057\u3044\u3068\u601D\u308F\u308C\u308B\u8A00\u8A9E\u3068\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\u306F\u4EE5\u4E0B\u306E\u901A\u308A\u3067\u3059\u3002\u3053\u308C\u306F\u3001\u3042\u306A\u305F\u304C\u4ECA\u5F8C\u4F5C\u6210\u3059\u308B\u30A8\u30F3\u30C8\u30EA\u30FC\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u306E\u3067\u3001\u6B63\u3057\u304F\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002
macro.weblog.on=\u6295\u7A3F\u65E5\u6642\:
planetConfig.prompt=\u30A2\u30B0\u30EA\u30B2\u30FC\u30BF\u304C\u751F\u6210\u3059\u308B\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u306B\u542B\u307E\u308C\u308B\u30BF\u30A4\u30C8\u30EB\u3001\u8AAC\u660E\u3001\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3001\u30B5\u30A4\u30C8URL\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5FC5\u8981\u3067\u3042\u308C\u3070\u30D7\u30ED\u30AD\u30B7\u3092\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u3082\u3067\u304D\u307E\u3059\u3002
-oauthKeys.description=\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8 {0} \u306EOAuth\u30AD\u30FC\u3068\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8
generic.changes.saved=\u5909\u66F4\u304C\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F
error.commentPostFailedEmailAddress=\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u304C\u4E0D\u6B63\u3067\u3059\u3002
ConfigForm.title=Planet \u30BF\u30A4\u30C8\u30EB\t
@@ -1208,12 +1202,10 @@ mediaFile.move.confirm=\u9078\u629E\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3
pingTarget.updated=Ping\u30BF\u30FC\u30B2\u30C3\u30C8 "{0}" \u304C\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F
generic.name=\u540D\u524D
pingTarget.malformedUrl=URL\u304C\u4E0D\u6B63\u306A\u5F62\u5F0F\u3067\u3059\u3002
-oauthKeys.tip=OAuth\u3092\u30B5\u30DD\u30FC\u30C8\u3059\u308B\u30B5\u30A4\u30C8\u3084\u30D6\u30ED\u30B0\u30FB\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u30FB\u30D7\u30ED\u30B0\u30E9\u30E0\u306B\u5BFE\u3057\u3066\u3001\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3078\u30A2\u30AF\u30BB\u30B9\u3057\u3066\u30A8\u30F3\u30C8\u30EA\u30FC\u3092\u6295\u7A3F\u30FB\u7DE8\u96C6\u3059\u308B\u3053\u3068\u3092\u8A8D\u53EF\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002
mediaFileView.filesTagged=\u30BF\u30B0\u304C {0} \u306E\u30D5\u30A1\u30A4\u30EB
weblogEdit.hasComments=\u30B3\u30E1\u30F3\u30C8 [{1}]
categoryDeleteOK.title=\u30AB\u30C6\u30B4\u30EA\u306E\u524A\u9664
bookmarksForm.url=URL
-oauthKeys.accessTokenURL=\u30A2\u30AF\u30BB\u30B9\u30FB\u30C8\u30FC\u30AF\u30F3URL
mediaFile.move.success=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u6B63\u5E38\u306B\u79FB\u52D5\u3055\u308C\u307E\u3057\u305F\u3002
mediaFileView.noResults=\u6761\u4EF6\u306B\u5408\u81F4\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4ED6\u306E\u6761\u4EF6\u3092\u8A66\u3057\u3066\u304F\u3060\u3055\u3044\u3002
planetGroups.error.title=\u30BF\u30A4\u30C8\u30EB\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059
@@ -1273,7 +1265,6 @@ installer.yesCreateTables=\u306F\u3044 - \u4ECA\u3059\u3050\u30C6\u30FC\u30D6\u3
tabbedmenu.bookmarks.allFolders=Blogroll
pageForm.tip.required=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u7DE8\u96C6\u3057\u3066\u3001\u751F\u6210\u3055\u308C\u308B\u30DA\u30FC\u30B8\u3092\u5909\u66F4\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3067\u4F7F\u7528\u3059\u308B\u3053\u3068\u306E\u3067\u304D\u308B\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u304A\u3088\u3073\u30B3\u30FC\u30C9\u306B\u3064\u3044\u3066\u306F\u3001Roller\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u30FB\u30AC\u30A4\u30C9\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u308C\u306F\u4E0A\u7D1A\u30E6\u30FC\u30B6\u30FC\u306E\u305F\u3081\u306E\u3082\u306E\u3067\u3042\u308A\u3001\u3082\u3057\u3042\u306A\u305F\u304CHTML\u306B\u8A73\u3057\u304F\u306A\u3044\u5834\u5408\u3001\u7DE8\u96C6\u3057\u306A\u3044\u65B9\u304C\u826F\u3044\u3067\u3057\u3087\u3046\u3002\u30E1\u30E2\: \u3053\u308C\u306F\u5FC5\u9808\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3067\u3059\u3002\u3042\u306A\u305F\u306F\u3001\u540D\u524D\u3001\u30EA\u30F3\u30AF\u304A\u3088\u3073\u8A73\u7D30\u3092\u5909\u66F4\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002
mediaFileView.lt=<
-oauthAuthorize.tip=\u30A6\u30A7\u30D6\u30B5\u30A4\u30C8\u304C\u3001\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059\u3002\u4EE5\u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u62BC\u3057\u3066\u30A2\u30AF\u30BB\u30B9\u3092\u8A8D\u53EF\u3059\u308B\u304B\u3001\u3053\u306E\u30A6\u30A4\u30F3\u30C9\u30A6\u3092\u9589\u3058\u3066\u62D2\u5426\u3057\u3066\u304F\u3060\u3055\u3044\u3002
planetSubscription.error.deleting=\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u524A\u9664\u30A8\u30E9\u30FC
error.add.user.openIdInUse=Open ID\u306F\u4ED6\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3067\u65E2\u306B\u4F7F\u308F\u308C\u3066\u3044\u307E\u3059\u3002
themeEditor.importAndOverwriteTemplates=\u30C6\u30FC\u30DE\u3092\u65E2\u5B58\u306E\u30AB\u30B9\u30BF\u30E0\u30FB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306B\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u3001\u540C\u540D\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306F\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002
@@ -1324,12 +1315,10 @@ mediaFile.includeInGallery.success=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u3
mediaFileEdit.directory=\u30D5\u30A9\u30EB\u30C0
bookmarksForm.feedurl=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL
planetSubscription.success.deleted=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u304C\u6B63\u5E38\u306B\u524A\u9664\u3055\u308C\u307E\u3057\u305F
-oauthKeys.userKeys=\u5404\u30E6\u30FC\u30B6\u30FC\u306E\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u304A\u3088\u3073\u30AD\u30FC
mediaFileView.type=\u30BF\u30A4\u30D7
mediaFileEdit.includeGallery=\u30AE\u30E3\u30E9\u30EA\u30FC\u306B\u542B\u3081\u307E\u3059\u304B?
statCount.weblogCommentCountType=\u30D6\u30ED\u30B0\u306E\u30B3\u30E1\u30F3\u30C8\u6570
mediaFileSuccess.subtitle=\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u3092\u4F5C\u6210\u3057\u307E\u3059\u304B?
-oauthKeys.userKeysTip=\u3053\u308C\u3089\u306F\u3001\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u3065\u3051\u3089\u308C\u305F\u30AD\u30FC\u3067\u3059\u3002\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u304C\u5FC5\u8981\u306A\u30D6\u30ED\u30B0\u30FB\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u3092\u8A8D\u53EF\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002
categoriesForm.noresults=\u73FE\u5728\u3001\u30AB\u30C6\u30B4\u30EA\u306F\u3042\u308A\u307E\u305B\u3093
installer.errorCreatingTablesExplanation=\u30C6\u30FC\u30D6\u30EB\u306E\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u4F5C\u6210\u30B9\u30AF\u30EA\u30D7\u30C8\u306B\u554F\u984C\u304C\u3042\u308B\u304B\u3001\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u306A\u3044\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u4F7F\u7528\u3055\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3042\u306A\u305F\u306F\u3001\u3053\u306E\u554F\u984C\u3092\u89E3\u6C7A\u3057\u3066Roller\u3092\u518D\u8D77\u52D5\u307E\u305F\u306F\u518D\u30C7\u30D7\u30ED\u30A4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u4F5C\u6210\u51E6\u7406\u4E2D\u306E\u6210\u529F/\u30A8\u30E9\u30FC\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u4EE5\u4E0B\u3067\u3059\:
commonPingTargets.error.loading=\u5171\u901APing\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F
@@ -1353,7 +1342,6 @@ mediaFileView.gt=>
pageForm.action=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u7DE8\u96C6
mediaFileSuccess.size=\u30B5\u30A4\u30BA\:
configForm.allowUserWeblogCreation=\u30E6\u30FC\u30B6\u306B\u65B0\u3057\u3044\u30D6\u30ED\u30B0\u306E\u4F5C\u6210\u3092\u8A31\u53EF\u3057\u307E\u3059\u304B?
-oauthKeys.consumerKey=\u30B3\u30F3\u30B7\u30E5\u30FC\u30DE\u30FC\u30FB\u30AD\u30FC
categoryForm.requiredFields={0} \u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059
mediaFileEdit.updateFileContents=\u30D5\u30A1\u30A4\u30EB\u306E\u5185\u5BB9\u3092\u66F4\u65B0\u3059\u308B
websiteSettings.error.processingBannedwordslist=\u30D6\u30E9\u30C3\u30AF\u30EA\u30B9\u30C8\u306E\u51E6\u7406\u30A8\u30E9\u30FC\: {0}
@@ -1383,7 +1371,7 @@ pingTargetAdd.subtitle=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u8FFD\u52A0
planetSubscription.feedUrl=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL
mediaFileSuccess.noEnclosure=\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3\u306A\u3057
userRegister.tip.ready=\u3088\u308D\u3057\u3051\u308C\u3070\u3001\u4EE5\u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
-configForm.AtomPubAuth=AtomPub\u8A8D\u8A3C (basic, oauth, \u307E\u305F\u306F wsse)
+configForm.AtomPubAuth=AtomPub\u8A8D\u8A3C (basic \u307E\u305F\u306F wsse)
ConfigForm.proxyPort=Feed fetcher\u304C\u4F7F\u7528\u3059\u308B\u30D7\u30ED\u30AD\u30B7\u306E\u30DD\u30FC\u30C8
mediaFileView.searchTitle=\u691C\u7D22\u7D50\u679C
weblogEdit.enclosureLength=\u9577\u3055
@@ -1395,7 +1383,6 @@ pageRemoves.youSure=\u3053\u306E\u30DA\u30FC\u30B8\u3092\u524A\u9664\u3057\u307E
mediaFileAdd.fileLocation=\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E
mediaFileView.eq=\=
userAdmin.error.userNotFound=\u6307\u5B9A\u3055\u308C\u305F\u30E6\u30FC\u30B6\u306F\u5B58\u5728\u3057\u307E\u305B\u3093
-oauthKeys.siteWideKeysTip=\u3042\u306A\u305F\u306F\u30B5\u30A4\u30C8\u306E\u7BA1\u7406\u8005\u3067\u3042\u308B\u305F\u3081\u3001\u30B5\u30A4\u30C8\u5168\u4F53\u306E\u30AD\u30FC\u3068\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u6A29\u3092\u6301\u3063\u3066\u3044\u307E\u3059\u3002\u3042\u306A\u305F\u306F\u3053\u308C\u3092\u3001\u3053\u306E\u30B5\u30A4\u30C8\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u304C\u5FC5\u8981\u306A\u4ED6\u306E\u30B5\u30A4\u30C8\u306B\u5BFE\u3057\u3066\u63D0\u4F9B\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305F\u3060\u3057\u3001\u30E6\u30FC\u30B6\u306F\u30A2\u30AF\u30BB\u30B9\u3092\u8A8D\u53EF\u3059\u308B\u305F\u3081\u306BRoller\u3078\u30ED\u30B0\u30A4\u30F3\u3057\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093\u3002
editPages.remove.notFound=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8ID {0} \u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3067\u3057\u305F
planetGroups.prompt.add=\u30B0\u30EB\u30FC\u30D7\u3092\u4F5C\u6210\u3059\u308B\u306B\u306F\u3001\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3067\u4F7F\u7528\u3055\u308C\u308B\u8868\u793A\u540D\u304A\u3088\u3073\u30E6\u30CB\u30FC\u30AF\u30FB\u30CF\u30F3\u30C9\u30EB\u3092\u5165\u529B\u3057\u3066\u4FDD\u5B58\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
mediaFileView.matchingResults=\u6761\u4EF6\u306B\u5408\u81F4\u3059\u308B {0} \u4EF6\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002
@@ -1408,9 +1395,7 @@ mediaFileView.filesNamed=\u540D\u524D\u304C {0} \u3067\u59CB\u307E\u308B\
editPages.remove.requiredTemplate=\u5FC5\u9808\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306F\u524A\u9664\u3067\u304D\u307E\u305B\u3093
user.account.activation.mail.subject=Roller\: \u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30A2\u30AF\u30C6\u30A3\u30D9\u30FC\u30B7\u30E7\u30F3\u30FB\u30B3\u30FC\u30C9
generic.error.check.logs=Roller\u30B7\u30B9\u30C6\u30E0\u30FB\u30A8\u30E9\u30FC - \u7BA1\u7406\u8005\u306BRoller\u306E\u30ED\u30B0\u306E\u78BA\u8A8D\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044\u3002
-oauthKeys.authorizationURL=\u8A8D\u53EFURL
weblogEdit.scheduledEntry=\u30A8\u30F3\u30C8\u30EA\u30FC\u306E\u516C\u958B\u304C {0} \u306B\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u3055\u308C\u307E\u3057\u305F
-yourWebsites.oauthKeys=OAuth\u8A8D\u8A3C\u60C5\u5831
weblogEdit.mediaCastLacksContentTypeOrLength=\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3URL\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u30B5\u30FC\u30D0\u306FContent-Type\u307E\u305F\u306FLength\u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002
frontpageConfig.weblogs.error=\u30D6\u30ED\u30B0\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u4E2D\u306B\u4E88\u671F\u305B\u306C\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
pingTarget.created=Ping\u30BF\u30FC\u30B2\u30C3\u30C8 "{0}" \u304C\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F
@@ -1423,12 +1408,10 @@ mediaFileEdit.tags=\u30BF\u30B0\uFF08\u30B9\u30DA\u30FC\u30B9\u3067\u5206\u5272\
macro.weblog.noEntriesForCategory=\u6307\u5B9A\u3055\u308C\u305F\u30AB\u30C6\u30B4\u30EA\u306B\u306F\u30A8\u30F3\u30C8\u30EA\u30FC\u304C\u3042\u308A\u307E\u305B\u3093
userAdmin.noPasswordForOpenID=OpenID\u3092\u6307\u5B9A\u3059\u308B\u5834\u5408\u306F\u3001\u30D1\u30B9\u30EF\u30FC\u30C9\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u7A7A\u767D\u306E\u307E\u307E\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
mediaFileAdd.errorUploading=\u30D5\u30A1\u30A4\u30EB {0} \u306E\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
-oauthKeys.requestTokenURL=\u30EA\u30AF\u30A8\u30B9\u30C8\u30FB\u30C8\u30FC\u30AF\u30F3URL
Register.error.timeZoneNull=\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059
mediaFileSuccess.selectEnclosure=RSS/Atom\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3\uFF08\u4F8B\uFF1APodcast\uFF09\u3068\u3057\u3066\u30A8\u30F3\u30C8\u30EA\u306B\u542B\u3081\u308B\u30D5\u30A1\u30A4\u30EB\u30921\u3064\uFF08\u307E\u305F\u306F\u3001\u306A\u3057\uFF09\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\:
mediaFileSuccess.bytes=\u30D0\u30A4\u30C8
mediaFileView.moveSelected=\u9078\u629E\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u30D5\u30A9\u30EB\u30C0\u306B\u79FB\u52D5\:
-oauthKeys.urls=OAuth\u306EURL
tabbedmenu.admin.planetGroupSubs=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3
weblogEdit.submittedForReview=\u30A8\u30F3\u30C8\u30EA\u30FC\u304C\u30EC\u30D3\u30E5\u30FC\u3092\u53D7\u3051\u308B\u305F\u3081\u306B\u9001\u4FE1\u3055\u308C\u307E\u3057\u305F
installer.upgradeTables=\u30C6\u30FC\u30D6\u30EB\u3092\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u3057\u307E\u3059\u304B?
@@ -1437,7 +1420,6 @@ mediaFileSuccess.selectImages=\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u306B\u
bookmarkForm.created=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF "{0}" \u304C\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F
installer.bannerTitleLeft=Apache Roller Weblogger
stylesheetEdit.confirmRevert=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u30C6\u30FC\u30DE\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u306B\u623B\u3057\u3066\u3088\u308D\u3057\u3044\u3067\u3059\u304B?
-oauthKeys.consumerSecret=\u30B3\u30F3\u30B7\u30E5\u30FC\u30DE\u30FC\u30FB\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8
categoryForm.removed=\u30AB\u30C6\u30B4\u30EA "{0}" \u304C\u524A\u9664\u3055\u308C\u307E\u3057\u305F
maintenance.message.indexed.failure=\u691C\u7D22\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u518D\u69CB\u7BC9\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F - \u30B7\u30B9\u30C6\u30E0\u30FB\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044
bookmarksForm.selectAllLabel=\u3059\u3079\u3066\u306E\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u9078\u629E
@@ -1450,6 +1432,5 @@ userSettings.tip.username=\u30E6\u30FC\u30B6\u540D\u306F\u5909\u66F4\u3067\u304D
installer.heresTheStackTrace=\u30C7\u30D0\u30C3\u30B0\u306E\u52A9\u3051\u3068\u306A\u308B\u3001\u4F8B\u5916\u306E\u30B9\u30BF\u30C3\u30AF\u30C8\u30EC\u30FC\u30B9\u306F\u3053\u3061\u3089\:
weblogEntry.pendingEntrySubject=Roller\: \u30D6\u30ED\u30B0 "{0}" \u306E\u65B0\u3057\u3044\u30EC\u30D3\u30E5\u30FC\u5F85\u3061\u306E\u6295\u7A3F ({1})
frontpageConfig.frontpageBlogName=\u30D5\u30ED\u30F3\u30C8\u30FB\u30DA\u30FC\u30B8\u30FB\u30D6\u30ED\u30B0\u306E\u540D\u524D
-oauthAuthorize.description=\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8 {0} \u306BOAuth\u30A2\u30AF\u30BB\u30B9\u3092\u8A8D\u53EF\u3057\u307E\u3059\u304B?
weblogEntryQuery.date.toStringFormat={0,date,yy/MM/dd HH:mm}
commentManagement.date.toStringFormat={0,date,yy/MM/dd HH:mm}
diff --git a/app/src/main/resources/ApplicationResources_zh_CN.properties b/app/src/main/resources/ApplicationResources_zh_CN.properties
index 93ac844968..49a4edb32d 100644
--- a/app/src/main/resources/ApplicationResources_zh_CN.properties
+++ b/app/src/main/resources/ApplicationResources_zh_CN.properties
@@ -337,7 +337,7 @@ configForm.editorPages=\u7F16\u8F91\u5668\u9875\u9762
configForm.webServicesSettings=Web\u670D\u52A1\u8BBE\u7F6E
configForm.enableAtomPub=\u542F\u7528 Atom \u53D1\u5E03\u534F\u8BAE
-configForm.AtomPubAuth=AtomPub \u8BA4\u8BC1\u65B9\u5F0F (basic / oauth / wsse)
+configForm.AtomPubAuth=AtomPub \u8BA4\u8BC1\u65B9\u5F0F (basic / wsse)
configForm.enableXmlRpc=\u542F\u7528 Blogger / MetaWeblog API
configForm.weblogSettings=\u535A\u5BA2\u663E\u793A\u8BBE\u7F6E
@@ -940,37 +940,6 @@ navigationBar.logout=\u6CE8\u9500
navigationBar.login=\u767B\u5F55
navigationBar.register=\u6CE8\u518C
-# ----------------------------------------------------------------- OAuth pages
-
-oauthKeys.title=OAuth\u5BC6\u94A5
-oauthKeys.description=\u4F60\u7684\u8D26\u6237{0}\u4F7F\u7528\u7684OAuth\u5BC6\u94A5
-oauthKeys.tip=\u4F60\u53EF\u4EE5\u6388\u6743\u5176\u4ED6\u652F\u6301OAuth\u7684\u7AD9\u70B9\u548C\u5BA2\u6237\u7AEF\u7A0B\u5E8F\u767B\u5F55\u4F60\u7684\u8D26\u53F7\u53D1\u5E03\u548C\u7F16\u8F91\u6587\u7AE0\u3002
-
-
-oauthKeys.consumerKey=\u5BA2\u6237\u79C1\u94A5
-oauthKeys.consumerSecret=\u5BA2\u6237\u5BC6\u94A5
-oauthKeys.userKeys=\u7528\u6237\u6307\u5B9A\u7684\u5BC6\u94A5
-oauthKeys.userKeysTip=\u8FD9\u4E9B\u5BC6\u94A5\u4E0E\u4F60\u7684\u8D26\u6237\u76F8\u5173\u8054\uFF0C\u53EF\u4EE5\u7528\u6765\u6388\u6743\u5BA2\u6237\u7AEF\u7A0B\u5E8F\u767B\u5F55\u4F60\u7684\u8D26\u53F7\u3002
-
-oauthKeys.siteWideKeys=\u5168\u7AD9\u8303\u56F4\u5BC6\u94A5
-oauthKeys.siteWideKeysTip=\u7531\u4E8E\u4F60\u662F\u8D85\u7EA7\u7BA1\u7406\u5458\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528\u5168\u7AD9\u8303\u56F4\u5BC6\u94A5\u3002\u4F60\u53EF\u4EE5\u5C06\u5176\u7ED9\u4E88\u5176\u4ED6\u9700\u8981\u767B\u5F55\u672C\u7AD9\u8D26\u53F7\u7684\u7AD9\u70B9\u3002
-
-
-
-oauthKeys.urls=OAuth\u8BA4\u8BC1URL
-oauthKeys.urlsTip=\u8FD9\u662F\u4F60\u7684\u5BA2\u6237\u7AEF\u7A0B\u5E8F\u767B\u5F55\u535A\u5BA2\u8D26\u6237\u65F6\u9700\u8981\u4F7F\u7528\u7684OAuth\u8BA4\u8BC1URL\u3002
-
-oauthKeys.requestTokenURL=\u8BF7\u6C42\u6807\u8BC6URL
-oauthKeys.authorizationURL=\u8BA4\u8BC1URL
-oauthKeys.accessTokenURL=\u8BBF\u95EE\u6807\u8BC6URL
-
-
-oauthAuthorize.title=OAuth\u8BA4\u8BC1
-oauthAuthorize.description=\u786E\u5B9A\u8981\u5141\u8BB8OAuth\u8BA4\u8BC1\u5BA2\u6237\u7AEF\u8BBF\u95EE{0}\u8D26\u53F7\u5417\uFF1F
-oauthAuthorize.tip=\u6709\u67D0\u4E2A\u7AD9\u70B9\u8BF7\u6C42\u8BBF\u95EE\u4F60\u7684\u8D26\u53F7\u3002\u8BF7\u70B9\u51FB\u4EE5\u4E0B\u6309\u94AE\u4EE5\u5141\u8BB8\u8BBF\u95EE\u6216\u5173\u95ED\u7A97\u53E3\u4EE5\u62D2\u7EDD\u8BBF\u95EE\u3002
-
-
-
# -------------------------------------------------------------- Page management
pagesForm.title=\u9875\u9762\u6A21\u677F
@@ -1841,10 +1810,6 @@ yourWebsites.createWeblog.desc=\u4F60\u8FD8\u6709\u66F4\u591A\u60F3\u8981\u8868\
yourWebsites.editProfile=\u7F16\u8F91\u7528\u6237\u4FE1\u606F
yourWebsites.editProfile.desc=\u4FEE\u6539\u5BC6\u7801\u3001\u8054\u7CFB\u4FE1\u606F\u6216\u754C\u9762\u8BED\u8A00\u3002
-yourWebsites.oauthKeys=OAuth\u51ED\u8BC1
-yourWebsites.oauthKeys.desc=\u5141\u8BB8\u5176\u4ED6\u7AD9\u70B9\u548C\u7A0B\u5E8F\u8FDC\u7A0B\u8BBF\u95EE\u4F60\u7684\u8D26\u53F7\u3002
-
-
yourWebsites.globalAdmin=\u670D\u52A1\u5668\u7BA1\u7406
yourWebsites.globalAdmin.desc=\u8FDB\u884C\u5168\u7AD9\u8303\u56F4\u7684\u7BA1\u7406\u64CD\u4F5C\u3002
diff --git a/app/src/main/resources/META-INF/persistence.xml b/app/src/main/resources/META-INF/persistence.xml
index 199c87280b..e27c7b43ff 100644
--- a/app/src/main/resources/META-INF/persistence.xml
+++ b/app/src/main/resources/META-INF/persistence.xml
@@ -1,5 +1,8 @@
-
+
+ "-//Apache Software Foundation//DTD Struts Configuration 6.5//EN"
+ "https://struts.apache.org/dtds/struts-6.5.dtd">
+
+
+
+
+
+
+
+
+
@@ -47,14 +63,16 @@
-
+
+
-
+
@@ -137,18 +155,6 @@
execute,save
-
- .OAuthKeys
- execute
-
-
-
- .OAuthAuthorize
- execute
-
-
.CreateWeblog
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
index 29cbb23d1b..b70cc1eeb0 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
@@ -34,14 +34,6 @@
">
- <%-- Edit profile --%>
-
-
-
- ">
-
-
-
<%-- Create weblog --%>
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/OAuthAuthorize.jsp b/app/src/main/webapp/WEB-INF/jsps/core/OAuthAuthorize.jsp
deleted file mode 100644
index bc63ca2a42..0000000000
--- a/app/src/main/webapp/WEB-INF/jsps/core/OAuthAuthorize.jsp
+++ /dev/null
@@ -1,40 +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.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-