From ff34095f325446cc245b3cd3b90d9159c680e33a Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 07:57:43 -0600 Subject: [PATCH 01/22] Upgrade to Java 17, Derby 10.16.1.1, and fix SLF4J bridge Phase 0 of the javax to Jakarta EE 10 migration (ROL-2183). - Set compiler target from Java 11 to Java 17 (required by Spring 7, Struts 7) - Upgrade Derby from 10.11.1.1 to 10.16.1.1 (old version doesn't support Java 17) - Fix SLF4J bridge: log4j-slf4j-impl is for SLF4J 1.x, switch to log4j-slf4j2-impl to match the SLF4J 2.0.16 already declared in app/pom.xml --- app/pom.xml | 2 +- pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/pom.xml b/app/pom.xml index e40aef0d1..beafd9bf3 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -328,7 +328,7 @@ limitations under the License. org.apache.logging.log4j - log4j-slf4j-impl + log4j-slf4j2-impl ${log4j2.version} diff --git a/pom.xml b/pom.xml index 56f6a110f..dcd64dd62 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ limitations under the License. - 10.11.1.1 + 10.16.1.1 1.4.7 2.3.1 10.0.24 @@ -64,7 +64,7 @@ limitations under the License. maven-compiler-plugin 3.13.0 - 11 + 17 true -Xlint:all From 68e4af47191b530714b092426fdc9c1617428727 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 08:15:32 -0600 Subject: [PATCH 02/22] Remove OAuth 1.0a, OpenID 2.0 filter, and unused dependencies Phase 1 of the Jakarta EE 10 migration removes unmaintained and obsolete dependencies while still on the javax namespace so changes can be tested incrementally. - Remove all OAuth 1.0a support (net.oauth.core:oauth-provider): 3 servlets, OAuthManager interface and JPA implementation, Struts actions, JSPs, ORM mappings, SQL schema, Guice bindings, and test - Remove spring-security-openid: delete CustomOpenIDAuthenticationProcessingFilter, remove OpenID beans from security.xml, simplify RollerUserDetailsService and RollerSession to remove OpenID URL detection - Remove struts2-bootstrap-plugin (unused taglib, never referenced in JSPs) - Remove OAuth URL methods from URLStrategy and MultiWeblogURLStrategy - Remove OAuth authentication path from RollerAtomHandler (keep WSSE and BASIC) - Clean up ApplicationResources properties files (EN, JA, ZH_CN) to remove OAuth keys/authorize entries --- app/pom.xml | 35 +- .../business/MultiWeblogURLStrategy.java | 16 - .../weblogger/business/OAuthManager.java | 112 ----- .../weblogger/business/URLStrategy.java | 10 - .../roller/weblogger/business/Weblogger.java | 7 - .../weblogger/business/WebloggerImpl.java | 14 - .../business/jpa/JPAOAuthManagerImpl.java | 400 ------------------ .../business/jpa/JPAWebloggerImpl.java | 2 - .../business/jpa/JPAWebloggerModule.java | 7 - .../weblogger/pojos/OAuthAccessorRecord.java | 185 -------- .../weblogger/pojos/OAuthConsumerRecord.java | 110 ----- .../weblogger/ui/core/RollerSession.java | 11 +- ...mOpenIDAuthenticationProcessingFilter.java | 114 ----- .../security/RollerUserDetailsService.java | 59 +-- .../ui/struts2/core/OAuthAuthorize.java | 101 ----- .../weblogger/ui/struts2/core/OAuthKeys.java | 117 ----- .../atomprotocol/RollerAtomHandler.java | 32 +- .../webservices/oauth/AccessTokenServlet.java | 99 ----- .../oauth/AuthorizationServlet.java | 167 -------- .../oauth/RequestTokenServlet.java | 110 ----- .../resources/ApplicationResources.properties | 37 +- .../ApplicationResources_ja.properties | 21 +- .../ApplicationResources_zh_CN.properties | 37 +- .../main/resources/META-INF/persistence.xml | 4 +- .../pojos/OAuthAccessorRecord.orm.xml | 46 -- .../pojos/OAuthConsumerRecord.orm.xml | 31 -- .../resources/sql/400-to-500-migration.vm | 23 - .../resources/sql/510-to-520-migration.vm | 2 - app/src/main/resources/sql/createdb.vm | 25 -- app/src/main/resources/sql/droptables.sql | 4 - app/src/main/resources/struts.xml | 12 - .../WEB-INF/jsps/core/MainMenuSidebar.jsp | 8 - .../WEB-INF/jsps/core/OAuthAuthorize.jsp | 40 -- .../webapp/WEB-INF/jsps/core/OAuthKeys.jsp | 72 ---- .../webapp/WEB-INF/jsps/taglibs-struts2.jsp | 1 - app/src/main/webapp/WEB-INF/security.xml | 19 +- app/src/main/webapp/WEB-INF/tiles.xml | 8 - app/src/main/webapp/WEB-INF/web.xml | 34 -- .../business/jpa/JPAOAuthManagerTest.java | 93 ---- testing/junit-cleartables-mysql.sql | 2 - 40 files changed, 21 insertions(+), 2206 deletions(-) delete mode 100644 app/src/main/java/org/apache/roller/weblogger/business/OAuthManager.java delete mode 100644 app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java delete mode 100644 app/src/main/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.java delete mode 100644 app/src/main/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.java delete mode 100644 app/src/main/java/org/apache/roller/weblogger/ui/core/filters/CustomOpenIDAuthenticationProcessingFilter.java delete mode 100644 app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/OAuthAuthorize.java delete mode 100644 app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/OAuthKeys.java delete mode 100644 app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java delete mode 100644 app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java delete mode 100644 app/src/main/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java delete mode 100644 app/src/main/resources/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml delete mode 100644 app/src/main/resources/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml delete mode 100644 app/src/main/webapp/WEB-INF/jsps/core/OAuthAuthorize.jsp delete mode 100644 app/src/main/webapp/WEB-INF/jsps/core/OAuthKeys.jsp delete mode 100644 app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java diff --git a/app/pom.xml b/app/pom.xml index beafd9bf3..4e77923c7 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -50,8 +50,7 @@ limitations under the License. 7.0.0 2.24.3 9.12.1 - 20100527 - 3.4.0 +3.4.0 3.5.2 1.0b3 1.19.0 @@ -60,7 +59,6 @@ limitations under the License. 5.8.14 2.5.29 2.4.1 - 1.6 1.0.2 3.1.3 @@ -249,7 +247,7 @@ limitations under the License. org.webjars webjars-servlet-2.x - ${webjars.version} + 1.6 @@ -450,22 +448,6 @@ limitations under the License. ${spring.security.version} - - org.springframework.security - spring-security-openid - ${spring.security.version} - - - com.google.inject - guice - - - commons-logging - commons-logging - - - - org.springframework.security spring-security-taglibs @@ -503,12 +485,6 @@ limitations under the License. - - com.jgeppert.struts2.bootstrap - struts2-bootstrap-plugin - 4.0.0 - - com.rometools rome @@ -536,13 +512,6 @@ limitations under the License. - - net.oauth.core - oauth-provider - compile - ${oauth-core.version} - - org.bouncycastle bcpkix-jdk15on diff --git a/app/src/main/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java b/app/src/main/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java index acb077ec5..583e9b506 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java @@ -455,21 +455,5 @@ public String getOpenSearchWeblogURL(String weblogHandle) { return WebloggerRuntimeConfig.getAbsoluteContextURL() + "/roller-services/opensearch/" + weblogHandle; } - @Override - public String getOAuthRequestTokenURL() { - return WebloggerRuntimeConfig.getAbsoluteContextURL() + "/roller-services/oauth/requestToken"; - } - - @Override - public String getOAuthAuthorizationURL() { - return WebloggerRuntimeConfig.getAbsoluteContextURL() + "/roller-services/oauth/authorize"; - } - @Override - public String getOAuthAccessTokenURL() { - return WebloggerRuntimeConfig.getAbsoluteContextURL() + "/roller-services/oauth/accessToken"; - } - } - - diff --git a/app/src/main/java/org/apache/roller/weblogger/business/OAuthManager.java b/app/src/main/java/org/apache/roller/weblogger/business/OAuthManager.java deleted file mode 100644 index 329b225b0..000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/OAuthManager.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2007 AOL, LLC. - * - * 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.business; - -import java.io.IOException; - -import net.oauth.OAuthAccessor; -import net.oauth.OAuthConsumer; -import net.oauth.OAuthException; -import net.oauth.OAuthMessage; -import net.oauth.OAuthProblemException; -import net.oauth.OAuthServiceProvider; -import net.oauth.OAuthValidator; -import org.apache.roller.weblogger.WebloggerException; - - -/** - * Management of and access to configured and persistent OAuth objects. - */ -public interface OAuthManager { - - /** - * Get validator to be used to OAuth validate messages. - */ - OAuthServiceProvider getServiceProvider(); - - /** - * Get validator to be used to OAuth validate messages. - */ - OAuthValidator getValidator(); - - /** - * Get the site-wide consumer. - */ - OAuthConsumer getConsumer() - throws WebloggerException; - - /** - * Get consumer corresponding to request. - */ - OAuthConsumer getConsumerByUsername(String username) - throws WebloggerException; - - /** - * Get consumer corresponding to request. - */ - OAuthConsumer getConsumer( - OAuthMessage requestMessage) - throws IOException, OAuthProblemException; - - /** - * Add a site-wide consumer provided a key, there can only be one. - */ - OAuthConsumer addConsumer(String consumerKey) - throws OAuthException, WebloggerException; - - /** - * Store a new consumer for specified user, each user can have only one. - */ - OAuthConsumer addConsumer(String username, String consumerKey) - throws OAuthException; - - /** - * Get the access token and token secret for the given request. - * If token is provided, it better be good; otherwise exception. - * If consumer key is provided and no accessor exists, will return null. - * - * @param requestMessage Request with token or consumer key - * @return Accessor or null if consumer key does not have a token yet - * @throws OAuthProblemException If provided token is bad - * @throws java.io.IOException on IO error - */ - OAuthAccessor getAccessor(OAuthMessage requestMessage) - throws IOException, OAuthProblemException; - - /** - * Set the access token - */ - void markAsAuthorized(OAuthAccessor accessor, String userId) - throws OAuthException; - - /** - * Generate a fresh request token and secret for a consumer. - * - * @throws OAuthException - */ - void generateRequestToken( - OAuthAccessor accessor) - throws OAuthException; - - /** - * Generate a fresh request token and secret for a consumer. - * - * @throws OAuthException - */ - void generateAccessToken(OAuthAccessor accessor) - throws OAuthException; -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/URLStrategy.java b/app/src/main/java/org/apache/roller/weblogger/business/URLStrategy.java index db87407aa..053bbf48f 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/URLStrategy.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/URLStrategy.java @@ -235,14 +235,4 @@ String getWeblogResourceURL(Weblog weblog, * Get url to JSON tags service url, optionally for a given weblog. */ String getWeblogTagsJsonURL(Weblog weblog, boolean absolute, int pageNum); - - - /* Get URL for obtaining OAuth Request Token */ - String getOAuthRequestTokenURL(); - - /* Get URL authorizing an OAuth Request Token */ - String getOAuthAuthorizationURL(); - - /* Get URL for obtaining OAuth Access Token */ - String getOAuthAccessTokenURL(); } diff --git a/app/src/main/java/org/apache/roller/weblogger/business/Weblogger.java b/app/src/main/java/org/apache/roller/weblogger/business/Weblogger.java index 834efed2c..62f498efb 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/Weblogger.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/Weblogger.java @@ -50,13 +50,6 @@ public interface Weblogger { BookmarkManager getBookmarkManager(); - /** - * - * Get OAuthManager associated with this Weblogger instance. - */ - OAuthManager getOAuthManager(); - - /** * * Get WeblogManager associated with this Weblogger instance. diff --git a/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java index 4dcb1b545..4f6fb8d65 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java @@ -68,7 +68,6 @@ public abstract class WebloggerImpl implements Weblogger { private final UserManager userManager; private final WeblogManager weblogManager; private final WeblogEntryManager weblogEntryManager; - private final OAuthManager oauthManager; private final FeedFetcher feedFetcher; private final PlanetManager planetManager; @@ -98,7 +97,6 @@ protected WebloggerImpl( UserManager userManager, WeblogManager weblogManager, WeblogEntryManager weblogEntryManager, - OAuthManager oauthManager, FeedFetcher feedFetcher, PlanetManager planetManager, org.apache.roller.planet.business.PlanetURLStrategy planetUrlStrategy, @@ -118,7 +116,6 @@ protected WebloggerImpl( this.userManager = userManager; this.weblogManager = weblogManager; this.weblogEntryManager = weblogEntryManager; - this.oauthManager = oauthManager; this.urlStrategy = urlStrategy; this.feedFetcher = feedFetcher; this.planetManager = planetManager; @@ -291,17 +288,6 @@ public PluginManager getPluginManager() { } - /** - * - * - * @see org.apache.roller.weblogger.business.Weblogger#getOAuthManager() - */ - @Override - public OAuthManager getOAuthManager() { - return oauthManager; - } - - /** * @inheritDoc */ diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java deleted file mode 100644 index baebb320d..000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java +++ /dev/null @@ -1,400 +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.business.jpa; - -import java.io.IOException; -import java.sql.Timestamp; -import java.util.Date; -import java.util.UUID; -import jakarta.persistence.TypedQuery; -import net.oauth.OAuthAccessor; -import net.oauth.OAuthConsumer; -import net.oauth.OAuthException; -import net.oauth.OAuthMessage; -import net.oauth.OAuthProblemException; -import net.oauth.OAuthServiceProvider; -import net.oauth.OAuthValidator; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.OAuthManager; -import org.apache.roller.weblogger.business.Weblogger; -import org.apache.roller.weblogger.pojos.OAuthAccessorRecord; -import org.apache.roller.weblogger.pojos.OAuthConsumerRecord; - - -/** - * JPA based OAuth manager implementation. - */ -public class JPAOAuthManagerImpl implements OAuthManager { - private final Weblogger roller; - private final JPAPersistenceStrategy strategy; - private final OAuthValidator validator; - - /** - * The logger instance for this class. - */ - private static final Log log = LogFactory.getFactory().getInstance(JPAOAuthManagerImpl.class); - - - @com.google.inject.Inject - public JPAOAuthManagerImpl( - Weblogger roller, - JPAPersistenceStrategy strategy, - OAuthValidator validator) { - this.roller = roller; - this.strategy = strategy; - this.validator = validator; - } - - @Override - public OAuthServiceProvider getServiceProvider() { - return new OAuthServiceProvider( - roller.getUrlStrategy().getOAuthRequestTokenURL(), - roller.getUrlStrategy().getOAuthAuthorizationURL(), - roller.getUrlStrategy().getOAuthAccessTokenURL()); - } - - @Override - public OAuthValidator getValidator() { - return validator; - } - - @Override - public OAuthConsumer getConsumer( - OAuthMessage requestMessage) - throws IOException, OAuthProblemException { - - OAuthConsumer consumer; - // try to load from local cache if not throw exception - String consumer_key = requestMessage.getConsumerKey(); - - consumer = getConsumerByKey(consumer_key); - - if(consumer == null) { - throw new OAuthProblemException("token_rejected"); - } - - return consumer; - } - - /** - * Get the access token and token secret for the given oauth_token. - */ - @Override - public OAuthAccessor getAccessor(OAuthMessage requestMessage) - throws IOException, OAuthProblemException { - - String consumerToken = requestMessage.getToken(); - OAuthAccessor accessor = null; - if (StringUtils.isNotEmpty(consumerToken)) { - // caller provided a token, it better be good or else - accessor = getAccessorByToken(consumerToken); - if (accessor == null) { - throw new OAuthProblemException("token_expired"); - } - } - - String consumerKey = requestMessage.getConsumerKey(); - if (accessor == null && StringUtils.isNotEmpty(consumerKey)) { - // caller provided contumer key, do we have an accessor yet - accessor = getAccessorByKey(consumerKey); - } - return accessor; - } - - /** - * Set the access token - */ - @Override - public void markAsAuthorized(OAuthAccessor accessor, String userId) - throws OAuthException { - try { - OAuthAccessorRecord record = (OAuthAccessorRecord) strategy.load( - OAuthAccessorRecord.class, accessor.consumer.consumerKey); - record.setUserName(userId); - record.setAuthorized(Boolean.TRUE); - strategy.store(record); - - } catch (WebloggerException ex) { - throw new OAuthException("ERROR: setting authorization flag", ex); - } - } - - /** - * Generate a fresh request token and secret for a consumer. - * @throws OAuthException - */ - @Override - public void generateRequestToken( - OAuthAccessor accessor) - throws OAuthException { - - // generate oauth_token and oauth_secret - String consumer_key = accessor.consumer.consumerKey; - // generate token and secret based on consumer_key - - // for now use md5 of name + current time as token - String token_data = consumer_key + System.nanoTime(); - String token = DigestUtils.md5Hex(token_data); - // for now use md5 of name + current time + token as secret - String secret_data = consumer_key + System.nanoTime() + token; - String secret = DigestUtils.md5Hex(secret_data); - - accessor.requestToken = token; - accessor.tokenSecret = secret; - accessor.accessToken = null; - - // add to the local cache - addAccessor(accessor); - } - - /** - * Generate a fresh request token and secret for a consumer. - * @throws OAuthException - */ - @Override - public void generateAccessToken(OAuthAccessor accessor) - throws OAuthException { - - try { - // generate oauth_token and oauth_secret - // generate token and secret based on consumer_key - String consumer_key = accessor.consumer.consumerKey; - - OAuthAccessorRecord record = (OAuthAccessorRecord) strategy.load( - OAuthAccessorRecord.class, accessor.consumer.consumerKey); - - // for now use md5 of name + current time as token - String token_data = consumer_key + System.nanoTime(); - String token = DigestUtils.md5Hex(token_data); - - record.setRequestToken(null); - record.setAccessToken(token); - strategy.store(record); - - } catch (WebloggerException ex) { - throw new OAuthException("ERROR: generating access token", ex); - } - } - - @Override - public OAuthConsumer addConsumer(String username, String consumerKey) throws OAuthException { - - OAuthConsumerRecord record = new OAuthConsumerRecord(); - record.setConsumerKey(consumerKey); - record.setUserName(username); - record.setConsumerSecret(UUID.randomUUID().toString()); - - try { - strategy.store(record); - } catch (WebloggerException ex) { - throw new OAuthException("ERROR storing accessor", ex); - } - - return new OAuthConsumer(null, - record.getConsumerKey(), - record.getConsumerSecret(), - getServiceProvider()); - } - - @Override - public OAuthConsumer addConsumer(String consumerKey) - throws OAuthException, WebloggerException { - if (getConsumer() == null) { - return addConsumer(null, consumerKey); - } else { - throw new OAuthException("ERROR: cannot have more than one site-wide consumer"); - } - } - - @Override - public OAuthConsumer getConsumer() throws WebloggerException { - OAuthConsumerRecord record = null; - try { - TypedQuery q = strategy.getNamedQuery("OAuthConsumerRecord.getSiteWideConsumer", - OAuthConsumerRecord.class); - record = q.getSingleResult(); - - } catch (Exception ex) { - log.debug("ERROR fetching site-wide consumer", ex); - } - if (record != null) { - return new OAuthConsumer( - null, - record.getConsumerKey(), - record.getConsumerSecret(), - getServiceProvider()); - } - return null; - } - - @Override - public OAuthConsumer getConsumerByUsername(String username) throws WebloggerException { - OAuthConsumerRecord record = null; - try { - TypedQuery q = strategy.getNamedQuery("OAuthConsumerRecord.getByUsername", - OAuthConsumerRecord.class); - q.setParameter(1, username); - record = q.getSingleResult(); - - } catch (Exception ex) { - log.debug("ERROR fetching consumer", ex); - } - if (record != null) { - OAuthConsumer consumer = new OAuthConsumer( - null, - record.getConsumerKey(), - record.getConsumerSecret(), - getServiceProvider()); - consumer.setProperty("userName", record.getUserName()); - return consumer; - } - return null; - } - - - //--------------------------------------------- package protected internals - - OAuthConsumer consumerFromRecord(OAuthConsumerRecord record) { - OAuthConsumer consumer = null; - if (record != null) { - consumer = new OAuthConsumer( - null, - record.getConsumerKey(), - record.getConsumerSecret(), - getServiceProvider()); - if (record.getUserName() != null) { - consumer.setProperty("userId", record.getUserName()); - } - } - return consumer; - } - - OAuthAccessor accessorFromRecord(OAuthAccessorRecord record) { - OAuthAccessor accessor = null; - if (record != null) { - accessor = - new OAuthAccessor(getConsumerByKey(record.getConsumerKey())); - accessor.accessToken = record.getAccessToken(); - accessor.requestToken = record.getRequestToken(); - accessor.tokenSecret = record.getTokenSecret(); - if (record.getAuthorized() != null) { - accessor.setProperty("authorized", record.getAuthorized()); - } - if (record.getUserName() != null) { - accessor.setProperty("userId", record.getUserName()); - } - } - return accessor; - } - - OAuthConsumer getConsumerByKey(String consumerKey) { - OAuthConsumerRecord record = null; - try { - TypedQuery q = strategy.getNamedQuery("OAuthConsumerRecord.getByConsumerKey", - OAuthConsumerRecord.class); - q.setParameter(1, consumerKey); - record = q.getSingleResult(); - - } catch (Exception ex) { - log.debug("ERROR fetching consumer", ex); - } - return consumerFromRecord(record); - } - - void addAccessor(OAuthAccessor accessor) throws OAuthException { - - OAuthAccessorRecord record = new OAuthAccessorRecord(); - record.setConsumerKey(accessor.consumer.consumerKey); - record.setRequestToken(accessor.requestToken); - record.setAccessToken(accessor.accessToken); - record.setTokenSecret(accessor.tokenSecret); - if (accessor.getProperty("userId") != null) { - record.setUserName((String)accessor.getProperty("userId")); - } - - if (record.getCreated() != null) { - record.setCreated(record.getCreated()); - } else { - record.setCreated(new Timestamp(new Date().getTime())); - } - - if (record.getUpdated() != null) { - record.setUpdated(record.getUpdated()); - } else { - record.setUpdated(record.getCreated()); - } - - if (accessor.getProperty("authorized") != null) { - record.setAuthorized((Boolean)accessor.getProperty("authorized")); - } - try { - strategy.store(record); - } catch (WebloggerException ex) { - throw new OAuthException("ERROR storing accessor", ex); - } - } - - OAuthAccessor getAccessorByKey(String consumerKey) { - OAuthAccessorRecord record = null; - try { - TypedQuery q = strategy.getNamedQuery("OAuthAccessorRecord.getByKey", - OAuthAccessorRecord.class); - q.setParameter(1, consumerKey); - record = q.getSingleResult(); - - } catch (Exception ex) { - log.debug("ERROR fetching accessor", ex); - } - return accessorFromRecord(record); - } - - OAuthAccessor getAccessorByToken(String token) { - OAuthAccessorRecord record = null; - try { - TypedQuery q = strategy.getNamedQuery("OAuthAccessorRecord.getByToken", - OAuthAccessorRecord.class); - q.setParameter(1, token); - record = q.getSingleResult(); - - } catch (Exception ex) { - log.debug("ERROR fetching accessor", ex); - } - return accessorFromRecord(record); - } - - void removeConsumer(OAuthConsumer consumer) throws OAuthException { - try { - strategy.remove(OAuthConsumerRecord.class, consumer.consumerKey); - } catch (WebloggerException ex) { - throw new OAuthException("ERROR removing consumer", ex); - } - } - - void removeAccessor(OAuthAccessor accessor) throws OAuthException { - try { - strategy.remove(OAuthAccessorRecord.class, accessor.consumer.consumerKey); - } catch (WebloggerException ex) { - throw new OAuthException("ERROR removing accessor", ex); - } - } -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java index fe74ea040..91597ca10 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java @@ -61,7 +61,6 @@ protected JPAWebloggerImpl( UserManager userManager, WeblogManager weblogManager, WeblogEntryManager weblogEntryManager, - OAuthManager oauthManager, FeedFetcher feedFetcher, PlanetManager planetManager, PlanetURLStrategy planetUrlStrategy, @@ -82,7 +81,6 @@ protected JPAWebloggerImpl( userManager, weblogManager, weblogEntryManager, - oauthManager, feedFetcher, planetManager, planetUrlStrategy, diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java index d9e189494..f3e392862 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java @@ -20,8 +20,6 @@ import com.google.inject.Binder; import com.google.inject.Module; -import net.oauth.OAuthValidator; -import net.oauth.SimpleOAuthValidator; import org.apache.roller.planet.business.MultiPlanetURLStrategy; import org.apache.roller.planet.business.Planet; import org.apache.roller.planet.business.PlanetManager; @@ -34,7 +32,6 @@ import org.apache.roller.weblogger.business.FileContentManagerImpl; import org.apache.roller.weblogger.business.MediaFileManager; import org.apache.roller.weblogger.business.MultiWeblogURLStrategy; -import org.apache.roller.weblogger.business.OAuthManager; import org.apache.roller.weblogger.business.PropertiesManager; import org.apache.roller.weblogger.business.URLStrategy; import org.apache.roller.weblogger.business.Weblogger; @@ -75,10 +72,6 @@ public void configure(Binder binder) { binder.bind(UserManager.class).to( JPAUserManagerImpl.class); binder.bind(WeblogManager.class).to( JPAWeblogManagerImpl.class); binder.bind(WeblogEntryManager.class).to( JPAWeblogEntryManagerImpl.class); - binder.bind(OAuthManager.class).to( JPAOAuthManagerImpl.class); - - binder.bind(OAuthValidator.class).to( SimpleOAuthValidator.class); - binder.bind(MediaFileManager.class).to( JPAMediaFileManagerImpl.class); binder.bind(FileContentManager.class).to( FileContentManagerImpl.class); binder.bind(IndexManager.class).to( LuceneIndexManager.class); diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.java b/app/src/main/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.java deleted file mode 100644 index e76e9b7ee..000000000 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.java +++ /dev/null @@ -1,185 +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.pojos; - -import java.io.Serializable; -import java.sql.Timestamp; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; - - -/** - * Stores data for an OAuth accessor - */ -public class OAuthAccessorRecord implements Serializable { - private String consumerKey; - private String requestToken; - private String accessToken; - private String tokenSecret; - private Timestamp created; - private Timestamp updated; - private Boolean authorized; - private String userName; - - public OAuthAccessorRecord() { - } - - /** - * @return the consumerKey - */ - public String getConsumerKey() { - return consumerKey; - } - - /** - * @param consumerKey the consumerKey to set - */ - public void setConsumerKey(String consumerKey) { - this.consumerKey = consumerKey; - } - - /** - * @return the requestToken - */ - public String getRequestToken() { - return requestToken; - } - - /** - * @param requestToken the requestToken to set - */ - public void setRequestToken(String requestToken) { - this.requestToken = requestToken; - } - - /** - * @return the accessToken - */ - public String getAccessToken() { - return accessToken; - } - - /** - * @param accessToken the accessToken to set - */ - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - /** - * @return the tokenSecret - */ - public String getTokenSecret() { - return tokenSecret; - } - - /** - * @param tokenSecret the tokenSecret to set - */ - public void setTokenSecret(String tokenSecret) { - this.tokenSecret = tokenSecret; - } - - /** - * @return the created - */ - public Timestamp getCreated() { - return created; - } - - /** - * @param created the created to set - */ - public void setCreated(Timestamp created) { - this.created = created; - } - - /** - * @return the updated - */ - public Timestamp getUpdated() { - return updated; - } - - /** - * @param updated the updated to set - */ - public void setUpdated(Timestamp updated) { - this.updated = updated; - } - - //------------------------------------------------------- Good citizenship - - @Override - public String toString() { - StringBuilder buf = new StringBuilder(); - buf.append("{"); - buf.append(this.getConsumerKey()); - buf.append("}"); - return buf.toString(); - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - if (!(other instanceof OAuthAccessorRecord)) { - return false; - } - OAuthAccessorRecord o = (OAuthAccessorRecord)other; - return new EqualsBuilder() - .append(getConsumerKey(), o.getConsumerKey()) - .isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(getConsumerKey()).toHashCode(); - } - - /** - * @return the authorized - */ - public Boolean getAuthorized() { - return authorized; - } - - /** - * @param authorized the authorized to set - */ - public void setAuthorized(Boolean authorized) { - this.authorized = authorized; - } - - /** - * @return the userName - */ - public String getUserName() { - return userName; - } - - /** - * @param userName the userName to set - */ - public void setUserName(String userName) { - this.userName = userName; - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.java b/app/src/main/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.java deleted file mode 100644 index 5ab75b0c9..000000000 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.java +++ /dev/null @@ -1,110 +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.pojos; - -import java.io.Serializable; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; - - -/** - * Stores data for an OAuth consumer key and secret. - * There can be up to one for the whole site and up to one per user. - */ -public class OAuthConsumerRecord implements Serializable { - private String consumerKey; - private String consumerSecret; - private String userName; - - public OAuthConsumerRecord() { - } - - /** - * @return the consumerKey - */ - public String getConsumerKey() { - return consumerKey; - } - - /** - * @param consumerKey the consumerKey to set - */ - public void setConsumerKey(String consumerKey) { - this.consumerKey = consumerKey; - } - - /** - * @return the consumerSecret - */ - public String getConsumerSecret() { - return consumerSecret; - } - - /** - * @param consumerSecret the consumerSecret to set - */ - public void setConsumerSecret(String consumerSecret) { - this.consumerSecret = consumerSecret; - } - - /** - * @return the username - */ - public String getUserName() { - return userName; - } - - /** - * @param username the username to set - */ - public void setUserName(String username) { - this.userName = username; - } - - //------------------------------------------------------- Good citizenship - - @Override - public String toString() { - StringBuilder buf = new StringBuilder(); - buf.append("{"); - buf.append(this.getConsumerKey()); - buf.append("}"); - return buf.toString(); - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - if (!(other instanceof OAuthConsumerRecord)) { - return false; - } - OAuthConsumerRecord o = (OAuthConsumerRecord)other; - return new EqualsBuilder() - .append(getConsumerKey(), o.getConsumerKey()) - .isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(getConsumerKey()).toHashCode(); - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java index 5c0f029c2..97d108832 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java @@ -89,16 +89,7 @@ public static RollerSession getRollerSession(HttpServletRequest request) { UserManager umgr = WebloggerFactory.getWeblogger().getUserManager(); User user = umgr.getUserByUserName(principal.getName()); - - // check for OpenID username (in the form of a URL) - if (user == null && principal.getName() != null && principal.getName().startsWith("http://")) { - String openidurl = principal.getName(); - if (openidurl.endsWith("/")) { - openidurl = openidurl.substring(0, openidurl.length() - 1); - } - user = umgr.getUserByOpenIdUrl(openidurl); - } - + // try one time to auto-provision, only happens if user==null // which means installation has LDAP enabled in security.xml if (user == null && WebloggerConfig.getBooleanProperty("users.ldap.autoProvision.enabled")) { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/CustomOpenIDAuthenticationProcessingFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/CustomOpenIDAuthenticationProcessingFilter.java deleted file mode 100644 index 9076578d8..000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/CustomOpenIDAuthenticationProcessingFilter.java +++ /dev/null @@ -1,114 +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.core.filters; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; - -import javax.servlet.Filter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.openid.OpenIDAuthenticationToken; -import org.springframework.security.openid.OpenIDAuthenticationFilter; -//import org.springframework.security.userdetails.openid.OpenIDUserAttribute; - - -/** - * Handle response from OpenID provider. - * @author Tatyana Tokareva - */ -public class CustomOpenIDAuthenticationProcessingFilter - extends OpenIDAuthenticationFilter implements Filter { - - private static Log log = LogFactory.getLog(CustomOpenIDAuthenticationProcessingFilter.class); - - /** - * @throws org.springframework.security.core.AuthenticationException - */ - @Override - public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse rsp) throws IOException { - OpenIDAuthenticationToken auth; - - // Processing standard OpenId user authentication - auth = (OpenIDAuthenticationToken) super.attemptAuthentication(req, rsp); - - // auth will be null on the first pass of super.attemptAuthentication() - if (auth != null) { - GrantedAuthority ga = (GrantedAuthority) auth.getAuthorities().toArray()[0]; - - if (ga.getAuthority().equals("rollerOpenidLogin")) { - - /* TODO: when Spring Security 2.1 is released, we can uncomment - * this code, which will allow us to pre-populate the new user - * registration form with information from the OpenID Provider. - * - Collection sREGAttributesList = auth.getAttributes(); - OpenIDUserAttribute openidName = new OpenIDUserAttribute( - OpenIDUserAttribute.Attributes.openidname.toString(), ""); - openidName.setValue(auth.getIdentityUrl()); - sREGAttributesList.add(openidName); - - // TODO: find a better place to stash attributes - UserManager mgr = WebloggerFactory.getWeblogger().getUserManager(); - mgr.userAttributes.put( - UserAttribute.Attributes.openidUrl.toString(), - sREGAttributesList); - */ - - } - } - return auth; - } - - /** - * {@inheritDoc} - */ - @Override - protected String lookupRealm(String returnToUrl) { - - String mapping = super.lookupRealm(returnToUrl); - - if (mapping == null) { - try { - URL url = new URL(returnToUrl); - int port = url.getPort(); - - StringBuilder realmBuffer = new StringBuilder(returnToUrl.length()) - .append(url.getProtocol()) - .append("://") - .append(url.getHost()); - if (port != -1) { - realmBuffer.append(":").append(port); - } - realmBuffer.append("/"); - mapping = realmBuffer.toString(); - } catch (MalformedURLException e) { - log.warn("returnToUrl was not a valid URL: [" + returnToUrl + "]", e); - } - } - - return mapping; - } -} diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java index db41c19b1..853cfb742 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java @@ -39,54 +39,17 @@ public UserDetails loadUserByUsername(String userName) { try { UserManager umgr = roller.getUserManager(); User userData; - // OpenID user? - if (userName.startsWith("http://") || userName.startsWith("https://")) { - if (userName.endsWith("/")) { - userName = userName.substring(0, userName.length() -1 ); - } - try { - userData = umgr.getUserByOpenIdUrl(userName); - if (userData == null) { - log.warn("No user found with OpenID URL: " + userName + - " (OpenID aliased by auth provider?) Confirm URL exists in roller_user table"); - } - } catch (WebloggerException ex) { - throw new DataRetrievalFailureException("ERROR in user lookup", ex); - } - String name; - String password; - List authorities; - - // We are not throwing UsernameNotFound exception in case of - // openid authentication in order to receive OpenID Simple Registration (SREG) - // attributes from the authentication filter and save them - if (userData == null) { - authorities = new ArrayList<>(1); - SimpleGrantedAuthority g = new SimpleGrantedAuthority("rollerOpenidLogin"); - authorities.add(g); - name = "openid"; - password = "openid"; - } else { - authorities = getAuthorities(userData, umgr); - name = userData.getUserName(); - password = userData.getPassword(); - } - return new org.springframework.security.core.userdetails.User(name, password, - true, true, true, true, authorities); - } else { - // standard username/password auth - try { - userData = umgr.getUserByUserName(userName); - } catch (WebloggerException ex) { - throw new DataRetrievalFailureException("ERROR in user lookup", ex); - } - if (userData == null) { - throw new UsernameNotFoundException("ERROR no user: " + userName); - } - List authorities = getAuthorities(userData, umgr); - return new org.springframework.security.core.userdetails.User(userData.getUserName(), userData.getPassword(), - true, true, true, true, authorities); - } + try { + userData = umgr.getUserByUserName(userName); + } catch (WebloggerException ex) { + throw new DataRetrievalFailureException("ERROR in user lookup", ex); + } + if (userData == null) { + throw new UsernameNotFoundException("ERROR no user: " + userName); + } + List authorities = getAuthorities(userData, umgr); + return new org.springframework.security.core.userdetails.User(userData.getUserName(), userData.getPassword(), + true, true, true, true, authorities); } catch (WebloggerException ex) { throw new DataAccessResourceFailureException("ERROR: fetching roles", ex); } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/OAuthAuthorize.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/OAuthAuthorize.java deleted file mode 100644 index 93a0359fd..000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/OAuthAuthorize.java +++ /dev/null @@ -1,101 +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.struts2.core; - -import javax.servlet.http.HttpServletRequest; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.pojos.User; -import org.apache.roller.weblogger.ui.struts2.util.UIAction; -import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.ServletRequestAware; -import org.apache.struts2.interceptor.validation.SkipValidation; - - -/** - * Allow user to authorized OAuth access to his/her account. - */ -// TODO: make this work @AllowedMethods({"execute"}) -public class OAuthAuthorize extends UIAction implements ServletRequestAware { - private static Log log = LogFactory.getLog(OAuthAuthorize.class); - private String appDesc = null; - private String token = null; - private String callback = null; - - - public OAuthAuthorize() { - this.pageTitle = "oauthAuthorize.title"; - } - - - // override default security, we do not require an action weblog - @Override - public boolean isWeblogRequired() { - return false; - } - - - @SkipValidation - @Override - public String execute() { - try { - User ud = getAuthenticatedUser(); - } catch (Exception ex) { - log.error("ERROR fetching user information", ex); - } - return SUCCESS; - } - - /** - * @return the appDesc - */ - public String getAppDesc() { - return appDesc; - } - - /** - * @return the token - */ - public String getToken() { - return token; - } - - /** - * @return the callback - */ - public String getCallback() { - return callback; - } - - /** - * @return the userName - */ - public String getUserName() { - return getAuthenticatedUser().getUserName(); - } - - @Override - public void setServletRequest(HttpServletRequest request) { - this.appDesc = (String)request.getAttribute("CONS_DESC"); - this.token = (String)request.getAttribute("TOKEN"); - this.callback = (String)request.getAttribute("CALLBACK"); - if (this.getCallback() == null) { - this.callback = ""; - } - } -} diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/OAuthKeys.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/OAuthKeys.java deleted file mode 100644 index 52546b647..000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/OAuthKeys.java +++ /dev/null @@ -1,117 +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.struts2.core; - -import net.oauth.OAuthConsumer; -import org.apache.commons.codec.digest.DigestUtils; -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; -import org.apache.roller.weblogger.config.WebloggerRuntimeConfig; -import org.apache.roller.weblogger.pojos.User; -import org.apache.roller.weblogger.ui.struts2.util.UIAction; -import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.validation.SkipValidation; - - -/** - * Allows user to view his/her OAuth consumer key and secret. - */ -// TODO: make this work @AllowedMethods({"execute"}) -public class OAuthKeys extends UIAction { - private static Log log = LogFactory.getLog(OAuthKeys.class); - private OAuthConsumer userConsumer; - private OAuthConsumer siteWideConsumer; - - public OAuthKeys() { - this.pageTitle = "oauthKeys.title"; - } - - - // override default security, we do not require an action weblog - @Override - public boolean isWeblogRequired() { - return false; - } - - - @SkipValidation - @Override - public String execute() { - boolean flush = false; - - try { - User ud = getAuthenticatedUser(); - OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager(); - userConsumer = omgr.getConsumerByUsername(ud.getUserName()); - if (userConsumer == null) { - String consumerKey = DigestUtils.md5Hex(ud.getUserName()); - userConsumer = omgr.addConsumer(ud.getUserName(), consumerKey); - flush = true; - } - - if (isUserIsAdmin()) { - siteWideConsumer = omgr.getConsumer(); - if (siteWideConsumer == null) { - String consumerKey = DigestUtils.md5Hex( - WebloggerRuntimeConfig.getAbsoluteContextURL()); - siteWideConsumer = omgr.addConsumer(consumerKey); - flush = true; - } - } - - if (flush) { - WebloggerFactory.getWeblogger().flush(); - } - - } catch (Exception ex) { - log.error("ERROR creating or retrieving your OAuth information", ex); - } - - return SUCCESS; - } - - /** - * @return the user's consumer - */ - public OAuthConsumer getUserConsumer() { - return userConsumer; - } - - /** - * @return the site's consumer - */ - public OAuthConsumer getSiteWideConsumer() { - return siteWideConsumer; - } - - public String getRequestTokenURL() { - return WebloggerFactory.getWeblogger().getUrlStrategy().getOAuthRequestTokenURL(); - } - - public String getAuthorizationURL() { - return WebloggerFactory.getWeblogger().getUrlStrategy().getOAuthAuthorizationURL(); - } - - public String getAccessTokenURL() { - return WebloggerFactory.getWeblogger().getUrlStrategy().getOAuthAccessTokenURL(); - } - - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java index 55e1c576e..f9180c163 100644 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java @@ -39,12 +39,8 @@ import com.rometools.rome.feed.atom.Feed; import java.nio.charset.StandardCharsets; import javax.servlet.http.HttpServletResponse; -import net.oauth.OAuthAccessor; -import net.oauth.OAuthMessage; -import net.oauth.server.OAuthServlet; import org.apache.commons.lang3.StringUtils; import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.OAuthManager; import org.apache.roller.weblogger.config.WebloggerConfig; import org.apache.roller.weblogger.config.WebloggerRuntimeConfig; import org.apache.roller.weblogger.pojos.WeblogPermission; @@ -118,10 +114,7 @@ public RollerAtomHandler(HttpServletRequest request, HttpServletResponse respons roller = WebloggerFactory.getWeblogger(); String userName; - if ("oauth".equals(WebloggerRuntimeConfig.getProperty("webservices.atomPubAuth"))) { - userName = authenticationOAUTH(request, response); - - } else if ("wsse".equals(WebloggerRuntimeConfig.getProperty("webservices.atomPubAuth"))) { + if ("wsse".equals(WebloggerRuntimeConfig.getProperty("webservices.atomPubAuth"))) { userName = authenticateWSSE(request); } else { @@ -494,29 +487,6 @@ public String authenticateBASIC(HttpServletRequest request) { } - private String authenticationOAUTH( - HttpServletRequest request, HttpServletResponse response) { - try { - OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager(); - OAuthMessage requestMessage = OAuthServlet.getMessage(request, null); - OAuthAccessor accessor = omgr.getAccessor(requestMessage); - omgr.getValidator().validateMessage(requestMessage, accessor); - return (String)accessor.consumer.getProperty("userId"); - - } catch (Exception ex) { - log.debug("ERROR authenticating user", ex); - String realm = (request.isSecure())?"https://":"http://"; - realm += request.getLocalName(); - try { - OAuthServlet.handleException(response, ex, realm, true); - } catch (Exception ioe) { - log.debug("ERROR writing error response", ioe); - } - } - return null; - } - - public static void oneSecondThrottle() { // Throttle one entry per second per weblog because time- // stamp in MySQL and other DBs has only 1 sec resolution 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 344fac29d..000000000 --- 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 7f4787642..000000000 --- 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 797252f8b..000000000 --- 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/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties index 66072c23f..6a0abebdc 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 8802be030..7c3c5508f 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 93ac84496..49a4edb32 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 199c87280..cafcdfaa4 100644 --- a/app/src/main/resources/META-INF/persistence.xml +++ b/app/src/main/resources/META-INF/persistence.xml @@ -27,9 +27,7 @@ org/apache/roller/weblogger/pojos/ObjectPermission.orm.xml org/apache/roller/weblogger/pojos/WeblogPermission.orm.xml org/apache/roller/weblogger/pojos/Weblog.orm.xml - org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml - org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml - org/apache/roller/weblogger/pojos/MediaFile.orm.xml +org/apache/roller/weblogger/pojos/MediaFile.orm.xml org/apache/roller/weblogger/pojos/MediaFileTag.orm.xml org/apache/roller/weblogger/pojos/MediaFileDirectory.orm.xml org/apache/roller/weblogger/pojos/AutoPing.orm.xml diff --git a/app/src/main/resources/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml b/app/src/main/resources/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml deleted file mode 100644 index 3c710aff7..000000000 --- a/app/src/main/resources/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - org.apache.roller.weblogger.pojos - - - - SELECT p FROM OAuthAccessorRecord p WHERE p.consumerKey = ?1 - - - SELECT p FROM OAuthAccessorRecord p WHERE p.requestToken = ?1 OR p.accessToken = ?1 - - - SELECT p FROM OAuthAccessorRecord p WHERE p.userName = ?1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/resources/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml b/app/src/main/resources/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml deleted file mode 100644 index 2cf7a7724..000000000 --- a/app/src/main/resources/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - org.apache.roller.weblogger.pojos - -
- - SELECT p FROM OAuthConsumerRecord p WHERE p.consumerKey = ?1 - - - SELECT p FROM OAuthConsumerRecord p WHERE p.userName = ?1 - - - SELECT p FROM OAuthConsumerRecord p WHERE p.userName IS NULL - - - - - - - - - - - - - - diff --git a/app/src/main/resources/sql/400-to-500-migration.vm b/app/src/main/resources/sql/400-to-500-migration.vm index 8ff0fca14..6ae36bdd3 100644 --- a/app/src/main/resources/sql/400-to-500-migration.vm +++ b/app/src/main/resources/sql/400-to-500-migration.vm @@ -78,29 +78,6 @@ create index ua_attrname_idx on roller_userattribute( attrname$!db.INDEXSIZE ); create index ua_attrvalue_idx on roller_userattribute( attrvalue$!db.INDEXSIZE ); --- OAUTH SUPPORT - --- each record is an OAuth consumer key and secret, can be tied to just one user -create table roller_oauthconsumer ( - consumerkey varchar(48) not null primary key, - consumersecret varchar(48) not null, - username varchar(48) -); -create index oc_username_idx on roller_oauthconsumer( username$!db.INDEXSIZE ); - --- each record is an OAuth accessor, always tied to just one user -create table roller_oauthaccessor ( - consumerkey varchar(48) not null primary key, - requesttoken varchar(48), - accesstoken varchar(48), - tokensecret varchar(48), - created $db.TIMESTAMP_SQL_TYPE not null, - updated $db.TIMESTAMP_SQL_TYPE not null, - username varchar(48), - authorized $db.BOOLEAN_SQL_TYPE_FALSE -); - - -- MEDIA BLOGGING create table roller_mediafile ( diff --git a/app/src/main/resources/sql/510-to-520-migration.vm b/app/src/main/resources/sql/510-to-520-migration.vm index 42dcecb12..1af765337 100644 --- a/app/src/main/resources/sql/510-to-520-migration.vm +++ b/app/src/main/resources/sql/510-to-520-migration.vm @@ -39,8 +39,6 @@ #expandTimestampNotNull('roller_comment' 'posttime') #expandTimestampNotNull('roller_mediafile' 'date_uploaded') #expandTimestamp('roller_mediafile' 'last_updated') -#expandTimestampNotNull('roller_oauthaccessor' 'created') -#expandTimestampNotNull('roller_oauthaccessor' 'updated') #expandTimestampNotNull('roller_permission' 'datecreated') #expandTimestamp('roller_tasklock' 'timeacquired') #expandTimestamp('roller_tasklock' 'lastrun') diff --git a/app/src/main/resources/sql/createdb.vm b/app/src/main/resources/sql/createdb.vm index 9493947e4..29ed1fb58 100644 --- a/app/src/main/resources/sql/createdb.vm +++ b/app/src/main/resources/sql/createdb.vm @@ -314,27 +314,6 @@ create index ea_entryid_idx on entryattribute( entryid ); alter table entryattribute add constraint ea_name_uq unique ( entryid, name$!db.INDEXSIZE ); --- OAUTH SUPPORT - --- each record is an OAuth consumer key and secret, can be tied to just one user -create table roller_oauthconsumer ( - consumerkey varchar(48) not null primary key, - consumersecret varchar(48) not null, - username varchar(48) -); - --- each record is an OAuth accessor, always tied to just one user -create table roller_oauthaccessor ( - consumerkey varchar(48) not null primary key, - requesttoken varchar(48), - accesstoken varchar(48), - tokensecret varchar(48), - created $db.TIMESTAMP_SQL_TYPE not null, - updated $db.TIMESTAMP_SQL_TYPE not null, - username varchar(48), - authorized $db.BOOLEAN_SQL_TYPE_FALSE -); - create table rag_properties ( name varchar(255) not null primary key, value $db.TEXT_SQL_TYPE @@ -504,7 +483,3 @@ alter table autoping add constraint ap_weblogid_fk alter table autoping add constraint ap_pingtargetid_fk foreign key (pingtargetid) references pingtarget(id) $!db.ADDL_FK_PARAMS ; - --- oauth indexes - -create index oc_username_idx on roller_oauthconsumer( username$!db.INDEXSIZE ); diff --git a/app/src/main/resources/sql/droptables.sql b/app/src/main/resources/sql/droptables.sql index 95c41f1a5..82218dbca 100644 --- a/app/src/main/resources/sql/droptables.sql +++ b/app/src/main/resources/sql/droptables.sql @@ -38,10 +38,6 @@ drop table roller_mediafiletag; drop table roller_mediafile; drop table roller_mediafiledir; --- oauth tables -drop table roller_oauthconsumer; -drop table roller_oauthaccessor; - -- core services tables drop table roller_hitcounts; drop table roller_comment; diff --git a/app/src/main/resources/struts.xml b/app/src/main/resources/struts.xml index cc94ba658..e6bf72409 100644 --- a/app/src/main/resources/struts.xml +++ b/app/src/main/resources/struts.xml @@ -137,18 +137,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 29cbb23d1..b70cc1eeb 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 bc63ca2a4..000000000 --- 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" %> - -

- - - -

- -

- - - -

- -
- " size="20" />
- - - - - - - diff --git a/app/src/main/webapp/WEB-INF/jsps/core/OAuthKeys.jsp b/app/src/main/webapp/WEB-INF/jsps/core/OAuthKeys.jsp deleted file mode 100644 index 778c73d03..000000000 --- a/app/src/main/webapp/WEB-INF/jsps/core/OAuthKeys.jsp +++ /dev/null @@ -1,72 +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" %> - -

- - - -

- -

- -

- - -

- -

- -

: -

- -

: -

- - - - -

- -

- -

: -

- -

: -

- -
- - -

- -

- -

: -

- -

: -

- -

: -

- -
- -" onclick="window.location=''" /> diff --git a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp b/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp index 97d46374e..d3a0a956f 100644 --- a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp @@ -26,7 +26,6 @@ <%@ taglib uri="http://jakarta.apache.org/taglibs/string-1.1" prefix="str" %> <%@ taglib uri="/struts-tags" prefix="s" %> -<%@ taglib uri="/struts-bootstrap-tags" prefix="sboo" %> <%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %> diff --git a/app/src/main/webapp/WEB-INF/security.xml b/app/src/main/webapp/WEB-INF/security.xml index 18ed9206a..ba55d4a75 100644 --- a/app/src/main/webapp/WEB-INF/security.xml +++ b/app/src/main/webapp/WEB-INF/security.xml @@ -46,8 +46,6 @@ - - @@ -70,12 +68,11 @@ - + @@ -91,18 +88,6 @@ class="org.apache.roller.weblogger.ui.core.security.RollerRememberMeAuthenticationProvider"> - - - - - - - - - - - diff --git a/app/src/main/webapp/WEB-INF/tiles.xml b/app/src/main/webapp/WEB-INF/tiles.xml index f25bb52e1..eb30deeb2 100644 --- a/app/src/main/webapp/WEB-INF/tiles.xml +++ b/app/src/main/webapp/WEB-INF/tiles.xml @@ -115,14 +115,6 @@ - - - - - - - - diff --git a/app/src/main/webapp/WEB-INF/web.xml b/app/src/main/webapp/WEB-INF/web.xml index 0418832da..3fd0ff667 100644 --- a/app/src/main/webapp/WEB-INF/web.xml +++ b/app/src/main/webapp/WEB-INF/web.xml @@ -308,40 +308,6 @@ 2 - - - - RequestTokenServlet - org.apache.roller.weblogger.webservices.oauth.RequestTokenServlet - - - - AuthorizationServlet - org.apache.roller.weblogger.webservices.oauth.AuthorizationServlet - - - - AccessTokenServlet - org.apache.roller.weblogger.webservices.oauth.AccessTokenServlet - - - - RequestTokenServlet - /roller-services/oauth/requestToken - - - - AuthorizationServlet - /roller-services/oauth/authorize - - - - AccessTokenServlet - /roller-services/oauth/accessToken - - - - PageServlet diff --git a/app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java deleted file mode 100644 index 0b2ab39bf..000000000 --- a/app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java +++ /dev/null @@ -1,93 +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.business.jpa; - -import net.oauth.OAuthAccessor; -import net.oauth.OAuthConsumer; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.TestUtils; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * Test Weblogger Bookmark Management. - */ -public class JPAOAuthManagerTest { - public static Log log = LogFactory.getLog(JPAOAuthManagerTest.class); - - @BeforeEach - public void setUp() throws Exception { - - // setup weblogger - TestUtils.setupWeblogger(); - - try { - TestUtils.endSession(true); - } catch (Exception ex) { - log.error(ex); - throw new Exception("Test setup failed", ex); - } - } - - @AfterEach - public void tearDown() throws Exception { - - try { - TestUtils.endSession(true); - } catch (Exception ex) { - log.error("ERROR in tearDown", ex); - throw new Exception("Test teardown failed", ex); - } - } - - @Test - public void testCRUD() throws Exception { - JPAOAuthManagerImpl omgr = (JPAOAuthManagerImpl) - WebloggerFactory.getWeblogger().getOAuthManager(); - - String consumerKey = "1111"; - OAuthConsumer consumer = omgr.addConsumer("dummyusername", consumerKey); - TestUtils.endSession(true); - - consumer = omgr.getConsumerByKey(consumer.consumerKey); - assertNotNull(consumer); - assertEquals(consumerKey, consumer.consumerKey); - - OAuthAccessor accessor = new OAuthAccessor(consumer); - accessor.setProperty("userId", "dummyusername"); - omgr.addAccessor(accessor); - TestUtils.endSession(true); - - accessor = omgr.getAccessorByKey(consumerKey); - assertNotNull(accessor); - - omgr.removeAccessor(accessor); - TestUtils.endSession(true); - assertNull(omgr.getAccessorByKey(consumerKey)); - - omgr.removeConsumer(consumer); - TestUtils.endSession(true); - assertNull(omgr.getConsumerByKey(consumerKey)); - } -} diff --git a/testing/junit-cleartables-mysql.sql b/testing/junit-cleartables-mysql.sql index 34a8b72aa..d3d7a1754 100644 --- a/testing/junit-cleartables-mysql.sql +++ b/testing/junit-cleartables-mysql.sql @@ -39,7 +39,5 @@ delete from userrole WHERE username like 'junit_%'; delete from roller_permission WHERE username like 'junit_%'; delete from roller_user WHERE username like 'junit_%'; delete from roller_userattribute WHERE username like 'junit_%'; -delete from roller_oauthconsumer WHERE username like 'junit_%'; -delete from roller_oauthaccessor WHERE username like 'junit_%'; delete from roller_tasklock WHERE name = 'TestTask'; From a1c737709449f9a171ebcc3384f5fb4f11952acb Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 08:22:24 -0600 Subject: [PATCH 03/22] Fork XmlRpcServlet and AtomServlet into Roller codebase These servlets come from xmlrpc-server and rome-propono respectively, neither of which has a Jakarta Servlet compatible release. Forking the servlet classes into Roller decouples us from their javax.servlet dependency so the imports can be converted to jakarta.servlet in Phase 2. - Fork XmlRpcServlet and XmlRpcServletServer from Apache XML-RPC 3.1.3 into org.apache.roller.weblogger.webservices.xmlrpc package - Fork AtomServlet from rome-propono into RollerAtomServlet, which directly creates RollerAtomHandler instead of using propono's factory lookup - Update web.xml servlet-class references to point to the forked classes - Both libraries remain as dependencies for their non-servlet infrastructure classes --- app/pom.xml | 6 + .../atomprotocol/RollerAtomServlet.java | 368 ++++++++++++++++++ .../xmlrpc/RollerXmlRpcServlet.java | 213 ++++++++++ .../xmlrpc/RollerXmlRpcServletServer.java | 150 +++++++ app/src/main/webapp/WEB-INF/web.xml | 4 +- 5 files changed, 739 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomServlet.java create mode 100644 app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServlet.java create mode 100644 app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServletServer.java diff --git a/app/pom.xml b/app/pom.xml index 4e77923c7..7d7232ba4 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -385,6 +385,12 @@ limitations under the License. ${xmlrpc-version} + org.apache.xmlrpc xmlrpc-server 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 000000000..c1a959e87 --- /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 javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.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.propono.atom.server.AtomRequestImpl; +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 AtomRequestImpl(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 AtomRequestImpl(req); + try { + if (handler.isCollectionURI(areq)) { + + if (req.getContentType().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 (req.getContentType() != 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 AtomRequestImpl(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 AtomRequestImpl(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/xmlrpc/RollerXmlRpcServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServlet.java new file mode 100644 index 000000000..3f0e68bee --- /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 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.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:

+ *
+ * + * + *
NameDescription
enabledForExtensionsSets 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 000000000..45793299d --- /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 javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.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/webapp/WEB-INF/web.xml b/app/src/main/webapp/WEB-INF/web.xml index 3fd0ff667..a38de8944 100644 --- a/app/src/main/webapp/WEB-INF/web.xml +++ b/app/src/main/webapp/WEB-INF/web.xml @@ -267,7 +267,7 @@ AtomServlet - com.rometools.propono.atom.server.AtomServlet + org.apache.roller.weblogger.webservices.atomprotocol.RollerAtomServlet @@ -292,7 +292,7 @@ XmlRpcServlet - org.apache.xmlrpc.webserver.XmlRpcServlet + org.apache.roller.weblogger.webservices.xmlrpc.RollerXmlRpcServlet Sets whether the servlet supports vendor extensions for XML-RPC. From 44e81c8f93d0d3340b72d7fc8ff4ada6fc880bc1 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 08:58:45 -0600 Subject: [PATCH 04/22] Migrate to Jakarta EE 10, Spring 7, Struts 7, and EclipseLink 5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The big switch: all javax Java EE APIs replaced with Jakarta equivalents, all major frameworks upgraded to Jakarta-compatible versions. Dependencies: javax.servlet-api 4.0.1 → jakarta.servlet-api 6.0.0, javax.mail → jakarta.mail-api 2.1.3 + angus-mail 2.0.3, javax.activation → jakarta.activation-api 2.1.3, jaxb-api → jakarta.xml.bind-api 4.0.2 + jaxb-runtime 4.0.5, JSTL 1.2 → jakarta.servlet.jsp.jstl-api 3.0.1, Struts 2.5.29 → 7.1.1, Spring 5.3.39 → 7.0.8, Spring Security 5.8.14 → 7.0.6, EclipseLink 4.0.5 → 5.0.1 Java source: 320 javax.servlet/mail/activation imports converted to jakarta across 89 files, xwork2 imports migrated to org.apache.struts2 package, deprecated Struts interfaces (ServletRequestAware, RequestAware, HttpParametersAware) replaced with ActionContext lookups Spring Security: AccessDecisionManager/RoleVoter removed (deprecated in 6.0), migrated to expression-based access control with hasAuthority/hasAnyAuthority, password encoder constructors updated to factory methods Config: web.xml namespace updated to jakartaee 6.0, struts.xml DTD updated to Struts 7.0, persistence.xml and 29 ORM files updated to Jakarta JPA 3.2 namespace, tiles.xml DTD updated to 3.0, security.xml migrated to Spring Security 7 patterns Also: forked AtomRequestImpl from rome-propono to use jakarta.servlet, deleted dead RollerAtomHandlerFactory, fixed FolderEdit ServletResponseAware removal --- app/pom.xml | 82 ++++++----- .../apache/roller/planet/util/MailUtil.java | 16 +-- .../weblogger/business/MailProvider.java | 6 +- .../business/themes/ThemeManagerImpl.java | 4 +- .../weblogger/planet/ui/PlanetConfig.java | 12 +- .../weblogger/planet/ui/PlanetGroupSubs.java | 9 +- .../weblogger/planet/ui/PlanetGroups.java | 9 +- .../weblogger/ui/core/CmaRollerContext.java | 2 +- .../weblogger/ui/core/RollerContext.java | 12 +- .../weblogger/ui/core/RollerSession.java | 10 +- .../ui/core/filters/BootstrapFilter.java | 20 +-- .../ui/core/filters/CharEncodingFilter.java | 12 +- .../ui/core/filters/DebugFilter.java | 16 +-- .../ui/core/filters/IPBanFilter.java | 16 +-- .../weblogger/ui/core/filters/InitFilter.java | 14 +- .../ui/core/filters/LoadSaltFilter.java | 4 +- .../filters/PersistenceSessionFilter.java | 16 +-- .../ui/core/filters/RoleAssignmentFilter.java | 16 +-- .../SpringFirewallExceptionFilter.java | 16 +-- .../ui/core/filters/ValidateSaltFilter.java | 14 +- .../ui/core/security/AutoProvision.java | 2 +- .../core/security/BasicUserAutoProvision.java | 2 +- .../ui/core/security/CustomUserRegistry.java | 2 +- .../ui/core/tags/calendar/CalendarTag.java | 6 +- .../weblogger/ui/rendering/RequestMapper.java | 6 +- .../ui/rendering/WeblogRequestMapper.java | 8 +- .../filters/DeviceResolverRequestFilter.java | 8 +- .../filters/RequestMappingFilter.java | 16 +-- .../mobile/MobileDeviceRepository.java | 4 +- .../ui/rendering/model/CalendarModel.java | 2 +- .../comments/CommentAuthenticator.java | 2 +- .../comments/CommentAuthenticatorUtils.java | 2 +- .../comments/DefaultCommentAuthenticator.java | 2 +- .../comments/LdapCommentAuthenticator.java | 4 +- .../comments/MathCommentAuthenticator.java | 4 +- .../servlets/CommentAuthenticatorServlet.java | 10 +- .../ui/rendering/servlets/CommentServlet.java | 12 +- .../ui/rendering/servlets/FeedServlet.java | 10 +- .../servlets/MediaResourceServlet.java | 10 +- .../ui/rendering/servlets/PageServlet.java | 14 +- .../rendering/servlets/PlanetFeedServlet.java | 10 +- .../servlets/PreviewResourceServlet.java | 12 +- .../ui/rendering/servlets/PreviewServlet.java | 14 +- .../ui/rendering/servlets/RSDServlet.java | 10 +- .../rendering/servlets/ResourceServlet.java | 12 +- .../ui/rendering/servlets/SearchServlet.java | 14 +- .../rendering/servlets/TrackbackServlet.java | 10 +- .../ui/rendering/util/ModDateHeaderUtil.java | 4 +- .../ui/rendering/util/ParsedRequest.java | 2 +- .../ui/rendering/util/PlanetRequest.java | 2 +- .../rendering/util/WeblogCommentRequest.java | 2 +- .../ui/rendering/util/WeblogFeedRequest.java | 2 +- .../util/WeblogMediaResourceRequest.java | 2 +- .../ui/rendering/util/WeblogPageRequest.java | 2 +- .../rendering/util/WeblogPreviewRequest.java | 2 +- .../util/WeblogPreviewResourceRequest.java | 2 +- .../ui/rendering/util/WeblogRequest.java | 2 +- .../rendering/util/WeblogResourceRequest.java | 2 +- .../rendering/util/WeblogSearchRequest.java | 2 +- .../util/WeblogTrackbackRequest.java | 2 +- .../rendering/util/mobile/DeviceResolver.java | 2 +- .../ui/rendering/util/mobile/DeviceUtils.java | 2 +- .../util/mobile/LiteDeviceResolver.java | 2 +- .../util/mobile/MobileDeviceRepository.java | 2 +- .../velocity/WebappResourceLoader.java | 2 +- .../admin/GlobalCommentManagement.java | 11 +- .../ui/struts2/admin/GlobalConfig.java | 36 ++--- .../ui/struts2/ajax/CommentDataServlet.java | 8 +- .../ui/struts2/ajax/ThemeDataServlet.java | 8 +- .../ui/struts2/ajax/UserDataServlet.java | 8 +- .../weblogger/ui/struts2/core/Register.java | 14 +- .../ui/struts2/editor/FolderEdit.java | 15 +- .../weblogger/ui/struts2/editor/Members.java | 22 ++- .../weblogger/ui/struts2/util/UIAction.java | 20 +-- .../ui/struts2/util/UIActionInterceptor.java | 8 +- .../util/UIActionPrepareInterceptor.java | 4 +- .../struts2/util/UISecurityInterceptor.java | 4 +- .../weblogger/ui/tags/StringTagSupport.java | 6 +- .../weblogger/ui/tags/TruncateNicelyTag.java | 2 +- .../roller/weblogger/ui/tags/WordWrapTag.java | 2 +- .../roller/weblogger/util/I18nMessages.java | 2 +- .../roller/weblogger/util/MailUtil.java | 16 +-- .../roller/weblogger/util/Utilities.java | 8 +- .../atomprotocol/RollerAtomHandler.java | 4 +- .../RollerAtomHandlerFactory.java | 41 ------ .../atomprotocol/RollerAtomRequestImpl.java | 135 ++++++++++++++++++ .../atomprotocol/RollerAtomServlet.java | 19 ++- .../opensearch/OpenSearchServlet.java | 8 +- .../webservices/tagdata/TagDataServlet.java | 8 +- .../xmlrpc/RollerXmlRpcServlet.java | 10 +- .../xmlrpc/RollerXmlRpcServletServer.java | 6 +- .../main/resources/META-INF/persistence.xml | 5 +- .../apache/roller/planet/pojos/Planet.orm.xml | 4 +- .../roller/planet/pojos/PlanetGroup.orm.xml | 4 +- .../pojos/RuntimeConfigProperty.orm.xml | 4 +- .../roller/planet/pojos/Subscription.orm.xml | 4 +- .../planet/pojos/SubscriptionEntry.orm.xml | 4 +- .../roller/weblogger/pojos/AutoPing.orm.xml | 4 +- .../pojos/CustomTemplateRendition.orm.xml | 4 +- .../roller/weblogger/pojos/MediaFile.orm.xml | 4 +- .../pojos/MediaFileDirectory.orm.xml | 4 +- .../weblogger/pojos/MediaFileTag.orm.xml | 4 +- .../weblogger/pojos/ObjectPermission.orm.xml | 4 +- .../weblogger/pojos/PingQueueEntry.orm.xml | 4 +- .../roller/weblogger/pojos/PingTarget.orm.xml | 4 +- .../pojos/RuntimeConfigProperty.orm.xml | 4 +- .../roller/weblogger/pojos/TaskLock.orm.xml | 4 +- .../roller/weblogger/pojos/User.orm.xml | 4 +- .../roller/weblogger/pojos/UserRole.orm.xml | 4 +- .../roller/weblogger/pojos/Weblog.orm.xml | 4 +- .../weblogger/pojos/WeblogBookmark.orm.xml | 4 +- .../pojos/WeblogBookmarkFolder.orm.xml | 4 +- .../weblogger/pojos/WeblogCategory.orm.xml | 4 +- .../weblogger/pojos/WeblogEntry.orm.xml | 4 +- .../pojos/WeblogEntryAttribute.orm.xml | 4 +- .../pojos/WeblogEntryComment.orm.xml | 4 +- .../weblogger/pojos/WeblogEntryTag.orm.xml | 4 +- .../pojos/WeblogEntryTagAggregate.orm.xml | 4 +- .../weblogger/pojos/WeblogHitCount.orm.xml | 4 +- .../weblogger/pojos/WeblogPermission.orm.xml | 4 +- .../weblogger/pojos/WeblogTemplate.orm.xml | 4 +- app/src/main/resources/struts.xml | 4 +- app/src/main/webapp/WEB-INF/security.xml | 25 ++-- app/src/main/webapp/WEB-INF/tiles.xml | 6 +- app/src/main/webapp/WEB-INF/web.xml | 10 +- app/src/main/webapp/roller-ui/errors/403.jsp | 6 +- app/src/main/webapp/roller-ui/errors/404.jsp | 6 +- .../main/webapp/roller-ui/errors/error.jsp | 8 +- .../main/webapp/roller-ui/logout-redirect.jsp | 2 +- .../weblogger/ui/core/RollerSessionTest.java | 4 +- .../ui/core/filters/LoadSaltFilterTest.java | 6 +- .../core/filters/ValidateSaltFilterTest.java | 10 +- .../model/SearchResultsFeedModelTest.java | 2 +- .../model/SearchResultsModelTest.java | 2 +- 134 files changed, 629 insertions(+), 560 deletions(-) delete mode 100644 app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java create mode 100644 app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomRequestImpl.java diff --git a/app/pom.xml b/app/pom.xml index 7d7232ba4..d48ae0832 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -33,10 +33,9 @@ limitations under the License. war - 4.0.1 - 2.2 - 1.2.0 - 1.2 + 6.0.0 + 4.0.0 + 3.0.1 1.7.8 1.10.15 9.7.1 @@ -46,7 +45,7 @@ limitations under the License. 1.18.0 1.13.0 3.17.0 - 4.0.5 + 5.0.1 7.0.0 2.24.3 9.12.1 @@ -55,9 +54,9 @@ limitations under the License. 1.0b3 1.19.0 2.0.16 - 5.3.39 - 5.8.14 - 2.5.29 + 7.0.8 + 7.0.6 + 7.1.1 2.4.1 1.0.2 3.1.3 @@ -68,55 +67,58 @@ limitations under the License. - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api ${servlet.version} provided - javax.servlet.jsp - jsp-api + jakarta.servlet.jsp + jakarta.servlet.jsp-api ${jsp-api.version} provided - javax.servlet - jstl + jakarta.servlet.jsp.jstl + jakarta.servlet.jsp.jstl-api + ${jstl.version} + + + org.glassfish.web + jakarta.servlet.jsp.jstl ${jstl.version} - javax.mail - mail - ${java-mail.version} + jakarta.mail + jakarta.mail-api + 2.1.3 + provided + + + org.eclipse.angus + angus-mail + 2.0.3 provided - - - javax.activation - activation - - - com.sun.activation - javax.activation - ${java-activation.version} + jakarta.activation + jakarta.activation-api + 2.1.3 - javax.xml.bind - jaxb-api - ${jaxb.version} - - - - javax.activation - javax.activation-api - - + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.2 + + + org.glassfish.jaxb + jaxb-runtime + 4.0.5 + org.webjars webjars-servlet-2.x @@ -620,9 +623,9 @@ limitations under the License. ${derby.version} - javax.mail - mail - ${java-mail.version} + org.eclipse.angus + angus-mail + 2.0.3 @@ -707,6 +710,7 @@ limitations under the License. false + -Djavax.xml.accessExternalSchema=all diff --git a/app/src/main/java/org/apache/roller/planet/util/MailUtil.java b/app/src/main/java/org/apache/roller/planet/util/MailUtil.java index 970795610..02befd637 100644 --- a/app/src/main/java/org/apache/roller/planet/util/MailUtil.java +++ b/app/src/main/java/org/apache/roller/planet/util/MailUtil.java @@ -20,14 +20,14 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.SendFailedException; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.Address; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.SendFailedException; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.Address; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; import org.apache.commons.lang3.StringUtils; diff --git a/app/src/main/java/org/apache/roller/weblogger/business/MailProvider.java b/app/src/main/java/org/apache/roller/weblogger/business/MailProvider.java index 1a682c360..898a59294 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/MailProvider.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/MailProvider.java @@ -19,9 +19,9 @@ package org.apache.roller.weblogger.business; import java.util.Properties; -import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.Transport; +import jakarta.mail.MessagingException; +import jakarta.mail.Session; +import jakarta.mail.Transport; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; diff --git a/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java index 13467171c..744cc5715 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java @@ -30,8 +30,8 @@ import java.util.Map; import java.util.Set; -import javax.activation.FileTypeMap; -import javax.activation.MimetypesFileTypeMap; +import jakarta.activation.FileTypeMap; +import jakarta.activation.MimetypesFileTypeMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java index 8d24508f5..f57c81d52 100644 --- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java +++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java @@ -30,7 +30,7 @@ import org.apache.roller.weblogger.config.runtime.RuntimeConfigDefs; import org.apache.roller.weblogger.pojos.GlobalPermission; import org.apache.roller.weblogger.pojos.RuntimeConfigProperty; -import org.apache.struts2.interceptor.HttpParametersAware; +import org.apache.struts2.ActionContext; import org.apache.struts2.dispatcher.HttpParameters; import org.apache.struts2.dispatcher.Parameter; @@ -45,7 +45,7 @@ * Handles editing of planet global runtime properties. */ // TODO: make this work @AllowedMethods({"execute","save"}) -public class PlanetConfig extends PlanetUIAction implements HttpParametersAware { +public class PlanetConfig extends PlanetUIAction { private static final Log log = LogFactory.getLog(PlanetConfig.class); @@ -80,6 +80,9 @@ public boolean isWeblogRequired() { @Override public void myPrepare() { + // initialize request parameters from ActionContext + this.parameters = ActionContext.getContext().getParameters(); + try { // just grab our properties map PropertiesManager pMgr = WebloggerFactory.getWeblogger().getPropertiesManager(); @@ -180,11 +183,6 @@ public HttpParameters getParameters() { return parameters; } - @Override - public void setParameters(HttpParameters parameters) { - this.parameters = parameters; - } - public Map getProperties() { return properties; } diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java index 7d6ed549e..b71961ad2 100644 --- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java +++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java @@ -28,9 +28,9 @@ import org.apache.roller.planet.pojos.Subscription; import org.apache.roller.weblogger.business.WebloggerFactory; import org.apache.roller.weblogger.pojos.GlobalPermission; -import org.apache.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.ActionContext; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.*; @@ -38,7 +38,7 @@ * Manage planet group subscriptions, default group is "all". */ // TODO: make this work @AllowedMethods({"execute","saveSubscription","saveGroup","deleteSubscription"}) -public class PlanetGroupSubs extends PlanetUIAction implements ServletRequestAware { +public class PlanetGroupSubs extends PlanetUIAction { private static final Log log = LogFactory.getLog(PlanetGroupSubs.class); @@ -68,7 +68,8 @@ public boolean isWeblogRequired() { @Override - public void setServletRequest(HttpServletRequest request) { + public void myPrepare() { + HttpServletRequest request = ActionContext.getContext().getServletRequest(); if (request.getParameter("createNew") != null) { group = new PlanetGroup(); } else { diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java index cea902576..4e6d0e964 100644 --- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java +++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java @@ -21,9 +21,9 @@ import org.apache.roller.planet.business.PlanetManager; import org.apache.roller.planet.pojos.PlanetGroup; import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.ActionContext; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; @@ -32,7 +32,7 @@ * Manage planet groups. */ // TODO: make this work @AllowedMethods({"execute","save","delete"}) -public class PlanetGroups extends PlanetUIAction implements ServletRequestAware { +public class PlanetGroups extends PlanetUIAction { private static Log log = LogFactory.getLog(PlanetGroups.class); @@ -51,7 +51,8 @@ public boolean isWeblogRequired() { } @Override - public void setServletRequest(HttpServletRequest request) { + public void myPrepare() { + HttpServletRequest request = ActionContext.getContext().getServletRequest(); group = PlanetGroupSubs.getGroupFromRequest(request, getPlanet()); } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/CmaRollerContext.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/CmaRollerContext.java index 3e2d54498..29c1eb1b7 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/CmaRollerContext.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/CmaRollerContext.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.core; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContext; /** diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerContext.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerContext.java index a3dfb930b..9413bc8ca 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerContext.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerContext.java @@ -23,9 +23,9 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; -import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; import org.apache.roller.weblogger.business.Weblogger; import org.springframework.security.authentication.AuthenticationProvider; @@ -309,10 +309,10 @@ private DelegatingPasswordEncoder createPasswordEncoder() { // supported encoders encoders.put("bcrypt", new BCryptPasswordEncoder()); - encoders.put("pbkdf2", new Pbkdf2PasswordEncoder()); + encoders.put("pbkdf2", Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8()); // provided by bouncy castle dependency - encoders.put("scrypt", new SCryptPasswordEncoder()); - encoders.put("argon2", new Argon2PasswordEncoder()); + encoders.put("scrypt", SCryptPasswordEncoder.defaultsForSpringSecurity_v5_8()); + encoders.put("argon2", Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8()); // just for testing encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance()); diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java index 97d108832..959cc3e90 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java @@ -21,11 +21,11 @@ import java.io.Serializable; import java.security.Principal; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import javax.servlet.http.HttpSessionActivationListener; -import javax.servlet.http.HttpSessionEvent; -import javax.servlet.http.HttpSessionListener; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import jakarta.servlet.http.HttpSessionActivationListener; +import jakarta.servlet.http.HttpSessionEvent; +import jakarta.servlet.http.HttpSessionListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/BootstrapFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/BootstrapFilter.java index 2ca3da9c4..cf4ef1226 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/BootstrapFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/BootstrapFilter.java @@ -19,16 +19,16 @@ package org.apache.roller.weblogger.ui.core.filters; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +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.roller.weblogger.business.WebloggerFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/CharEncodingFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/CharEncodingFilter.java index c8109a59c..99f44624b 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/CharEncodingFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/CharEncodingFilter.java @@ -20,12 +20,12 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/DebugFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/DebugFilter.java index 1bf1508c8..de994e489 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/DebugFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/DebugFilter.java @@ -19,14 +19,14 @@ package org.apache.roller.weblogger.ui.core.filters; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/IPBanFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/IPBanFilter.java index eda17e24e..2846d821e 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/IPBanFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/IPBanFilter.java @@ -19,14 +19,14 @@ package org.apache.roller.weblogger.ui.core.filters; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +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.roller.weblogger.util.IPBanList; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/InitFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/InitFilter.java index 554ccc6be..6d9da1abf 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/InitFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/InitFilter.java @@ -20,13 +20,13 @@ import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/LoadSaltFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/LoadSaltFilter.java index b2e63915d..85e2c76d7 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/LoadSaltFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/LoadSaltFilter.java @@ -20,8 +20,8 @@ import java.io.IOException; import java.security.SecureRandom; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.RandomStringUtils; import org.apache.roller.weblogger.ui.core.RollerSession; import org.apache.roller.weblogger.ui.rendering.util.cache.SaltCache; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/PersistenceSessionFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/PersistenceSessionFilter.java index a687552f7..44127249d 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/PersistenceSessionFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/PersistenceSessionFilter.java @@ -19,14 +19,14 @@ package org.apache.roller.weblogger.ui.core.filters; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +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.roller.weblogger.business.WebloggerFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/RoleAssignmentFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/RoleAssignmentFilter.java index bf4aaba70..37e9e03ef 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/RoleAssignmentFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/RoleAssignmentFilter.java @@ -19,14 +19,14 @@ package org.apache.roller.weblogger.ui.core.filters; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SpringFirewallExceptionFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SpringFirewallExceptionFilter.java index 2ff028cea..186e84ff9 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SpringFirewallExceptionFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SpringFirewallExceptionFilter.java @@ -19,14 +19,14 @@ package org.apache.roller.weblogger.ui.core.filters; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.security.web.firewall.RequestRejectedException; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/ValidateSaltFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/ValidateSaltFilter.java index 586bff185..5f9e54b34 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/ValidateSaltFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/ValidateSaltFilter.java @@ -23,13 +23,13 @@ import java.util.Objects; import java.util.Set; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/security/AutoProvision.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/AutoProvision.java index 0df869f3e..aa52fd534 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/security/AutoProvision.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/AutoProvision.java @@ -17,7 +17,7 @@ */ package org.apache.roller.weblogger.ui.core.security; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; public interface AutoProvision { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/security/BasicUserAutoProvision.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/BasicUserAutoProvision.java index e486d02c9..b2739de59 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/security/BasicUserAutoProvision.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/BasicUserAutoProvision.java @@ -17,7 +17,7 @@ */ package org.apache.roller.weblogger.ui.core.security; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/security/CustomUserRegistry.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/CustomUserRegistry.java index 14d184f87..01eb5fa84 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/security/CustomUserRegistry.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/CustomUserRegistry.java @@ -24,7 +24,7 @@ import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.roller.weblogger.config.AuthMethod; import org.springframework.security.core.Authentication; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/tags/calendar/CalendarTag.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/tags/calendar/CalendarTag.java index 2993837bb..afa309991 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/tags/calendar/CalendarTag.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/tags/calendar/CalendarTag.java @@ -32,9 +32,9 @@ import java.util.ResourceBundle; import java.util.StringTokenizer; -import javax.servlet.jsp.JspException; -import javax.servlet.jsp.tagext.Tag; -import javax.servlet.jsp.tagext.TagSupport; +import jakarta.servlet.jsp.JspException; +import jakarta.servlet.jsp.tagext.Tag; +import jakarta.servlet.jsp.tagext.TagSupport; /** diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/RequestMapper.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/RequestMapper.java index 4bac5118f..00fb58068 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/RequestMapper.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/RequestMapper.java @@ -2,9 +2,9 @@ package org.apache.roller.weblogger.ui.rendering; import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** 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 693be62ab..e17c5295d 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 @@ -23,10 +23,10 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/DeviceResolverRequestFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/DeviceResolverRequestFilter.java index 8add35406..732000d16 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/DeviceResolverRequestFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/DeviceResolverRequestFilter.java @@ -23,10 +23,10 @@ import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.roller.weblogger.ui.rendering.util.mobile.Device; import org.apache.roller.weblogger.ui.rendering.util.mobile.DeviceResolver; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/RequestMappingFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/RequestMappingFilter.java index 4c56fb92b..c30513138 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/RequestMappingFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/RequestMappingFilter.java @@ -22,14 +22,14 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +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.roller.weblogger.ui.rendering.RequestMapper; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/mobile/MobileDeviceRepository.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/mobile/MobileDeviceRepository.java index ddad1e2d1..e57ce5c8c 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/mobile/MobileDeviceRepository.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/mobile/MobileDeviceRepository.java @@ -18,8 +18,8 @@ package org.apache.roller.weblogger.ui.rendering.mobile; import java.util.regex.Pattern; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; import static org.apache.roller.weblogger.ui.rendering.mobile.MobileDeviceRepository.DeviceType.*; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/CalendarModel.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/CalendarModel.java index dfb778ec0..a558887ea 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/CalendarModel.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/CalendarModel.java @@ -19,7 +19,7 @@ package org.apache.roller.weblogger.ui.rendering.model; import java.util.Map; -import javax.servlet.jsp.PageContext; +import jakarta.servlet.jsp.PageContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentAuthenticator.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentAuthenticator.java index 68c707f17..1440f9269 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentAuthenticator.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentAuthenticator.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.rendering.plugins.comments; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentAuthenticatorUtils.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentAuthenticatorUtils.java index 12a78f600..309e1232d 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentAuthenticatorUtils.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentAuthenticatorUtils.java @@ -24,7 +24,7 @@ import org.apache.roller.weblogger.business.WebloggerFactory; import org.apache.roller.weblogger.pojos.Weblog; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Locale; class CommentAuthenticatorUtils { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/DefaultCommentAuthenticator.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/DefaultCommentAuthenticator.java index 49b48fd7b..81b02a109 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/DefaultCommentAuthenticator.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/DefaultCommentAuthenticator.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.rendering.plugins.comments; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticator.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticator.java index 27a5e1e47..8f4b9a6ef 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticator.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticator.java @@ -24,8 +24,8 @@ import javax.naming.NamingException; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/MathCommentAuthenticator.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/MathCommentAuthenticator.java index 74ab7bfa1..41a568401 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/MathCommentAuthenticator.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/MathCommentAuthenticator.java @@ -21,8 +21,8 @@ import java.util.Locale; import java.util.Random; import java.security.SecureRandom; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.util.I18nMessages; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentAuthenticatorServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentAuthenticatorServlet.java index b808050ef..781bcfafb 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentAuthenticatorServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentAuthenticatorServlet.java @@ -20,11 +20,11 @@ import java.io.IOException; import java.io.PrintWriter; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +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.roller.weblogger.config.WebloggerConfig; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java index 677a8f97a..6b9482237 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java @@ -22,12 +22,12 @@ import java.sql.Timestamp; import java.util.Iterator; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.RequestDispatcher; +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.lang3.StringUtils; import org.apache.commons.logging.Log; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/FeedServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/FeedServlet.java index c05bdfd56..8a8b3d968 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/FeedServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/FeedServlet.java @@ -21,11 +21,11 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +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.roller.util.RollerConstants; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/MediaResourceServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/MediaResourceServlet.java index 713e4c2d1..f2e864dc5 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/MediaResourceServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/MediaResourceServlet.java @@ -22,11 +22,11 @@ import java.io.InputStream; import java.io.OutputStream; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +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; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java index baf5e0948..39280f494 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java @@ -53,13 +53,13 @@ import org.apache.roller.weblogger.util.I18nMessages; import org.apache.roller.weblogger.util.cache.CachedContent; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.jsp.JspFactory; -import javax.servlet.jsp.PageContext; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.jsp.JspFactory; +import jakarta.servlet.jsp.PageContext; import java.io.IOException; import java.util.Date; import java.util.HashMap; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PlanetFeedServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PlanetFeedServlet.java index 432a0c33a..19008086a 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PlanetFeedServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PlanetFeedServlet.java @@ -22,11 +22,11 @@ import java.util.Date; import java.util.HashMap; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +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.lang3.StringUtils; import org.apache.commons.logging.Log; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PreviewResourceServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PreviewResourceServlet.java index 7103bea9f..553971b2f 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PreviewResourceServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PreviewResourceServlet.java @@ -20,12 +20,12 @@ import java.io.IOException; import java.io.InputStream; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletContext; +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.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PreviewServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PreviewServlet.java index a2ed8ced8..fbf07ebe4 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PreviewServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PreviewServlet.java @@ -37,13 +37,13 @@ import org.apache.roller.weblogger.ui.rendering.util.WeblogPreviewRequest; import org.apache.roller.weblogger.util.cache.CachedContent; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.jsp.JspFactory; -import javax.servlet.jsp.PageContext; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.jsp.JspFactory; +import jakarta.servlet.jsp.PageContext; import java.io.IOException; import java.util.HashMap; import java.util.Map; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/RSDServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/RSDServlet.java index cd2315211..da5ba82af 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/RSDServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/RSDServlet.java @@ -20,11 +20,11 @@ import java.io.IOException; import java.util.HashMap; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +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.roller.util.RollerConstants; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/ResourceServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/ResourceServlet.java index 8dbd5dba1..1c9e59bf6 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/ResourceServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/ResourceServlet.java @@ -21,12 +21,12 @@ import java.io.IOException; import java.io.InputStream; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletContext; +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; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/SearchServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/SearchServlet.java index 9b3c90c6e..eaeafa7bf 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/SearchServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/SearchServlet.java @@ -22,13 +22,13 @@ import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.jsp.JspFactory; -import javax.servlet.jsp.PageContext; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.jsp.JspFactory; +import jakarta.servlet.jsp.PageContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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 index 2b43a4e75..5046544e3 100644 --- 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 @@ -22,11 +22,11 @@ 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 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.roller.util.RollerConstants; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/ModDateHeaderUtil.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/ModDateHeaderUtil.java index d227de531..67367bb6c 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/ModDateHeaderUtil.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/ModDateHeaderUtil.java @@ -21,8 +21,8 @@ import java.text.SimpleDateFormat; import java.util.Date; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/ParsedRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/ParsedRequest.java index e14414bf4..1133da337 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/ParsedRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/ParsedRequest.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.rendering.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/PlanetRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/PlanetRequest.java index 11f1fb7f8..09fb4c00f 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/PlanetRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/PlanetRequest.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.rendering.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogCommentRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogCommentRequest.java index 95eea7989..6c0e08720 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogCommentRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogCommentRequest.java @@ -20,7 +20,7 @@ import java.net.URLDecoder; import java.nio.charset.StandardCharsets; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogFeedRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogFeedRequest.java index 2c0832f6d..bd94b83cb 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogFeedRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogFeedRequest.java @@ -20,7 +20,7 @@ import java.util.List; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogMediaResourceRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogMediaResourceRequest.java index ee94984ae..1d297c4ef 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogMediaResourceRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogMediaResourceRequest.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.rendering.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPageRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPageRequest.java index 4e7dc7cb5..bdf766e09 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPageRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPageRequest.java @@ -33,7 +33,7 @@ import org.apache.roller.weblogger.util.URLUtilities; import org.apache.roller.weblogger.util.Utilities; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewRequest.java index 5df599d4e..2c8741323 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewRequest.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.rendering.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewResourceRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewResourceRequest.java index d689d2c8f..686aa286f 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewResourceRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewResourceRequest.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.rendering.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.java index 37fa6d806..f42c5ac40 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.java @@ -19,7 +19,7 @@ package org.apache.roller.weblogger.ui.rendering.util; import java.util.Locale; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogResourceRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogResourceRequest.java index 19107c4c2..9e7fe6ca2 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogResourceRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogResourceRequest.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.rendering.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.util.URLUtilities; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogSearchRequest.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogSearchRequest.java index d1037ee5d..b518fb14a 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogSearchRequest.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/WeblogSearchRequest.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.rendering.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; 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 index 11807c6b5..c51831c65 100644 --- 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 @@ -20,7 +20,7 @@ import java.net.URLDecoder; import java.nio.charset.StandardCharsets; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/DeviceResolver.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/DeviceResolver.java index 60e6010aa..9e47cb2a7 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/DeviceResolver.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/DeviceResolver.java @@ -20,7 +20,7 @@ */ package org.apache.roller.weblogger.ui.rendering.util.mobile; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * Service interface for resolving Devices that originate web requests with the diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/DeviceUtils.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/DeviceUtils.java index dea2f8245..79bb814aa 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/DeviceUtils.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/DeviceUtils.java @@ -20,7 +20,7 @@ */ package org.apache.roller.weblogger.ui.rendering.util.mobile; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.web.context.request.RequestAttributes; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/LiteDeviceResolver.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/LiteDeviceResolver.java index d02929b94..f29e59e03 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/LiteDeviceResolver.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/LiteDeviceResolver.java @@ -24,7 +24,7 @@ import java.util.Arrays; import java.util.Enumeration; import java.util.List; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * A "lightweight" device resolver algorithm based on Wordpress's Mobile pack. diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/MobileDeviceRepository.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/MobileDeviceRepository.java index 7c8e2bd81..201755e99 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/MobileDeviceRepository.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/MobileDeviceRepository.java @@ -20,7 +20,7 @@ */ package org.apache.roller.weblogger.ui.rendering.util.mobile; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * The Class MobileDeviceRepository. diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/WebappResourceLoader.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/WebappResourceLoader.java index 0a53e17a2..35b18cfd6 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/WebappResourceLoader.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/WebappResourceLoader.java @@ -25,7 +25,7 @@ import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalCommentManagement.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalCommentManagement.java index ef1774f8c..375d31cfb 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalCommentManagement.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalCommentManagement.java @@ -24,7 +24,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -41,15 +40,15 @@ import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.Utilities; +import org.apache.struts2.ActionContext; import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.ServletRequestAware; /** * Action for managing global set of comments. */ // TODO: make this work @AllowedMethods({"query","delete","update"}) -public class GlobalCommentManagement extends UIAction implements ServletRequestAware { +public class GlobalCommentManagement extends UIAction { private static Log log = LogFactory.getLog(GlobalCommentManagement.class); @@ -245,6 +244,7 @@ public String delete() { * Update a list of comments. */ public String update() { + httpMethod = ActionContext.getContext().getServletRequest().getMethod(); if (!"POST".equals(httpMethod)) { return ERROR; } @@ -378,9 +378,4 @@ public void setPager(CommentsPager pager) { this.pager = pager; } - @Override - public void setServletRequest(HttpServletRequest req) { - httpMethod = req.getMethod(); - } - } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java index 194337886..580a4af80 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java @@ -19,8 +19,6 @@ package org.apache.roller.weblogger.ui.struts2.admin; import java.util.*; -import javax.servlet.http.HttpServletRequest; - import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -39,17 +37,16 @@ import org.apache.roller.weblogger.pojos.Weblog; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.Utilities; +import org.apache.struts2.ActionContext; import org.apache.struts2.dispatcher.HttpParameters; import org.apache.struts2.dispatcher.Parameter; -import org.apache.struts2.interceptor.HttpParametersAware; -import org.apache.struts2.interceptor.ServletRequestAware; /** * Action which handles editing of global configuration. */ // TODO: make this work @AllowedMethods({"execute","save"}) -public class GlobalConfig extends UIAction implements HttpParametersAware, ServletRequestAware { +public class GlobalConfig extends UIAction { private static final Log log = LogFactory.getLog(GlobalConfig.class); @@ -101,6 +98,16 @@ public List requiredGlobalPermissionActions() { */ @Override public void myPrepare() { + // initialize request parameters from ActionContext + this.params = ActionContext.getContext().getParameters(); + + if (log.isDebugEnabled()) { + log.debug("Parameter map:"); + for (Map.Entry entry : params.entrySet()) { + log.debug(entry.getKey() + " = " + Utilities.stringArrayToString(entry.getValue().getMultipleValues(), ",")); + } + } + try { // just grab our properties map and make it available to the action PropertiesManager mgr = WebloggerFactory.getWeblogger().getPropertiesManager(); @@ -152,6 +159,7 @@ public String execute() { * Save global properties. */ public String save() { + httpMethod = ActionContext.getContext().getServletRequest().getMethod(); if (!"POST".equals(httpMethod)) { return ERROR; } @@ -252,19 +260,6 @@ public String save() { } - @Override - public void setParameters(HttpParameters parameters) { - this.params = parameters; - - if (log.isDebugEnabled()) { - log.debug("Parameter map:"); - - for (Map.Entry entry : parameters.entrySet()) { - log.debug(entry.getKey() + " = " + Utilities.stringArrayToString(entry.getValue().getMultipleValues(), ",")); - } - } - } - // convenience method for getting a single parameter as a String private String getParameter(String key) { return this.params.get(key).getValue(); @@ -306,11 +301,6 @@ public void setCommentPlugins(String[] commentPlugins) { this.commentPlugins = commentPlugins.clone(); } - @Override - public void setServletRequest(HttpServletRequest req) { - httpMethod = req.getMethod(); - } - public Collection getWeblogs() { return weblogs; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/CommentDataServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/CommentDataServlet.java index 59db62bd7..2563e1a18 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/CommentDataServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/CommentDataServlet.java @@ -19,10 +19,10 @@ package org.apache.roller.weblogger.ui.struts2.ajax; import java.io.IOException; -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.text.StringEscapeUtils; import org.apache.commons.text.WordUtils; import org.apache.roller.weblogger.business.Weblogger; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java index 694c736dd..236b4d3bf 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java @@ -27,10 +27,10 @@ import java.util.ArrayList; 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; /** * Return theme information (id, name, description, relative path to thumbnail) diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/UserDataServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/UserDataServlet.java index b3739ce40..2472bd1d4 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/UserDataServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/UserDataServlet.java @@ -21,10 +21,10 @@ import java.io.IOException; 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.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.business.Weblogger; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Register.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Register.java index 1d8f6628a..5ddf04337 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Register.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Register.java @@ -20,7 +20,7 @@ import java.util.TimeZone; import java.util.UUID; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.CharSetUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; @@ -37,8 +37,8 @@ import org.apache.roller.weblogger.ui.core.security.CustomUserRegistry; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.MailUtil; +import org.apache.struts2.ActionContext; import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.validation.SkipValidation; @@ -51,7 +51,7 @@ * @see org.apache.roller.weblogger.ui.struts2.core.Login */ // TODO: make this work @AllowedMethods({"execute","save","activate"}) -public class Register extends UIAction implements ServletRequestAware { +public class Register extends UIAction { private static Log log = LogFactory.getLog(Register.class); private static final String DISABLED_RETURN_CODE = "disabled"; @@ -434,13 +434,11 @@ private void checkOpenID() { public HttpServletRequest getServletRequest() { + if (servletRequest == null) { + servletRequest = ActionContext.getContext().getServletRequest(); + } return servletRequest; } - - @Override - public void setServletRequest(HttpServletRequest servletRequest) { - this.servletRequest = servletRequest; - } public ProfileBean getBean() { return bean; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java index 94de22d1f..d06c2444e 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java @@ -27,18 +27,18 @@ import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; -import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.convention.annotation.AllowedMethods; import org.apache.struts2.interceptor.validation.SkipValidation; +import org.apache.struts2.ActionContext; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; /** * Edit a new or existing folder. */ // TODO: make this work @AllowedMethods({"execute","save"}) -public class FolderEdit extends UIAction implements ServletResponseAware { +public class FolderEdit extends UIAction { private static final Log log = LogFactory.getLog(FolderEdit.class); @@ -51,8 +51,6 @@ public class FolderEdit extends UIAction implements ServletResponseAware { // the folder we are adding or editing private WeblogBookmarkFolder folder = null; - private HttpServletResponse httpServletResponse; - public FolderEdit() { this.desiredMenu = "editor"; @@ -81,9 +79,8 @@ public void myPrepare() { } } - @Override - public void setServletResponse(HttpServletResponse httpServletResponse) { - this.httpServletResponse = httpServletResponse; + private HttpServletResponse getServletResponse() { + return ActionContext.getContext().getServletResponse(); } /** @@ -130,7 +127,7 @@ public String save() { // HTTP response splitting defense String sanetizedFolderID = folderId.replace("\n", "").replace("\r", ""); - httpServletResponse.addHeader("folderId", sanetizedFolderID); + getServletResponse().addHeader("folderId", sanetizedFolderID); return SUCCESS; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Members.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Members.java index bda896194..4fa3ea1ae 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Members.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Members.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; @@ -30,9 +29,8 @@ import org.apache.roller.weblogger.pojos.WeblogPermission; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.Utilities; +import org.apache.struts2.ActionContext; import org.apache.struts2.dispatcher.HttpParameters; -import org.apache.struts2.dispatcher.Parameter; -import org.apache.struts2.interceptor.HttpParametersAware; /** @@ -42,7 +40,7 @@ * website.permissions collection when a permission is deleted. */ // TODO: make this work @AllowedMethods({"execute","save"}) -public class Members extends UIAction implements HttpParametersAware { +public class Members extends UIAction { private static final Log log = LogFactory.getLog(Members.class); @@ -52,12 +50,17 @@ public class Members extends UIAction implements HttpParametersAware { public Members() { log.debug("Instantiating members action"); - + this.actionName = "members"; this.desiredMenu = "editor"; this.pageTitle = "memberPermissions.title"; } - + + @Override + public void myPrepare() { + this.parameters = ActionContext.getContext().getParameters(); + } + @Override public String execute() { log.debug("Showing weblog members page"); @@ -159,14 +162,9 @@ public String getParameter(String key) { } - public Map getParameters() { + public HttpParameters getParameters() { return parameters; } - - @Override - public void setParameters(HttpParameters parameters) { - this.parameters = parameters; - } public List getWeblogPermissions() { try { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java index b5be30dcb..09d3ed496 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java @@ -18,7 +18,9 @@ package org.apache.roller.weblogger.ui.struts2.util; -import com.opensymphony.xwork2.ActionSupport; +import org.apache.struts2.ActionContext; +import org.apache.struts2.ActionSupport; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.text.StringEscapeUtils; import org.apache.roller.weblogger.business.UserManager; import org.apache.roller.weblogger.business.WebloggerFactory; @@ -30,8 +32,6 @@ import org.apache.roller.weblogger.pojos.WeblogPermission; import org.apache.roller.weblogger.ui.core.util.menu.Menu; import org.apache.roller.weblogger.ui.core.util.menu.MenuHelper; -import org.apache.struts2.interceptor.RequestAware; - import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -39,7 +39,6 @@ import java.util.Collections; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -53,7 +52,7 @@ * getText(key) on the param passed into setError() and setSuccess(). */ public abstract class UIAction extends ActionSupport - implements UIActionPreparable, UISecurityEnforced, RequestAware { + implements UIActionPreparable, UISecurityEnforced { // a result that sends the user to an access denied warning public static final String DENIED = "access-denied"; @@ -88,13 +87,14 @@ public abstract class UIAction extends ActionSupport public void myPrepare() { // no-op } - - @Override - public void setRequest(Map map) { - this.salt = (String) map.get("salt"); - } public String getSalt() { + if (salt == null) { + HttpServletRequest request = ActionContext.getContext().getServletRequest(); + if (request != null) { + salt = (String) request.getAttribute("salt"); + } + } return salt; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIActionInterceptor.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIActionInterceptor.java index 08b65f4bb..d3d144299 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIActionInterceptor.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIActionInterceptor.java @@ -18,7 +18,7 @@ package org.apache.roller.weblogger.ui.struts2.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; @@ -28,9 +28,9 @@ import org.apache.roller.weblogger.ui.core.RollerSession; import org.apache.struts2.StrutsStatics; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; +import org.apache.struts2.ActionContext; +import org.apache.struts2.ActionInvocation; +import org.apache.struts2.interceptor.MethodFilterInterceptor; /** * A struts2 interceptor for configuring specifics of the weblogger ui. diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIActionPrepareInterceptor.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIActionPrepareInterceptor.java index 7e558dd0a..862f0a3e7 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIActionPrepareInterceptor.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIActionPrepareInterceptor.java @@ -20,8 +20,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; +import org.apache.struts2.ActionInvocation; +import org.apache.struts2.interceptor.MethodFilterInterceptor; /** * A struts2 interceptor for doing custom prepare logic. diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java index 8e97899b8..64fbcb880 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java @@ -27,8 +27,8 @@ import org.apache.roller.weblogger.pojos.Weblog; import org.apache.roller.weblogger.pojos.WeblogPermission; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; +import org.apache.struts2.ActionInvocation; +import org.apache.struts2.interceptor.MethodFilterInterceptor; /** * A struts2 interceptor for configuring specifics of the weblogger ui. diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/tags/StringTagSupport.java b/app/src/main/java/org/apache/roller/weblogger/ui/tags/StringTagSupport.java index 0286801c7..86297d4c8 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/tags/StringTagSupport.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/tags/StringTagSupport.java @@ -18,9 +18,9 @@ import java.io.IOException; import java.io.StringWriter; -import javax.servlet.jsp.JspException; -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.tagext.BodyTagSupport; +import jakarta.servlet.jsp.JspException; +import jakarta.servlet.jsp.JspWriter; +import jakarta.servlet.jsp.tagext.BodyTagSupport; /** * Abstract support class for the String Taglib. diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/tags/TruncateNicelyTag.java b/app/src/main/java/org/apache/roller/weblogger/ui/tags/TruncateNicelyTag.java index 33ab6d9d9..e9381249d 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/tags/TruncateNicelyTag.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/tags/TruncateNicelyTag.java @@ -15,7 +15,7 @@ */ package org.apache.roller.weblogger.ui.tags; -import javax.servlet.jsp.JspException; +import jakarta.servlet.jsp.JspException; import org.apache.commons.lang3.math.NumberUtils; /** diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/tags/WordWrapTag.java b/app/src/main/java/org/apache/roller/weblogger/ui/tags/WordWrapTag.java index 293ce90da..f7f81ebc9 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/tags/WordWrapTag.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/tags/WordWrapTag.java @@ -15,7 +15,7 @@ */ package org.apache.roller.weblogger.ui.tags; -import javax.servlet.jsp.JspException; +import jakarta.servlet.jsp.JspException; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; diff --git a/app/src/main/java/org/apache/roller/weblogger/util/I18nMessages.java b/app/src/main/java/org/apache/roller/weblogger/util/I18nMessages.java index c6de4c353..d1582d1c4 100644 --- a/app/src/main/java/org/apache/roller/weblogger/util/I18nMessages.java +++ b/app/src/main/java/org/apache/roller/weblogger/util/I18nMessages.java @@ -192,7 +192,7 @@ public static void reloadBundle(Locale key) { /** * Clear tomcat cache. * - * @see com.opensymphony.xwork2.util.LocalizedTextUtil + * @see org.apache.struts2.util.LocalizedTextUtil */ private static void clearTomcatCache() { diff --git a/app/src/main/java/org/apache/roller/weblogger/util/MailUtil.java b/app/src/main/java/org/apache/roller/weblogger/util/MailUtil.java index eeedc9e32..6c519bd46 100644 --- a/app/src/main/java/org/apache/roller/weblogger/util/MailUtil.java +++ b/app/src/main/java/org/apache/roller/weblogger/util/MailUtil.java @@ -27,14 +27,14 @@ import java.util.ResourceBundle; import java.util.Set; import java.util.TreeSet; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.SendFailedException; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.Address; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.SendFailedException; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.Address; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/app/src/main/java/org/apache/roller/weblogger/util/Utilities.java b/app/src/main/java/org/apache/roller/weblogger/util/Utilities.java index e35efb030..1a59ff824 100644 --- a/app/src/main/java/org/apache/roller/weblogger/util/Utilities.java +++ b/app/src/main/java/org/apache/roller/weblogger/util/Utilities.java @@ -19,10 +19,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.activation.FileTypeMap; -import javax.activation.MimetypesFileTypeMap; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; +import jakarta.activation.FileTypeMap; +import jakarta.activation.MimetypesFileTypeMap; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; import org.apache.commons.codec.binary.Base64; import org.apache.commons.text.StringEscapeUtils; diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java index f9180c163..0fd472898 100644 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java @@ -19,7 +19,7 @@ import com.rometools.propono.atom.common.Categories; import com.rometools.propono.atom.server.AtomRequest; import java.util.StringTokenizer; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.codec.binary.Base64; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -38,7 +38,7 @@ import com.rometools.rome.feed.atom.Entry; import com.rometools.rome.feed.atom.Feed; import java.nio.charset.StandardCharsets; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.apache.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.config.WebloggerConfig; diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java deleted file mode 100644 index 4b3e1f361..000000000 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java +++ /dev/null @@ -1,41 +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.webservices.atomprotocol; - -import com.rometools.propono.atom.server.AtomHandlerFactory; -import com.rometools.propono.atom.server.AtomHandler; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * Extends {@link com.rometools.propono.atom.server.AtomHandlerFactory} to create and return - * {@link com.rometools.propono.atom.server.impl.FileBasedAtomHandler}. - */ -public class RollerAtomHandlerFactory extends AtomHandlerFactory { - - /** - * Create new AtomHandler. - */ - @Override - public AtomHandler newAtomHandler( - HttpServletRequest req, HttpServletResponse res) { - return new RollerAtomHandler(req, res); - } -} - diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomRequestImpl.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomRequestImpl.java new file mode 100644 index 000000000..0f15a4710 --- /dev/null +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomRequestImpl.java @@ -0,0 +1,135 @@ +/* + * 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. + */ +/* + * Derived from com.rometools.propono.atom.server.AtomRequestImpl. + * Forked to use jakarta.servlet instead of javax.servlet. + */ +package org.apache.roller.weblogger.webservices.atomprotocol; + +import java.io.IOException; +import java.io.InputStream; +import java.security.Principal; +import java.util.Enumeration; +import java.util.Map; + +import jakarta.servlet.http.HttpServletRequest; + +import com.rometools.propono.atom.server.AtomRequest; + +public class RollerAtomRequestImpl implements AtomRequest { + + private final HttpServletRequest wrapped; + + public RollerAtomRequestImpl(HttpServletRequest request) { + this.wrapped = request; + } + + @Override + public String getPathInfo() { + return wrapped.getPathInfo(); + } + + @Override + public String getQueryString() { + return wrapped.getQueryString(); + } + + @Override + public String getRemoteUser() { + return wrapped.getRemoteUser(); + } + + @Override + public boolean isUserInRole(String role) { + return wrapped.isUserInRole(role); + } + + @Override + public Principal getUserPrincipal() { + return wrapped.getUserPrincipal(); + } + + @Override + public String getRequestURI() { + return wrapped.getRequestURI(); + } + + @Override + public StringBuffer getRequestURL() { + return wrapped.getRequestURL(); + } + + @Override + public int getContentLength() { + return wrapped.getContentLength(); + } + + @Override + public String getContentType() { + return wrapped.getContentType(); + } + + @Override + public String getParameter(String name) { + return wrapped.getParameter(name); + } + + @Override + public Enumeration getParameterNames() { + return wrapped.getParameterNames(); + } + + @Override + public String[] getParameterValues(String name) { + return wrapped.getParameterValues(name); + } + + @Override + @SuppressWarnings("unchecked") + public Map getParameterMap() { + return (Map) wrapped.getParameterMap(); + } + + @Override + public InputStream getInputStream() throws IOException { + return wrapped.getInputStream(); + } + + @Override + public long getDateHeader(String name) { + return wrapped.getDateHeader(name); + } + + @Override + public String getHeader(String name) { + return wrapped.getHeader(name); + } + + @Override + public Enumeration getHeaders(String name) { + return wrapped.getHeaders(name); + } + + @Override + public Enumeration 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 index c1a959e87..261256ac4 100644 --- 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 @@ -24,11 +24,11 @@ import java.util.Collections; import java.util.Locale; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +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; @@ -42,7 +42,6 @@ import com.rometools.propono.atom.server.AtomHandler; import com.rometools.propono.atom.server.AtomMediaResource; import com.rometools.propono.atom.server.AtomRequest; -import com.rometools.propono.atom.server.AtomRequestImpl; import com.rometools.rome.feed.atom.Content; import com.rometools.rome.feed.atom.Entry; import com.rometools.rome.feed.atom.Feed; @@ -93,7 +92,7 @@ protected void doGet(final HttpServletRequest req, final HttpServletResponse res final AtomHandler handler = createAtomRequestHandler(req, res); final String userName = handler.getAuthenticatedUsername(); if (userName != null) { - final AtomRequest areq = new AtomRequestImpl(req); + final AtomRequest areq = new RollerAtomRequestImpl(req); try { if (handler.isAtomServiceURI(areq)) { // return an Atom Service document @@ -174,7 +173,7 @@ protected void doPost(final HttpServletRequest req, final HttpServletResponse re final AtomHandler handler = createAtomRequestHandler(req, res); final String userName = handler.getAuthenticatedUsername(); if (userName != null) { - final AtomRequest areq = new AtomRequestImpl(req); + final AtomRequest areq = new RollerAtomRequestImpl(req); try { if (handler.isCollectionURI(areq)) { @@ -281,7 +280,7 @@ protected void doPut(final HttpServletRequest req, final HttpServletResponse res final AtomHandler handler = createAtomRequestHandler(req, res); final String userName = handler.getAuthenticatedUsername(); if (userName != null) { - final AtomRequest areq = new AtomRequestImpl(req); + final AtomRequest areq = new RollerAtomRequestImpl(req); try { if (handler.isEntryURI(areq)) { @@ -328,7 +327,7 @@ protected void doDelete(final HttpServletRequest req, final HttpServletResponse final AtomHandler handler = createAtomRequestHandler(req, res); final String userName = handler.getAuthenticatedUsername(); if (userName != null) { - final AtomRequest areq = new AtomRequestImpl(req); + final AtomRequest areq = new RollerAtomRequestImpl(req); try { if (handler.isEntryURI(areq)) { handler.deleteEntry(areq); 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 fe8e7b57a..511866b28 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 e239839eb..7712e156e 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 index 3f0e68bee..62db6b427 100644 --- 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 @@ -28,11 +28,11 @@ import java.net.URL; import java.util.Enumeration; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +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; 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 index 45793299d..3bed68a63 100644 --- 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 @@ -27,9 +27,9 @@ import java.io.InputStream; import java.io.OutputStream; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +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; diff --git a/app/src/main/resources/META-INF/persistence.xml b/app/src/main/resources/META-INF/persistence.xml index cafcdfaa4..e27c7b43f 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 7.0//EN" + "https://struts.apache.org/dtds/struts-7.0.dtd"> diff --git a/app/src/main/webapp/WEB-INF/security.xml b/app/src/main/webapp/WEB-INF/security.xml index ba55d4a75..7825c085a 100644 --- a/app/src/main/webapp/WEB-INF/security.xml +++ b/app/src/main/webapp/WEB-INF/security.xml @@ -28,14 +28,14 @@ - - - - - - - - + + + + + + + + - - - - - - - - - diff --git a/app/src/main/webapp/WEB-INF/tiles.xml b/app/src/main/webapp/WEB-INF/tiles.xml index eb30deeb2..c63b07655 100644 --- a/app/src/main/webapp/WEB-INF/tiles.xml +++ b/app/src/main/webapp/WEB-INF/tiles.xml @@ -16,9 +16,9 @@ copyright in this work, please see the NOTICE file in the top level directory of this distribution. --> - + diff --git a/app/src/main/webapp/WEB-INF/web.xml b/app/src/main/webapp/WEB-INF/web.xml index a38de8944..2f6cd3c75 100644 --- a/app/src/main/webapp/WEB-INF/web.xml +++ b/app/src/main/webapp/WEB-INF/web.xml @@ -1,8 +1,8 @@ - + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" + version="6.0"> Roller Weblogger @@ -12,7 +12,7 @@ - javax.servlet.jsp.jstl.fmt.localizationContext + jakarta.servlet.jsp.jstl.fmt.localizationContext ApplicationResources @@ -462,7 +462,7 @@ mail/Session - javax.mail.Session + jakarta.mail.Session Container Session diff --git a/app/src/main/webapp/roller-ui/errors/403.jsp b/app/src/main/webapp/roller-ui/errors/403.jsp index 06c8194f7..a476f4089 100644 --- a/app/src/main/webapp/roller-ui/errors/403.jsp +++ b/app/src/main/webapp/roller-ui/errors/403.jsp @@ -29,9 +29,9 @@

- - - + + + diff --git a/app/src/main/webapp/roller-ui/errors/404.jsp b/app/src/main/webapp/roller-ui/errors/404.jsp index 33b01730f..5ee7ba1de 100644 --- a/app/src/main/webapp/roller-ui/errors/404.jsp +++ b/app/src/main/webapp/roller-ui/errors/404.jsp @@ -31,9 +31,9 @@

- - - + + +
diff --git a/app/src/main/webapp/roller-ui/errors/error.jsp b/app/src/main/webapp/roller-ui/errors/error.jsp index ea1781166..aba8881eb 100644 --- a/app/src/main/webapp/roller-ui/errors/error.jsp +++ b/app/src/main/webapp/roller-ui/errors/error.jsp @@ -31,10 +31,10 @@

- - - - + + + +
diff --git a/app/src/main/webapp/roller-ui/logout-redirect.jsp b/app/src/main/webapp/roller-ui/logout-redirect.jsp index 45211b9eb..e7023f4b4 100644 --- a/app/src/main/webapp/roller-ui/logout-redirect.jsp +++ b/app/src/main/webapp/roller-ui/logout-redirect.jsp @@ -17,7 +17,7 @@ --%> <%@ page language="java" contentType="text/html; charset=UTF-8" %> <%@ page import="org.apache.roller.weblogger.ui.core.RollerSession" %> -<%@ page import="javax.servlet.http.Cookie" %> +<%@ page import="jakarta.servlet.http.Cookie" %> <%@ page import="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices" %> <% diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionTest.java index ea8522f93..5fde0cc06 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionTest.java @@ -10,8 +10,8 @@ import org.mockito.MockedStatic; import org.mockito.MockitoAnnotations; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import java.security.Principal; import static org.junit.jupiter.api.Assertions.*; diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/LoadSaltFilterTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/LoadSaltFilterTest.java index 5ace927a2..47f2f2171 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/LoadSaltFilterTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/LoadSaltFilterTest.java @@ -9,9 +9,9 @@ import org.mockito.MockedStatic; import org.mockito.MockitoAnnotations; -import javax.servlet.FilterChain; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import static org.mockito.Mockito.*; diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/ValidateSaltFilterTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/ValidateSaltFilterTest.java index ab866d080..0058e2a98 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/ValidateSaltFilterTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/ValidateSaltFilterTest.java @@ -10,11 +10,11 @@ import org.mockito.MockedStatic; import org.mockito.MockitoAnnotations; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/rendering/model/SearchResultsFeedModelTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/model/SearchResultsFeedModelTest.java index 1ca19b116..07da2b7b9 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/rendering/model/SearchResultsFeedModelTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/model/SearchResultsFeedModelTest.java @@ -23,7 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.TestUtils; diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/rendering/model/SearchResultsModelTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/model/SearchResultsModelTest.java index 9c38e3bda..c0886fd83 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/rendering/model/SearchResultsModelTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/model/SearchResultsModelTest.java @@ -25,7 +25,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.TestUtils; From 01086d6668e386c5bf04514f7547aea3f7a49529 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 09:12:23 -0600 Subject: [PATCH 05/22] Upgrade Jetty Maven plugin to 12, Tomcat to 10.1, and PostgreSQL to 16 Jetty 10 used javax.servlet and was incompatible with the Jakarta EE 10 migration. Jetty 12's ee10 module supports jakarta.servlet natively. The Dockerfile now targets Tomcat 10.1 (Jakarta EE 10) with angus-mail replacing the old javax.mail JAR. --- Dockerfile | 12 +++++++----- app/pom.xml | 6 +++--- app/src/test/resources/jetty.xml | 6 ++---- docker-compose.yml | 4 +--- pom.xml | 8 +++----- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index 872061a0c..3870efc22 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ # STAGE 1 - BUILD ------------------------------------------------ -FROM maven:3-openjdk-17-slim as builder +FROM maven:3-eclipse-temurin-17 AS builder COPY ./docker /project/docker @@ -38,7 +38,7 @@ mvn -Duser.home=/builder/home -DskipTests=true -B clean install # STAGE 2 - PACKAGE ------------------------------------------------ -FROM tomcat:9-jdk17-openjdk-slim +FROM tomcat:10.1-jdk17-openjdk-slim # Remove existing Tomcat webapps @@ -70,9 +70,11 @@ RUN mkdir -p data/mediafiles data/searchindex WORKDIR /usr/local/tomcat/lib RUN apt-get update && apt-get install -y wget -RUN wget -O postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.3.1.jar -RUN wget https://repo1.maven.org/maven2/javax/mail/mail/1.4.7/mail-1.4.7.jar -#RUN wget https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar +RUN wget -O postgresql.jar https://jdbc.postgresql.org/download/postgresql-42.7.4.jar +RUN wget https://repo1.maven.org/maven2/org/eclipse/angus/angus-mail/2.0.3/angus-mail-2.0.3.jar +RUN wget https://repo1.maven.org/maven2/jakarta/mail/jakarta.mail-api/2.1.3/jakarta.mail-api-2.1.3.jar +RUN wget https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api/2.1.3/jakarta.activation-api-2.1.3.jar +RUN wget https://repo1.maven.org/maven2/org/eclipse/angus/angus-activation/2.0.2/angus-activation-2.0.2.jar # Add Roller entry-point and go! diff --git a/app/pom.xml b/app/pom.xml index d48ae0832..c23028f84 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -588,13 +588,13 @@ limitations under the License. - org.eclipse.jetty - jetty-maven-plugin + org.eclipse.jetty.ee10 + jetty-ee10-maven-plugin /roller - src/test/resources/jetty.xml + src/test/resources/jetty.xml ${project.build.directory}/test-classes/roller-jettyrun.properties diff --git a/app/src/test/resources/jetty.xml b/app/src/test/resources/jetty.xml index a31ca4c6d..24d1424e2 100644 --- a/app/src/test/resources/jetty.xml +++ b/app/src/test/resources/jetty.xml @@ -16,14 +16,12 @@ copyright in this work, please see the NOTICE file in the top level directory of this distribution. --> - - - + jdbc/rollerdb @@ -36,7 +34,7 @@ - + mail/Session diff --git a/docker-compose.yml b/docker-compose.yml index ba5c7b8d4..dad8c6b8f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,12 +19,10 @@ # Example Docker Compose setup for running Roller and PostgreSQL locally -version: '3.7' - services: postgresql: - image: "postgres:10.0" + image: "postgres:16" ports: - "5432:5432" volumes: diff --git a/pom.xml b/pom.xml index dcd64dd62..a4f48fd12 100644 --- a/pom.xml +++ b/pom.xml @@ -41,9 +41,7 @@ limitations under the License. 10.16.1.1 - 1.4.7 - 2.3.1 - 10.0.24 + 12.0.21 UTF-8 UTF-8 6.1.5 @@ -86,8 +84,8 @@ limitations under the License. - org.eclipse.jetty - jetty-maven-plugin + org.eclipse.jetty.ee10 + jetty-ee10-maven-plugin ${jetty.plugin.version} From 96f4e794574dea10e71371aeaca51c28ded42ec0 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 09:13:15 -0600 Subject: [PATCH 06/22] Update CI matrix to require Java 17 minimum The Jakarta EE 10 migration sets Java 17 as the compiler target, so the JDK 11 build matrix entry is no longer valid. --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ba177a1d2..a3f00c251 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - java: [ '11', '17', '21', '23' ] + java: [ '17', '21', '23' ] steps: - name: Set up JDK ${{ matrix.java }} @@ -75,7 +75,7 @@ jobs: # only on integration and only once in this matrix - name: Upload Dev Build on Integration - if: ${{ (matrix.java == '11') && (github.event_name == 'push') }} + if: ${{ (matrix.java == '17') && (github.event_name == 'push') }} uses: actions/upload-artifact@v4 with: name: dev-build From ecb194dbd90e4516cf3bdbce03503a7ca555ac5f Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 09:45:14 -0600 Subject: [PATCH 07/22] Fix it-selenium module for Jakarta EE 10 migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update it-selenium/pom.xml to replace javax dependencies removed from the parent pom: javax.xml.bind → jakarta.xml.bind, javax.mail → jakarta.mail + angus-mail. Switch Jetty plugin to ee10 variant and update config for Jetty 12. --- it-selenium/pom.xml | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/it-selenium/pom.xml b/it-selenium/pom.xml index f9f980e94..f81e0732f 100644 --- a/it-selenium/pom.xml +++ b/it-selenium/pom.xml @@ -58,8 +58,8 @@ 4.28.0 - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api xerces @@ -74,16 +74,9 @@ - javax.xml.bind - jaxb-api - ${jaxb.version} - - - - javax.activation - javax.activation-api - - + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.2 test @@ -137,19 +130,12 @@ - - - javax.xml.bind - jaxb-api - 2.3.1 - - - org.eclipse.jetty - jetty-maven-plugin + org.eclipse.jetty.ee10 + jetty-ee10-maven-plugin selenium 9999 @@ -157,7 +143,7 @@ /roller target/roller-selenium-tests-${project.version} - ${project.parent.basedir}/app/src/test/resources/jetty.xml + ${project.parent.basedir}/app/src/test/resources/jetty.xml src/test/resources/roller-jettyrun.properties @@ -206,9 +192,14 @@ ${derby.version} - javax.mail - mail - ${java-mail.version} + jakarta.mail + jakarta.mail-api + 2.1.3 + + + org.eclipse.angus + angus-mail + 2.0.3 From 33fe72e3a867f65de81064700fc7f524d47091dd Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 10:13:14 -0600 Subject: [PATCH 08/22] Fix Struts DTD reference: struts-7.0.dtd does not exist Struts 7.1.1 ships with struts-6.5.dtd as the latest DTD. The non-existent struts-7.0.dtd URL causes startup failures when the XML parser cannot fetch the DTD (e.g., in Docker containers without full internet access). --- app/src/main/resources/struts.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/resources/struts.xml b/app/src/main/resources/struts.xml index 706652c59..7f215b9b0 100644 --- a/app/src/main/resources/struts.xml +++ b/app/src/main/resources/struts.xml @@ -17,8 +17,8 @@ directory of this distribution. --> + "-//Apache Software Foundation//DTD Struts Configuration 6.5//EN" + "https://struts.apache.org/dtds/struts-6.5.dtd"> From 6621c85ea45ebc8d1d47c1c2a84af1b93ac7f660 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 10:19:00 -0600 Subject: [PATCH 09/22] Rename fileUpload interceptor to actionFileUpload for Struts 7 Struts 7 renamed the fileUpload interceptor to actionFileUpload. This causes a startup failure when Struts initializes the interceptor stack. --- app/src/main/resources/struts.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/resources/struts.xml b/app/src/main/resources/struts.xml index 7f215b9b0..94aa78a4c 100644 --- a/app/src/main/resources/struts.xml +++ b/app/src/main/resources/struts.xml @@ -54,7 +54,7 @@ - + From 2738254474d1b13a0a0d5efd3ce4054cd77e6e45 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 16:35:17 -0600 Subject: [PATCH 10/22] Fix Struts 7 parameter binding, OGNL allowlist, and static content path Struts 7 only binds request parameters to @StrutsParameter-annotated properties and denies OGNL access to classes outside its allowlist, which silently broke every form in the application. Also re-enables the prepare interceptor before params so Preparable actions load the object that submitted values are bound onto, and converts PlanetGroupSubs to the standard Preparable contract. --- .../weblogger/planet/ui/PlanetGroupSubs.java | 10 ++++++++-- app/src/main/resources/struts.xml | 20 ++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java index b71961ad2..4fd89118b 100644 --- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java +++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java @@ -29,6 +29,7 @@ import org.apache.roller.weblogger.business.WebloggerFactory; import org.apache.roller.weblogger.pojos.GlobalPermission; import org.apache.struts2.ActionContext; +import org.apache.struts2.Preparable; import jakarta.servlet.http.HttpServletRequest; import java.util.*; @@ -38,7 +39,7 @@ * Manage planet group subscriptions, default group is "all". */ // TODO: make this work @AllowedMethods({"execute","saveSubscription","saveGroup","deleteSubscription"}) -public class PlanetGroupSubs extends PlanetUIAction { +public class PlanetGroupSubs extends PlanetUIAction implements Preparable { private static final Log log = LogFactory.getLog(PlanetGroupSubs.class); @@ -67,8 +68,13 @@ public boolean isWeblogRequired() { } + /** + * Loads the group being edited. This runs before the params interceptor so + * that submitted values are bound onto the loaded group rather than being + * overwritten by it. + */ @Override - public void myPrepare() { + public void prepare() { HttpServletRequest request = ActionContext.getContext().getServletRequest(); if (request.getParameter("createNew") != null) { group = new PlanetGroup(); diff --git a/app/src/main/resources/struts.xml b/app/src/main/resources/struts.xml index 94aa78a4c..c30a78aab 100644 --- a/app/src/main/resources/struts.xml +++ b/app/src/main/resources/struts.xml @@ -21,6 +21,22 @@ "https://struts.apache.org/dtds/struts-6.5.dtd"> + + + + + + + + + @@ -47,7 +63,9 @@ - + + From 191ff819fc60942eca485f3de3c356dce54f6441 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 16:35:26 -0600 Subject: [PATCH 11/22] Fix mvn jetty:run for the Jetty 12 plugin The plugin renamed jettyXml to jettyXmls and silently ignored the old parameter, so jetty.xml was never loaded. That file also needed updating for Jetty 12: a DOCTYPE is now required, plus.jndi.Resource takes the server ref as scope instead of a string, and MailSessionReference no longer exists so the mail session is built from angus-mail directly. The Derby datasource moves from commons-dbcp 1.4 to commons-dbcp2, and roller-jettyrun.properties uses installation.type=ittest so the schema is created at startup and jetty:run comes up ready to log in. --- app/pom.xml | 16 ++++++++++++---- app/src/test/resources/jetty.xml | 18 ++++++++++-------- .../test/resources/roller-jettyrun.properties | 13 ++++++++++++- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/app/pom.xml b/app/pom.xml index c23028f84..7dcdfdf2b 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -310,6 +310,12 @@ limitations under the License. ${lucene.version} + + org.slf4j + slf4j-api + ${slf4j.version} + + @@ -594,7 +600,9 @@ limitations under the License. /roller - src/test/resources/jetty.xml + + src/test/resources/jetty.xml + ${project.build.directory}/test-classes/roller-jettyrun.properties @@ -608,9 +616,9 @@ limitations under the License. 6.1.5 - commons-dbcp - commons-dbcp - 1.4 + org.apache.commons + commons-dbcp2 + 2.13.0 org.apache.derby diff --git a/app/src/test/resources/jetty.xml b/app/src/test/resources/jetty.xml index 24d1424e2..42894d4c1 100644 --- a/app/src/test/resources/jetty.xml +++ b/app/src/test/resources/jetty.xml @@ -1,4 +1,5 @@ + - + jdbc/rollerdb - + org.apache.derby.jdbc.ClientDriver jdbc:derby://localhost:4224/memory:rollerdb;create=true app @@ -34,17 +36,17 @@ - + mail/Session - - + + + mail - true - - + + diff --git a/app/src/test/resources/roller-jettyrun.properties b/app/src/test/resources/roller-jettyrun.properties index b4a15f602..4a480a97f 100644 --- a/app/src/test/resources/roller-jettyrun.properties +++ b/app/src/test/resources/roller-jettyrun.properties @@ -1,6 +1,7 @@ # used during mvn jetty:run, not Roller testing (mvn test) -installation.type=auto +# creates the schema during startup so jetty:run comes up ready to use +installation.type=ittest planet.aggregator.enabled=true database.configurationType=jdbc @@ -49,3 +50,13 @@ cache.sitewide.enabled=false cache.weblogpage.enabled=false cache.weblogfeed.enabled=false cache.planet.enabled=false + +# Authentication defaults to Roller's own user database, which needs no extra +# services. To develop against OIDC instead, start Keycloak with +# "docker compose up -d keycloak", add "127.0.0.1 keycloak" to your hosts file +# so the issuer resolves the same here and in the browser, then uncomment: +#authentication.method=oidc +#oidc.keycloak.client-id=web_app +#oidc.keycloak.client-secret=web_app +#oidc.keycloak.issuer-uri=http://keycloak:9080/realms/roller +#oidc.keycloak.client-name=Keycloak From 7867dc129da67b85aea8893de88625738bef7532 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 17:08:58 -0600 Subject: [PATCH 12/22] Permit unmatched requests explicitly under Spring Security 7 The XML namespace now authorizes through AuthorizationManager, which denies any request that matches no intercept-url rule, where the old FilterSecurityInterceptor allowed them. Every unlisted URL including the login page itself redirected to the login page in an infinite loop. --- app/src/main/webapp/WEB-INF/security.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/webapp/WEB-INF/security.xml b/app/src/main/webapp/WEB-INF/security.xml index 7825c085a..68a6644b2 100644 --- a/app/src/main/webapp/WEB-INF/security.xml +++ b/app/src/main/webapp/WEB-INF/security.xml @@ -36,6 +36,9 @@ + + Date: Tue, 11 Aug 2026 17:08:58 -0600 Subject: [PATCH 13/22] Serve WebJar assets from META-INF/resources instead of the webjars servlet webjars-servlet-2.x extends the javax HttpServlet, so loading it on a Jakarta container throws NoClassDefFoundError at startup and takes the whole context down with a 503. Servlet 3.0+ containers serve jar META-INF/resources content from the docroot at the same /webjars paths, so the servlet is unnecessary. --- app/src/main/webapp/WEB-INF/web.xml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/app/src/main/webapp/WEB-INF/web.xml b/app/src/main/webapp/WEB-INF/web.xml index 2f6cd3c75..275cb2722 100644 --- a/app/src/main/webapp/WEB-INF/web.xml +++ b/app/src/main/webapp/WEB-INF/web.xml @@ -302,12 +302,6 @@ - - WebjarsServlet - org.webjars.servlet.WebjarsServlet - 2 - - PageServlet @@ -408,11 +402,6 @@ /roller-services/opensearch/* - - WebjarsServlet - /webjars/* - - 30 From b9dff984385a3e0e59e4cd9cf1d4523715095c79 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 17:09:31 -0600 Subject: [PATCH 14/22] Restore the bootstrap form theme via the Jakarta struts2-bootstrap-plugin The plugin was removed earlier in the migration as an unused taglib, but it also supplies the FreeMarker templates behind the theme="bootstrap" attribute that nearly every form JSP uses, so any page with a form failed to render with TemplateNotFoundException. Version 6.1.0 is Jakarta-native. It emits Bootstrap 5 markup while the JSPs still ship Bootstrap 3 CSS, so some form styling is off until the UI is converted to Bootstrap 5 in a follow-up. This also drops the webjars-servlet-2.x dependency whose servlet was removed from web.xml. --- app/pom.xml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/pom.xml b/app/pom.xml index 7dcdfdf2b..59d9cc8b6 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -57,6 +57,7 @@ limitations under the License. 7.0.8 7.0.6 7.1.1 + 6.1.0 2.4.1 1.0.2 3.1.3 @@ -246,13 +247,16 @@ limitations under the License. - + - org.webjars - webjars-servlet-2.x - 1.6 + com.jgeppert.struts2.bootstrap + struts2-bootstrap-plugin + ${struts-bootstrap.version} + org.webjars bootstrap From d12aa22179e136ba6dda54cc6992d6364afdcd2e Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 11 Aug 2026 17:09:31 -0600 Subject: [PATCH 15/22] Fix the it-selenium jetty harness for the Jetty 12 plugin The plugin renamed jettyXml to jettyXmls and silently ignored the old parameter, so jetty.xml never loaded, the JNDI datasource was never bound, the Derby network server never started, and every test met a 503. The datasource in that file now uses commons-dbcp2, so the plugin classpath follows. The publish button is now located by its btn-success class because its generated id changed between form-theme versions. --- .../logs/roller-2026-08-11-165858.log.gz | Bin 0 -> 4784 bytes .../logs/roller-2026-08-11-165926.log.gz | Bin 0 -> 4718 bytes .../logs/roller-2026-08-11-170101.log.gz | Bin 0 -> 4694 bytes .../logs/roller-2026-08-11-170125.log.gz | Bin 0 -> 4702 bytes .../logs/roller-2026-08-11-170214.log.gz | Bin 0 -> 4719 bytes .../logs/roller-2026-08-11-170353.log.gz | Bin 0 -> 9616 bytes .../logs/roller-2026-08-11-170505.log.gz | Bin 0 -> 19730 bytes .../logs/roller-2026-08-11-170652.log.gz | Bin 0 -> 4815 bytes it-selenium/logs/roller.log | 199 ++++++++++++++++++ it-selenium/pom.xml | 10 +- .../selenium/editor/AbstractEntryPage.java | 5 +- 11 files changed, 209 insertions(+), 5 deletions(-) create mode 100644 it-selenium/logs/roller-2026-08-11-165858.log.gz create mode 100644 it-selenium/logs/roller-2026-08-11-165926.log.gz create mode 100644 it-selenium/logs/roller-2026-08-11-170101.log.gz create mode 100644 it-selenium/logs/roller-2026-08-11-170125.log.gz create mode 100644 it-selenium/logs/roller-2026-08-11-170214.log.gz create mode 100644 it-selenium/logs/roller-2026-08-11-170353.log.gz create mode 100644 it-selenium/logs/roller-2026-08-11-170505.log.gz create mode 100644 it-selenium/logs/roller-2026-08-11-170652.log.gz create mode 100644 it-selenium/logs/roller.log diff --git a/it-selenium/logs/roller-2026-08-11-165858.log.gz b/it-selenium/logs/roller-2026-08-11-165858.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..e2821388dc09d14496cf81d720de2a9fab513bdb GIT binary patch literal 4784 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 K>7OS7ZvX%x4K!K+ literal 0 HcmV?d00001 diff --git a/it-selenium/logs/roller-2026-08-11-165926.log.gz b/it-selenium/logs/roller-2026-08-11-165926.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..e1bcf851e98b65e653a9f5a7895b18c3fb06d99a GIT binary patch literal 4718 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 literal 0 HcmV?d00001 diff --git a/it-selenium/logs/roller-2026-08-11-170101.log.gz b/it-selenium/logs/roller-2026-08-11-170101.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..91e92b1574cdbc672c4c20f5095fe15f97d0a121 GIT binary patch literal 4694 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 Yf5)9q8iECYN3AdZ7q(vj9b|3*0Qw^~1^@s6 literal 0 HcmV?d00001 diff --git a/it-selenium/logs/roller-2026-08-11-170125.log.gz b/it-selenium/logs/roller-2026-08-11-170125.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..327e1cd272a72394ff17bd5c48fef713ebf6500b GIT binary patch literal 4702 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 literal 0 HcmV?d00001 diff --git a/it-selenium/logs/roller-2026-08-11-170214.log.gz b/it-selenium/logs/roller-2026-08-11-170214.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..f178c876b773760c078515da0bd84fd169210cf0 GIT binary patch literal 4719 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 xXakpikA);Ih;n*{GymU$-^>>F=p|P=&jX7F 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 literal 0 HcmV?d00001 diff --git a/it-selenium/logs/roller-2026-08-11-170505.log.gz b/it-selenium/logs/roller-2026-08-11-170505.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..26375c9a626dc36462d5f3913d3da42ca3053929 GIT binary patch literal 19730 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

nOM4-Na1fj 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 literal 0 HcmV?d00001 diff --git a/it-selenium/logs/roller-2026-08-11-170652.log.gz b/it-selenium/logs/roller-2026-08-11-170652.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b39b59503f12443d1d74de561f741f9c050da71 GIT binary patch literal 4815 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 literal 0 HcmV?d00001 diff --git a/it-selenium/logs/roller.log b/it-selenium/logs/roller.log new file mode 100644 index 000000000..e76ced355 --- /dev/null +++ b/it-selenium/logs/roller.log @@ -0,0 +1,199 @@ +INFO 2026-08-11 17:08:26 [main] ContextLoader - Root WebApplicationContext: initialization started +INFO 2026-08-11 17:08:27 [main] SpringSecurityCoreVersion - You are running with Spring Security Core 7.0.6 +INFO 2026-08-11 17:08:27 [main] HttpSecurityBeanDefinitionParser - Checking sorted filter chain: [Root bean: class=org.springframework.security.web.session.DisableEncodeUrlFilter; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null, order = 100, Root bean: class=org.springframework.security.web.context.SecurityContextHolderFilter; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null, order = 500, Root bean: class=org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null, order = 700, Root bean: class=org.springframework.security.web.header.HeaderWriterFilter; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null, order = 800, , order = 2200, Root bean: class=org.springframework.security.web.savedrequest.RequestCacheAwareFilter; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null, order = 2900, Root bean: class=null; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=org.springframework.security.config.http.HttpConfigurationBuilder$SecurityContextHolderAwareRequestFilterBeanFactory#0; factoryMethodName=getBean; initMethodNames=null; destroyMethodNames=null, order = 3000, Root bean: class=org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null, order = 3200, Root bean: class=org.springframework.security.web.authentication.AnonymousAuthenticationFilter; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null, order = 3300, Root bean: class=org.springframework.security.web.access.ExceptionTranslationFilter; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null, order = 3700, , order = 3800] +INFO 2026-08-11 17:08:27 [main] DefaultFilterChainValidator - Checking whether login URL '/roller-ui/login.rol' is accessible with your configuration +INFO 2026-08-11 17:08:27 [main] ContextLoader - Root WebApplicationContext initialized in 215 ms +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - SUCCESS: Got parameters. Using configuration type JDBC_PROPERTIES +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - -- Using JDBC driver class: org.apache.derby.jdbc.ClientDriver +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - -- Using JDBC connection URL: jdbc:derby://localhost:4224/memory:rollerdb;create=true +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - -- Using JDBC username: app +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - -- Using JDBC password: [hidden] +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - SUCCESS: loaded JDBC driver class [org.apache.derby.jdbc.ClientDriver] +WARN 2026-08-11 17:08:27 [main] WebloggerStartup - Failed to setup mail provider, continuing anyways. +Reason: ERROR connecting to mail server +INFO 2026-08-11 17:08:27 [main] WebloggerStartup - The cause of setting up mail provider error was: +org.apache.roller.weblogger.business.startup.StartupException: ERROR connecting to mail server + at org.apache.roller.weblogger.business.MailProvider.(MailProvider.java:99) ~[classes/:?] + at org.apache.roller.weblogger.business.startup.WebloggerStartup.prepare(WebloggerStartup.java:177) ~[classes/:?] + at org.apache.roller.weblogger.ui.core.RollerContext.contextInitialized(RollerContext.java:154) ~[classes/:?] + at org.eclipse.jetty.ee10.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:1591) ~[jetty-ee10-servlet-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.servlet.ServletContextHandler.contextInitialized(ServletContextHandler.java:500) ~[jetty-ee10-servlet-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.servlet.ServletHandler.initialize(ServletHandler.java:676) ~[jetty-ee10-servlet-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.servlet.ServletContextHandler.startContext(ServletContextHandler.java:1325) ~[jetty-ee10-servlet-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.webapp.WebAppContext.startWebapp(WebAppContext.java:1350) ~[jetty-ee10-webapp-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.webapp.WebAppContext.startContext(WebAppContext.java:1308) ~[jetty-ee10-webapp-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.servlet.ServletContextHandler.lambda$doStart$0(ServletContextHandler.java:1051) ~[jetty-ee10-servlet-12.0.21.jar:12.0.21] + at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.call(ContextHandler.java:1463) [jetty-server-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.servlet.ServletContextHandler.doStart(ServletContextHandler.java:1048) [jetty-ee10-servlet-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.webapp.WebAppContext.doStart(WebAppContext.java:504) [jetty-ee10-webapp-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.maven.plugin.MavenWebAppContext.doStart(MavenWebAppContext.java:312) [jetty-ee10-maven-plugin-12.0.21.jar:12.0.21] + at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93) [jetty-util-12.0.21.jar:12.0.21] + at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169) [jetty-util-12.0.21.jar:12.0.21] + at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:120) [jetty-util-12.0.21.jar:12.0.21] + at org.eclipse.jetty.server.Handler$Abstract.doStart(Handler.java:491) [jetty-server-12.0.21.jar:12.0.21] + at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93) [jetty-util-12.0.21.jar:12.0.21] + at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169) [jetty-util-12.0.21.jar:12.0.21] + at org.eclipse.jetty.server.Server.start(Server.java:643) [jetty-server-12.0.21.jar:12.0.21] + at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:120) [jetty-util-12.0.21.jar:12.0.21] + at org.eclipse.jetty.server.Handler$Abstract.doStart(Handler.java:491) [jetty-server-12.0.21.jar:12.0.21] + at org.eclipse.jetty.server.Server.doStart(Server.java:584) [jetty-server-12.0.21.jar:12.0.21] + at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93) [jetty-util-12.0.21.jar:12.0.21] + at org.eclipse.jetty.maven.AbstractJettyEmbedder.doStart(AbstractJettyEmbedder.java:206) [jetty-maven-12.0.21.jar:12.0.21] + at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93) [jetty-util-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.maven.plugin.JettyStartMojo.startJettyEmbedded(JettyStartMojo.java:53) [jetty-ee10-maven-plugin-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.maven.plugin.AbstractWebAppMojo.startJetty(AbstractWebAppMojo.java:451) [jetty-ee10-maven-plugin-12.0.21.jar:12.0.21] + at org.eclipse.jetty.ee10.maven.plugin.AbstractWebAppMojo.execute(AbstractWebAppMojo.java:429) [jetty-ee10-maven-plugin-12.0.21.jar:12.0.21] + at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:126) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2(MojoExecutor.java:328) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute(MojoExecutor.java:316) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:174) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.MojoExecutor.access$000(MojoExecutor.java:75) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.MojoExecutor$1.run(MojoExecutor.java:162) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute(DefaultMojosExecutionStrategy.java:39) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:159) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:105) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:73) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:53) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:118) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:261) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:173) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:101) [maven-core-3.9.8.jar:3.9.8] + at org.apache.maven.cli.MavenCli.execute(MavenCli.java:903) [maven-embedder-3.9.8.jar:3.9.8] + at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:280) [maven-embedder-3.9.8.jar:3.9.8] + at org.apache.maven.cli.MavenCli.main(MavenCli.java:203) [maven-embedder-3.9.8.jar:3.9.8] + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?] + at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?] + at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:255) [plexus-classworlds-2.8.0.jar:?] + at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:201) [plexus-classworlds-2.8.0.jar:?] + at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:361) [plexus-classworlds-2.8.0.jar:?] + at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:314) [plexus-classworlds-2.8.0.jar:?] +INFO 2026-08-11 17:08:27 [main] DatabaseInstaller - Creating Roller Weblogger database tables. +INFO 2026-08-11 17:08:27 [main] WebloggerFactory - Bootstrapping Roller Weblogger business tier +INFO 2026-08-11 17:08:27 [main] WebloggerFactory - Weblogger Provider = org.apache.roller.weblogger.business.GuiceWebloggerProvider +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - SUCCESS: Got parameters. Using configuration type JDBC_PROPERTIES +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - -- Using JDBC driver class: org.apache.derby.jdbc.ClientDriver +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - -- Using JDBC connection URL: jdbc:derby://localhost:4224/memory:rollerdb;create=true +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - -- Using JDBC username: app +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - -- Using JDBC password: [hidden] +INFO 2026-08-11 17:08:27 [main] DatabaseProvider - SUCCESS: loaded JDBC driver class [org.apache.derby.jdbc.ClientDriver] +INFO 2026-08-11 17:08:27 [main] JPAPersistenceStrategy - hibernate.transaction.factory_class: org.hibernate.transaction.JDBCTransactionFactory +INFO 2026-08-11 17:08:27 [main] JPAPersistenceStrategy - eclipselink.logging.logger: org.eclipse.persistence.logging.slf4j.SLF4JLogger +INFO 2026-08-11 17:08:27 [main] JPAPersistenceStrategy - hibernate.dialect: org.hibernate.dialect.DerbyDialect +INFO 2026-08-11 17:08:27 [main] JPAPersistenceStrategy - eclipselink.persistence-context.flush-mode: auto +INFO 2026-08-11 17:08:27 [main] JPAPersistenceStrategy - hibernate.transaction.manager_lookup_class: org.hibernate.transaction.JBossTransactionManagerLookup +INFO 2026-08-11 17:08:28 [main] LuceneIndexManager - search enabled: true +INFO 2026-08-11 17:08:28 [main] LuceneIndexManager - index dir: target/work/search-index +INFO 2026-08-11 17:08:28 [main] PluginManagerImpl - Configured comment plugins +INFO 2026-08-11 17:08:28 [main] PluginManagerImpl - [class org.apache.roller.weblogger.business.plugins.comment.LinkMarkupPlugin,class org.apache.roller.weblogger.business.plugins.comment.AutoformatPlugin,class org.apache.roller.weblogger.business.plugins.comment.HTMLSubsetPlugin] +INFO 2026-08-11 17:08:28 [main] ThreadManagerImpl - Instantiating Thread Manager +INFO 2026-08-11 17:08:28 [main] WebloggerFactory - Roller Weblogger business tier successfully bootstrapped +INFO 2026-08-11 17:08:28 [main] WebloggerFactory - Version: 6.1.5 +INFO 2026-08-11 17:08:28 [main] WebloggerFactory - Revision: r191ff819fc60942eca485f3de3c356dce54f6441 +INFO 2026-08-11 17:08:28 [main] WebloggerImpl - Initializing Roller Weblogger business tier +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.name not yet in roller_properties database table, will store with default value of [Roller Site`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.shortName not yet in roller_properties database table, will store with default value of [Front Page`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.description not yet in roller_properties database table, will store with default value of [A default install of the Roller Weblogger open source blog server`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.frontpage.weblog.handle not yet in roller_properties database table, will store with default value of [`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.frontpage.weblog.aggregated not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.adminemail not yet in roller_properties database table, will store with default value of [`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.absoluteurl not yet in roller_properties database table, will store with default value of [`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property pings.suspendPingProcessing not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.registration.enabled not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property user.account.email.activation not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.registration.url not yet in roller_properties database table, will store with default value of [`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.allowUserWeblogCreation not yet in roller_properties database table, will store with default value of [true`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.editor.pages not yet in roller_properties database table, will store with default value of [editor-text.jsp,editor-summernote.jsp`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property webservices.enableXmlRpc not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property webservices.enableAtomPub not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property webservices.atomPubAuth not yet in roller_properties database table, will store with default value of [basic`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.pages.maxEntries not yet in roller_properties database table, will store with default value of [30`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.newsfeeds.defaultEntries not yet in roller_properties database table, will store with default value of [30`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.newsfeeds.styledFeeds not yet in roller_properties database table, will store with default value of [true`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.comments.enabled not yet in roller_properties database table, will store with default value of [true`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property comments.ignoreSpam.enabled not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.trackbacks.enabled not yet in roller_properties database table, will store with default value of [true`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property trackbacks.ignoreSpam.enabled not yet in roller_properties database table, will store with default value of [true`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.comments.htmlenabled not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.comments.plugins not yet in roller_properties database table, will store with default value of [HTMLSubset`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.comments.emailnotify not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.moderation.required not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property site.trackbackVerification.enabled not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property uploads.enabled not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property uploads.types.allowed not yet in roller_properties database table, will store with default value of [`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property uploads.types.forbid not yet in roller_properties database table, will store with default value of [exe`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property uploads.file.maxsize not yet in roller_properties database table, will store with default value of [2.00`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property uploads.dir.maxsize not yet in roller_properties database table, will store with default value of [20.00`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property users.themes.path not yet in roller_properties database table, will store with default value of [/themes`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property themes.customtheme.allowed not yet in roller_properties database table, will store with default value of [false`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property spam.bannedwordslist not yet in roller_properties database table, will store with default value of [`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property analytics.default.tracking.code not yet in roller_properties database table, will store with default value of [`] +INFO 2026-08-11 17:08:28 [main] JPAPropertiesManagerImpl - Property analytics.code.override.allowed not yet in roller_properties database table, will store with default value of [true`] +INFO 2026-08-11 17:08:28 [main] ThemeManagerImpl - Loading themes from /Users/mraible/dev/roller-jakarta-check/it-selenium/target/war/work/org.apache.roller/roller-webapp/themes... +INFO 2026-08-11 17:08:28 [main] ThemeManagerImpl - Loaded theme 'basic' +INFO 2026-08-11 17:08:28 [main] ThemeManagerImpl - Loaded theme 'basicmobile' +INFO 2026-08-11 17:08:28 [main] ThemeManagerImpl - Loaded theme 'gaurav' +INFO 2026-08-11 17:08:28 [main] ThemeManagerImpl - Loaded theme 'fauxcoly' +INFO 2026-08-11 17:08:28 [main] ThemeManagerImpl - Loaded theme 'frontpage' +INFO 2026-08-11 17:08:28 [main] ThemeManagerImpl - Successfully loaded 5 themes from disk. +INFO 2026-08-11 17:08:28 [main] ThreadManagerImpl - Initializing task: ScheduledEntriesTask +INFO 2026-08-11 17:08:28 [main] ThreadManagerImpl - Initializing task: ResetHitCountsTask +INFO 2026-08-11 17:08:28 [main] ThreadManagerImpl - Initializing task: PingQueueTask +INFO 2026-08-11 17:08:28 [main] ThreadManagerImpl - Initializing task: TestTask +INFO 2026-08-11 17:08:28 [main] LuceneIndexManager - Index initialized and ready for use. +INFO 2026-08-11 17:08:28 [main] PingConfig - Creating common ping target 'Technorati' from configuration properties. +INFO 2026-08-11 17:08:28 [main] PingConfig - Creating common ping target 'Weblogs.com' from configuration properties. +INFO 2026-08-11 17:08:28 [main] PingConfig - Creating common ping target 'blo.gs' from configuration properties. +INFO 2026-08-11 17:08:28 [main] PingConfig - Creating common ping target 'IceRocket' from configuration properties. +INFO 2026-08-11 17:08:28 [main] WebloggerImpl - Roller Weblogger business tier successfully initialized +INFO 2026-08-11 17:08:28 [main] RollerContext - Remember Me enabled: false +WARN 2026-08-11 17:08:28 [main] RollerContext - New passwords are stored in plain text! +INFO 2026-08-11 17:08:28 [main] RollerContext - Password Encryption Algorithm set to 'noop' +INFO 2026-08-11 17:08:28 [main] RollerContext - Initializing Velocity +INFO 2026-08-11 17:08:28 [main] StrutsTilesListener - Starting Struts Tiles 3 integration ... +INFO 2026-08-11 17:08:28 [main] TilesAccess - Publishing TilesContext for context: org.apache.struts2.tiles.StrutsWildcardServletApplicationContext +INFO 2026-08-11 17:08:28 [main] StrutsSpringObjectFactory - Initializing Struts-Spring integration... +INFO 2026-08-11 17:08:28 [main] SpringObjectFactory - Setting autowire strategy to name +INFO 2026-08-11 17:08:28 [main] StrutsSpringObjectFactory - ... initialized Struts-Spring integration successfully +WARN 2026-08-11 17:08:28 [main] ParametersInterceptor - @StrutsParameter annotation requirement is disabled! We strongly recommend keeping it enabled to protect against critical vulnerabilities. Set the configuration `struts.parameters.requireAnnotations=true` to enable it. Please refer to the Struts 7.0 migration guide and security documentation for further information. +WARN 2026-08-11 17:08:28 [main] DefaultExcludedPatternsChecker - Replacing excluded patterns [[actionErrors|actionMessages|fieldErrors, .*(^|\.|\[|\'|"|get)class(\(\.|\[|\'|").*, (^|\%\{)(#?top\.)[^\s]*, (^|\%\{)((#?)(\[\d\]\.)?)(dojo|struts|session|request|response|application|servlet(Request|Response|Context)|parameters|context|_memberAccess)(\.|\[).*]] with [[^method:.*, ^action:.*]], be aware that this affects all instances and safety of your application! +WARN 2026-08-11 17:08:28 [main] PackageBasedActionConfigBuilder - The includeJars pattern [false] did not match any jars in the classpath +INFO 2026-08-11 17:08:28 [main] RequestMappingFilter - Request mapping filter initialized, 1 mappers configured. +INFO 2026-08-11 17:08:28 [main] RequestMappingFilter - [class org.apache.roller.weblogger.ui.rendering.WeblogRequestMapper] +INFO 2026-08-11 17:08:28 [main] IPBanFilter - INIT IPBanFilter +INFO 2026-08-11 17:08:28 [main] FeedServlet - Initializing FeedServlet +INFO 2026-08-11 17:08:28 [main] WeblogFeedCache - {size=200, id=cache.weblogfeed, enabled=false, timeout=3600} +WARN 2026-08-11 17:08:28 [main] WeblogFeedCache - Caching has been DISABLED +INFO 2026-08-11 17:08:28 [main] SiteWideCache - {size=50, id=cache.sitewide, enabled=false, timeout=1800} +WARN 2026-08-11 17:08:28 [main] SiteWideCache - Caching has been DISABLED +INFO 2026-08-11 17:08:28 [main] MediaResourceServlet - Initializing ResourceServlet +INFO 2026-08-11 17:08:28 [main] PageServlet - Initializing PageServlet +INFO 2026-08-11 17:08:28 [main] WeblogPageCache - {size=400, id=cache.weblogpage, enabled=false, timeout=3600} +WARN 2026-08-11 17:08:28 [main] WeblogPageCache - Caching has been DISABLED +INFO 2026-08-11 17:08:28 [main] PageServlet - Referrer spam check enabled = false +INFO 2026-08-11 17:08:28 [main] ResourceServlet - Initializing ResourceServlet +INFO 2026-08-11 17:08:28 [main] SearchServlet - Initializing SearchServlet +INFO 2026-08-11 17:08:28 [main] CommentServlet - Initializing CommentServlet +INFO 2026-08-11 17:08:28 [main] CommentValidationManager - Configured 3 CommentValidators +INFO 2026-08-11 17:08:28 [main] CommentValidationManager - [class org.apache.roller.weblogger.ui.rendering.plugins.comments.BannedwordslistCommentValidator,class org.apache.roller.weblogger.ui.rendering.plugins.comments.ExcessLinksCommentValidator,class org.apache.roller.weblogger.ui.rendering.plugins.comments.ExcessSizeCommentValidator] +INFO 2026-08-11 17:08:28 [main] CommentServlet - Comment Throttling DISABLED +INFO 2026-08-11 17:08:28 [main] PlanetFeedServlet - Initializing PlanetRssServlet +INFO 2026-08-11 17:08:28 [main] PlanetCache - Planet cache = {size=10, id=cache.planet, enabled=false, timeout=1800} +WARN 2026-08-11 17:08:28 [main] PlanetCache - Caching has been DISABLED +INFO 2026-08-11 17:08:28 [main] RSDServlet - Initializing RSDServlet +INFO 2026-08-11 17:08:28 [main] CommentValidationManager - Configured 3 CommentValidators +INFO 2026-08-11 17:08:28 [main] CommentValidationManager - [class org.apache.roller.weblogger.ui.rendering.plugins.comments.BannedwordslistCommentValidator,class org.apache.roller.weblogger.ui.rendering.plugins.comments.ExcessLinksCommentValidator,class org.apache.roller.weblogger.ui.rendering.plugins.comments.ExcessSizeCommentValidator] +INFO 2026-08-11 17:08:28 [main] PreviewResourceServlet - Initializing PreviewResourceServlet +INFO 2026-08-11 17:08:28 [main] PreviewServlet - Initializing PreviewServlet +INFO 2026-08-11 17:08:31 [qtp501254005-77] SaltCache - {size=5000, id=cache.salt, timeout=3600, enabled=true} +INFO 2026-08-11 17:08:31 [qtp501254005-77] CacheManager - Cache Manager Initialized. +INFO 2026-08-11 17:08:31 [qtp501254005-77] CacheManager - Cache Factory = org.apache.roller.weblogger.util.cache.ExpiringLRUCacheFactoryImpl +INFO 2026-08-11 17:08:33 [HitCountQueueProcessor] ContinuousWorkerThread - HitCountQueueProcessor Started. +INFO 2026-08-11 17:08:33 [qtp501254005-123] RendererManager - Renderer Manager Initialized, 1 factories configured. +INFO 2026-08-11 17:08:33 [qtp501254005-123] RendererManager - [class org.apache.roller.weblogger.ui.rendering.velocity.VelocityRendererFactory] +INFO 2026-08-11 17:08:33 [qtp501254005-123] RollerVelocity - Initializing Velocity Rendering Engine +WARN 2026-08-11 17:08:33 [qtp501254005-123] UIPluginManagerImpl - Default editor was not properly configured, picking one at random instead. +INFO 2026-08-11 17:08:35 [ShutdownMonitor] TilesAccess - Removing TilesContext for context: org.apache.struts2.tiles.StrutsWildcardServletApplicationContext +INFO 2026-08-11 17:08:35 [ShutdownMonitor] HitCountQueue - stopping worker HitCountQueueProcessor +INFO 2026-08-11 17:08:35 [HitCountQueueProcessor] ContinuousWorkerThread - HitCountQueueProcessor INTERRUPT: sleep interrupted +INFO 2026-08-11 17:08:35 [HitCountQueueProcessor] ContinuousWorkerThread - HitCountQueueProcessor Done. diff --git a/it-selenium/pom.xml b/it-selenium/pom.xml index f81e0732f..f12f54145 100644 --- a/it-selenium/pom.xml +++ b/it-selenium/pom.xml @@ -143,7 +143,9 @@ /roller target/roller-selenium-tests-${project.version} - ${project.parent.basedir}/app/src/test/resources/jetty.xml + + ${project.parent.basedir}/app/src/test/resources/jetty.xml + src/test/resources/roller-jettyrun.properties @@ -177,9 +179,9 @@ 6.1.5 - commons-dbcp - commons-dbcp - 1.4 + org.apache.commons + commons-dbcp2 + 2.13.0 org.apache.derby diff --git a/it-selenium/src/test/java/org/apache/roller/selenium/editor/AbstractEntryPage.java b/it-selenium/src/test/java/org/apache/roller/selenium/editor/AbstractEntryPage.java index f043c9f47..9f87782d2 100644 --- a/it-selenium/src/test/java/org/apache/roller/selenium/editor/AbstractEntryPage.java +++ b/it-selenium/src/test/java/org/apache/roller/selenium/editor/AbstractEntryPage.java @@ -18,6 +18,7 @@ package org.apache.roller.selenium.editor; import org.apache.roller.selenium.AbstractRollerPage; +import org.openqa.selenium.By; /** * Base class for the new/edit entry pages @@ -37,7 +38,9 @@ public void setSummary(String value) { } public EntryEditPage postBlogEntry() { - clickById("entry_%{#mainAction}!publish"); + // the publish button is the only success-styled submit on the page; + // its generated id changed between form-theme versions + driver.findElement(By.cssSelector("input.btn-success[type='submit']")).click(); return new EntryEditPage(driver); } } From e62111edd0e1081a0d96b4bd4811a3e770657f23 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Wed, 12 Aug 2026 06:40:15 -0600 Subject: [PATCH 16/22] Deliver uploaded files via Struts 7's UploadedFilesAware interface Struts 7 removed the old file upload parameter injection (File[] plus FileName/ContentType setters), so MediaFileAdd, MediaFileEdit, and BookmarksImport never received uploaded files. Each action now implements UploadedFilesAware and reads the file, original name, and content type from the UploadedFile objects supplied by the actionFileUpload interceptor. The upload fields are no longer exposed as getter/setter pairs so the params interceptor cannot collide with the form field names. Reported by Greg Huber on dev@roller. --- .../ui/struts2/editor/BookmarksImport.java | 69 ++++++----------- .../ui/struts2/editor/MediaFileAdd.java | 67 ++++++----------- .../ui/struts2/editor/MediaFileEdit.java | 75 +++++-------------- 3 files changed, 63 insertions(+), 148 deletions(-) diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarksImport.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarksImport.java index 01aca355b..9ae5900a5 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarksImport.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarksImport.java @@ -24,6 +24,7 @@ import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.util.RollerConstants; @@ -31,31 +32,27 @@ import org.apache.roller.weblogger.business.WebloggerFactory; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; +import org.apache.struts2.action.UploadedFilesAware; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.dispatcher.multipart.UploadedFile; /** * Import opml file into bookmarks folder. */ // TODO: make this work @AllowedMethods({"execute","save"}) -public final class BookmarksImport extends UIAction { - +public final class BookmarksImport extends UIAction implements UploadedFilesAware { + private static Log log = LogFactory.getLog(BookmarksImport.class); - + // only write files out that are below this threshold private static final long WRITE_THRESHOLD_IN_MB = 4; private static final long WRITE_THRESHOLD = WRITE_THRESHOLD_IN_MB * 1024000; - // uploaded opml file - private File opmlFile = null; - - // content type of uploaded file - private String opmlFileContentType = null; - - // file name of uploaded file - private String opmlFileFileName = null; - - + // uploaded opml file, injected by the actionFileUpload interceptor + private UploadedFile opmlFile = null; + + public BookmarksImport() { this.actionName = "bookmarksImport"; this.desiredMenu = "editor"; @@ -70,20 +67,25 @@ public String execute() { return INPUT; } + @Override + public void withUploadedFiles(List uploadedFiles) { + this.opmlFile = uploadedFiles.isEmpty() ? null : uploadedFiles.get(0); + } + /** * Save imported bookmarks. */ public String save() { - + BookmarkManager bm = WebloggerFactory.getWeblogger().getBookmarkManager(); - + InputStream stream = null; - if(getOpmlFile() != null && getOpmlFile().exists()) { + if (opmlFile != null && opmlFile.getContent() instanceof File file && file.exists()) { try { //only write files out that are less than 4MB - if (getOpmlFile().length() < WRITE_THRESHOLD) { + if (file.length() < WRITE_THRESHOLD) { - stream = new FileInputStream(getOpmlFile()); + stream = new FileInputStream(file); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[RollerConstants.EIGHT_KB_IN_BYTES]; @@ -109,14 +111,14 @@ public String save() { addMessage("bookmarksImport.imported", folderName); // destroy the temporary file created - getOpmlFile().delete(); + opmlFile.delete(); return SUCCESS; } else { String data = "The file is greater than " + WRITE_THRESHOLD_IN_MB +" MB, and has not been written to stream." - +" File Size: " + getOpmlFile().length() + " bytes. " + +" File Size: " + file.length() + " bytes. " +" This is a limitation of this particular " +" web application"; addError("bookmarksImport.error", data); @@ -136,30 +138,5 @@ public String save() { } return INPUT; } - - - public File getOpmlFile() { - return opmlFile; - } - - public void setOpmlFile(File opmlFile) { - this.opmlFile = opmlFile; - } - - public String getOpmlFileContentType() { - return opmlFileContentType; - } - - public void setOpmlFileContentType(String opmlFileContentType) { - this.opmlFileContentType = opmlFileContentType; - } - - public String getOpmlFileFileName() { - return opmlFileFileName; - } - - public void setOpmlFileFileName(String opmlFileFileName) { - this.opmlFileFileName = opmlFileFileName; - } - + } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java index 881dad754..74cf7feba 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java @@ -36,6 +36,8 @@ import org.apache.roller.weblogger.util.RollerMessages; import org.apache.roller.weblogger.util.RollerMessages.RollerMessage; import org.apache.roller.weblogger.util.Utilities; +import org.apache.struts2.action.UploadedFilesAware; +import org.apache.struts2.dispatcher.multipart.UploadedFile; import org.apache.struts2.interceptor.validation.SkipValidation; /** @@ -43,20 +45,16 @@ */ @SuppressWarnings("serial") // TODO: make this work @AllowedMethods({"execute","save"}) -public class MediaFileAdd extends MediaFileBase { +public class MediaFileAdd extends MediaFileBase implements UploadedFilesAware { private static final Log log = LogFactory.getLog(MediaFileAdd.class); private MediaFileBean bean = new MediaFileBean(); private MediaFileDirectory directory; - // an array of files uploaded by the user, if applicable - private File[] uploadedFiles = null; - - // an array of content types for upload files - private String[] uploadedFilesContentType = null; - - // an array of filenames for uploaded files - private String[] uploadedFilesFileName = null; + // files uploaded by the user, injected by the actionFileUpload interceptor; + // deliberately not exposed via a getter/setter pair so the params + // interceptor can't collide with the form field of the same name + private List uploadedFiles = null; private List newImages = new ArrayList<>(); @@ -112,7 +110,7 @@ public void myPrepare() { /** * Show form for adding a new media file. - * + * * @return String The result of the action. */ @SkipValidation @@ -121,6 +119,11 @@ public String execute() { return INPUT; } + @Override + public void withUploadedFiles(List uploadedFiles) { + this.uploadedFiles = uploadedFiles; + } + /** * Save a media file. * @@ -136,15 +139,16 @@ public String save() { RollerMessages errors = new RollerMessages(); List uploaded = new ArrayList<>(); - File[] uploads = getUploadedFiles(); - if (uploads != null && uploads.length > 0) { + if (uploadedFiles != null && !uploadedFiles.isEmpty()) { // loop over uploaded files and try saving them - for (int i = 0; i < uploads.length; i++) { + for (UploadedFile upload : uploadedFiles) { // skip null files - if (uploads[i] == null || !uploads[i].exists()) { + if (upload == null + || !(upload.getContent() instanceof File uploadFile) + || !uploadFile.exists()) { continue; } @@ -152,7 +156,7 @@ public String save() { MediaFile mediaFile = new MediaFile(); bean.copyTo(mediaFile); - String fileName = getUploadedFilesFileName()[i]; + String fileName = upload.getOriginalName(); int terminated = fileName.indexOf('\000'); if (terminated != -1) { // disallow sneaky null terminated strings @@ -170,18 +174,15 @@ public String save() { mediaFile.setName(fileName); mediaFile.setDirectory(getDirectory()); mediaFile.setWeblog(getActionWeblog()); - mediaFile.setLength(this.uploadedFiles[i].length()); - mediaFile.setInputStream(new FileInputStream( - this.uploadedFiles[i])); - mediaFile - .setContentType(this.uploadedFilesContentType[i]); + mediaFile.setLength(uploadFile.length()); + mediaFile.setInputStream(new FileInputStream(uploadFile)); // in some cases Struts2 is not able to guess the content // type correctly and assigns the default, which is // octet-stream. So in cases where we see octet-stream // we double check and see if we can guess the content // type via the Java MIME type facilities. - mediaFile.setContentType(this.uploadedFilesContentType[i]); + mediaFile.setContentType(upload.getContentType()); if (mediaFile.getContentType() == null || mediaFile.getContentType().endsWith("/octet-stream")) { @@ -262,30 +263,6 @@ public void setDirectory(MediaFileDirectory directory) { this.directory = directory; } - public File[] getUploadedFiles() { - return uploadedFiles; - } - - public void setUploadedFiles(File[] uploadedFiles) { - this.uploadedFiles = uploadedFiles; - } - - public String[] getUploadedFilesContentType() { - return uploadedFilesContentType; - } - - public void setUploadedFilesContentType(String[] uploadedFilesContentType) { - this.uploadedFilesContentType = uploadedFilesContentType; - } - - public String[] getUploadedFilesFileName() { - return uploadedFilesFileName; - } - - public void setUploadedFilesFileName(String[] uploadedFilesFileName) { - this.uploadedFilesFileName = uploadedFilesFileName; - } - /** * @return the newImages */ diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java index 76ff2dbb7..37c876e7f 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java @@ -29,28 +29,27 @@ import org.apache.roller.weblogger.business.WebloggerFactory; import org.apache.roller.weblogger.pojos.MediaFile; import org.apache.roller.weblogger.pojos.MediaFileDirectory; +import org.apache.struts2.action.UploadedFilesAware; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.dispatcher.multipart.UploadedFile; import org.apache.struts2.interceptor.validation.SkipValidation; +import java.util.List; + /** * Edits metadata for a media file. */ @SuppressWarnings("serial") // TODO: make this work @AllowedMethods({"execute","save"}) -public class MediaFileEdit extends MediaFileBase { +public class MediaFileEdit extends MediaFileBase implements UploadedFilesAware { private static Log log = LogFactory.getLog(MediaFileEdit.class); private MediaFileBean bean = new MediaFileBean(); private MediaFileDirectory directory; - // file uploaded by the user, if applicable - private File uploadedFile = null; - - // content types for upload file - private String uploadedFileContentType = null; - - // filename for uploaded file - private String uploadedFileName = null; + // replacement file uploaded by the user, if applicable, injected + // by the actionFileUpload interceptor + private UploadedFile uploadedFile = null; public MediaFileEdit() { this.actionName = "mediaFileEdit"; @@ -75,6 +74,11 @@ public void myPrepare() { } + @Override + public void withUploadedFiles(List uploadedFiles) { + this.uploadedFile = uploadedFiles.isEmpty() ? null : uploadedFiles.get(0); + } + /** * Validates media file metadata to be updated. */ @@ -122,11 +126,12 @@ public String save() { MediaFile mediaFile = manager.getMediaFile(getMediaFileId()); bean.copyTo(mediaFile); - if (uploadedFile != null) { - mediaFile.setLength(this.uploadedFile.length()); - mediaFile.setContentType(this.uploadedFileContentType); + if (uploadedFile != null + && uploadedFile.getContent() instanceof File uploadFile) { + mediaFile.setLength(uploadFile.length()); + mediaFile.setContentType(uploadedFile.getContentType()); manager.updateMediaFile(getActionWeblog(), mediaFile, - new FileInputStream(this.uploadedFile)); + new FileInputStream(uploadFile)); } else { manager.updateMediaFile(getActionWeblog(), mediaFile); } @@ -173,48 +178,4 @@ public void setDirectory(MediaFileDirectory directory) { this.directory = directory; } - /** - * @return the uploadedFile - */ - public File getUploadedFile() { - return uploadedFile; - } - - /** - * @param uploadedFile - * the uploadedFile to set - */ - public void setUploadedFile(File uploadedFile) { - this.uploadedFile = uploadedFile; - } - - /** - * @return the uploadedFileContentType - */ - public String getUploadedFileContentType() { - return uploadedFileContentType; - } - - /** - * @param uploadedFileContentType - * the uploadedFileContentType to set - */ - public void setUploadedFileContentType(String uploadedFileContentType) { - this.uploadedFileContentType = uploadedFileContentType; - } - - /** - * @return the uploadedFileName - */ - public String getUploadedFileName() { - return uploadedFileName; - } - - /** - * @param uploadedFileName - * the uploadedFileName to set - */ - public void setUploadedFileName(String uploadedFileName) { - this.uploadedFileName = uploadedFileName; - } } From 47a8cdd6bc6cc3cbed7df972fad4b4c4664e0c86 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Wed, 12 Aug 2026 07:48:56 -0600 Subject: [PATCH 17/22] Test against JDK 25 and upgrade Mockito so it can mock there The CI matrix moves from JDK 23 to JDK 25, the current LTS. Mockito 5.15.2 cannot instrument JDK 25 class files, which fails 19 session and filter tests, so it moves to 5.23.0. All 157 unit tests pass on 17, 21, and 25. --- .github/workflows/main.yml | 2 +- app/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a3f00c251..ade84a728 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - java: [ '17', '21', '23' ] + java: [ '17', '21', '25' ] steps: - name: Set up JDK ${{ matrix.java }} diff --git a/app/pom.xml b/app/pom.xml index 59d9cc8b6..24d170ec4 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -569,7 +569,7 @@ limitations under the License. org.mockito mockito-core - 5.15.2 + 5.23.0 test From dd2b2839768421bcce9d47440983865e314aea8a Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Wed, 12 Aug 2026 09:43:22 -0600 Subject: [PATCH 18/22] Fix AtomPub basic authentication checking the wrong user's password authenticateBASIC verified the supplied password against the handler's user field, which is only assigned after authentication returns, so the check always threw NullPointerException, was swallowed by the catch block, and every basic-auth request got a 401. The check now uses the account it just looked up. This bug exists on master too; the new web services smoke test in this stack caught it. --- .../weblogger/webservices/atomprotocol/RollerAtomHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java index 0fd472898..4cc333db6 100644 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java @@ -471,7 +471,7 @@ public String authenticateBASIC(HttpServletRequest request) { User inUser = roller.getUserManager().getUserByUserName(userID); if (inUser.getEnabled()) { String password = userPass.substring(p+1); - valid = RollerContext.getPasswordEncoder().matches(password, user.getPassword()); + valid = RollerContext.getPasswordEncoder().matches(password, inUser.getPassword()); } } } From 14937ad9dc64149886c32b71c62aa36694c448e6 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Wed, 12 Aug 2026 13:35:56 -0600 Subject: [PATCH 19/22] Run CI on pull requests that target feature branches so stacked PRs get checks --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ade84a728..c0e6e07de 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,7 +21,7 @@ on: push: branches: [master] pull_request: - branches: [master] + branches: [master, 'feature/**'] jobs: build-test: From a90829305f39c5e43dd4ce890573c0e3e8d9aba2 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Wed, 12 Aug 2026 21:10:42 -0600 Subject: [PATCH 20/22] Restore null path info handling in the forked Atom adapter and stop reusing the PostgreSQL 10 data directory The rome-propono adapter the AtomPub servlet was forked from normalizes a null path info to an empty string, and dropping that in the fork made a request to the exact /roller-services/app mapping fail with a 500 instead of serving the Atom service document. docker-compose now binds a new postgresql-16-data directory, since PostgreSQL 16 refuses to start on a data directory initialized by the PostgreSQL 10 image this file used before. Both found by Copilot review on the pull request. --- .../webservices/atomprotocol/RollerAtomRequestImpl.java | 4 +++- docker-compose.yml | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomRequestImpl.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomRequestImpl.java index 0f15a4710..643e4ce62 100644 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomRequestImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomRequestImpl.java @@ -39,7 +39,9 @@ public RollerAtomRequestImpl(HttpServletRequest request) { @Override public String getPathInfo() { - return wrapped.getPathInfo(); + // the handler splits this without a null check, and a request to the + // exact servlet mapping has no path info + return wrapped.getPathInfo() != null ? wrapped.getPathInfo() : ""; } @Override diff --git a/docker-compose.yml b/docker-compose.yml index dad8c6b8f..db6aec6cf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,7 +27,10 @@ services: - "5432:5432" volumes: - type: bind - source: ./docker/postgresql-data + # PostgreSQL 16 cannot start on a data directory initialized by the + # PostgreSQL 10 image this file used before; a new directory avoids + # clobbering old data (pg_dump from the old container to migrate it) + source: ./docker/postgresql-16-data target: /var/lib/postgresql/data environment: - POSTGRES_DB=rollerdb From b58edfdb03c76175be8adefd9d0d9572c87b78c2 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Wed, 12 Aug 2026 21:20:50 -0600 Subject: [PATCH 21/22] Target Jakarta EE 11 so Spring Framework 7 runs on its supported baseline Spring Framework 7 is built against Servlet 6.1 and its supported platform is Jakarta EE 11, so pairing it with Servlet 6.0 on Jetty 12.0 and Tomcat 10.1 was an unsupported combination that could break whenever Spring reaches a 6.1-only API. The servlet API moves to 6.1.0, the Jetty plugin to the ee11 flavor at 12.1.12, and the Docker image to Tomcat 11. JSP was already at the EE 11 level. Raised by Copilot review on the pull request. --- .gitignore | 1 + Dockerfile | 2 +- app/pom.xml | 6 +++--- it-selenium/pom.xml | 4 ++-- pom.xml | 6 +++--- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 4419d5ba2..f1557451b 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ docker/postgresql-data docker/roller-data assembly-release/release.sh it-selenium/overlays/ +logs/ diff --git a/Dockerfile b/Dockerfile index 3870efc22..330b2cb38 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,7 +38,7 @@ mvn -Duser.home=/builder/home -DskipTests=true -B clean install # STAGE 2 - PACKAGE ------------------------------------------------ -FROM tomcat:10.1-jdk17-openjdk-slim +FROM tomcat:11.0-jdk17-temurin # Remove existing Tomcat webapps diff --git a/app/pom.xml b/app/pom.xml index 24d170ec4..357120e67 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -33,7 +33,7 @@ limitations under the License. war - 6.0.0 + 6.1.0 4.0.0 3.0.1 1.7.8 @@ -598,8 +598,8 @@ limitations under the License. - org.eclipse.jetty.ee10 - jetty-ee10-maven-plugin + org.eclipse.jetty.ee11 + jetty-ee11-maven-plugin /roller diff --git a/it-selenium/pom.xml b/it-selenium/pom.xml index f12f54145..a1880ce44 100644 --- a/it-selenium/pom.xml +++ b/it-selenium/pom.xml @@ -134,8 +134,8 @@ - org.eclipse.jetty.ee10 - jetty-ee10-maven-plugin + org.eclipse.jetty.ee11 + jetty-ee11-maven-plugin selenium 9999 diff --git a/pom.xml b/pom.xml index a4f48fd12..5f3e9e918 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ limitations under the License. 10.16.1.1 - 12.0.21 + 12.1.12 UTF-8 UTF-8 6.1.5 @@ -84,8 +84,8 @@ limitations under the License. - org.eclipse.jetty.ee10 - jetty-ee10-maven-plugin + org.eclipse.jetty.ee11 + jetty-ee11-maven-plugin ${jetty.plugin.version} From aec70d0ef088ea00de3a653b3f2ed4648d4d6eb8 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Thu, 13 Aug 2026 07:09:24 -0600 Subject: [PATCH 22/22] Refuse stale AtomPub auth schemes and answer missing Content-Type with 415 webservices.atomPubAuth is a runtime property persisted in the database, so an upgraded site can still carry the removed oauth value; the wsse-else-basic chain silently accepted HTTP Basic for it, an auth mode the administrator never chose. Unknown values now refuse authentication with a log message naming the fix. The AtomPub servlet also dereferenced the request Content-Type before its null check, turning a POST without one into a 500 instead of the intended 415. Both found by code review. --- .../atomprotocol/RollerAtomHandler.java | 15 ++++++++++++--- .../atomprotocol/RollerAtomServlet.java | 5 +++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java index 4cc333db6..7385a72a8 100644 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java @@ -114,12 +114,21 @@ public RollerAtomHandler(HttpServletRequest request, HttpServletResponse respons roller = WebloggerFactory.getWeblogger(); String userName; - if ("wsse".equals(WebloggerRuntimeConfig.getProperty("webservices.atomPubAuth"))) { + String authScheme = WebloggerRuntimeConfig.getProperty("webservices.atomPubAuth"); + if ("wsse".equals(authScheme)) { userName = authenticateWSSE(request); - } else { - // default to basic + } else if (authScheme == null || authScheme.isBlank() || "basic".equals(authScheme)) { userName = authenticateBASIC(request); + + } else { + // an upgraded site may still have "oauth" stored in the runtime + // config; refuse authentication instead of silently accepting a + // scheme the administrator did not choose + log.error("Unsupported webservices.atomPubAuth value '" + authScheme + + "' (OAuth 1.0a support was removed); set it to 'basic' or 'wsse'." + + " Refusing AtomPub authentication until it is corrected."); + userName = null; } if (userName != null) { 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 index 261256ac4..e30033ed2 100644 --- 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 @@ -177,7 +177,8 @@ protected void doPost(final HttpServletRequest req, final HttpServletResponse re try { if (handler.isCollectionURI(areq)) { - if (req.getContentType().startsWith("application/atom+xml")) { + final String contentType = req.getContentType(); + if (contentType != null && contentType.startsWith("application/atom+xml")) { // parse incoming entry final Entry entry = Atom10Parser.parseEntry( @@ -211,7 +212,7 @@ protected void doPost(final HttpServletRequest req, final HttpServletResponse re Atom10Generator.serializeEntry(newEntry, writer); writer.close(); - } else if (req.getContentType() != null) { + } else if (contentType != null) { // get incoming title and slug from HTTP header final String title = areq.getHeader("Title");