diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 16ac36cf3a..a0a009107c 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: @@ -32,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - java: [ '11', '17', '21', '25' ] + java: [ '17', '21', '25' ] steps: - name: Set up JDK ${{ matrix.java }} @@ -79,7 +79,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@v7 with: name: dev-build diff --git a/.gitignore b/.gitignore index c24ba08a68..8d6dcdd665 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,5 @@ docker/postgresql-data docker/roller-data assembly-release/release.sh it-selenium/overlays/ -it-selenium/logs/ +docker/postgresql-16-data +logs/ diff --git a/Dockerfile b/Dockerfile index 872061a0c1..3376091fc3 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:11.0-jdk17-temurin # 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://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.13/postgresql-42.7.13.jar +RUN wget https://repo1.maven.org/maven2/org/eclipse/angus/angus-mail/2.0.5/angus-mail-2.0.5.jar +RUN wget https://repo1.maven.org/maven2/jakarta/mail/jakarta.mail-api/2.1.5/jakarta.mail-api-2.1.5.jar +RUN wget https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api/2.1.4/jakarta.activation-api-2.1.4.jar +RUN wget https://repo1.maven.org/maven2/org/eclipse/angus/angus-activation/2.0.3/angus-activation-2.0.3.jar # Add Roller entry-point and go! diff --git a/app/pom.xml b/app/pom.xml index a55d266df3..fcd2fef571 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -33,34 +33,31 @@ limitations under the License. war - 4.0.1 - 2.2 - 1.2.0 - 1.2 - 1.7.8 - 1.10.17 + 6.1.0 + 4.0.0 + 3.0.2 + 1.10.18 9.10.1 - 1.70 + 1.86 1.11.0 1.11.0 1.22.1 1.15.0 3.20.0 - 4.0.9 + 5.0.2 7.0.0 2.26.1 9.12.3 - 20100527 3.5.1 - 3.5.6 + 3.6.0 1.0b3 1.19.0 - 2.0.19 - 5.3.39 - 5.8.16 - 2.5.29 + 2.0.20 + 7.0.9 + 7.1.1 + 7.3.0 + 6.2.0 2.4.1 - 1.6 1.0.2 3.1.3 @@ -70,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 + 3.0.1 + - javax.mail - mail - ${java-mail.version} + jakarta.mail + jakarta.mail-api + 2.1.5 + provided + + + org.eclipse.angus + angus-mail + 2.0.5 provided - - - javax.activation - activation - - - com.sun.activation - javax.activation - ${java-activation.version} + jakarta.activation + jakarta.activation-api + 2.1.4 - javax.xml.bind - jaxb-api - ${jaxb.version} - - - - javax.activation - javax.activation-api - - + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.5 + + + org.glassfish.jaxb + jaxb-runtime + 4.0.9 + - org.webjars - webjars-servlet-2.x - ${webjars.version} + com.jgeppert.struts2.bootstrap + struts2-bootstrap-plugin + ${struts-bootstrap.version} + org.webjars bootstrap @@ -277,9 +281,9 @@ limitations under the License. - org.webjars.bower + org.webjars.npm summernote - 0.8.12 + 0.9.1 @@ -309,6 +313,12 @@ limitations under the License. ${lucene.version} + + org.slf4j + slf4j-api + ${slf4j.version} + + @@ -328,7 +338,7 @@ limitations under the License. org.apache.logging.log4j - log4j-slf4j-impl + log4j-slf4j2-impl ${log4j2.version} @@ -387,6 +397,12 @@ limitations under the License. ${xmlrpc-version} + org.apache.xmlrpc xmlrpc-server @@ -450,22 +466,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 +503,6 @@ limitations under the License. - - com.jgeppert.struts2.bootstrap - struts2-bootstrap-plugin - 4.0.0 - - com.rometools rome @@ -529,6 +523,12 @@ limitations under the License. ${rome.version} compile + + + commons-httpclient + commons-httpclient + commons-logging commons-logging @@ -537,15 +537,9 @@ limitations under the License. - net.oauth.core - oauth-provider - compile - ${oauth-core.version} - - - + org.bouncycastle - bcpkix-jdk15on + bcprov-jdk18on ${bouncycastle.version} @@ -581,14 +575,14 @@ limitations under the License. org.mockito mockito-core - 5.23.0 + 5.24.0 test org.instancio instancio-junit - 5.6.0 + 6.0.1 test @@ -610,13 +604,15 @@ limitations under the License. - org.eclipse.jetty - jetty-maven-plugin + org.eclipse.jetty.ee11 + jetty-ee11-maven-plugin /roller - src/test/resources/jetty.xml + + src/test/resources/jetty.xml + ${project.build.directory}/test-classes/roller-jettyrun.properties @@ -630,9 +626,9 @@ limitations under the License. 6.1.6 - commons-dbcp - commons-dbcp - 1.4 + org.apache.commons + commons-dbcp2 + 2.14.0 org.apache.derby @@ -645,9 +641,9 @@ limitations under the License. ${derby.version} - javax.mail - mail - ${java-mail.version} + org.eclipse.angus + angus-mail + 2.0.5 @@ -732,6 +728,7 @@ limitations under the License. false + -Djavax.xml.accessExternalSchema=all @@ -795,7 +792,7 @@ limitations under the License. org.codehaus.mojo buildnumber-maven-plugin - 3.3.0 + 3.3.1 validate 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 970795610b..02befd6373 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 1a682c360e..898a59294f 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/MultiWeblogURLStrategy.java b/app/src/main/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java index acb077ec5b..583e9b5066 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 80657bbe99..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/OAuthManager.java +++ /dev/null @@ -1,142 +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 - * - * @deprecated Records approval against the consumer key alone, without - * naming the request token being approved and without - * requiring that it is still pending. Use - * {@link #authorizeRequestToken(String, String, String)}, - * which does both in one statement. No longer called from - * Roller; retained for callers outside the project. - */ - @Deprecated - void markAsAuthorized(OAuthAccessor accessor, String userId) - throws OAuthException; - - /** - * Record a user's approval of one pending request token. - * - *

The whole transition happens in a single conditional statement: the - * record is claimed only if it still matches the consumer key and the - * exact request token and has not yet been exchanged for an access token. - * A pending token already approved by the same user is accepted as an - * idempotent retry; a different user cannot claim it. The transition stays - * in one statement, without a read-then-write window. - * - * @param consumerKey key of the consumer the token was issued to - * @param requestToken the pending request token being approved - * @param userName the approving user - * @return true if this call performed the approval or confirmed the same - * user's prior approval; false if the record did not match, belongs - * to another user, or was already exchanged. Callers should not - * distinguish these cases to the client. - * @throws OAuthException on persistence failure - */ - boolean authorizeRequestToken(String consumerKey, String requestToken, String userName) - 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 db87407aa1..053bbf48f6 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 834efed2c9..62f498efbc 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 14e65a9f6d..0a75aac80a 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 @@ -69,7 +69,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; @@ -99,7 +98,6 @@ protected WebloggerImpl( UserManager userManager, WeblogManager weblogManager, WeblogEntryManager weblogEntryManager, - OAuthManager oauthManager, FeedFetcher feedFetcher, PlanetManager planetManager, org.apache.roller.planet.business.PlanetURLStrategy planetUrlStrategy, @@ -119,7 +117,6 @@ protected WebloggerImpl( this.userManager = userManager; this.weblogManager = weblogManager; this.weblogEntryManager = weblogEntryManager; - this.oauthManager = oauthManager; this.urlStrategy = urlStrategy; this.feedFetcher = feedFetcher; this.planetManager = planetManager; @@ -292,17 +289,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 373711c94a..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java +++ /dev/null @@ -1,420 +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.Query; -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); - } - } - - @Override - public boolean authorizeRequestToken(String consumerKey, String requestToken, String userName) - throws OAuthException { - if (consumerKey == null || requestToken == null || userName == null) { - return false; - } - try { - Query q = strategy.getNamedUpdate("OAuthAccessorRecord.authorizeRequestToken"); - q.setParameter(1, userName); - q.setParameter(2, new Timestamp(new Date().getTime())); - q.setParameter(3, consumerKey); - q.setParameter(4, requestToken); - return q.executeUpdate() == 1; - - } catch (WebloggerException ex) { - throw new OAuthException("ERROR: authorizing request token", 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 fe74ea0406..91597ca10e 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 d9e189494f..f3e392862a 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/business/themes/ThemeManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java index 13467171ce..744cc57153 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 8d24508f5e..2543c67d0c 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.action.ParametersAware; import org.apache.struts2.dispatcher.HttpParameters; import org.apache.struts2.dispatcher.Parameter; @@ -45,12 +45,17 @@ * 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 implements ParametersAware { private static final Log log = LogFactory.getLog(PlanetConfig.class); // original request parameters private HttpParameters parameters = HttpParameters.create().build(); + + @Override + public void withParameters(HttpParameters parameters) { + this.parameters = parameters; + } // runtime properties data private Map properties = Collections.emptyMap(); @@ -180,11 +185,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/PlanetGroupBean.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupBean.java new file mode 100644 index 0000000000..b6806b8da3 --- /dev/null +++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupBean.java @@ -0,0 +1,66 @@ +/* + * 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.planet.ui; + +import org.apache.roller.planet.pojos.PlanetGroup; + +/** + * Bean for managing planet group form data. + */ +public class PlanetGroupBean { + + private String id = null; + private String handle = null; + private String title = null; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getHandle() { + return handle; + } + + public void setHandle(String handle) { + this.handle = handle; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public void copyTo(PlanetGroup dataHolder) { + dataHolder.setHandle(this.handle); + dataHolder.setTitle(this.title); + } + + public void copyFrom(PlanetGroup dataHolder) { + this.id = dataHolder.getId(); + this.handle = dataHolder.getHandle(); + this.title = dataHolder.getTitle(); + } +} 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 7d6ed549e3..ecc8903489 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,10 @@ 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.Preparable; +import org.apache.struts2.interceptor.parameter.StrutsParameter; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.*; @@ -38,12 +39,15 @@ * 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 implements Preparable { private static final Log log = LogFactory.getLog(PlanetGroupSubs.class); // the planet group we are working in - private PlanetGroup group = null; + private PlanetGroup planetGroup = null; + + // form data for the group + private PlanetGroupBean group = new PlanetGroupBean(); // the subscription to deal with private String subUrl = null; @@ -67,13 +71,21 @@ public boolean isWeblogRequired() { } + /** + * Loads the group being edited. This runs before the params interceptor so + * that submitted values are bound onto the form bean rather than being + * overwritten by it. + */ @Override - public void setServletRequest(HttpServletRequest request) { - if (request.getParameter("createNew") != null) { - group = new PlanetGroup(); - } else { - group = getGroupFromRequest(request, getPlanet()); + public void prepare() { + HttpServletRequest request = getServletRequest(); + if (request.getParameter("createNew") == null) { + planetGroup = getGroupFromRequest(request, getPlanet()); } + if (planetGroup == null) { + planetGroup = new PlanetGroup(); + } + group.copyFrom(planetGroup); } @@ -121,20 +133,22 @@ public String saveGroup() { try { PlanetManager planetManager = WebloggerFactory.getWeblogger().getPlanetManager(); - PlanetGroup existingGroup = planetManager.getGroup(getPlanet(), getGroup().getHandle()); + getGroup().copyTo(planetGroup); + PlanetGroup existingGroup = planetManager.getGroup(getPlanet(), planetGroup.getHandle()); if (existingGroup == null) { - log.debug("Adding New Group: " + getGroup().getHandle()); - planetManager.saveNewPlanetGroup(getPlanet(), getGroup()); + log.debug("Adding New Group: " + planetGroup.getHandle()); + planetManager.saveNewPlanetGroup(getPlanet(), planetGroup); } else { log.debug("Updating Existing Group: " + existingGroup.getHandle()); - existingGroup.setTitle( getGroup().getTitle() ); - existingGroup.setHandle( getGroup().getHandle() ); + existingGroup.setTitle( planetGroup.getTitle() ); + existingGroup.setHandle( planetGroup.getHandle() ); planetManager.saveGroup(existingGroup); } WebloggerFactory.getWeblogger().flush(); + getGroup().copyFrom(planetGroup); addMessage("planetGroups.success.saved"); } catch (Exception ex) { @@ -196,9 +210,9 @@ public String saveSubscription() { } // add the sub to the group - group.getSubscriptions().add(sub); - sub.getGroups().add(group); - pmgr.saveGroup(group); + planetGroup.getSubscriptions().add(sub); + sub.getGroups().add(planetGroup); + pmgr.saveGroup(planetGroup); WebloggerFactory.getWeblogger().flush(); // clear field after success @@ -232,11 +246,11 @@ public String deleteSubscription() { Subscription sub = pmgr.getSubscription(getSubUrl()); // remove sub from group - getGroup().getSubscriptions().remove(sub); - pmgr.saveGroup(getGroup()); + planetGroup.getSubscriptions().remove(sub); + pmgr.saveGroup(planetGroup); // remove group from sub - sub.getGroups().remove(getGroup()); + sub.getGroups().remove(planetGroup); pmgr.saveSubscription(sub); WebloggerFactory.getWeblogger().flush(); @@ -272,10 +286,10 @@ public String getPageTitle() { if (pageTitle == null) { if (getCreateNew()) { pageTitle = getText("planetGroupSubs.custom.title.new"); - } else if (getGroup().getHandle().equals("all")) { + } else if (planetGroup.getHandle().equals("all")) { pageTitle = getText("planetGroupSubs.default.title"); } else { - pageTitle = getText("planetGroupSubs.custom.title", new String[]{getGroup().getHandle()}); + pageTitle = getText("planetGroupSubs.custom.title", new String[]{planetGroup.getHandle()}); } } return pageTitle; @@ -285,8 +299,8 @@ public String getPageTitle() { public List getSubscriptions() { List subs = Collections.emptyList(); - if (getGroup() != null) { - Set subsSet = getGroup().getSubscriptions(); + if (planetGroup != null) { + Set subsSet = planetGroup.getSubscriptions(); // iterate over list and build display list subs = new ArrayList<>(); @@ -301,18 +315,16 @@ public List getSubscriptions() { return subs; } - public PlanetGroup getGroup() { + @StrutsParameter(depth = 1) + public PlanetGroupBean getGroup() { return group; } - public void setGroup(PlanetGroup group) { - this.group = group; - } - public String getSubUrl() { return subUrl; } + @StrutsParameter public void setSubUrl(String subUrl) { this.subUrl = subUrl; } @@ -322,7 +334,7 @@ public boolean getCreateNew() { PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); PlanetGroup existingGroup = null; try { - existingGroup = pmgr.getGroupById(group.getId()); + existingGroup = pmgr.getGroupById(planetGroup.getId()); } catch (RollerException e) { log.error("Error getting group by ID", e); } @@ -336,7 +348,7 @@ public void setCreateNew(boolean createNew) { } public String getGroupHandle() { - return group.getHandle(); + return planetGroup.getHandle(); } } 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 cea9025766..ec7eababbc 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,8 @@ 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 javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; @@ -32,7 +31,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 +50,8 @@ public boolean isWeblogRequired() { } @Override - public void setServletRequest(HttpServletRequest request) { + public void myPrepare() { + HttpServletRequest request = getServletRequest(); group = PlanetGroupSubs.getGroupFromRequest(request, getPlanet()); } 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 e76e9b7ee6..0000000000 --- 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 5ab75b0c9b..0000000000 --- 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/CmaRollerContext.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/CmaRollerContext.java index 3e2d544987..29c1eb1b77 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 0955747bc9..b78991085d 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; @@ -317,10 +317,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 5c0f029c25..959cc3e908 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; @@ -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/BootstrapFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/BootstrapFilter.java index a9d20c2283..1ccc442ce5 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/BootstrapSecurityFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/BootstrapSecurityFilter.java index 32b63922c1..727b061d20 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/BootstrapSecurityFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/BootstrapSecurityFilter.java @@ -1,8 +1,8 @@ package org.apache.roller.weblogger.ui.core.filters; import java.io.IOException; -import javax.servlet.*; -import javax.servlet.http.*; +import jakarta.servlet.*; +import jakarta.servlet.http.*; import org.apache.roller.weblogger.business.WebloggerFactory; import org.apache.roller.weblogger.ui.core.security.BootstrapSecurity; 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 c8109a59c5..99f44624b3 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/CustomOpenIDAuthenticationProcessingFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/CustomOpenIDAuthenticationProcessingFilter.java deleted file mode 100644 index 9076578d88..0000000000 --- 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/filters/DebugFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/DebugFilter.java index 1bf1508c88..de994e489b 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 eda17e24eb..2846d821e3 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 554ccc6beb..6d9da1abfb 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 8a1c830fa3..f0729400bb 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 a687552f7a..44127249d9 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 bf4aaba709..37e9e03ef6 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/SaltValidator.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SaltValidator.java index e1dba53f73..50e4a5f729 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SaltValidator.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/SaltValidator.java @@ -22,8 +22,8 @@ import java.util.Locale; import java.util.Objects; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; import org.apache.roller.weblogger.pojos.User; import org.apache.roller.weblogger.ui.core.RollerSession; 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 2ff028cea6..186e84ff91 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 78a32474b9..8c7e125c8e 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 @@ -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/XmlRpcEnabledFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/XmlRpcEnabledFilter.java index 3d5255bbcf..c5fac53ea9 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/XmlRpcEnabledFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/filters/XmlRpcEnabledFilter.java @@ -19,13 +19,13 @@ 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.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.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/security/AutoProvision.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/AutoProvision.java index 0df869f3e1..aa52fd5348 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 d526e06bcf..f3e4e724f7 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/BootstrapSecurity.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/BootstrapSecurity.java index 54f9ae2d3e..c67abc6d75 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/security/BootstrapSecurity.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/BootstrapSecurity.java @@ -23,7 +23,7 @@ import java.security.MessageDigest; import java.security.SecureRandom; import java.util.Base64; -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/core/security/CustomUserRegistry.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/CustomUserRegistry.java index 14d184f870..01eb5fa845 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/security/RollerUserDetailsService.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/security/RollerUserDetailsService.java index db41c19b1e..853cfb7429 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/core/tags/calendar/CalendarTag.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/tags/calendar/CalendarTag.java index 2993837bb5..afa3099911 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 4bac5118f8..00fb58068f 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 ee12cb7d09..f3f0f123be 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 8add354065..732000d16b 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 4c56fb92be..c305131382 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 ddad1e2d1b..e57ce5c8cd 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 dfb778ec02..a558887eac 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 68c707f176..1440f92690 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 12a78f600a..309e1232de 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 49b48fd7be..81b02a109e 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 b851048ff1..e49ad85194 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 74ab7bfa16..41a5684017 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 b808050ef9..781bcfafbe 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 2e2b5bd7df..f60f327471 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 c05bdfd56d..8a8b3d9689 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 a42faec283..10cdf4af56 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 baf5e0948a..39280f4945 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 432a0c33a1..19008086ac 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 3fea57ff2b..5a944ef174 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 a2ed8ced82..fbf07ebe4d 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 cd23152115..da5ba82af9 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 4f793e7036..b78f1a09be 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 9b3c90c6e0..eaeafa7bfd 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/util/ModDateHeaderUtil.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/ModDateHeaderUtil.java index d227de531a..67367bb6c1 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 e14414bf47..1133da3370 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 11f1fb7f86..09fb4c00fb 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 95eea79896..6c0e087200 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 2c0832f6d7..bd94b83cbd 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 ee94984aea..1d297c4efa 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 4e7dc7cb52..bdf766e09b 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 5df599d4ea..2c87413235 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 d689d2c8fa..686aa286fc 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 37fa6d8067..f42c5ac400 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 19107c4c21..9e7fe6ca2c 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 d1037ee5d6..b518fb14a7 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/mobile/DeviceResolver.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/util/mobile/DeviceResolver.java index 60e6010aad..9e47cb2a73 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 dea2f82453..79bb814aa4 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 d02929b94b..f29e59e032 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 7c8e2bd819..201755e996 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 0a53e17a22..35b18cfd66 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/CacheInfo.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CacheInfo.java index 7f199baf5e..9feae539fb 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CacheInfo.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CacheInfo.java @@ -25,6 +25,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** @@ -105,6 +106,7 @@ public String getCache() { return cache; } + @StrutsParameter public void setCache(String cache) { this.cache = cache; } 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 ef1774f8c4..caac1056d9 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; @@ -42,14 +41,14 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.Utilities; import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * 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 = getServletRequest().getMethod(); if (!"POST".equals(httpMethod)) { return ERROR; } @@ -338,6 +338,7 @@ public List getCommentStatusOptions() { return opts; } + @StrutsParameter(depth = 1) public GlobalCommentManagementBean getBean() { return bean; } @@ -378,9 +379,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 4cd235084d..d39b036cf2 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; @@ -43,23 +41,28 @@ import org.apache.roller.weblogger.ui.rendering.util.cache.WeblogPageCache; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.Utilities; +import org.apache.struts2.action.ParametersAware; import org.apache.struts2.dispatcher.HttpParameters; import org.apache.struts2.dispatcher.Parameter; -import org.apache.struts2.interceptor.HttpParametersAware; -import org.apache.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * 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 implements ParametersAware { private static final Log log = LogFactory.getLog(GlobalConfig.class); // the request parameters private HttpParameters params = HttpParameters.create().build(); + @Override + public void withParameters(HttpParameters parameters) { + this.params = parameters; + } + // map of config properties private Map properties = Collections.emptyMap(); @@ -105,6 +108,13 @@ public List requiredGlobalPermissionActions() { */ @Override public void myPrepare() { + 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(); @@ -156,6 +166,7 @@ public String execute() { * Save global properties. */ public String save() { + httpMethod = getServletRequest().getMethod(); if (!"POST".equals(httpMethod)) { return ERROR; } @@ -293,19 +304,6 @@ private void invalidateRenderedContent() { } - @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(); @@ -343,15 +341,11 @@ public String[] getCommentPlugins() { return commentPlugins.clone(); } + @StrutsParameter 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/admin/PingTargetEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java index 148dbc9625..93c956eeea 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java @@ -27,6 +27,7 @@ import org.apache.roller.weblogger.pojos.PingTarget; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * Add or modify a common ping target. @@ -140,6 +141,7 @@ private boolean isAdd() { return actionName.equals("commonPingTargetAdd"); } + @StrutsParameter(depth = 1) public PingTargetBean getBean() { return bean; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargets.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargets.java index c34fbc1904..5311271532 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargets.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargets.java @@ -30,6 +30,7 @@ import org.apache.roller.weblogger.pojos.PingTarget; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * Admin action for managing global ping targets. @@ -203,6 +204,7 @@ public String getPingTargetId() { return pingTargetId; } + @StrutsParameter public void setPingTargetId(String pingTargetId) { this.pingTargetId = pingTargetId; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java index 53c0daa60a..3b438db605 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java @@ -27,6 +27,7 @@ import org.apache.roller.weblogger.pojos.GlobalPermission; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** @@ -70,6 +71,7 @@ public String getAuthMethod() { return authMethod.name(); } + @StrutsParameter(depth = 1) public CreateUserBean getBean() { return bean; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java index 70878ecf82..d27a0e0ca0 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java @@ -40,6 +40,7 @@ import org.apache.roller.weblogger.ui.core.RollerLoginSessionManager; import org.apache.roller.weblogger.ui.struts2.core.Register; import org.apache.roller.weblogger.ui.struts2.util.UIAction; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; @@ -272,6 +273,7 @@ private void myValidate() { } } + @StrutsParameter(depth = 1) public CreateUserBean getBean() { return bean; } 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 6868c27ebd..93862fae6c 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 bf395a2a0a..166f738ead 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 @@ -28,10 +28,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 b3739ce408..2472bd1d4c 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/BootstrapToken.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/BootstrapToken.java index 0d4ce17bcb..b42e4a704a 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/BootstrapToken.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/BootstrapToken.java @@ -19,21 +19,19 @@ package org.apache.roller.weblogger.ui.struts2.core; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.ui.core.security.BootstrapSecurity; import org.apache.roller.weblogger.ui.struts2.util.UIAction; -import org.apache.struts2.interceptor.ServletRequestAware; -import org.apache.struts2.interceptor.ServletResponseAware; +import org.apache.struts2.action.ServletResponseAware; +import org.apache.struts2.interceptor.parameter.StrutsParameter; -public class BootstrapToken extends UIAction implements ServletRequestAware, ServletResponseAware { +public class BootstrapToken extends UIAction implements ServletResponseAware { private static final Log LOG = LogFactory.getLog(BootstrapToken.class); - private HttpServletRequest request; private HttpServletResponse response; private String token; @@ -45,17 +43,17 @@ public String execute() { setResponseHeaders(); LOG.info("Roller is waiting for an administrator to submit the one-time setup token; " + "database setup will not continue until the token is accepted. Setup page: " - + request.getRequestURL()); + + getServletRequest().getRequestURL()); return INPUT; } public String redeem() { setResponseHeaders(); - if (!"POST".equalsIgnoreCase(request.getMethod())) { + if (!"POST".equalsIgnoreCase(getServletRequest().getMethod())) { addActionError(getText("installer.bootstrap.postRequired")); return INPUT; } - if (BootstrapSecurity.redeem(request, token == null ? null : token.trim())) { + if (BootstrapSecurity.redeem(getServletRequest(), token == null ? null : token.trim())) { LOG.info("One-time setup token accepted; continuing database setup."); return SUCCESS; } @@ -68,15 +66,12 @@ private void setResponseHeaders() { response.setHeader("Referrer-Policy", "no-referrer"); } + @StrutsParameter public void setToken(String token) { this.token = token; } - public void setServletRequest(HttpServletRequest request) { - this.request = request; - } - - public void setServletResponse(HttpServletResponse response) { + public void withServletResponse(HttpServletResponse response) { this.response = response; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/CreateWeblog.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/CreateWeblog.java index f2ffe2b3be..a763437f80 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/CreateWeblog.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/CreateWeblog.java @@ -34,6 +34,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.Utilities; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; import java.util.List; @@ -199,6 +200,7 @@ public List getThemes() { return themeMgr.getEnabledThemesList(); } + @StrutsParameter(depth = 1) public CreateWeblogBean getBean() { return bean; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/FrontpageSetup.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/FrontpageSetup.java index cac83ba4e1..3e1dbfb1b7 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/FrontpageSetup.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/FrontpageSetup.java @@ -21,7 +21,7 @@ import java.util.Collections; import java.util.List; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -31,7 +31,7 @@ import org.apache.roller.weblogger.ui.rendering.util.cache.SiteWideCache; import org.apache.roller.weblogger.ui.rendering.util.cache.WeblogFeedCache; import org.apache.roller.weblogger.ui.rendering.util.cache.WeblogPageCache; -import org.apache.struts2.ServletActionContext; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * Chooses the site frontpage weblog for the first time. @@ -110,7 +110,7 @@ public String save() { } protected boolean isPostRequest() { - HttpServletRequest req = ServletActionContext.getRequest(); + HttpServletRequest req = getServletRequest(); return req != null && "POST".equalsIgnoreCase(req.getMethod()); } @@ -124,6 +124,7 @@ public String getFrontpageBlog() { return frontpageBlog; } + @StrutsParameter public void setFrontpageBlog(String frontpageBlog) { this.frontpageBlog = frontpageBlog; } @@ -132,6 +133,7 @@ public Boolean getAggregated() { return aggregated; } + @StrutsParameter public void setAggregated(Boolean aggregated) { this.aggregated = aggregated; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Install.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Install.java index 4ccc4d5105..871d6e1c5d 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Install.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Install.java @@ -32,7 +32,6 @@ import org.apache.roller.weblogger.config.WebloggerConfig; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.springframework.beans.FatalBeanException; -import org.apache.struts2.ServletActionContext; import org.apache.roller.weblogger.ui.core.security.BootstrapSecurity; @@ -115,7 +114,7 @@ public String execute() { public String create() { - if (!BootstrapSecurity.isValid(ServletActionContext.getRequest())) return BOOTSTRAP; + if (!BootstrapSecurity.isValid(getServletRequest())) return BOOTSTRAP; if (WebloggerFactory.isBootstrapped()) { return SUCCESS; @@ -136,7 +135,7 @@ public String create() { public String upgrade() { - if (!BootstrapSecurity.isValid(ServletActionContext.getRequest())) return BOOTSTRAP; + if (!BootstrapSecurity.isValid(getServletRequest())) return BOOTSTRAP; if (WebloggerFactory.isBootstrapped()) { return SUCCESS; @@ -157,7 +156,7 @@ public String upgrade() { public String bootstrap() { - if (!BootstrapSecurity.isValid(ServletActionContext.getRequest())) return BOOTSTRAP; + if (!BootstrapSecurity.isValid(getServletRequest())) return BOOTSTRAP; log.info("ENTERING"); if (WebloggerFactory.isBootstrapped()) { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Login.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Login.java index 0cd3a83860..254c6d49d1 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Login.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Login.java @@ -22,6 +22,7 @@ import org.apache.roller.weblogger.config.WebloggerConfig; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * Handle user logins. @@ -81,6 +82,7 @@ public String getError() { return error; } + @StrutsParameter public void setError(String error) { this.error = error; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/MainMenu.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/MainMenu.java index 566db7fc9d..1879137391 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/MainMenu.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/MainMenu.java @@ -30,6 +30,7 @@ import org.apache.roller.weblogger.pojos.WeblogPermission; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** @@ -133,6 +134,7 @@ public String getInviteId() { return inviteId; } + @StrutsParameter public void setInviteId(String inviteId) { this.inviteId = inviteId; } 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 93a0359fd7..0000000000 --- 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 52546b647b..0000000000 --- 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/ui/struts2/core/Profile.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Profile.java index 6f83a0ddb6..1cf8243916 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Profile.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Profile.java @@ -28,6 +28,7 @@ import org.apache.roller.weblogger.config.WebloggerConfig; import org.apache.roller.weblogger.pojos.User; import org.apache.roller.weblogger.ui.struts2.util.UIAction; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; import java.util.Arrays; @@ -180,6 +181,7 @@ public String getAuthMethod() { return authMethod.name(); } + @StrutsParameter(depth = 1) public ProfileBean getBean() { return bean; } 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 8d9c85050c..a8ed278e5f 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; @@ -40,7 +40,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.MailUtil; import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; @@ -53,14 +53,13 @@ * @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"; public static final String DEFAULT_ALLOWED_CHARS = "A-Za-z0-9"; // this is a no-no, we should not need this - private HttpServletRequest servletRequest = null; private AuthMethod authMethod = WebloggerConfig.getAuthMethod(); @@ -449,15 +448,7 @@ private void checkOpenID() { } - public HttpServletRequest getServletRequest() { - return servletRequest; - } - - @Override - public void setServletRequest(HttpServletRequest servletRequest) { - this.servletRequest = servletRequest; - } - + @StrutsParameter(depth = 1) public ProfileBean getBean() { return bean; } @@ -478,6 +469,7 @@ public String getActivationCode() { return activationCode; } + @StrutsParameter public void setActivationCode(String activationCode) { this.activationCode = activationCode; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java index 0bc9387858..9dbfec3941 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java @@ -27,6 +27,7 @@ import org.apache.roller.weblogger.pojos.WeblogBookmark; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; @@ -145,10 +146,12 @@ public String getFolderId() { return folderId; } + @StrutsParameter public void setFolderId(String folderId) { this.folderId = folderId; } + @StrutsParameter(depth = 1) public BookmarkBean getBean() { return bean; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java index df499162ee..89cdb6be46 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java @@ -33,6 +33,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; /** @@ -269,6 +270,7 @@ public String getFolderId() { return folderId; } + @StrutsParameter public void setFolderId(String folderId) { this.folderId = folderId; } @@ -277,6 +279,7 @@ public String[] getSelectedBookmarks() { return selectedBookmarks; } + @StrutsParameter public void setSelectedBookmarks(String[] bookmarks) { this.selectedBookmarks = bookmarks; } @@ -285,6 +288,7 @@ public String getTargetFolderId() { return targetFolderId; } + @StrutsParameter public void setTargetFolderId(String targetFolderId) { this.targetFolderId = targetFolderId; } @@ -312,6 +316,7 @@ public String getViewFolderId() { return viewFolderId; } + @StrutsParameter public void setViewFolderId(String viewFolderId) { this.viewFolderId = viewFolderId; } 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 01aca355bc..9ae5900a5d 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/CategoryEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java index f12f6abf68..4e2aa67b6c 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java @@ -31,6 +31,7 @@ import org.apache.roller.weblogger.pojos.WeblogPermission; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; @@ -164,6 +165,7 @@ public void myValidate() { } } + @StrutsParameter(depth = 1) public CategoryBean getBean() { return bean; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryRemove.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryRemove.java index 0dbd8dc681..4cd2675c21 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryRemove.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryRemove.java @@ -33,6 +33,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** @@ -151,6 +152,7 @@ public String getRemoveId() { return removeId; } + @StrutsParameter public void setRemoveId(String categoryId) { this.removeId = categoryId; } @@ -167,6 +169,7 @@ public String getTargetCategoryId() { return targetCategoryId; } + @StrutsParameter public void setTargetCategoryId(String targetCategoryId) { this.targetCategoryId = targetCategoryId; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java index 08699cd552..889fc9cae4 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java @@ -48,6 +48,7 @@ import org.apache.roller.weblogger.util.MailUtil; import org.apache.roller.weblogger.util.Utilities; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * Action for managing weblog comments. @@ -454,6 +455,7 @@ public List getCommentStatusOptions() { return opts; } + @StrutsParameter(depth = 1) public CommentsBean getBean() { return bean; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Entries.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Entries.java index 0a3bb6066a..e34aa47784 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Entries.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Entries.java @@ -37,6 +37,7 @@ import org.apache.roller.weblogger.ui.struts2.util.KeyValueObject; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** @@ -207,6 +208,7 @@ public List getStatusOptions() { } + @StrutsParameter(depth = 1) public EntriesBean getBean() { return bean; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryAddWithMediaFile.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryAddWithMediaFile.java index 600d6276d1..344416e0cb 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryAddWithMediaFile.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryAddWithMediaFile.java @@ -24,6 +24,7 @@ import org.apache.roller.weblogger.business.WebloggerFactory; import org.apache.roller.weblogger.pojos.MediaFile; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; /** @@ -116,6 +117,7 @@ public String execute() { return SUCCESS; } + @StrutsParameter(depth = 1) public EntryBean getBean() { return bean; } @@ -134,6 +136,7 @@ public String[] getSelectedImages() { /** * @param selectedImages the selectedImages to set */ + @StrutsParameter public void setSelectedImages(String[] selectedImages) { this.selectedImages = selectedImages; } @@ -150,6 +153,7 @@ public String getWeblog() { * @param weblog the weblog to set */ @Override + @StrutsParameter public void setWeblog(String weblog) { this.weblog = weblog; } @@ -164,6 +168,7 @@ public String getSelectedImage() { /** * @param selectedImage the selectedImage to set */ + @StrutsParameter public void setSelectedImage(String selectedImage) { this.selectedImage = selectedImage; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryEdit.java index 8fda6fcbdc..99aded8008 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryEdit.java @@ -50,6 +50,7 @@ import org.apache.roller.weblogger.util.MailUtil; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; /** @@ -356,6 +357,7 @@ private String failedSave() { return INPUT; } + @StrutsParameter(depth = 1) public EntryBean getBean() { return bean; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryRemove.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryRemove.java index 0db70756e1..f458b0dbfc 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryRemove.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryRemove.java @@ -29,6 +29,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import java.util.Collections; import java.util.List; @@ -124,6 +125,7 @@ public String getRemoveId() { return removeId; } + @StrutsParameter public void setRemoveId(String removeId) { this.removeId = removeId; } 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 9df65972f1..cdb380a5cd 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,11 +27,12 @@ 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.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; +import org.apache.struts2.action.ServletResponseAware; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; /** @@ -40,6 +41,8 @@ // TODO: make this work @AllowedMethods({"execute","save"}) public class FolderEdit extends UIAction implements ServletResponseAware { + private HttpServletResponse servletResponse = null; + private static final Log log = LogFactory.getLog(FolderEdit.class); // bean for managing form data @@ -51,8 +54,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"; @@ -82,8 +83,8 @@ public void myPrepare() { } @Override - public void setServletResponse(HttpServletResponse httpServletResponse) { - this.httpServletResponse = httpServletResponse; + public void withServletResponse(HttpServletResponse response) { + this.servletResponse = response; } /** @@ -138,7 +139,7 @@ public String save() { // HTTP response splitting defense String sanetizedFolderID = folderId.replace("\n", "").replace("\r", ""); - httpServletResponse.addHeader("folderId", sanetizedFolderID); + servletResponse.addHeader("folderId", sanetizedFolderID); return SUCCESS; @@ -169,6 +170,7 @@ private boolean isAdd() { return actionName.equals("folderAdd"); } + @StrutsParameter(depth = 1) public FolderBean getBean() { return bean; } 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 9c9fdfcf04..6651cfc64c 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 @@ -38,6 +38,9 @@ import org.apache.roller.weblogger.util.RollerMessages.RollerMessage; import org.apache.roller.weblogger.util.MediaTypePolicy; 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.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; /** @@ -45,20 +48,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<>(); @@ -118,7 +117,7 @@ public void myPrepare() { /** * Show form for adding a new media file. - * + * * @return String The result of the action. */ @SkipValidation @@ -127,6 +126,11 @@ public String execute() { return INPUT; } + @Override + public void withUploadedFiles(List uploadedFiles) { + this.uploadedFiles = uploadedFiles; + } + /** * Save a media file. * @@ -142,15 +146,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; } @@ -158,7 +163,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 @@ -176,17 +181,16 @@ 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.setLength(uploadFile.length()); + mediaFile.setInputStream(new FileInputStream(uploadFile)); // The type the browser put on the part describes what // the sender meant to send. It is taken as a hint and // the stored type is worked out from the file name. String declaredType = MediaTypePolicy.normalizeType( - this.uploadedFilesContentType[i]); + upload.getContentType()); if (!WebloggerFactory.getWeblogger().getFileContentManager().canSave( getActionWeblog(), fileName, declaredType, - this.uploadedFiles[i].length(), errors)) { + uploadFile.length(), errors)) { continue; } mediaFile.setContentType(MediaTypePolicy.storedTypeFor( @@ -248,6 +252,7 @@ public void myValidate() { } } + @StrutsParameter(depth = 1) public MediaFileBean getBean() { return bean; } @@ -264,30 +269,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 */ @@ -329,6 +310,7 @@ public String getDirectoryName() { * @param directoryName * the directoryName to set */ + @StrutsParameter public void setDirectoryName(String directoryName) { this.directoryName = directoryName; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java index e48c50ec6b..7feecc7be0 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java @@ -32,6 +32,7 @@ import org.apache.roller.weblogger.pojos.MediaFileDirectoryComparator.DirectoryComparatorType; import org.apache.roller.weblogger.pojos.WeblogPermission; import org.apache.roller.weblogger.ui.struts2.util.UIAction; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * Base class for all actions related to media files. @@ -214,6 +215,7 @@ public String[] getSelectedMediaFiles() { return selectedMediaFiles; } + @StrutsParameter public void setSelectedMediaFiles(String[] selectedMediaFiles) { this.selectedMediaFiles = selectedMediaFiles; } @@ -222,6 +224,7 @@ public String getSelectedDirectory() { return selectedDirectory; } + @StrutsParameter public void setSelectedDirectory(String selectedDirectory) { this.selectedDirectory = selectedDirectory; } @@ -238,6 +241,7 @@ public String getMediaFileId() { return mediaFileId; } + @StrutsParameter public void setMediaFileId(String mediaFileId) { this.mediaFileId = mediaFileId; } 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 11a787aea9..fe9d46a83e 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 @@ -1,235 +1,198 @@ -/* - * 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.editor; - -import java.io.File; -import java.io.FileInputStream; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.util.MediaTypePolicy; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.FileIOException; -import org.apache.roller.weblogger.business.MediaFileManager; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.pojos.MediaFile; -import org.apache.roller.weblogger.pojos.MediaFileDirectory; +/* + * 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.editor; + +import java.io.File; +import java.io.FileInputStream; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.roller.weblogger.util.MediaTypePolicy; +import org.apache.roller.weblogger.WebloggerException; +import org.apache.roller.weblogger.business.FileIOException; +import org.apache.roller.weblogger.business.MediaFileManager; +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.roller.weblogger.ui.core.RollerContext; import org.apache.roller.weblogger.util.RollerMessages; -import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.validation.SkipValidation; - -/** - * Edits metadata for a media file. - */ -@SuppressWarnings("serial") -// TODO: make this work @AllowedMethods({"execute","save"}) -public class MediaFileEdit extends MediaFileBase { - - 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; - - public MediaFileEdit() { - this.actionName = "mediaFileEdit"; - this.desiredMenu = "editor"; - this.pageTitle = "mediaFile.edit.title"; - } - - /** - * Prepares edit action. - */ - @Override - public void myPrepare() { - refreshAllDirectories(); - try { - MediaFileManager mgr = WebloggerFactory.getWeblogger().getMediaFileManager(); - if (!StringUtils.isEmpty(bean.getDirectoryId())) { - setDirectory(mgr.getMediaFileDirectory(getActionWeblog(), bean.getDirectoryId())); - } - } catch (WebloggerException ex) { - log.error("Error looking up media file directory", ex); - } - - } - - /** - * Validates media file metadata to be updated. - */ - public void myValidate() { - MediaFile fileWithSameName = getDirectory().getMediaFile(getBean().getName()); - if (fileWithSameName != null && !fileWithSameName.getId().equals(getMediaFileId())) { - addError("MediaFile.error.duplicateName", getBean().getName()); - } - } - - /** - * Show form for adding a new media file. - * - * @return String The result of the action. - */ - @SkipValidation - @Override - public String execute() { - MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); - try { - MediaFile mediaFile = manager.getMediaFile(getActionWeblog(), getMediaFileId()); - this.bean.copyFrom(mediaFile); - - } catch (FileIOException ex) { - addError("uploadFiles.error.upload", bean.getName()); - - } catch (Exception e) { - log.error("Error uploading file " + bean.getName(), e); - addError("uploadFiles.error.upload", bean.getName()); - } - - return INPUT; - } - - /** - * Save a media file. - * - * @return String The result of the action. - */ - public String save() { - myValidate(); - if (!hasActionErrors()) { - MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); - try { - MediaFile mediaFile = manager.getMediaFile(getActionWeblog(), getMediaFileId()); - bean.copyTo(mediaFile); - - if (uploadedFile != null) { - mediaFile.setLength(this.uploadedFile.length()); +import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.dispatcher.multipart.UploadedFile; +import org.apache.struts2.interceptor.parameter.StrutsParameter; +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 implements UploadedFilesAware { + + private static Log log = LogFactory.getLog(MediaFileEdit.class); + private MediaFileBean bean = new MediaFileBean(); + private MediaFileDirectory directory; + + // replacement file uploaded by the user, if applicable, injected + // by the actionFileUpload interceptor + private UploadedFile uploadedFile = null; + + public MediaFileEdit() { + this.actionName = "mediaFileEdit"; + this.desiredMenu = "editor"; + this.pageTitle = "mediaFile.edit.title"; + } + + /** + * Prepares edit action. + */ + @Override + public void myPrepare() { + refreshAllDirectories(); + try { + MediaFileManager mgr = WebloggerFactory.getWeblogger().getMediaFileManager(); + if (!StringUtils.isEmpty(bean.getDirectoryId())) { + setDirectory(mgr.getMediaFileDirectory(getActionWeblog(), bean.getDirectoryId())); + } + } catch (WebloggerException ex) { + log.error("Error looking up media file directory", ex); + } + + } + + @Override + public void withUploadedFiles(List uploadedFiles) { + this.uploadedFile = uploadedFiles.isEmpty() ? null : uploadedFiles.get(0); + } + + /** + * Validates media file metadata to be updated. + */ + public void myValidate() { + MediaFile fileWithSameName = getDirectory().getMediaFile(getBean().getName()); + if (fileWithSameName != null && !fileWithSameName.getId().equals(getMediaFileId())) { + addError("MediaFile.error.duplicateName", getBean().getName()); + } + } + + /** + * Show form for adding a new media file. + * + * @return String The result of the action. + */ + @SkipValidation + @Override + public String execute() { + MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); + try { + MediaFile mediaFile = manager.getMediaFile(getActionWeblog(), getMediaFileId()); + this.bean.copyFrom(mediaFile); + + } catch (FileIOException ex) { + addError("uploadFiles.error.upload", bean.getName()); + + } catch (Exception e) { + log.error("Error uploading file " + bean.getName(), e); + addError("uploadFiles.error.upload", bean.getName()); + } + + return INPUT; + } + + /** + * Save a media file. + * + * @return String The result of the action. + */ + public String save() { + myValidate(); + if (!hasActionErrors()) { + MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); + try { + MediaFile mediaFile = manager.getMediaFile(getActionWeblog(), getMediaFileId()); + bean.copyTo(mediaFile); + + if (uploadedFile != null + && uploadedFile.getContent() instanceof File uploadFile) { + mediaFile.setLength(uploadFile.length()); String declaredType = MediaTypePolicy.normalizeType( - this.uploadedFileContentType); + uploadedFile.getContentType()); RollerMessages errors = new RollerMessages(); if (!WebloggerFactory.getWeblogger().getFileContentManager().canSave( - getActionWeblog(), this.uploadedFileName, declaredType, - this.uploadedFile.length(), errors)) { + getActionWeblog(), uploadedFile.getOriginalName(), declaredType, + uploadFile.length(), errors)) { throw new FileIOException(errors.toString()); } // Replacing the body re-decides the type, on the same // terms as the original upload. mediaFile.setContentType(MediaTypePolicy.storedTypeFor( - this.uploadedFileName, declaredType, + uploadedFile.getOriginalName(), declaredType, RollerContext.getServletContext()::getMimeType)); - manager.updateMediaFile(getActionWeblog(), mediaFile, - new FileInputStream(this.uploadedFile)); - } else { - manager.updateMediaFile(getActionWeblog(), mediaFile); - } - - // Move file - if (!getBean().getDirectoryId().equals( - mediaFile.getDirectory().getId())) { - log.debug("Processing move of " + mediaFile.getId()); - setSelectedMediaFiles(new String[] { mediaFile.getId() }); - setSelectedDirectory(getBean().getDirectoryId()); - doMoveSelected(); - } - - WebloggerFactory.getWeblogger().flush(); - - addMessage("mediaFile.update.success"); - return SUCCESS; - - } catch (FileIOException ex) { - addError("uploadFiles.error.upload", bean.getName()); - - } catch (Exception e) { - log.error("Error uploading file " + bean.getName(), e); - addError("uploadFiles.error.upload", bean.getName()); - } - - } - return INPUT; - } - - public MediaFileBean getBean() { - return bean; - } - - public void setBean(MediaFileBean b) { - this.bean = b; - } - - public MediaFileDirectory getDirectory() { - return directory; - } - - 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; - } -} + manager.updateMediaFile(getActionWeblog(), mediaFile, + new FileInputStream(uploadFile)); + } else { + manager.updateMediaFile(getActionWeblog(), mediaFile); + } + + // Move file + if (!getBean().getDirectoryId().equals( + mediaFile.getDirectory().getId())) { + log.debug("Processing move of " + mediaFile.getId()); + setSelectedMediaFiles(new String[] { mediaFile.getId() }); + setSelectedDirectory(getBean().getDirectoryId()); + doMoveSelected(); + } + + WebloggerFactory.getWeblogger().flush(); + + addMessage("mediaFile.update.success"); + return SUCCESS; + + } catch (FileIOException ex) { + addError("uploadFiles.error.upload", bean.getName()); + + } catch (Exception e) { + log.error("Error uploading file " + bean.getName(), e); + addError("uploadFiles.error.upload", bean.getName()); + } + + } + return INPUT; + } + + @StrutsParameter(depth = 1) + public MediaFileBean getBean() { + return bean; + } + + public void setBean(MediaFileBean b) { + this.bean = b; + } + + public MediaFileDirectory getDirectory() { + return directory; + } + + public void setDirectory(MediaFileDirectory directory) { + this.directory = directory; + } + +} diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java index c16f0a78eb..172acdf4f0 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java @@ -34,6 +34,7 @@ import org.apache.roller.weblogger.pojos.WeblogPermission; import org.apache.roller.weblogger.ui.struts2.util.KeyValueObject; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; /** @@ -151,6 +152,7 @@ public String getDirectoryId() { * @param directoryId * the directoryId to set */ + @StrutsParameter public void setDirectoryId(String directoryId) { this.directoryId = directoryId; } @@ -166,6 +168,7 @@ public String getDirectoryName() { * @param directoryName * the directoryName to set */ + @StrutsParameter public void setDirectoryName(String directoryName) { this.directoryName = directoryName; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java index 32b83dc340..e52a7b2431 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java @@ -37,6 +37,7 @@ import org.apache.roller.weblogger.ui.struts2.util.KeyValueObject; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; /** @@ -376,6 +377,7 @@ public String getDirectoryId() { return directoryId; } + @StrutsParameter public void setDirectoryId(String id) { this.directoryId = id; } @@ -392,6 +394,7 @@ public String getNewDirectoryName() { return newDirectoryName; } + @StrutsParameter public void setNewDirectoryName(String newDirectoryName) { this.newDirectoryName = newDirectoryName; } @@ -408,6 +411,7 @@ public String getDirectoryName() { return directoryName; } + @StrutsParameter public void setDirectoryName(String path) { this.directoryName = path; } @@ -416,6 +420,7 @@ public String getSortBy() { return sortBy; } + @StrutsParameter public void setSortBy(String sortBy) { this.sortBy = sortBy; } @@ -433,6 +438,7 @@ public boolean myValidate() { return true; } + @StrutsParameter(depth = 1) public MediaFileSearchBean getBean() { return bean; } @@ -477,6 +483,7 @@ public String getViewDirectoryId() { return viewDirectoryId; } + @StrutsParameter public void setViewDirectoryId(String viewDirectoryId) { this.viewDirectoryId = viewDirectoryId; } 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 bda8961946..8c03ccdc0d 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.action.ParametersAware; import org.apache.struts2.dispatcher.HttpParameters; -import org.apache.struts2.dispatcher.Parameter; -import org.apache.struts2.interceptor.HttpParametersAware; /** @@ -42,22 +40,31 @@ * 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 implements ParametersAware { private static final Log log = LogFactory.getLog(Members.class); // raw parameters from request private HttpParameters parameters = HttpParameters.create().build(); + + @Override + public void withParameters(HttpParameters parameters) { + this.parameters = parameters; + } public Members() { log.debug("Instantiating members action"); - + this.actionName = "members"; this.desiredMenu = "editor"; this.pageTitle = "memberPermissions.title"; } - + + @Override + public void myPrepare() { + } + @Override public String execute() { log.debug("Showing weblog members page"); @@ -159,14 +166,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/editor/MembersInvite.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MembersInvite.java index 6d589f9694..b913ea7c7c 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MembersInvite.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MembersInvite.java @@ -31,6 +31,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.MailUtil; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** @@ -167,6 +168,7 @@ public String getUserName() { return userName; } + @StrutsParameter public void setUserName(String userId) { this.userName = userId; } @@ -175,6 +177,7 @@ public String getPermissionString() { return permissionString; } + @StrutsParameter public void setPermissionString(String permission) { this.permissionString = permission; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Pings.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Pings.java index 3a90368f76..1246aec3c6 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Pings.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Pings.java @@ -29,6 +29,7 @@ import org.apache.roller.weblogger.pojos.PingTarget; import org.apache.roller.weblogger.business.pings.WeblogUpdatePinger; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.xmlrpc.XmlRpcException; import java.io.IOException; import java.net.SocketException; @@ -242,6 +243,7 @@ public String getPingTargetId() { return pingTargetId; } + @StrutsParameter public void setPingTargetId(String pingTargetId) { this.pingTargetId = pingTargetId; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java index cb50e00bd8..ea8f5fd29d 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java @@ -32,6 +32,7 @@ import org.apache.roller.weblogger.util.cache.CacheManager; import java.util.Date; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * Action which handles editing for a weblog stylesheet override template. @@ -382,6 +383,7 @@ public String getContentsStandard() { * Sets the contents standard. * @param contents the new contents standard */ + @StrutsParameter public void setContentsStandard(String contents) { this.contentsStandard = contents; } @@ -398,6 +400,7 @@ public String getContentsMobile() { * Sets the contents mobile. * @param contents the new contents mobile */ + @StrutsParameter public void setContentsMobile(String contents) { this.contentsMobile = contents; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java index a1f95cebb0..8553cf18f9 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java @@ -28,6 +28,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; import java.util.Date; @@ -184,6 +185,7 @@ public Map getTemplateLanguages() { } + @StrutsParameter(depth = 1) public TemplateEditBean getBean() { return bean; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java index 157e8f4092..4a7d64f5df 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java @@ -32,6 +32,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import java.util.ArrayList; import java.util.Collections; @@ -320,6 +321,7 @@ public String getNewTmplName() { return newTmplName; } + @StrutsParameter public void setNewTmplName(String newTmplName) { this.newTmplName = newTmplName; } @@ -328,6 +330,7 @@ public ComponentType getNewTmplAction() { return newTmplAction; } + @StrutsParameter public void setNewTmplAction(ComponentType newTmplAction) { this.newTmplAction = newTmplAction; } @@ -336,6 +339,7 @@ public String getRemoveId() { return removeId; } + @StrutsParameter public void setRemoveId(String removeId) { this.removeId = removeId; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/ThemeEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/ThemeEdit.java index bf5a52725a..9318ab9c13 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/ThemeEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/ThemeEdit.java @@ -38,6 +38,7 @@ import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; /** * Action for controlling theme selection. @@ -252,6 +253,7 @@ public String getThemeType() { return themeType; } + @StrutsParameter public void setThemeType(String themeType) { this.themeType = themeType; } @@ -268,6 +270,7 @@ public boolean isImportTheme() { return importTheme; } + @StrutsParameter public void setImportTheme(boolean importTheme) { this.importTheme = importTheme; } @@ -276,6 +279,7 @@ public String getSelectedThemeId() { return selectedThemeId; } + @StrutsParameter public void setSelectedThemeId(String importThemeId) { this.selectedThemeId = importThemeId; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java index 03bbc1ba6e..61ca6acc0c 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java @@ -40,6 +40,7 @@ import org.apache.roller.weblogger.util.Bannedwordslist; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.parameter.StrutsParameter; import org.apache.struts2.interceptor.validation.SkipValidation; @@ -213,6 +214,7 @@ private void myValidate() { } + @StrutsParameter(depth = 1) public WeblogConfigBean getBean() { return bean; } 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 b5be30dcba..361c46817d 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,10 @@ package org.apache.roller.weblogger.ui.struts2.util; -import com.opensymphony.xwork2.ActionSupport; +import org.apache.struts2.action.ServletRequestAware; +import org.apache.struts2.ActionSupport; +import org.apache.struts2.interceptor.parameter.StrutsParameter; +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 +33,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 +40,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 +53,7 @@ * getText(key) on the param passed into setError() and setSuccess(). */ public abstract class UIAction extends ActionSupport - implements UIActionPreparable, UISecurityEnforced, RequestAware { + implements UIActionPreparable, UISecurityEnforced, ServletRequestAware { // a result that sends the user to an access denied warning public static final String DENIED = "access-denied"; @@ -83,18 +83,27 @@ public abstract class UIAction extends ActionSupport protected String pageTitle = null; protected String salt = null; + + private HttpServletRequest servletRequest = null; @Override public void myPrepare() { // no-op } - - @Override - public void setRequest(Map map) { - this.salt = (String) map.get("salt"); + + @Override + public void withServletRequest(HttpServletRequest request) { + this.servletRequest = request; + } + + protected HttpServletRequest getServletRequest() { + return servletRequest; } public String getSalt() { + if (salt == null && servletRequest != null) { + salt = (String) servletRequest.getAttribute("salt"); + } return salt; } @@ -103,6 +112,7 @@ public String getSalt() { * See also https://issues.apache.org/jira/browse/ROL-2068 * @param salt previous salt */ + @StrutsParameter public void setSalt(String salt) { // no-op } @@ -297,6 +307,7 @@ public String getWeblog() { return weblog; } + @StrutsParameter public void setWeblog(String weblog) { this.weblog = weblog; } 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 08b65f4bbc..d3d1442998 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 7e558dd0a9..862f0a3e77 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 8e97899b82..64fbcb8804 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/struts2/util/ValidateSaltInterceptor.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/ValidateSaltInterceptor.java index 76afb21da5..466dbc5ed0 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/ValidateSaltInterceptor.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/ValidateSaltInterceptor.java @@ -19,8 +19,8 @@ package org.apache.roller.weblogger.ui.struts2.util; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -28,9 +28,9 @@ import org.apache.struts2.StrutsStatics; import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.interceptor.AbstractInterceptor; +import org.apache.struts2.ActionContext; +import org.apache.struts2.ActionInvocation; +import org.apache.struts2.interceptor.AbstractInterceptor; /** * Validates salts after Struts has wrapped a multipart form request. 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 0286801c7d..86297d4c80 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 33ab6d9d9a..e9381249d7 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 293ce90da0..f7f81ebc96 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 c6de4c3538..d1582d1c4c 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 eeedc9e322..6c519bd46e 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/MediaTypePolicy.java b/app/src/main/java/org/apache/roller/weblogger/util/MediaTypePolicy.java index 2c8a7ebee7..3fa2675971 100644 --- a/app/src/main/java/org/apache/roller/weblogger/util/MediaTypePolicy.java +++ b/app/src/main/java/org/apache/roller/weblogger/util/MediaTypePolicy.java @@ -24,7 +24,7 @@ import java.util.Locale; import java.util.Set; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; /** * Decides what type an uploaded file is stored as, and how it is served back. 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 7caf9a6826..df9e0368ef 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/MediaCollection.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/MediaCollection.java index b4b100fb87..fde16ec858 100644 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/MediaCollection.java +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/MediaCollection.java @@ -44,7 +44,7 @@ import java.util.StringTokenizer; import java.util.TreeSet; import java.util.UUID; -import javax.servlet.http.HttpServletResponse; +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/webservices/atomprotocol/RollerAtomHandler.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java index d1bdbb2026..d82854c6be 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 @@ -20,7 +20,7 @@ import com.rometools.propono.atom.server.AtomRequest; import java.util.StringTokenizer; import java.util.Locale; -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; @@ -37,13 +37,10 @@ import com.rometools.propono.atom.server.AtomNotFoundException; import com.rometools.rome.feed.atom.Entry; import com.rometools.rome.feed.atom.Feed; -import javax.servlet.http.HttpServletResponse; -import net.oauth.OAuthAccessor; -import net.oauth.OAuthMessage; -import net.oauth.server.OAuthServlet; +import java.nio.charset.StandardCharsets; +import jakarta.servlet.http.HttpServletResponse; 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; @@ -119,18 +116,20 @@ public RollerAtomHandler(HttpServletRequest request, HttpServletResponse respons roller = WebloggerFactory.getWeblogger(); String userName; - String authenticationMethod = WebloggerRuntimeConfig - .getProperty("webservices.atomPubAuth"); - if (authenticationMethod != null) { - authenticationMethod = authenticationMethod.trim().toLowerCase(Locale.ROOT); + String authScheme = WebloggerRuntimeConfig.getProperty("webservices.atomPubAuth"); + if (authScheme != null) { + authScheme = authScheme.trim().toLowerCase(Locale.ROOT); } - if ("oauth".equals(authenticationMethod)) { - userName = authenticationOAUTH(request, response); - } else if ("basic".equals(authenticationMethod)) { + if ("basic".equals(authScheme)) { userName = authenticateBASIC(request); + } else { - log.warn("Unsupported AtomPub authentication method '" + authenticationMethod - + "'; expected 'basic' or 'oauth'. Authentication denied."); + // an upgraded site may still have "oauth" or "wsse" 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 and WSSE support were removed); set it to 'basic'." + + " Refusing AtomPub authentication until it is corrected."); userName = null; } @@ -453,29 +452,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/atomprotocol/RollerAtomHandlerFactory.java b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java deleted file mode 100644 index 4b3e1f3611..0000000000 --- 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 0000000000..643e4ce624 --- /dev/null +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomRequestImpl.java @@ -0,0 +1,137 @@ +/* + * 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() { + // 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 + 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 new file mode 100644 index 0000000000..e30033ed24 --- /dev/null +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomServlet.java @@ -0,0 +1,368 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. The ASF licenses this file to You + * under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. For additional information regarding + * copyright in this work, please see the NOTICE file in the top level + * directory of this distribution. + */ +package org.apache.roller.weblogger.webservices.atomprotocol; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Writer; +import java.util.Collections; +import java.util.Locale; + +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.jdom2.Document; +import org.jdom2.output.Format; +import org.jdom2.output.XMLOutputter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.rometools.propono.atom.common.AtomService; +import com.rometools.propono.atom.common.Categories; +import com.rometools.propono.atom.server.AtomException; +import com.rometools.propono.atom.server.AtomHandler; +import com.rometools.propono.atom.server.AtomMediaResource; +import com.rometools.propono.atom.server.AtomRequest; +import com.rometools.rome.feed.atom.Content; +import com.rometools.rome.feed.atom.Entry; +import com.rometools.rome.feed.atom.Feed; +import com.rometools.rome.feed.atom.Link; +import com.rometools.rome.io.WireFeedOutput; +import com.rometools.rome.io.impl.Atom10Generator; +import com.rometools.rome.io.impl.Atom10Parser; +import org.apache.roller.weblogger.util.Utilities; + +/** + * Forked from rome-propono's AtomServlet to remove the dependency on propono's + * servlet class, which has no Jakarta-compatible release. This servlet directly + * creates a {@link RollerAtomHandler} instead of going through propono's + * AtomHandlerFactory/FactoryFinder lookup. + * + *

Handles Atom Publishing Protocol requests by parsing incoming XML into + * ROME Atom {@link Entry} objects, passing those to the handler, and + * serializing entries and feeds returned by the handler to the response.

+ */ +public class RollerAtomServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** Feed type supported by this servlet */ + public static final String FEED_TYPE = "atom_1.0"; + + private static String contextDirPath = null; + + private static final Logger LOG = LoggerFactory.getLogger(RollerAtomServlet.class); + + static { + Atom10Parser.setResolveURIs(true); + } + + /** + * Create an Atom request handler directly, bypassing propono's factory lookup. + */ + private AtomHandler createAtomRequestHandler(final HttpServletRequest request, final HttpServletResponse response) { + return new RollerAtomHandler(request, response); + } + + /** + * Handles an Atom GET by calling handler and writing results to response. + */ + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { + LOG.debug("Entering"); + final AtomHandler handler = createAtomRequestHandler(req, res); + final String userName = handler.getAuthenticatedUsername(); + if (userName != null) { + final AtomRequest areq = new RollerAtomRequestImpl(req); + try { + if (handler.isAtomServiceURI(areq)) { + // return an Atom Service document + final AtomService service = handler.getAtomService(areq); + final Document doc = service.serviceToDocument(); + res.setContentType("application/atomsvc+xml; charset=utf-8"); + final Writer writer = res.getWriter(); + final XMLOutputter outputter = new XMLOutputter(); + outputter.setFormat(Format.getPrettyFormat()); + outputter.output(doc, writer); + writer.close(); + res.setStatus(HttpServletResponse.SC_OK); + } else if (handler.isCategoriesURI(areq)) { + final Categories cats = handler.getCategories(areq); + res.setContentType("application/xml"); + final Writer writer = res.getWriter(); + final Document catsDoc = new Document(); + catsDoc.setRootElement(cats.categoriesToElement()); + final XMLOutputter outputter = new XMLOutputter(); + outputter.output(catsDoc, writer); + writer.close(); + res.setStatus(HttpServletResponse.SC_OK); + } else if (handler.isCollectionURI(areq)) { + // return a collection + final Feed col = handler.getCollection(areq); + col.setFeedType(FEED_TYPE); + final WireFeedOutput wireFeedOutput = new WireFeedOutput(); + final Document feedDoc = wireFeedOutput.outputJDom(col); + res.setContentType("application/atom+xml; charset=utf-8"); + final Writer writer = res.getWriter(); + final XMLOutputter outputter = new XMLOutputter(); + outputter.setFormat(Format.getPrettyFormat()); + outputter.output(feedDoc, writer); + writer.close(); + res.setStatus(HttpServletResponse.SC_OK); + } else if (handler.isEntryURI(areq)) { + // return an entry + final Entry entry = handler.getEntry(areq); + if (entry != null) { + res.setContentType("application/atom+xml; type=entry; charset=utf-8"); + final Writer writer = res.getWriter(); + Atom10Generator.serializeEntry(entry, writer); + writer.close(); + } else { + res.setStatus(HttpServletResponse.SC_NOT_FOUND); + } + } else if (handler.isMediaEditURI(areq)) { + final AtomMediaResource entry = handler.getMediaResource(areq); + res.setContentType(entry.getContentType()); + res.setContentLength((int) entry.getContentLength()); + Utilities.copyInputToOutput(entry.getInputStream(), res.getOutputStream()); + res.getOutputStream().flush(); + res.getOutputStream().close(); + } else { + res.setStatus(HttpServletResponse.SC_NOT_FOUND); + } + } catch (final AtomException ae) { + res.sendError(ae.getStatus(), ae.getMessage()); + LOG.debug("An error occurred while processing GET", ae); + } catch (final Exception e) { + res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); + LOG.debug("An error occurred while processing GET", e); + } + } else { + res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\""); + res.sendError(HttpServletResponse.SC_UNAUTHORIZED); + } + LOG.debug("Exiting"); + } + + /** + * Handles an Atom POST by calling handler to identify URI, reading/parsing + * data, calling handler and writing results to response. + */ + @Override + protected void doPost(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { + LOG.debug("Entering"); + final AtomHandler handler = createAtomRequestHandler(req, res); + final String userName = handler.getAuthenticatedUsername(); + if (userName != null) { + final AtomRequest areq = new RollerAtomRequestImpl(req); + try { + if (handler.isCollectionURI(areq)) { + + final String contentType = req.getContentType(); + if (contentType != null && contentType.startsWith("application/atom+xml")) { + + // parse incoming entry + final Entry entry = Atom10Parser.parseEntry( + new BufferedReader(new InputStreamReader(req.getInputStream(), "UTF-8")), + null, Locale.US); + + // call handler to post it + final Entry newEntry = handler.postEntry(areq, entry); + + // set Location and Content-Location headers + for (final Object element : newEntry.getOtherLinks()) { + final Link link = (Link) element; + if ("edit".equals(link.getRel())) { + res.addHeader("Location", link.getHrefResolved()); + break; + } + } + for (final Object element : newEntry.getAlternateLinks()) { + final Link link = (Link) element; + if ("alternate".equals(link.getRel())) { + res.addHeader("Content-Location", link.getHrefResolved()); + break; + } + } + + // write entry back out to response + res.setStatus(HttpServletResponse.SC_CREATED); + res.setContentType("application/atom+xml; type=entry; charset=utf-8"); + + final Writer writer = res.getWriter(); + Atom10Generator.serializeEntry(newEntry, writer); + writer.close(); + + } else if (contentType != null) { + + // get incoming title and slug from HTTP header + final String title = areq.getHeader("Title"); + + // create new entry for resource, set title and type + final Entry resource = new Entry(); + resource.setTitle(title); + final Content content = new Content(); + content.setType(areq.getContentType()); + resource.setContents(Collections.singletonList(content)); + + // hand input stream off to handler to post file + final Entry newEntry = handler.postMedia(areq, resource); + + // set Location and Content-Location headers + for (final Object element : newEntry.getOtherLinks()) { + final Link link = (Link) element; + if ("edit".equals(link.getRel())) { + res.addHeader("Location", link.getHrefResolved()); + break; + } + } + for (final Object element : newEntry.getAlternateLinks()) { + final Link link = (Link) element; + if ("alternate".equals(link.getRel())) { + res.addHeader("Content-Location", link.getHrefResolved()); + break; + } + } + + res.setStatus(HttpServletResponse.SC_CREATED); + res.setContentType("application/atom+xml; type=entry; charset=utf-8"); + + final Writer writer = res.getWriter(); + Atom10Generator.serializeEntry(newEntry, writer); + writer.close(); + + } else { + res.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "No content-type specified in request"); + } + + } else { + res.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid collection specified in request"); + } + } catch (final AtomException ae) { + res.sendError(ae.getStatus(), ae.getMessage()); + LOG.debug("An error occurred while processing POST", ae); + } catch (final Exception e) { + res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); + LOG.debug("An error occurred while processing POST", e); + } + } else { + res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\""); + res.sendError(HttpServletResponse.SC_UNAUTHORIZED); + } + LOG.debug("Exiting"); + } + + /** + * Handles an Atom PUT by calling handler to identify URI, reading/parsing + * data, calling handler and writing results to response. + */ + @Override + protected void doPut(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { + LOG.debug("Entering"); + final AtomHandler handler = createAtomRequestHandler(req, res); + final String userName = handler.getAuthenticatedUsername(); + if (userName != null) { + final AtomRequest areq = new RollerAtomRequestImpl(req); + try { + if (handler.isEntryURI(areq)) { + + // parse incoming entry + final Entry unsavedEntry = Atom10Parser.parseEntry( + new BufferedReader(new InputStreamReader(req.getInputStream(), "UTF-8")), + null, Locale.US); + + // call handler to put entry + handler.putEntry(areq, unsavedEntry); + + res.setStatus(HttpServletResponse.SC_OK); + + } else if (handler.isMediaEditURI(areq)) { + + // hand input stream to handler + handler.putMedia(areq); + + res.setStatus(HttpServletResponse.SC_OK); + + } else { + res.setStatus(HttpServletResponse.SC_NOT_FOUND); + } + } catch (final AtomException ae) { + res.sendError(ae.getStatus(), ae.getMessage()); + LOG.debug("An error occurred while processing PUT", ae); + } catch (final Exception e) { + res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); + LOG.debug("An error occurred while processing PUT", e); + } + } else { + res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\""); + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + } + LOG.debug("Exiting"); + } + + /** + * Handle Atom DELETE by calling appropriate handler. + */ + @Override + protected void doDelete(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { + LOG.debug("Entering"); + final AtomHandler handler = createAtomRequestHandler(req, res); + final String userName = handler.getAuthenticatedUsername(); + if (userName != null) { + final AtomRequest areq = new RollerAtomRequestImpl(req); + try { + if (handler.isEntryURI(areq)) { + handler.deleteEntry(areq); + res.setStatus(HttpServletResponse.SC_OK); + } else { + res.setStatus(HttpServletResponse.SC_NOT_FOUND); + } + } catch (final AtomException ae) { + res.sendError(ae.getStatus(), ae.getMessage()); + LOG.debug("An error occurred while processing DELETE", ae); + } catch (final Exception e) { + res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); + LOG.debug("An error occurred while processing DELETE", e); + } + } else { + res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\""); + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + } + LOG.debug("Exiting"); + } + + /** + * Initialize servlet. + */ + @Override + public void init(final ServletConfig config) throws ServletException { + super.init(config); + contextDirPath = getServletContext().getRealPath("/"); + } + + /** + * Get absolute path to Servlet context directory. + */ + public static String getContextDirPath() { + return contextDirPath; + } +} diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java deleted file mode 100644 index 344fac29d2..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2007 AOL, LLC. - * Portions Copyright 2009 Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.roller.weblogger.webservices.oauth; - -import java.io.IOException; -import java.io.OutputStream; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import net.oauth.OAuth; -import net.oauth.OAuthAccessor; -import net.oauth.OAuthMessage; -import net.oauth.OAuthProblemException; -import net.oauth.server.OAuthServlet; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.business.OAuthManager; -import org.apache.roller.weblogger.business.WebloggerFactory; - -/** - * Access Token request handler - * - * @author Praveen Alavilli - * @author Dave Johnson (adapted for Roller) - */ -public class AccessTokenServlet extends HttpServlet { - protected static final Log log = LogFactory.getFactory().getInstance(AccessTokenServlet.class); - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - processRequest(request, response); - } - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - processRequest(request, response); - } - - public void processRequest(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - try{ - OAuthMessage requestMessage = OAuthServlet.getMessage(request, null); - - OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager(); - OAuthAccessor accessor = omgr.getAccessor(requestMessage); - omgr.getValidator().validateMessage(requestMessage, accessor); - - // make sure token is authorized - if (!Boolean.TRUE.equals(accessor.getProperty("authorized"))) { - OAuthProblemException problem = new OAuthProblemException("permission_denied"); - throw problem; - } - // generate access token and secret - if (accessor.accessToken == null) { - omgr.generateAccessToken(accessor); - WebloggerFactory.getWeblogger().flush(); - } - - response.setContentType("text/plain"); - try (OutputStream out = response.getOutputStream()) { - OAuth.formEncode(OAuth.newList( - "oauth_token", accessor.accessToken, - "oauth_token_secret", accessor.tokenSecret), out); - } - - } catch (Exception e){ - handleException(e, request, response, true); - } - } - - public void handleException(Exception e, HttpServletRequest request, - HttpServletResponse response, boolean sendBody) - throws IOException, ServletException { - log.debug("ERROR authorizing token", e); - String realm = (request.isSecure())?"https://":"http://"; - realm += request.getLocalName(); - OAuthServlet.handleException(response, e, realm, sendBody); - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java deleted file mode 100644 index cc54c4702f..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java +++ /dev/null @@ -1,276 +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.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; -import org.apache.roller.weblogger.pojos.User; -import org.apache.roller.weblogger.ui.core.RollerSession; -import org.apache.roller.weblogger.ui.core.filters.SaltValidator; -import org.springframework.security.web.savedrequest.SimpleSavedRequest; - -/** - * 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); - - /** - * One response for every refusal, so the endpoint reveals nothing about - * tokens the caller does not hold. - */ - private static final String PERMISSION_DENIED = "permission_denied"; - - - @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 (accessor == null || accessor.consumer == null - || accessor.requestToken == null) { - denyPermission(response); - return; - } - - if (Boolean.TRUE.equals(accessor.getProperty("authorized"))) { - // already authorized send the user back - returnToConsumer(request, response, accessor); - } else { - User user = getAuthenticatedUser(request); - if (user == null) { - sendToLogin(request, response, accessor); - return; - } - if (!Boolean.TRUE.equals(user.getEnabled())) { - denyPermission(response); - return; - } - sendToAuthorizePage(request, response, accessor); - } - - } catch (OAuthProblemException e) { - denyPermission(response); - } 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); - if (accessor == null || accessor.consumer == null || accessor.requestToken == null) { - denyPermission(response); - return; - } - - // The approving identity comes from the browser session, consistent - // with the rest of the UI. Without a session there is nobody to - // approve on behalf of, so send the caller through the login flow. - User user = getAuthenticatedUser(request); - if (user == null) { - sendToLogin(request, response, accessor); - return; - } - if (!Boolean.TRUE.equals(user.getEnabled())) { - denyPermission(response); - return; - } - String userId = user.getUserName(); - - // A consumer key bound to one user may only be approved by that - // user. A site-wide key has no bound user and is approved as - // whoever is logged in. - String consumerUserId = (String)accessor.consumer.getProperty("userId"); - if (consumerUserId != null && !consumerUserId.equals(userId)) { - denyPermission(response); - return; - } - - // Older clients still post the identity; accept it only when it - // agrees with the session. - String submittedUserId = request.getParameter("userId"); - if (submittedUserId == null) { - submittedUserId = request.getParameter("xoauth_requestor_id"); - } - if (submittedUserId != null && !submittedUserId.equals(userId)) { - denyPermission(response); - return; - } - - // A stale or already-used consent form is safe to show again. The - // forward passes through LoadSaltFilter and receives a fresh salt. - if (!hasValidSalt(request)) { - sendToAuthorizePage(request, response, accessor); - return; - } - - // Claim the pending request token in one conditional statement, so - // approval is one-shot. A token that is missing, belongs to another - // consumer, or has already been approved or exchanged all produce - // the same answer here and the same response below. - if (!omgr.authorizeRequestToken( - accessor.consumer.consumerKey, accessor.requestToken, userId)) { - denyPermission(response); - return; - } - WebloggerFactory.getWeblogger().flush(); - - accessor.setProperty("userId", userId); - accessor.setProperty("authorized", Boolean.TRUE); - - returnToConsumer(request, response, accessor); - - } catch (OAuthProblemException e) { - denyPermission(response); - } catch (Exception e){ - handleException(e, request, response, true); - } - } - - /** - * The Roller user behind this request's session, or null if there is none. - */ - private User getAuthenticatedUser(HttpServletRequest request) { - RollerSession rollerSession = RollerSession.getRollerSession(request); - return rollerSession == null ? null : rollerSession.getAuthenticatedUser(); - } - - boolean hasValidSalt(HttpServletRequest request) { - return SaltValidator.consumeSubmittedSalt(request); - } - - private void sendToLogin(HttpServletRequest request, - HttpServletResponse response, OAuthAccessor accessor) throws IOException { - String resume = OAuth.addParameters(request.getRequestURL().toString(), - "oauth_token", accessor.requestToken); - String callback = request.getParameter("oauth_callback"); - if (callback != null) { - resume = OAuth.addParameters(resume, "oauth_callback", callback); - } - - SimpleSavedRequest savedRequest = new SimpleSavedRequest(resume); - savedRequest.setMethod("GET"); - request.getSession(true).setAttribute( - "SPRING_SECURITY_SAVED_REQUEST", savedRequest); - response.sendRedirect(request.getContextPath() + "/roller-ui/login.rol"); - } - - /** - * Refuse the approval, in the OAuth problem-reporting form and with the - * same body for every reason. Written directly rather than thrown so the - * response does not vary with how the library happens to render a given - * exception. - */ - private void denyPermission(HttpServletResponse response) throws IOException { - response.setStatus(HttpServletResponse.SC_FORBIDDEN); - response.setContentType("text/plain"); - try (PrintWriter out = response.getWriter()) { - out.println("oauth_problem=" + PERMISSION_DENIED); - } - } - - private void sendToAuthorizePage(HttpServletRequest request, - HttpServletResponse response, OAuthAccessor accessor) - throws IOException, ServletException{ - String callback = request.getParameter("oauth_callback"); - if(callback == null || callback.length() <=0) { - callback = "none"; - } - String consumer_description = (String)accessor.consumer.getProperty("description"); - request.setAttribute("CONS_DESC", consumer_description); - request.setAttribute("CALLBACK", callback); - request.setAttribute("TOKEN", accessor.requestToken); - request.getRequestDispatcher("/roller-ui/oauthAuthorize.rol").forward(request, response); - } - - private void returnToConsumer(HttpServletRequest request, - HttpServletResponse response, OAuthAccessor accessor) - throws IOException, ServletException { - - // send the user back to site's callBackUrl - String callback = request.getParameter("oauth_callback"); - if ("none".equals(callback) - && accessor.consumer.callbackURL != null - && accessor.consumer.callbackURL.length() > 0){ - // first check if we have something in our properties file - callback = accessor.consumer.callbackURL; - } - - if ( "none".equals(callback) ) { - // no call back it must be a client - response.setContentType("text/plain"); - try (PrintWriter out = response.getWriter()) { - out.println("You have successfully authorized for consumer key '" - + accessor.consumer.consumerKey - + "'. Please close this browser window and click continue" - + " in the client."); - } - } else { - // if callback is not passed in, use the callback from config - if(callback == null || callback.length() <=0 ) { - callback = accessor.consumer.callbackURL; - } - String token = accessor.requestToken; - if (token != null && callback != null) { - callback = OAuth.addParameters(callback, "oauth_token", token); - } - - response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); - response.setHeader("Location", callback); - } - } - - public void handleException(Exception e, HttpServletRequest request, - HttpServletResponse response, boolean sendBody) - throws IOException, ServletException { - log.debug("ERROR authorizing token", e); - String realm = (request.isSecure())?"https://":"http://"; - realm += request.getLocalName(); - OAuthServlet.handleException(response, e, realm, sendBody); - } -} diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java deleted file mode 100644 index 797252f8bb..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2007 AOL, LLC. - * Portions Copyright 2009 Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.roller.weblogger.webservices.oauth; - -import java.io.IOException; -import java.io.OutputStream; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import net.oauth.OAuth; -import net.oauth.OAuthAccessor; -import net.oauth.OAuthConsumer; -import net.oauth.OAuthMessage; -import net.oauth.server.OAuthServlet; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.business.OAuthManager; -import org.apache.roller.weblogger.business.WebloggerFactory; - - -/** - * Request token request handler - * - * @author Praveen Alavilli - * @author Dave Johnson (adapted for Roller) - */ -public class RequestTokenServlet extends HttpServlet { - protected static final Log log = LogFactory.getFactory().getInstance(RequestTokenServlet.class); - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - processRequest(request, response); - } - - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - processRequest(request, response); - } - - public void processRequest(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - - try { - OAuthMessage requestMessage = OAuthServlet.getMessage(request, null); - OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager(); - OAuthAccessor accessor = omgr.getAccessor(requestMessage); - - if (accessor == null) { - - OAuthConsumer consumer = omgr.getConsumer(requestMessage); - accessor = new OAuthAccessor(consumer); - omgr.getValidator().validateMessage(requestMessage, accessor); - - { - // Support the 'Variable Accessor Secret' extension - // described in http://oauth.pbwiki.com/AccessorSecret - String secret = requestMessage.getParameter("oauth_accessor_secret"); - if (secret != null) { - accessor.setProperty(OAuthConsumer.ACCESSOR_SECRET, secret); - } - } - - // generate request_token and secret - omgr.generateRequestToken(accessor); - WebloggerFactory.getWeblogger().flush(); - } - - response.setContentType("text/plain"); - try (OutputStream out = response.getOutputStream()) { - String token = accessor.requestToken != null ? accessor.requestToken: accessor.accessToken; - OAuth.formEncode(OAuth.newList( - "oauth_token", token, - "oauth_token_secret", accessor.tokenSecret), out); - } - - } catch (Exception e){ - handleException(e, request, response, true); - } - - } - - public void handleException(Exception e, HttpServletRequest request, - HttpServletResponse response, boolean sendBody) - throws IOException, ServletException { - log.debug("ERROR authorizing token", e); - String realm = (request.isSecure())?"https://":"http://"; - realm += request.getLocalName(); - OAuthServlet.handleException(response, e, realm, sendBody); - } -} diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/opensearch/OpenSearchServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/opensearch/OpenSearchServlet.java index fe8e7b57a9..511866b28d 100644 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/opensearch/OpenSearchServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/opensearch/OpenSearchServlet.java @@ -19,10 +19,10 @@ import java.io.IOException; import java.io.PrintWriter; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.apache.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.business.URLStrategy; diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/tagdata/TagDataServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/tagdata/TagDataServlet.java index e239839ebb..7712e156ec 100644 --- a/app/src/main/java/org/apache/roller/weblogger/webservices/tagdata/TagDataServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/tagdata/TagDataServlet.java @@ -22,10 +22,10 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringEscapeUtils; import org.apache.roller.weblogger.WebloggerException; diff --git a/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServlet.java b/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServlet.java new file mode 100644 index 0000000000..62db6b427e --- /dev/null +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServlet.java @@ -0,0 +1,213 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Derived from org.apache.xmlrpc.webserver.XmlRpcServlet + * in Apache XML-RPC 3.1.3. Forked into the Roller codebase because + * xmlrpc-server has no Jakarta Servlet compatible release. + */ +package org.apache.roller.weblogger.webservices.xmlrpc; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.net.URL; +import java.util.Enumeration; + +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.xmlrpc.XmlRpcConfig; +import org.apache.xmlrpc.XmlRpcException; +import org.apache.xmlrpc.common.TypeConverterFactory; +import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping; +import org.apache.xmlrpc.server.PropertyHandlerMapping; +import org.apache.xmlrpc.server.RequestProcessorFactoryFactory; +import org.apache.xmlrpc.server.XmlRpcHandlerMapping; +import org.apache.xmlrpc.server.XmlRpcServer; +import org.apache.xmlrpc.util.ReflectionUtil; + + +/** + * A servlet for processing XML-RPC requests, derived from the Apache XML-RPC + * library's {@code XmlRpcServlet}. The typical use is to configure it in + * {@code web.xml} with an {@code XmlRpcServlet.properties} resource on the + * classpath that maps handler names to implementation classes. + * + *

The servlet accepts the following init parameters:

+ * + * + * + *
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 0000000000..3bed68a639 --- /dev/null +++ b/app/src/main/java/org/apache/roller/weblogger/webservices/xmlrpc/RollerXmlRpcServletServer.java @@ -0,0 +1,150 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Derived from org.apache.xmlrpc.webserver.XmlRpcServletServer + * in Apache XML-RPC 3.1.3. Forked into the Roller codebase because + * xmlrpc-server has no Jakarta Servlet compatible release. + */ +package org.apache.roller.weblogger.webservices.xmlrpc; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.apache.xmlrpc.XmlRpcException; +import org.apache.xmlrpc.common.ServerStreamConnection; +import org.apache.xmlrpc.common.XmlRpcHttpRequestConfig; +import org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl; +import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig; +import org.apache.xmlrpc.server.XmlRpcHttpServer; +import org.apache.xmlrpc.server.XmlRpcHttpServerConfig; +import org.apache.xmlrpc.util.HttpUtil; + + +/** + * An extension of {@link org.apache.xmlrpc.server.XmlRpcServer} + * suitable for processing servlet requests. + */ +public class RollerXmlRpcServletServer extends XmlRpcHttpServer { + + protected static class ServletStreamConnection implements ServerStreamConnection { + private final HttpServletRequest request; + private final HttpServletResponse response; + + protected ServletStreamConnection(HttpServletRequest pRequest, + HttpServletResponse pResponse) { + request = pRequest; + response = pResponse; + } + + /** Returns the servlet request. */ + public HttpServletRequest getRequest() { return request; } + + /** Returns the servlet response. */ + public HttpServletResponse getResponse() { return response; } + + public InputStream newInputStream() throws IOException { + return request.getInputStream(); + } + + public OutputStream newOutputStream() throws IOException { + response.setContentType("text/xml"); + return response.getOutputStream(); + } + + public void close() throws IOException { + response.getOutputStream().close(); + } + } + + /** + * @param pRequest The request object. + */ + protected XmlRpcHttpRequestConfigImpl newConfig(HttpServletRequest pRequest) { + return new XmlRpcHttpRequestConfigImpl(); + } + + protected XmlRpcHttpRequestConfigImpl getConfig(HttpServletRequest pRequest) { + XmlRpcHttpRequestConfigImpl result = newConfig(pRequest); + XmlRpcHttpServerConfig serverConfig = (XmlRpcHttpServerConfig) getConfig(); + result.setBasicEncoding(serverConfig.getBasicEncoding()); + result.setContentLengthOptional(serverConfig.isContentLengthOptional() + && (pRequest.getHeader("Content-Length") == null)); + result.setEnabledForExtensions(serverConfig.isEnabledForExtensions()); + result.setGzipCompressing(HttpUtil.isUsingGzipEncoding(pRequest.getHeader("Content-Encoding"))); + result.setGzipRequesting(HttpUtil.isUsingGzipEncoding(pRequest.getHeaders("Accept-Encoding"))); + result.setEncoding(pRequest.getCharacterEncoding()); + result.setEnabledForExceptions(serverConfig.isEnabledForExceptions()); + HttpUtil.parseAuthorization(result, pRequest.getHeader("Authorization")); + return result; + } + + protected ServletStreamConnection newStreamConnection(HttpServletRequest pRequest, + HttpServletResponse pResponse) { + return new ServletStreamConnection(pRequest, pResponse); + } + + /** + * Processes the servlet request. + * @param pRequest The servlet request being read. + * @param pResponse The servlet response being created. + * @throws IOException Reading the request or writing the response failed. + * @throws ServletException Processing the request failed. + */ + public void execute(HttpServletRequest pRequest, HttpServletResponse pResponse) + throws ServletException, IOException { + XmlRpcHttpRequestConfigImpl config = getConfig(pRequest); + ServletStreamConnection ssc = newStreamConnection(pRequest, pResponse); + try { + super.execute(config, ssc); + } catch (XmlRpcException e) { + throw new ServletException(e); + } + } + + /** Returns whether the request's content length is required. */ + protected boolean isContentLengthRequired(XmlRpcStreamRequestConfig pConfig) { + if (!pConfig.isEnabledForExtensions()) { + // The spec requires a content-length. + return true; + } + boolean isRequired = !((XmlRpcHttpServerConfig) getConfig()).isContentLengthOptional(); + if (pConfig instanceof XmlRpcHttpRequestConfig) { + isRequired |= !((XmlRpcHttpRequestConfig) pConfig).isContentLengthOptional(); + } + return isRequired; + } + + protected OutputStream getOutputStream(XmlRpcStreamRequestConfig pConfig, + ServerStreamConnection pConnection, + int pSize) throws IOException { + if (pSize != -1) { + ((ServletStreamConnection) pConnection).getResponse().setContentLength(pSize); + } + return super.getOutputStream(pConfig, pConnection, pSize); + } + + protected void setResponseHeader(ServerStreamConnection pConnection, String pHeader, String pValue) { + ((ServletStreamConnection) pConnection).getResponse().setHeader(pHeader, pValue); + } +} diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties index 1aba85d745..bc61ab836c 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 or oauth) +configForm.AtomPubAuth=AtomPub authentication (basic) configForm.enableXmlRpc=Enable Blogger / MetaWeblog API configForm.weblogSettings=Weblog Rendering Settings @@ -948,37 +948,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 @@ -1842,10 +1811,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 0111318f0c..f6ca6b5561 100644 --- a/app/src/main/resources/ApplicationResources_ja.properties +++ b/app/src/main/resources/ApplicationResources_ja.properties @@ -1061,7 +1061,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 @@ -1089,7 +1088,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 @@ -1112,7 +1110,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 @@ -1146,7 +1143,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 @@ -1155,7 +1151,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 @@ -1183,7 +1178,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 @@ -1192,12 +1186,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 @@ -1256,7 +1248,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 @@ -1305,12 +1296,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 @@ -1333,7 +1322,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} @@ -1362,7 +1350,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 \u307E\u305F\u306F oauth) +configForm.AtomPubAuth=AtomPub\u8A8D\u8A3C (basic) 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 @@ -1374,7 +1362,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 @@ -1387,9 +1374,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 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 themeEditor.yourCustomStylesheet=\u30AB\u30B9\u30BF\u30E0\u30FB\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u30FB\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\u3002 @@ -1401,12 +1386,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? @@ -1415,7 +1398,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 @@ -1428,6 +1410,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 b14a965252..03792b4a7a 100644 --- a/app/src/main/resources/ApplicationResources_zh_CN.properties +++ b/app/src/main/resources/ApplicationResources_zh_CN.properties @@ -336,7 +336,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) +configForm.AtomPubAuth=AtomPub \u8BA4\u8BC1\u65B9\u5F0F (basic) configForm.enableXmlRpc=\u542F\u7528 Blogger / MetaWeblog API configForm.weblogSettings=\u535A\u5BA2\u663E\u793A\u8BBE\u7F6E @@ -930,37 +930,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 @@ -1817,10 +1786,6 @@ yourWebsites.createWeblog.desc=\u4F60\u8FD8\u6709\u66F4\u591A\u60F3\u8981\u8868\ yourWebsites.editProfile=\u7F16\u8F91\u7528\u6237\u4FE1\u606F yourWebsites.editProfile.desc=\u4FEE\u6539\u5BC6\u7801\u3001\u8054\u7CFB\u4FE1\u606F\u6216\u754C\u9762\u8BED\u8A00\u3002 -yourWebsites.oauthKeys=OAuth\u51ED\u8BC1 -yourWebsites.oauthKeys.desc=\u5141\u8BB8\u5176\u4ED6\u7AD9\u70B9\u548C\u7A0B\u5E8F\u8FDC\u7A0B\u8BBF\u95EE\u4F60\u7684\u8D26\u53F7\u3002 - - yourWebsites.globalAdmin=\u670D\u52A1\u5668\u7BA1\u7406 yourWebsites.globalAdmin.desc=\u8FDB\u884C\u5168\u7AD9\u8303\u56F4\u7684\u7BA1\u7406\u64CD\u4F5C\u3002 diff --git a/app/src/main/resources/META-INF/persistence.xml b/app/src/main/resources/META-INF/persistence.xml index 199c87280b..e27c7b43ff 100644 --- a/app/src/main/resources/META-INF/persistence.xml +++ b/app/src/main/resources/META-INF/persistence.xml @@ -1,5 +1,8 @@ - + + "-//Apache Software Foundation//DTD Struts Configuration 6.5//EN" + "https://struts.apache.org/dtds/struts-6.5.dtd"> + + + + + + @@ -50,14 +60,16 @@ - + + - + @@ -157,18 +169,6 @@ execute,save - - .OAuthKeys - execute - - - - .OAuthAuthorize - execute - - .CreateWeblog diff --git a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp index 29cbb23d1b..b70cc1eeb0 100644 --- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp @@ -34,14 +34,6 @@ ">

- <%-- Edit profile --%> - - -

- ">

-

-
- <%-- Create weblog --%> diff --git a/app/src/main/webapp/WEB-INF/jsps/core/OAuthAuthorize.jsp b/app/src/main/webapp/WEB-INF/jsps/core/OAuthAuthorize.jsp deleted file mode 100644 index befdfe26fd..0000000000 --- a/app/src/main/webapp/WEB-INF/jsps/core/OAuthAuthorize.jsp +++ /dev/null @@ -1,40 +0,0 @@ -<%-- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. The ASF licenses this file to You - under the Apache License, Version 2.0 (the "License"); you may not - use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. For additional information regarding - copyright in this work, please see the NOTICE file in the top level - directory of this distribution. ---%> -<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> - -

- - - -

- -

- - - -

- -
- - - - - - - - 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 778c73d039..0000000000 --- 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 97d46374e3..d3a0a956f7 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/jsps/tiles/head.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp index 42ad1d1d8b..c6f88c6f46 100644 --- a/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp @@ -21,8 +21,8 @@ You can override it with your own file via WEB-INF/tiles-def.xml - - + + diff --git a/app/src/main/webapp/WEB-INF/security.xml b/app/src/main/webapp/WEB-INF/security.xml index 18ed9206a2..68a6644b23 100644 --- a/app/src/main/webapp/WEB-INF/security.xml +++ b/app/src/main/webapp/WEB-INF/security.xml @@ -28,14 +28,17 @@ - - - - - - - - + + + + + + + + + + - - @@ -57,25 +58,15 @@ - - - - - - - - - - + @@ -91,18 +82,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 d3750ef866..4538650f7a 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. --> - + @@ -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 8b1b550e3c..239dc1b038 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_1.xsd" + version="6.1"> Roller Weblogger @@ -12,7 +12,7 @@ - javax.servlet.jsp.jstl.fmt.localizationContext + jakarta.servlet.jsp.jstl.fmt.localizationContext ApplicationResources @@ -286,7 +286,7 @@ AtomServlet - com.rometools.propono.atom.server.AtomServlet + org.apache.roller.weblogger.webservices.atomprotocol.RollerAtomServlet @@ -311,7 +311,7 @@ XmlRpcServlet - org.apache.xmlrpc.webserver.XmlRpcServlet + org.apache.roller.weblogger.webservices.xmlrpc.RollerXmlRpcServlet Sets whether the servlet supports vendor extensions for XML-RPC. @@ -323,46 +323,6 @@ - - WebjarsServlet - org.webjars.servlet.WebjarsServlet - 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 @@ -458,11 +418,6 @@ /roller-services/opensearch/* - - WebjarsServlet - /webjars/* - - 30 @@ -512,7 +467,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 06c8194f7a..a476f40895 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 33b01730fe..5ee7ba1ded 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 ea17811662..aba8881ebe 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 45211b9eb6..e7023f4b48 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/business/jpa/JPAOAuthManagerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java deleted file mode 100644 index 1791d46e03..0000000000 --- a/app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java +++ /dev/null @@ -1,124 +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)); - } - - @Test - public void testAuthorizeRequestTokenTransition() throws Exception { - JPAOAuthManagerImpl omgr = (JPAOAuthManagerImpl) - WebloggerFactory.getWeblogger().getOAuthManager(); - - String consumerKey = "authorization-consumer"; - String requestToken = "pending-request-token"; - OAuthConsumer consumer = omgr.addConsumer("authorization-owner", consumerKey); - - OAuthAccessor accessor = new OAuthAccessor(consumer); - accessor.requestToken = requestToken; - accessor.tokenSecret = "pending-token-secret"; - omgr.addAccessor(accessor); - TestUtils.endSession(true); - - assertFalse(omgr.authorizeRequestToken(consumerKey, "another-token", "alice")); - assertTrue(omgr.authorizeRequestToken(consumerKey, requestToken, "alice")); - assertTrue(omgr.authorizeRequestToken(consumerKey, requestToken, "alice")); - assertFalse(omgr.authorizeRequestToken(consumerKey, requestToken, "bob")); - TestUtils.endSession(true); - - OAuthAccessor authorized = omgr.getAccessorByToken(requestToken); - assertNotNull(authorized); - assertEquals("alice", authorized.getProperty("userId")); - assertEquals(Boolean.TRUE, authorized.getProperty("authorized")); - - omgr.removeAccessor(authorized); - omgr.removeConsumer(consumer); - TestUtils.endSession(true); - } -} 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 ea8522f933..5fde0cc060 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 2087a005b3..5163acd2ce 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.*; @@ -76,7 +76,7 @@ public void testDoFilterWithNullRollerSession() throws Exception { @Test void firstFormHasAUsableSalt() throws Exception { - javax.servlet.http.HttpSession session = mock(javax.servlet.http.HttpSession.class); + jakarta.servlet.http.HttpSession session = mock(jakarta.servlet.http.HttpSession.class); java.util.Map attributes = new java.util.HashMap<>(); java.util.Map sessionAttributes = new java.util.HashMap<>(); when(request.getSession(true)).thenAnswer(invocation -> { 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 5f0715bee0..a85c4716be 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 @@ -9,10 +9,11 @@ import org.mockito.MockedStatic; import org.mockito.MockitoAnnotations; -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.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 1ca19b1161..07da2b7b9b 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 9c38e3bda7..c0886fd834 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; diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticatorTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticatorTest.java index 08e25cfc19..8c1e6a0020 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticatorTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/LdapCommentAuthenticatorTest.java @@ -17,8 +17,8 @@ package org.apache.roller.weblogger.ui.rendering.plugins.comments; import java.util.Locale; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/ajax/CommentDataServletTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/ajax/CommentDataServletTest.java index 9c3e87618a..14b0e19f6a 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/ajax/CommentDataServletTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/ajax/CommentDataServletTest.java @@ -25,10 +25,10 @@ import java.io.StringWriter; import java.nio.charset.StandardCharsets; -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.roller.weblogger.business.Weblogger; import org.apache.roller.weblogger.business.WebloggerFactory; diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/AuthoringActionScopingTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/AuthoringActionScopingTest.java index f03a484542..0cdff4e096 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/AuthoringActionScopingTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/AuthoringActionScopingTest.java @@ -18,11 +18,11 @@ package org.apache.roller.weblogger.ui.struts2.editor; -import com.opensymphony.xwork2.DefaultTextProvider; -import com.opensymphony.xwork2.TextProvider; -import com.opensymphony.xwork2.TextProviderFactory; -import com.opensymphony.xwork2.inject.Container; -import com.opensymphony.xwork2.inject.Scope; +import org.apache.struts2.text.DefaultTextProvider; +import org.apache.struts2.text.TextProvider; +import org.apache.struts2.text.TextProviderFactory; +import org.apache.struts2.inject.Container; +import org.apache.struts2.inject.Scope; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.TestUtils; @@ -447,5 +447,9 @@ public void setScopeStrategy(Scope.Strategy strategy) { @Override public void removeScopeStrategy() { } + + @Override + public void destroy() { + } }; } diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/StrutsParameterAnnotationTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/StrutsParameterAnnotationTest.java new file mode 100644 index 0000000000..72b5a65bfb --- /dev/null +++ b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/StrutsParameterAnnotationTest.java @@ -0,0 +1,330 @@ +/* + * 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. 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.util; + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.struts2.interceptor.parameter.StrutsParameterAuthorizer; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Struts only binds request parameters to members annotated with + * {@code @StrutsParameter}. Checks that every field submitted by the Struts + * forms in the JSPs, every parameter of the Struts URLs they build, and every + * parameter passed by a redirectAction result in struts.xml is authorized on + * the action class it is sent to, using Struts' own authorization rules. + */ +public class StrutsParameterAnnotationTest { + + /** + * Parameters that are submitted but intentionally not bound, keyed by + * action class simple name and parameter name. + */ + private static final Set NOT_BOUND = Set.of( + // set from the static of the action mapping in struts.xml + "PingTargetEdit.actionName", + "FolderEdit.actionName", + // no such property; the hidden fields are leftovers in the JSPs + "Categories.categoryId", + "WeblogConfig.defaultPlugins"); + + /** + * Forms whose target cannot be read from the JSP, keyed by JSP path and + * form id. An empty list skips the form. + */ + private static final Map> FORM_TARGETS = Map.of( + // posted by JavaScript to actionName + ".rol" + "admin/PingTargets.jsp#pingTargetEditForm", + List.of("commonPingTargetAdd", "commonPingTargetEdit"), + // popup that is not reachable from any page + "editor/MediaFileAddExternalInclude.jsp#entry", List.of()); + + private static final Pattern STRUTS_TAG = Pattern.compile( + "<(/?)s:(\\w+)((?:[^>\"']|\"[^\"]*\"|'[^']*')*)>"); + private static final Pattern SET_TAG = Pattern.compile( + "([^<]*)"); + private static final Pattern VAR_REF = Pattern.compile("%\\{#(\\w+)}"); + private static final Set FIELD_TAGS = Set.of( + "textfield", "hidden", "password", "textarea", "checkbox", + "checkboxlist", "select", "radio", "doubleselect", "combobox"); + + private static Path jspDirectory; + private static Map>> actions; + private static Document strutsXml; + + private final ClassAuthorizer authorizer = new ClassAuthorizer(); + private final Set failures = new TreeSet<>(); + private int checked = 0; + + @BeforeAll + public static void loadConfiguration() throws Exception { + Path projectDirectory = Path.of( + System.getProperty("project.build.directory")).getParent(); + jspDirectory = projectDirectory.resolve("src/main/webapp/WEB-INF/jsps"); + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setFeature( + "http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + try (InputStream in = StrutsParameterAnnotationTest.class.getResourceAsStream("/struts.xml")) { + strutsXml = factory.newDocumentBuilder().parse(in); + } + + actions = new HashMap<>(); + NodeList nodes = strutsXml.getElementsByTagName("action"); + for (int i = 0; i < nodes.getLength(); i++) { + Element action = (Element) nodes.item(i); + if (!action.getAttribute("class").isEmpty()) { + actions.computeIfAbsent(action.getAttribute("name"), k -> new LinkedHashSet<>()) + .add(Class.forName(action.getAttribute("class"), false, + StrutsParameterAnnotationTest.class.getClassLoader())); + } + } + } + + @Test + public void testFormFieldsAreAuthorized() throws IOException { + int forms = 0; + for (Path jsp : jsps()) { + String relative = jspDirectory.relativize(jsp).toString().replace('\\', '/'); + String content = Files.readString(jsp); + Map> vars = setVariables(content); + + Matcher m = STRUTS_TAG.matcher(content); + String formKey = null; + Set targets = null; + Set fields = null; + while (m.find()) { + boolean closing = !m.group(1).isEmpty(); + String tag = m.group(2); + String attrs = m.group(3); + if ("form".equals(tag) && !closing) { + formKey = relative + "#" + attr(attrs, "id"); + targets = new LinkedHashSet<>(); + fields = new LinkedHashSet<>(); + targets.addAll(resolve(attr(attrs, "action"), vars)); + } else if ("form".equals(tag)) { + if (fields != null && !fields.isEmpty()) { + forms++; + checkForm(formKey, targets, fields); + } + formKey = null; + fields = null; + } else if (fields != null && !closing) { + if ("submit".equals(tag)) { + targets.addAll(resolve(attr(attrs, "action"), vars)); + } else if (FIELD_TAGS.contains(tag)) { + String name = attr(attrs, "name"); + if (name != null && !name.contains("%{") + && !name.startsWith("action:") && !name.startsWith("method:")) { + fields.add(name); + } + } + } + } + } + assertNoFailures(); + assertTrue(forms > 40, "Only " + forms + " forms were found in " + jspDirectory); + assertTrue(checked > 250, "Only " + checked + " form fields were checked"); + } + + @Test + public void testUrlParametersAreAuthorized() throws IOException { + Pattern url = Pattern.compile( + "\"']|\"[^\"]*\"|'[^']*')*[^/])>(.*?)", Pattern.DOTALL); + Pattern param = Pattern.compile("> vars = setVariables(content); + Matcher m = url.matcher(content); + while (m.find()) { + for (String action : resolve(attr(m.group(1), "action"), vars)) { + Matcher p = param.matcher(m.group(2)); + while (p.find()) { + check(jsp.getFileName() + " url " + action, action, p.group(1)); + } + } + } + } + assertNoFailures(); + } + + @Test + public void testRedirectActionParametersAreAuthorized() { + NodeList results = strutsXml.getElementsByTagName("result"); + for (int i = 0; i < results.getLength(); i++) { + Element result = (Element) results.item(i); + if (!"redirectAction".equals(result.getAttribute("type"))) { + continue; + } + Map params = new HashMap<>(); + NodeList children = result.getElementsByTagName("param"); + for (int j = 0; j < children.getLength(); j++) { + Element param = (Element) children.item(j); + params.put(param.getAttribute("name"), param.getTextContent().trim()); + } + String action = stripMethod(params.getOrDefault("actionName", + result.getTextContent().trim())); + if (!actions.containsKey(action)) { + continue; + } + for (String name : params.keySet()) { + if (!"actionName".equals(name) && !"namespace".equals(name)) { + check("struts.xml redirect to " + action, action, name); + } + } + } + assertNoFailures(); + } + + private void checkForm(String formKey, Set targets, Set fields) { + List explicit = FORM_TARGETS.get(formKey); + if (explicit != null) { + targets = new LinkedHashSet<>(explicit); + if (explicit.isEmpty()) { + return; + } + } + if (targets.isEmpty()) { + failures.add(formKey + ": cannot tell which action the form submits to"); + return; + } + for (String action : targets) { + for (String field : fields) { + check(formKey + " -> " + action, action, field); + checked++; + } + } + } + + private void check(String source, String action, String parameter) { + Set> classes = actions.get(action); + if (classes == null) { + failures.add(source + ": no action named '" + action + "' in struts.xml"); + return; + } + for (Class actionClass : classes) { + if (!NOT_BOUND.contains(actionClass.getSimpleName() + "." + parameter) + && !authorizer.isAuthorized(parameter, actionClass, actionClass)) { + failures.add(source + ": '" + parameter + "' is not a @StrutsParameter of " + + actionClass.getName()); + } + } + } + + private void assertNoFailures() { + assertTrue(failures.isEmpty(), "Unauthorized request parameters:\n " + + String.join("\n ", failures)); + } + + private static List jsps() throws IOException { + try (Stream files = Files.walk(jspDirectory)) { + return files.filter(f -> f.toString().endsWith(".jsp")).sorted().toList(); + } + } + + /** Values of the {@code literal} tags in a JSP. */ + private static Map> setVariables(String content) { + Map> vars = new HashMap<>(); + Matcher m = SET_TAG.matcher(content); + while (m.find()) { + vars.computeIfAbsent(m.group(1), k -> new ArrayList<>()).add(m.group(2).trim()); + } + return vars; + } + + /** Action names an action attribute can refer to, empty if unknown. */ + private static Set resolve(String action, Map> vars) { + Set resolved = new LinkedHashSet<>(); + if (action == null || action.isBlank()) { + return resolved; + } + Matcher m = VAR_REF.matcher(action); + if (m.find()) { + for (String value : vars.getOrDefault(m.group(1), List.of())) { + resolved.addAll(resolve(action.replace(m.group(), value), vars)); + } + } else if (!action.contains("%{")) { + resolved.add(stripMethod(action)); + } + return resolved; + } + + private static String stripMethod(String action) { + int bang = action.indexOf('!'); + return bang < 0 ? action : action.substring(0, bang); + } + + private static String attr(String attrs, String name) { + Matcher m = Pattern.compile("\\b" + name + "\\s*=\\s*(\"([^\"]*)\"|'([^']*)')").matcher(attrs); + if (!m.find()) { + return null; + } + return m.group(2) != null ? m.group(2) : m.group(3); + } + + /** + * Struts' own authorizer, checking an action class rather than an + * instance so that the actions need not be created. + */ + private static final class ClassAuthorizer extends StrutsParameterAuthorizer { + + ClassAuthorizer() { + setRequireAnnotations("true"); + } + + @Override + protected Class ultimateClass(Object target) { + return (Class) target; + } + + @Override + protected BeanInfo getBeanInfo(Object target) { + try { + return Introspector.getBeanInfo((Class) target); + } catch (IntrospectionException e) { + throw new IllegalStateException(e); + } + } + } +} diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/ValidateSaltInterceptorTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/ValidateSaltInterceptorTest.java index 1aea1b6642..89b2ab958e 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/ValidateSaltInterceptorTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/ValidateSaltInterceptorTest.java @@ -19,8 +19,8 @@ package org.apache.roller.weblogger.ui.struts2.util; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; import org.apache.roller.weblogger.pojos.User; import org.apache.roller.weblogger.ui.core.RollerSession; @@ -34,8 +34,8 @@ import org.mockito.MockedStatic; import org.mockito.MockitoAnnotations; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionInvocation; +import org.apache.struts2.ActionContext; +import org.apache.struts2.ActionInvocation; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/app/src/test/java/org/apache/roller/weblogger/util/MediaTypePolicyTest.java b/app/src/test/java/org/apache/roller/weblogger/util/MediaTypePolicyTest.java index 2cd9a850d6..f0952346ea 100644 --- a/app/src/test/java/org/apache/roller/weblogger/util/MediaTypePolicyTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/util/MediaTypePolicyTest.java @@ -22,7 +22,7 @@ import java.nio.file.Path; import java.nio.file.Paths; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.Test; @@ -242,14 +242,14 @@ public void theResourceServletsCoverTheirUploadedMediaBranch() throws Exception public void everyUploadPathGoesThroughThePolicy() throws Exception { String[][] callers = { {"org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java", - "this.uploadedFilesContentType[i]"}, + "upload.getContentType()"}, {"org/apache/roller/weblogger/webservices/atomprotocol/" + "MediaCollection.java", "setContentType(contentType)"}, {"org/apache/roller/weblogger/webservices/xmlrpc/" + "MetaWeblogAPIHandler.java", "setContentType(type)"}, // Replacing an existing file's body is an upload too. {"org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java", - "this.uploadedFileContentType"}, + "uploadedFile.getContentType()"}, }; for (String[] caller : callers) { String src = source(caller[0]); @@ -266,7 +266,7 @@ public void everyUploadPathGoesThroughThePolicy() throws Exception { public void replacementRoutesUseTheReplacementName() throws Exception { String editor = source("org/apache/roller/weblogger/ui/struts2/editor/" + "MediaFileEdit.java"); - assertTrue(editor.contains("storedTypeFor(\n this.uploadedFileName")); + assertTrue(editor.contains("storedTypeFor(\n uploadedFile.getOriginalName()")); String atom = source("org/apache/roller/weblogger/webservices/atomprotocol/" + "MediaCollection.java"); diff --git a/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/MediaCollectionTest.java b/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/MediaCollectionTest.java index c374d2adcb..8e222bf7fb 100644 --- a/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/MediaCollectionTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/MediaCollectionTest.java @@ -8,7 +8,7 @@ import java.io.ByteArrayInputStream; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import com.rometools.propono.atom.server.AtomMediaResource; import org.apache.roller.weblogger.pojos.MediaFile; diff --git a/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerTest.java b/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerTest.java index 899a06f43b..2d20a9899a 100644 --- a/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerTest.java @@ -18,8 +18,8 @@ import org.mockito.MockedStatic; import org.mockito.MockitoAnnotations; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.time.Instant; diff --git a/app/src/test/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServletTest.java b/app/src/test/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServletTest.java deleted file mode 100644 index 2242f3e86c..0000000000 --- a/app/src/test/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServletTest.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.webservices.oauth; - -import net.oauth.OAuthAccessor; -import net.oauth.OAuthConsumer; -import net.oauth.OAuthProblemException; -import org.apache.roller.weblogger.business.OAuthManager; -import org.apache.roller.weblogger.business.Weblogger; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.pojos.User; -import org.apache.roller.weblogger.ui.core.RollerSession; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockedStatic; -import org.mockito.MockitoAnnotations; -import org.springframework.security.web.savedrequest.SimpleSavedRequest; - -import javax.servlet.RequestDispatcher; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import java.io.PrintWriter; -import java.io.StringWriter; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -/** - * Verifies which identity {@link AuthorizationServlet} authorizes a request - * token for. - * - *

The servlet runs the browser consent step: a logged-in user approves a - * consumer's pending request token. The identity being approved is a property - * of the session, so these tests pin it there and check that values arriving - * in the request body cannot redirect the approval onto a different account. - */ -public class AuthorizationServletTest { - - private static final String CONSUMER_KEY = "test-consumer-key"; - private static final String REQUEST_TOKEN = "test-request-token"; - - private AuthorizationServlet servlet; - - @Mock - private HttpServletRequest request; - - @Mock - private HttpServletResponse response; - - @Mock - private RequestDispatcher dispatcher; - - @Mock - private HttpSession httpSession; - - @Mock - private RollerSession rollerSession; - - @Mock - private Weblogger weblogger; - - @Mock - private OAuthManager oauthManager; - - private OAuthAccessor accessor; - private StringWriter responseBody; - - @BeforeEach - public void setUp() throws Exception { - MockitoAnnotations.openMocks(this); - servlet = spy(new AuthorizationServlet()); - doReturn(true).when(servlet).hasValidSalt(request); - - // A site-wide consumer: no "userId" property bound to the key. This is - // the configuration in which the servlet has no consumer-side identity - // to compare against and must fall back on the session. - OAuthConsumer consumer = - new OAuthConsumer("http://example.com/callback", CONSUMER_KEY, "secret", null); - accessor = new OAuthAccessor(consumer); - accessor.requestToken = REQUEST_TOKEN; - - when(request.getMethod()).thenReturn("POST"); - when(request.getRequestURL()) - .thenReturn(new StringBuffer("https://example.com/roller-services/oauth/authorize")); - when(request.getLocalName()).thenReturn("example.com"); - when(request.getContextPath()).thenReturn(""); - when(request.getSession(true)).thenReturn(httpSession); - when(request.getRequestDispatcher(anyString())).thenReturn(dispatcher); - responseBody = new StringWriter(); - when(response.getWriter()).thenReturn(new PrintWriter(responseBody)); - - when(weblogger.getOAuthManager()).thenReturn(oauthManager); - when(oauthManager.getAccessor(any())).thenReturn(accessor); - } - - private User user(String userName) { - User u = new User(); - u.setUserName(userName); - u.setEnabled(Boolean.TRUE); - return u; - } - - /** - * Assert that no approval was recorded at all. - */ - private void verifyNothingAuthorized() throws Exception { - verify(oauthManager, never()).markAsAuthorized(any(), anyString()); - verify(oauthManager, never()).authorizeRequestToken(anyString(), anyString(), anyString()); - } - - /** - * The session belongs to "alice" but the posted form names "admin". The - * approval must not be recorded for "admin". - */ - @Test - public void postedUserIdDoesNotChooseTheIdentity() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)).thenReturn(rollerSession); - when(rollerSession.getAuthenticatedUser()).thenReturn(user("alice")); - - when(request.getParameter("userId")).thenReturn("admin"); - - servlet.doPost(request, response); - - verify(response).setStatus(HttpServletResponse.SC_FORBIDDEN); - assertEquals("oauth_problem=permission_denied\n", responseBody.toString()); - verifyNothingAuthorized(); - } - } - - /** - * Same shape, using the alternate parameter name the servlet also reads. - */ - @Test - public void postedRequestorIdDoesNotChooseTheIdentity() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)).thenReturn(rollerSession); - when(rollerSession.getAuthenticatedUser()).thenReturn(user("alice")); - - when(request.getParameter("xoauth_requestor_id")).thenReturn("admin"); - - servlet.doPost(request, response); - - verify(response).setStatus(HttpServletResponse.SC_FORBIDDEN); - assertEquals("oauth_problem=permission_denied\n", responseBody.toString()); - verifyNothingAuthorized(); - } - } - - /** - * With nobody logged in there is no identity to approve, so nothing may be - * recorded no matter what the request body says. - */ - @Test - public void noSessionAuthorizesNobody() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)).thenReturn(rollerSession); - when(rollerSession.getAuthenticatedUser()).thenReturn(null); - - when(request.getParameter("userId")).thenReturn("admin"); - - servlet.doPost(request, response); - - verifyNothingAuthorized(); - verifyLoginResumeWasSaved(); - } - } - - /** - * A disabled account cannot approve anything, even with a live session. - */ - @Test - public void disabledUserAuthorizesNobody() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)).thenReturn(rollerSession); - User disabled = user("alice"); - disabled.setEnabled(Boolean.FALSE); - when(rollerSession.getAuthenticatedUser()).thenReturn(disabled); - when(request.getParameter("userId")).thenReturn("alice"); - - servlet.doPost(request, response); - - verifyNothingAuthorized(); - } - } - - /** - * The ordinary path: the logged-in user approves, and the approval is - * recorded against the session identity and the pending token. - */ - @Test - public void sessionUserIsTheAuthorizedIdentity() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)).thenReturn(rollerSession); - when(rollerSession.getAuthenticatedUser()).thenReturn(user("alice")); - when(oauthManager.authorizeRequestToken(CONSUMER_KEY, REQUEST_TOKEN, "alice")) - .thenReturn(Boolean.TRUE); - - servlet.doPost(request, response); - - verify(oauthManager).authorizeRequestToken(CONSUMER_KEY, REQUEST_TOKEN, "alice"); - } - } - - /** - * A legacy client may still post the parameter; when it agrees with the - * session it is simply redundant and the flow proceeds. - */ - @Test - public void matchingPostedUserIdIsTolerated() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)).thenReturn(rollerSession); - when(rollerSession.getAuthenticatedUser()).thenReturn(user("alice")); - when(request.getParameter("userId")).thenReturn("alice"); - when(oauthManager.authorizeRequestToken(CONSUMER_KEY, REQUEST_TOKEN, "alice")) - .thenReturn(Boolean.TRUE); - - servlet.doPost(request, response); - - verify(oauthManager).authorizeRequestToken(CONSUMER_KEY, REQUEST_TOKEN, "alice"); - } - } - - /** - * A consumer key bound to one user may only be approved by that user, even - * though the identity now comes from the session rather than the request. - */ - @Test - public void consumerBoundToAnotherUserIsRefused() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - - accessor.consumer.setProperty("userId", "bob"); - - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)).thenReturn(rollerSession); - when(rollerSession.getAuthenticatedUser()).thenReturn(user("alice")); - when(request.getParameter("userId")).thenReturn("bob"); - - servlet.doPost(request, response); - - verifyNothingAuthorized(); - } - } - - /** - * Failure of the one-shot persistence transition must not reveal why the - * pending token was not claimed. - */ - @Test - public void unmatchedPendingTokenIsRefusedGenerically() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)).thenReturn(rollerSession); - when(rollerSession.getAuthenticatedUser()).thenReturn(user("alice")); - when(oauthManager.authorizeRequestToken(CONSUMER_KEY, REQUEST_TOKEN, "alice")) - .thenReturn(Boolean.FALSE); - - servlet.doPost(request, response); - - verify(response).setStatus(HttpServletResponse.SC_FORBIDDEN); - assertEquals("oauth_problem=permission_denied\n", responseBody.toString()); - verify(weblogger, never()).flush(); - } - } - - /** - * Accessor lookup failures use the same response as a failed conditional - * transition, so callers cannot distinguish token states. - */ - @Test - public void unknownTokenIsRefusedGenerically() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class)) { - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - when(oauthManager.getAccessor(any())) - .thenThrow(new OAuthProblemException("token_expired")); - - servlet.doPost(request, response); - - verify(response).setStatus(HttpServletResponse.SC_FORBIDDEN); - assertEquals("oauth_problem=permission_denied\n", responseBody.toString()); - verifyNothingAuthorized(); - } - } - - @Test - public void missingAccessorOnGetIsRefusedGenerically() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class)) { - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - when(oauthManager.getAccessor(any())).thenReturn(null); - - servlet.doGet(request, response); - - verify(response).setStatus(HttpServletResponse.SC_FORBIDDEN); - assertEquals("oauth_problem=permission_denied\n", responseBody.toString()); - } - } - - @Test - public void expiredTokenOnGetIsRefusedGenerically() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class)) { - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - when(oauthManager.getAccessor(any())) - .thenThrow(new OAuthProblemException("token_expired")); - - servlet.doGet(request, response); - - verify(response).setStatus(HttpServletResponse.SC_FORBIDDEN); - assertEquals("oauth_problem=permission_denied\n", responseBody.toString()); - } - } - - @Test - public void pendingGetWithoutSessionRedirectsToLoginAndCanResume() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)) - .thenReturn(rollerSession); - when(rollerSession.getAuthenticatedUser()).thenReturn(null); - - servlet.doGet(request, response); - - verifyNothingAuthorized(); - verifyLoginResumeWasSaved(); - } - } - - @Test - public void invalidSaltRendersConsentAgainWithoutAuthorizing() throws Exception { - try (MockedStatic factory = mockStatic(WebloggerFactory.class); - MockedStatic session = mockStatic(RollerSession.class)) { - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - session.when(() -> RollerSession.getRollerSession(request)) - .thenReturn(rollerSession); - when(rollerSession.getAuthenticatedUser()).thenReturn(user("alice")); - doReturn(false).when(servlet).hasValidSalt(request); - - servlet.doPost(request, response); - - verify(dispatcher).forward(request, response); - verifyNothingAuthorized(); - } - } - - private void verifyLoginResumeWasSaved() throws Exception { - ArgumentCaptor saved = ArgumentCaptor.forClass(Object.class); - verify(httpSession).setAttribute( - eq("SPRING_SECURITY_SAVED_REQUEST"), saved.capture()); - assertTrue(saved.getValue() instanceof SimpleSavedRequest); - SimpleSavedRequest request = (SimpleSavedRequest) saved.getValue(); - assertEquals("GET", request.getMethod()); - assertTrue(request.getRedirectUrl().contains("oauth_token=" + REQUEST_TOKEN)); - verify(response).sendRedirect("/roller-ui/login.rol"); - } -} diff --git a/app/src/test/java/org/apache/roller/weblogger/webservices/xmlrpc/XmlRpcExtensionTypeTest.java b/app/src/test/java/org/apache/roller/weblogger/webservices/xmlrpc/XmlRpcExtensionTypeTest.java index 36a5928e01..bff74c7b46 100644 --- a/app/src/test/java/org/apache/roller/weblogger/webservices/xmlrpc/XmlRpcExtensionTypeTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/webservices/xmlrpc/XmlRpcExtensionTypeTest.java @@ -23,9 +23,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import javax.servlet.FilterChain; -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.xmlrpc.parser.XmlRpcRequestParser; import org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl; diff --git a/app/src/test/resources/jetty.xml b/app/src/test/resources/jetty.xml index a31ca4c6d5..42894d4c18 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 @@ -36,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 b4a15f6020..fcc0547419 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 diff --git a/docker-compose.yml b/docker-compose.yml index ba5c7b8d4b..db6aec6cf2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,17 +19,18 @@ # 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: - 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 diff --git a/it-selenium/pom.xml b/it-selenium/pom.xml index 9544eb12f8..8d19c105fd 100644 --- a/it-selenium/pom.xml +++ b/it-selenium/pom.xml @@ -63,8 +63,8 @@ 4.48.0 - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api xerces @@ -79,16 +79,9 @@ - javax.xml.bind - jaxb-api - ${jaxb.version} - - - - javax.activation - javax.activation-api - - + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.5 test @@ -133,7 +126,7 @@ maven-failsafe-plugin - 3.5.6 + 3.6.0 @@ -142,19 +135,12 @@ - - - javax.xml.bind - jaxb-api - 2.3.1 - - - org.eclipse.jetty - jetty-maven-plugin + org.eclipse.jetty.ee11 + jetty-ee11-maven-plugin selenium 9999 @@ -162,7 +148,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 @@ -196,9 +184,9 @@ 6.1.6 - commons-dbcp - commons-dbcp - 1.4 + org.apache.commons + commons-dbcp2 + 2.14.0 org.apache.derby @@ -211,9 +199,14 @@ ${derby.version} - javax.mail - mail - ${java-mail.version} + jakarta.mail + jakarta.mail-api + 2.1.5 + + + org.eclipse.angus + angus-mail + 2.0.5 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 f043c9f47c..9f87782d25 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); } } diff --git a/pom.xml b/pom.xml index 44a3aa9492..908f7b25dc 100644 --- a/pom.xml +++ b/pom.xml @@ -40,14 +40,12 @@ limitations under the License. - 10.15.2.0 - 1.4.7 - 2.3.1 - 10.0.26 + 10.16.1.1 + 12.1.13 UTF-8 UTF-8 6.1.6 - 1.7.36 + 2.0.20 @@ -62,9 +60,9 @@ limitations under the License. org.apache.maven.plugins maven-compiler-plugin - 3.15.0 + 3.16.0 - 11 + 17 true -Xlint:all @@ -86,14 +84,14 @@ limitations under the License. - org.eclipse.jetty - jetty-maven-plugin + org.eclipse.jetty.ee11 + jetty-ee11-maven-plugin ${jetty.plugin.version} org.codehaus.mojo versions-maven-plugin - 2.21.0 + 2.22.0 file:version-rules.xml @@ -107,9 +105,22 @@ limitations under the License. org.junit.jupiter junit-jupiter-engine - 5.14.4 + 6.1.3 test + + + org.freemarker + freemarker + 2.3.35 + + + + com.google.guava + guava + 33.7.1-jre + diff --git a/testing/junit-cleartables-mysql.sql b/testing/junit-cleartables-mysql.sql index 34a8b72aac..d3d7a1754d 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';