diff --git a/orcid-activemq/pom.xml b/orcid-activemq/pom.xml index ee85853f572..f5d08347a63 100644 --- a/orcid-activemq/pom.xml +++ b/orcid-activemq/pom.xml @@ -24,35 +24,35 @@ org.apache.activemq activemq-broker - 5.13.3 + ${activemq.version} org.apache.activemq activemq-spring - 5.13.3 + ${activemq.version} org.apache.activemq activemq-kahadb-store - 5.13.3 + ${activemq.version} jakarta.xml.bind jakarta.xml.bind-api - 2.3.3 + 3.0.1 com.sun.xml.bind jaxb-impl -2.3.3 +3.0.2 - javax.annotation - javax.annotation-api - 1.3.2 + jakarta.annotation + jakarta.annotation-api + 2.1.1 diff --git a/orcid-activemq/src/main/resources/activemq.xml b/orcid-activemq/src/main/resources/activemq.xml index 9bf0447492f..236b83fd855 100644 --- a/orcid-activemq/src/main/resources/activemq.xml +++ b/orcid-activemq/src/main/resources/activemq.xml @@ -5,7 +5,7 @@ xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd" > diff --git a/orcid-activemq/src/test/java/org/orcid/activemq/AppContextActiveMQTest.java b/orcid-activemq/src/test/java/org/orcid/activemq/AppContextActiveMQTest.java index f01652f1932..88d3ca05be0 100644 --- a/orcid-activemq/src/test/java/org/orcid/activemq/AppContextActiveMQTest.java +++ b/orcid-activemq/src/test/java/org/orcid/activemq/AppContextActiveMQTest.java @@ -2,7 +2,7 @@ import static org.junit.Assert.*; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.activemq.xbean.BrokerFactoryBean; import org.junit.Test; diff --git a/orcid-activemq/src/test/resources/test-orcid-activemq-web-context.xml b/orcid-activemq/src/test/resources/test-orcid-activemq-web-context.xml index 0987f174187..9c6dfe94d2b 100644 --- a/orcid-activemq/src/test/resources/test-orcid-activemq-web-context.xml +++ b/orcid-activemq/src/test/resources/test-orcid-activemq-web-context.xml @@ -4,11 +4,11 @@ xmlns:cache="http://www.springframework.org/schema/cache" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jms="http://www.springframework.org/schema/jms" xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd - http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd" > + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd" > diff --git a/orcid-activities-indexer/pom.xml b/orcid-activities-indexer/pom.xml index 019eae9e3b9..ab7fba4ae1c 100644 --- a/orcid-activities-indexer/pom.xml +++ b/orcid-activities-indexer/pom.xml @@ -3,7 +3,7 @@ 4.0.0 orcid-activities-indexer - 0.0.1-SNAPSHOT + release-2.0.0 war ORCID - Activities Indexer @@ -22,7 +22,6 @@ org.orcid orcid-model - ${project.version} org.orcid @@ -50,18 +49,34 @@ org.apache.activemq activemq-broker - 5.13.3 + ${activemq.version} org.apache.activemq activemq-spring - 5.13.3 + ${activemq.version} - com.sun.jersey + org.glassfish.jersey.core jersey-client - + ${jersey.version} + + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version} + + + org.glassfish.jersey.media + jersey-media-jaxb + ${jersey.version} + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + org.liquibase @@ -85,28 +100,27 @@ org.postgresql postgresql - - org.hibernate - hibernate-c3p0 - - - org.hibernate - hibernate-entitymanager - compile - - - org.hibernate - hibernate-core - - - org.hibernate.javax.persistence - hibernate-jpa-2.1-api - + + org.hibernate.orm + hibernate-core + + + org.hibernate.orm + hibernate-agroal + + + org.hibernate.orm + hibernate-c3p0 + + + org.hibernate.validator + hibernate-validator + org.orcid orcid-parent - ${project.version} + release-2.0.0 ../pom.xml diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/cron/RetryFailedRecords.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/cron/RetryFailedRecords.java index 82b93328cab..929e6f88f28 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/cron/RetryFailedRecords.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/cron/RetryFailedRecords.java @@ -6,7 +6,12 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import org.orcid.activitiesindexer.persistence.entities.ActivitiesStatusEntity; @@ -22,9 +27,6 @@ import org.springframework.scheduling.annotation.Scheduled; import com.fasterxml.jackson.databind.ObjectMapper; -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.WebResource; @Configuration @EnableScheduling @@ -50,7 +52,7 @@ public class RetryFailedRecords { private S3MessageProcessor s3Processor; public RetryFailedRecords() { - client = Client.create(); + client = ClientBuilder.newClient(); mapper = new ObjectMapper(); } @@ -156,11 +158,13 @@ private void sendSystemAlert(String message) { throw new RuntimeException(e); } - WebResource resource = client.resource(webhookUrl); - ClientResponse response = resource.entity(bodyJson).post(ClientResponse.class); - int status = response.getStatus(); - if (status != 200) { - LOGGER.warn("Unable to send message to Slack, status={}, error={}, message={}", new Object[] { status, response.getEntity(String.class), message }); + try (Response response = client.target(webhookUrl) + .request() + .post(Entity.entity(bodyJson, MediaType.APPLICATION_JSON_TYPE))) { + int status = response.getStatus(); + if (status != 200) { + LOGGER.warn("Unable to send message to Slack, status={}, error={}, message={}", new Object[] { status, response.readEntity(String.class), message }); + } } } } diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/jersey/OrcidJerseyClientHandler.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/jersey/OrcidJerseyClientHandler.java index bc3d9675707..94bf2d05c00 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/jersey/OrcidJerseyClientHandler.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/jersey/OrcidJerseyClientHandler.java @@ -16,6 +16,7 @@ */ package org.orcid.activitiesindexer.jersey; +import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -23,30 +24,31 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.config.ClientConfig; -import com.sun.jersey.api.client.config.DefaultClientConfig; +import org.glassfish.jersey.jackson.JacksonFeature; + +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; public class OrcidJerseyClientHandler { private static final Logger LOGGER = LoggerFactory.getLogger(OrcidJerseyClientHandler.class); public static Client create(boolean isDevelopmentMode, Map properties) { - ClientConfig config = null; + ClientBuilder builder = ClientBuilder.newBuilder(); if (isDevelopmentMode) { // DANGER!!! Trust all certs LOGGER.info("TRUSTING ALL SSL CERTS IN DEV MODE!!!"); - config = new DevJerseyClientConfig(); - } else { - config = new DefaultClientConfig(); + DevJerseyClientConfig.apply(builder); } - Set keyset = properties.keySet(); + + Client client = builder.register(JacksonFeature.class).build(); + + Set keyset = new HashMap<>(properties).keySet(); for (String key : keyset) { - config.getProperties().put(key, properties.get(key)); + client.property(key, properties.get(key)); } - config.getClasses().add(JacksonJaxbJsonProvider.class); - return Client.create(config); + + return client; } } diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/BaseListener.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/BaseListener.java index d55cbd21acd..afc233ad4e6 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/BaseListener.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/BaseListener.java @@ -19,8 +19,8 @@ import java.util.HashMap; import java.util.Map; -import javax.jms.JMSException; -import javax.jms.Message; +import jakarta.jms.JMSException; +import jakarta.jms.Message; import org.apache.activemq.command.ActiveMQMapMessage; import org.fusesource.hawtbuf.UTF8Buffer; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/ReIndexListener.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/ReIndexListener.java index 5cefced111d..4fd1feaa465 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/ReIndexListener.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/ReIndexListener.java @@ -20,10 +20,10 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import javax.annotation.Resource; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.jms.Message; +import jakarta.jms.MessageListener; +import jakarta.xml.bind.JAXBException; import org.orcid.activitiesindexer.s3.S3MessageProcessor; import org.orcid.utils.listener.LastModifiedMessage; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/UpdatedOrcidListener.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/UpdatedOrcidListener.java index 296f4fbbee2..7fcf783e73a 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/UpdatedOrcidListener.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/UpdatedOrcidListener.java @@ -18,9 +18,9 @@ import java.util.Map; -import javax.annotation.Resource; -import javax.jms.Message; -import javax.jms.MessageListener; +import jakarta.annotation.Resource; +import jakarta.jms.Message; +import jakarta.jms.MessageListener; import org.orcid.utils.listener.LastModifiedMessage; import org.slf4j.Logger; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/UpdatedOrcidWorker.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/UpdatedOrcidWorker.java index d5651cde53f..cbf0d761b96 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/UpdatedOrcidWorker.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/UpdatedOrcidWorker.java @@ -16,7 +16,7 @@ */ package org.orcid.activitiesindexer.listener; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.activitiesindexer.s3.S3MessageProcessor; import org.orcid.utils.listener.LastModifiedMessage; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/persistence/dao/ActivitiesStatusDao.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/persistence/dao/ActivitiesStatusDao.java index 821299578c2..199d631d5ee 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/persistence/dao/ActivitiesStatusDao.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/listener/persistence/dao/ActivitiesStatusDao.java @@ -20,10 +20,10 @@ import java.util.Date; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.activitiesindexer.persistence.entities.ActivitiesStatusEntity; import org.orcid.activitiesindexer.persistence.util.ActivityType; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/orcid/Orcid20APIClient.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/orcid/Orcid20APIClient.java index f282c977039..40ea50df73e 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/orcid/Orcid20APIClient.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/orcid/Orcid20APIClient.java @@ -19,8 +19,13 @@ import java.net.URI; import java.net.URISyntaxException; -import javax.annotation.Resource; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.Invocation; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.MediaType; import org.orcid.activitiesindexer.exception.DeprecatedRecordException; import org.orcid.activitiesindexer.exception.LockedRecordException; @@ -39,12 +44,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; - -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.WebResource; -import com.sun.jersey.api.client.WebResource.Builder; -import com.sun.jersey.api.client.config.ClientConfig; +import org.glassfish.jersey.client.ClientProperties; @Component public class Orcid20APIClient { @@ -72,93 +72,103 @@ public Orcid20APIClient(@Value("${org.orcid.message-listener.api20BaseURI}") Str * @return Activities */ public Record fetchPublicRecord(String orcid) throws LockedRecordException, DeprecatedRecordException { - WebResource webResource = jerseyClient.resource(baseUri).path(orcid + "/record"); - webResource.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, false); - Builder builder = webResource.accept(MediaType.APPLICATION_XML).header("Authorization", "Bearer " + accessToken); - ClientResponse response = builder.get(ClientResponse.class); - if (response.getStatus() != 200) { + WebTarget webTarget = jerseyClient.target(baseUri).path(orcid + "/record"); + Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML) + .property(ClientProperties.FOLLOW_REDIRECTS, false) + .header("Authorization", "Bearer " + accessToken); + try (Response response = builder.get()) { + if (response.getStatus() != 200) { OrcidError orcidError = null; switch (response.getStatus()) { case 301: - orcidError = response.getEntity(OrcidError.class); + orcidError = response.readEntity(OrcidError.class); throw new DeprecatedRecordException(orcidError); case 409: - orcidError = response.getEntity(OrcidError.class); + orcidError = response.readEntity(OrcidError.class); throw new LockedRecordException(orcidError); default: LOG.error("Unable to fetch public activities for " + orcid + " on API 2.0 HTTP error code: " + response.getStatus()); throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } + } + return response.readEntity(Record.class); } - return response.getEntity(Record.class); } public Affiliation fetchAffiliation(String orcid, Long putCode, AffiliationType type){ - WebResource webResource = jerseyClient.resource(baseUri).path(orcid + "/" + type.value() + "/" + putCode); - webResource.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, false); - Builder builder = webResource.accept(MediaType.APPLICATION_XML).header("Authorization", "Bearer " + accessToken); - ClientResponse response = builder.get(ClientResponse.class); - if (response.getStatus() != 200) { + WebTarget webTarget = jerseyClient.target(baseUri).path(orcid + "/" + type.value() + "/" + putCode); + Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML) + .property(ClientProperties.FOLLOW_REDIRECTS, false) + .header("Authorization", "Bearer " + accessToken); + try (Response response = builder.get()) { + if (response.getStatus() != 200) { switch (response.getStatus()) { default: LOG.error("Unable to fetch affiliation from record " + orcid + "/" + type.value() + "/" + putCode+" on API 2.0 HTTP error code: " + response.getStatus()); throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } + } + + Affiliation aff; + + if(AffiliationType.EDUCATION.equals(type)) { + aff = response.readEntity(Education.class); + } else { + aff = response.readEntity(Employment.class); + } + + return aff; } - - Affiliation aff; - - if(AffiliationType.EDUCATION.equals(type)) { - aff = response.getEntity(Education.class); - } else { - aff = response.getEntity(Employment.class); - } - - return aff; } public Funding fetchFunding(String orcid, Long putCode){ - WebResource webResource = jerseyClient.resource(baseUri).path(orcid + "/funding/"+ putCode); - webResource.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, false); - Builder builder = webResource.accept(MediaType.APPLICATION_XML).header("Authorization", "Bearer " + accessToken); - ClientResponse response = builder.get(ClientResponse.class); - if (response.getStatus() != 200) { + WebTarget webTarget = jerseyClient.target(baseUri).path(orcid + "/funding/"+ putCode); + Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML) + .property(ClientProperties.FOLLOW_REDIRECTS, false) + .header("Authorization", "Bearer " + accessToken); + try (Response response = builder.get()) { + if (response.getStatus() != 200) { switch (response.getStatus()) { default: LOG.error("Unable to fetch funding record " + orcid + "/" + putCode+" on API 2.0 HTTP error code: " + response.getStatus()); throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } + } + return response.readEntity(Funding.class); } - return response.getEntity(Funding.class); } public Work fetchWork(String orcid, Long putCode){ - WebResource webResource = jerseyClient.resource(baseUri).path(orcid + "/work/"+ putCode); - webResource.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, false); - Builder builder = webResource.accept(MediaType.APPLICATION_XML).header("Authorization", "Bearer " + accessToken); - ClientResponse response = builder.get(ClientResponse.class); - if (response.getStatus() != 200) { + WebTarget webTarget = jerseyClient.target(baseUri).path(orcid + "/work/"+ putCode); + Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML) + .property(ClientProperties.FOLLOW_REDIRECTS, false) + .header("Authorization", "Bearer " + accessToken); + try (Response response = builder.get()) { + if (response.getStatus() != 200) { switch (response.getStatus()) { default: LOG.error("Unable to fetch work from record " + orcid + "/" + putCode+" on API 2.0 HTTP error code: " + response.getStatus()); throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } + } + return response.readEntity(Work.class); } - return response.getEntity(Work.class); } public PeerReview fetchPeerReview(String orcid, Long putCode){ - WebResource webResource = jerseyClient.resource(baseUri).path(orcid + "/peer-review/"+ putCode); - webResource.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, false); - Builder builder = webResource.accept(MediaType.APPLICATION_XML).header("Authorization", "Bearer " + accessToken); - ClientResponse response = builder.get(ClientResponse.class); - if (response.getStatus() != 200) { + WebTarget webTarget = jerseyClient.target(baseUri).path(orcid + "/peer-review/"+ putCode); + Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML) + .property(ClientProperties.FOLLOW_REDIRECTS, false) + .header("Authorization", "Bearer " + accessToken); + try (Response response = builder.get()) { + if (response.getStatus() != 200) { switch (response.getStatus()) { default: LOG.error("Unable to fetch peer review from record " + orcid + "/" + putCode+" on API 2.0 HTTP error code: " + response.getStatus()); throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } + } + return response.readEntity(PeerReview.class); } - return response.getEntity(PeerReview.class); } } diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/persistence/entities/ActivitiesStatusEntity.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/persistence/entities/ActivitiesStatusEntity.java index cacfe1a1d8c..826c0aa0a46 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/persistence/entities/ActivitiesStatusEntity.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/persistence/entities/ActivitiesStatusEntity.java @@ -18,10 +18,10 @@ import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "activities_status") diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/persistence/spring/OrcidEntityManagerFactory.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/persistence/spring/OrcidEntityManagerFactory.java index d094cb83a5b..7081713bc26 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/persistence/spring/OrcidEntityManagerFactory.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/persistence/spring/OrcidEntityManagerFactory.java @@ -16,8 +16,8 @@ */ package org.orcid.activitiesindexer.persistence.spring; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.FactoryBean; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/ExceptionHandler.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/ExceptionHandler.java index b50fcac698f..5b85754011e 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/ExceptionHandler.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/ExceptionHandler.java @@ -18,8 +18,8 @@ import java.io.IOException; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import org.orcid.jaxb.model.error_v2.OrcidError; import org.orcid.jaxb.model.message.OrcidDeprecated; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3Manager.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3Manager.java index 48167367abd..8545976681c 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3Manager.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3Manager.java @@ -22,11 +22,11 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; -import javax.ws.rs.core.MediaType; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.MediaType; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; import org.orcid.activitiesindexer.persistence.util.ActivityType; import org.orcid.jaxb.model.error_v2.OrcidError; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3MessageProcessor.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3MessageProcessor.java index 37dae7babb7..ba7604f9c55 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3MessageProcessor.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3MessageProcessor.java @@ -22,7 +22,7 @@ import java.util.Map; import java.util.function.Consumer; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.activitiesindexer.exception.DeprecatedRecordException; import org.orcid.activitiesindexer.exception.LockedRecordException; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3MessagingService.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3MessagingService.java index 300c00d1ced..5fd942b3400 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3MessagingService.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/s3/S3MessagingService.java @@ -20,7 +20,7 @@ import java.io.InputStream; import java.util.Date; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/util/DevJerseyClientConfig.java b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/util/DevJerseyClientConfig.java index 57c5f105801..b25767cde15 100644 --- a/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/util/DevJerseyClientConfig.java +++ b/orcid-activities-indexer/src/main/java/org/orcid/activitiesindexer/util/DevJerseyClientConfig.java @@ -29,33 +29,17 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; -import com.sun.jersey.api.client.config.DefaultClientConfig; -import com.sun.jersey.client.urlconnection.HTTPSProperties; +import jakarta.ws.rs.client.ClientBuilder; /** * DANGER!!! For dev only! */ -public class DevJerseyClientConfig extends DefaultClientConfig { +public class DevJerseyClientConfig { - public DevJerseyClientConfig() { - super(); - init(); - } - - public DevJerseyClientConfig(Class... providers) { - super(providers); - init(); - } - - public DevJerseyClientConfig(Set> providers) { - super(providers); - init(); - } - - public void init() { + public static void apply(ClientBuilder builder) { SSLContext ctx = createSslContext(); HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory()); - getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(new HostnameVerifier() { + builder.sslContext(ctx).hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession sslSession) { if (hostname.equals("localhost")) { @@ -63,10 +47,10 @@ public boolean verify(String hostname, SSLSession sslSession) { } return false; } - }, ctx)); + }); } - private SSLContext createSslContext() { + private static SSLContext createSslContext() { try { // DANGER!!! Accepts all certs! TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { diff --git a/orcid-activities-indexer/src/main/resources/orcid-activities-indexer-web-context.xml b/orcid-activities-indexer/src/main/resources/orcid-activities-indexer-web-context.xml index dd2ced54d80..9c9a449c66a 100644 --- a/orcid-activities-indexer/src/main/resources/orcid-activities-indexer-web-context.xml +++ b/orcid-activities-indexer/src/main/resources/orcid-activities-indexer-web-context.xml @@ -26,13 +26,13 @@ xmlns:util="http://www.springframework.org/schema/util" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd - http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd - http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd - http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> @@ -64,12 +64,7 @@ - - - - - + diff --git a/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/persistence/dao/ActivitiesStatusDaoTest.java b/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/persistence/dao/ActivitiesStatusDaoTest.java index e5e6340452d..6131e1bd02e 100644 --- a/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/persistence/dao/ActivitiesStatusDaoTest.java +++ b/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/persistence/dao/ActivitiesStatusDaoTest.java @@ -24,7 +24,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/persistence/managers/ActivitiesStatusManagerTest.java b/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/persistence/managers/ActivitiesStatusManagerTest.java index 8386a4bb402..3a9853b00ca 100644 --- a/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/persistence/managers/ActivitiesStatusManagerTest.java +++ b/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/persistence/managers/ActivitiesStatusManagerTest.java @@ -21,7 +21,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/s3/S3UpdaterTest.java b/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/s3/S3UpdaterTest.java index 9e144c07497..b08642f8dd4 100644 --- a/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/s3/S3UpdaterTest.java +++ b/orcid-activities-indexer/src/test/java/org/orcid/activitiesindexer/s3/S3UpdaterTest.java @@ -18,7 +18,7 @@ import static org.junit.Assert.assertEquals; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBException; import org.junit.Before; import org.junit.Test; diff --git a/orcid-activities-indexer/src/test/resources/orcid-activities-indexer-test-context.xml b/orcid-activities-indexer/src/test/resources/orcid-activities-indexer-test-context.xml index c386579ea2e..24626a41612 100644 --- a/orcid-activities-indexer/src/test/resources/orcid-activities-indexer-test-context.xml +++ b/orcid-activities-indexer/src/test/resources/orcid-activities-indexer-test-context.xml @@ -27,13 +27,13 @@ xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd - http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd - http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd - http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd"> diff --git a/orcid-api-common/pom.xml b/orcid-api-common/pom.xml index 5c1aee9582c..e5075e57974 100644 --- a/orcid-api-common/pom.xml +++ b/orcid-api-common/pom.xml @@ -44,7 +44,7 @@ org.springframework spring-aop - + org.glassfish.jersey.containers @@ -54,6 +54,11 @@ org.glassfish.jersey.media jersey-media-json-jackson + + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider + ${jackson.version} + org.glassfish.jersey.core jersey-server @@ -61,7 +66,7 @@ org.glassfish.jersey.ext - jersey-spring4 + jersey-spring6 ${jersey.version} @@ -77,39 +82,46 @@ - javax.ws.rs - javax.ws.rs-api + jakarta.ws.rs + jakarta.ws.rs-api - javax.inject - javax.inject - 1 + jakarta.inject + jakarta.inject-api + 2.0.1 - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api provided - - - org.aspectj - aspectjrt - org.aspectj aspectjweaver - - - - javax.validation - validation-api - - - org.hibernate - hibernate-agroal - + + + jakarta.validation + jakarta.validation-api + 3.0.2 + + + org.hibernate.orm + hibernate-core + + + org.hibernate.orm + hibernate-agroal + + + org.hibernate.orm + hibernate-c3p0 + + + org.hibernate.validator + hibernate-validator + org.apache.jena jena-core @@ -127,7 +139,17 @@ de.undercouch citeproc-java - 0.6 + 3.5.0 + + + org.jbibtex + jbibtex + 1.0.20 + + + org.antlr + antlr4-runtime + 4.13.1 org.togglz @@ -157,73 +179,11 @@ maven-compiler-plugin false - 11 - 11 + 17 + 17 - - - - org.codehaus.mojo - exec-maven-plugin - 3.1.0 - - - geonames - generate-sources - - java - - - jena.schemagen - - --inference \ - -i ${project.basedir}/src/main/vocabs/geonames_v3.1.rdf \ - -e RDF \ - --package org.orcid.api.common.writer.rdf.vocabs \ - -o ${jena.dir} \ - -n Geonames - - - - - pav - generate-sources - - java - - - jena.schemagen - - --inference \ - -i ${project.basedir}/src/main/vocabs/pav.rdf \ - -e RDF \ - --package org.orcid.api.common.writer.rdf.vocabs \ - -o ${jena.dir} \ - -n PAV - - - - - prov-o - generate-sources - - java - - - jena.schemagen - - --inference \ - -i ${project.basedir}/src/main/vocabs/prov-o.rdf \ - -e RDF \ - --package org.orcid.api.common.writer.rdf.vocabs \ - -o ${jena.dir} \ - -n PROV - - - - - + org.codehaus.mojo build-helper-maven-plugin diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/OrcidApiCommonEndpoints.java b/orcid-api-common/src/main/java/org/orcid/api/common/OrcidApiCommonEndpoints.java index f6285a38fdd..605498eb83c 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/OrcidApiCommonEndpoints.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/OrcidApiCommonEndpoints.java @@ -3,29 +3,23 @@ import static org.orcid.core.api.OrcidApiConstants.OAUTH_TOKEN; import static org.orcid.core.constants.OrcidOauth2Constants.*; -import javax.annotation.Resource; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.FormParam; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedHashMap; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - +import jakarta.annotation.Resource; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.FormParam; +import jakarta.ws.rs.HeaderParam; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.apache.commons.lang.StringUtils; import org.orcid.core.oauth.authorizationServer.AuthorizationServerUtil; -import org.orcid.api.common.oauth.OrcidClientCredentialEndPointDelegator; import org.orcid.core.constants.OrcidOauth2Constants; import org.orcid.core.togglz.Features; -import org.springframework.security.oauth2.common.exceptions.UnsupportedGrantTypeException; import org.springframework.stereotype.Component; - import java.io.IOException; import java.net.URISyntaxException; @@ -35,9 +29,6 @@ public class OrcidApiCommonEndpoints { @Context private UriInfo uriInfo; - @Resource - private OrcidClientCredentialEndPointDelegator orcidClientCredentialEndPointDelegator; - @Resource private AuthorizationServerUtil authorizationServerUtil; @@ -55,98 +46,53 @@ public Response obtainOauth2TokenPost(@HeaderParam("Authorization") @DefaultValu // Token delegation is not implemented in the authorization server if(grantType == null) { - throw new UnsupportedGrantTypeException("grant_type is missing"); + throw new IllegalArgumentException("grant_type is missing"); + } else if(clientId == null || clientId.length() > 50 || StringUtils.isBlank(clientId)) { + throw new IllegalArgumentException("client_id is missing or invalid"); + } else if(clientSecret == null || clientSecret.length() > 100 || StringUtils.isBlank(clientSecret)) { + throw new IllegalArgumentException("client_secret is missing or invalid"); } - if(Features.OAUTH_AUTHORIZATION_CODE_EXCHANGE.isActive()) { - Response response = null; - if(StringUtils.isNotBlank(authorization)) { - switch (grantType) { - case OrcidOauth2Constants.GRANT_TYPE_AUTHORIZATION_CODE: - response = authorizationServerUtil.forwardAuthorizationCodeExchangeRequest(authorization, redirectUri, code); - break; - case OrcidOauth2Constants.GRANT_TYPE_REFRESH_TOKEN: - response = authorizationServerUtil.forwardRefreshTokenRequest(authorization, refreshToken, scopeList); - break; - case OrcidOauth2Constants.GRANT_TYPE_CLIENT_CREDENTIALS: - response = authorizationServerUtil.forwardClientCredentialsRequest(authorization, scopeList); - break; - case IETF_EXCHANGE_GRANT_TYPE: - response = authorizationServerUtil.forwardTokenExchangeRequest(authorization, subjectToken, subjectTokenType, requestedTokenType, scopeList); - break; - default: - response = authorizationServerUtil.forwardOtherTokenExchangeRequest(authorization, grantType, code, scopeList); - break; - } - } else { - switch (grantType) { - case OrcidOauth2Constants.GRANT_TYPE_AUTHORIZATION_CODE: - response = authorizationServerUtil.forwardAuthorizationCodeExchangeRequest(clientId, clientSecret, redirectUri, code); - break; - case OrcidOauth2Constants.GRANT_TYPE_REFRESH_TOKEN: - response = authorizationServerUtil.forwardRefreshTokenRequest(clientId, clientSecret, refreshToken, scopeList); - break; - case OrcidOauth2Constants.GRANT_TYPE_CLIENT_CREDENTIALS: - response = authorizationServerUtil.forwardClientCredentialsRequest(clientId, clientSecret, scopeList); - break; - case IETF_EXCHANGE_GRANT_TYPE: - response = authorizationServerUtil.forwardTokenExchangeRequest(clientId, clientSecret, subjectToken, subjectTokenType, requestedTokenType, scopeList); - break; - default: - response = authorizationServerUtil.forwardOtherTokenExchangeRequest(clientId, clientSecret, grantType, code, scopeList); - break; - } + Response response = null; + if(StringUtils.isNotBlank(authorization)) { + switch (grantType) { + case OrcidOauth2Constants.GRANT_TYPE_AUTHORIZATION_CODE: + response = authorizationServerUtil.forwardAuthorizationCodeExchangeRequest(authorization, redirectUri, code); + break; + case OrcidOauth2Constants.GRANT_TYPE_REFRESH_TOKEN: + response = authorizationServerUtil.forwardRefreshTokenRequest(authorization, refreshToken, scopeList); + break; + case OrcidOauth2Constants.GRANT_TYPE_CLIENT_CREDENTIALS: + response = authorizationServerUtil.forwardClientCredentialsRequest(authorization, scopeList); + break; + case IETF_EXCHANGE_GRANT_TYPE: + response = authorizationServerUtil.forwardTokenExchangeRequest(authorization, subjectToken, subjectTokenType, requestedTokenType, scopeList); + break; + default: + response = authorizationServerUtil.forwardOtherTokenExchangeRequest(authorization, grantType, code, scopeList); + break; } - Object entity = response.getEntity(); - int statusCode = response.getStatus(); - return Response.status(statusCode).entity(entity).header(Features.OAUTH_AUTHORIZATION_CODE_EXCHANGE.name(),"ON").build(); } else { - MultivaluedMap formParams = new MultivaluedHashMap(); - if (clientId != null) { - formParams.add(OrcidOauth2Constants.CLIENT_ID_PARAM, clientId); - } - if (scopeList != null) { - formParams.add(OrcidOauth2Constants.SCOPE_PARAM, scopeList); - } - if (grantType != null) { - formParams.add(OrcidOauth2Constants.GRANT_TYPE, grantType); - } - - if (code != null) { - formParams.add("code", code); - } - - if (state != null) { - formParams.add(OrcidOauth2Constants.STATE_PARAM, state); - } - - if (redirectUri != null) { - formParams.add(OrcidOauth2Constants.REDIRECT_URI_PARAM, redirectUri); - } - - if (redirectUri != null) { - formParams.add(OrcidOauth2Constants.REDIRECT_URI_PARAM, redirectUri); + switch (grantType) { + case OrcidOauth2Constants.GRANT_TYPE_AUTHORIZATION_CODE: + response = authorizationServerUtil.forwardAuthorizationCodeExchangeRequest(clientId, clientSecret, redirectUri, code); + break; + case OrcidOauth2Constants.GRANT_TYPE_REFRESH_TOKEN: + response = authorizationServerUtil.forwardRefreshTokenRequest(clientId, clientSecret, refreshToken, scopeList); + break; + case OrcidOauth2Constants.GRANT_TYPE_CLIENT_CREDENTIALS: + response = authorizationServerUtil.forwardClientCredentialsRequest(clientId, clientSecret, scopeList); + break; + case IETF_EXCHANGE_GRANT_TYPE: + response = authorizationServerUtil.forwardTokenExchangeRequest(clientId, clientSecret, subjectToken, subjectTokenType, requestedTokenType, scopeList); + break; + default: + response = authorizationServerUtil.forwardOtherTokenExchangeRequest(clientId, clientSecret, grantType, code, scopeList); + break; } - - if (refreshToken != null) { - formParams.add(OrcidOauth2Constants.REFRESH_TOKEN, refreshToken); - } - - if (revokeOld != null) { - formParams.add(OrcidOauth2Constants.REVOKE_OLD, revokeOld); - } - // IETF Token exchange - if (subjectToken != null) { - formParams.add(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN, subjectToken); - } - if (subjectTokenType != null) { - formParams.add(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE, subjectTokenType); - } - if (requestedTokenType != null) { - formParams.add(OrcidOauth2Constants.IETF_EXCHANGE_REQUESTED_TOKEN_TYPE, requestedTokenType); - } - - return orcidClientCredentialEndPointDelegator.obtainOauth2Token(authorization, formParams); } + Object entity = response.getEntity(); + int statusCode = response.getStatus(); + return Response.status(statusCode).entity(entity).header(Features.OAUTH_AUTHORIZATION_CODE_EXCHANGE.name(),"ON").build(); } } diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/OrcidApiService.java b/orcid-api-common/src/main/java/org/orcid/api/common/OrcidApiService.java index bdaac12c6c2..272a6d3f0eb 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/OrcidApiService.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/OrcidApiService.java @@ -3,10 +3,10 @@ import static org.orcid.core.api.OrcidApiConstants.CLIENT_PATH; import static org.orcid.core.api.OrcidApiConstants.STATUS_PATH; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; /** * @author Declan Newman (declan) Date: 01/03/2012 diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/T2OrcidApiService.java b/orcid-api-common/src/main/java/org/orcid/api/common/T2OrcidApiService.java index 11f9743e757..575b7d81cda 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/T2OrcidApiService.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/T2OrcidApiService.java @@ -13,14 +13,14 @@ import static org.orcid.core.api.OrcidApiConstants.WEBHOOKS_PATH; import static org.orcid.core.api.OrcidApiConstants.WORKS_PATH; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.orcid.jaxb.model.message.OrcidMessage; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/analytics/APIEndpointParser.java b/orcid-api-common/src/main/java/org/orcid/api/common/analytics/APIEndpointParser.java index 4d416661fb8..8a8927f7920 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/analytics/APIEndpointParser.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/analytics/APIEndpointParser.java @@ -5,7 +5,7 @@ import org.glassfish.jersey.server.ContainerRequest; -import javax.ws.rs.core.PathSegment; +import jakarta.ws.rs.core.PathSegment; public class APIEndpointParser { diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/analytics/AnalyticsProcess.java b/orcid-api-common/src/main/java/org/orcid/api/common/analytics/AnalyticsProcess.java index 658f0f5426f..70f1f9c4adf 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/analytics/AnalyticsProcess.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/analytics/AnalyticsProcess.java @@ -1,6 +1,6 @@ package org.orcid.api.common.analytics; -import javax.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.HttpHeaders; import org.orcid.api.common.analytics.client.AnalyticsClient; import org.orcid.core.manager.ClientDetailsEntityCacheManager; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/analytics/client/google/UniversalAnalyticsClient.java b/orcid-api-common/src/main/java/org/orcid/api/common/analytics/client/google/UniversalAnalyticsClient.java index ca682ea3002..3a67e583cca 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/analytics/client/google/UniversalAnalyticsClient.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/analytics/client/google/UniversalAnalyticsClient.java @@ -6,7 +6,7 @@ import java.net.HttpURLConnection; import java.net.URL; -import javax.ws.rs.HttpMethod; +import jakarta.ws.rs.HttpMethod; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/exception/JSONInputValidator.java b/orcid-api-common/src/main/java/org/orcid/api/common/exception/JSONInputValidator.java index 558f0b4818c..fc328274b10 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/exception/JSONInputValidator.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/exception/JSONInputValidator.java @@ -5,9 +5,9 @@ import java.util.Map; import javax.xml.XMLConstants; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.util.JAXBSource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.util.JAXBSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/exception/OrcidOAuth2AuthenticationEntryPoint.java b/orcid-api-common/src/main/java/org/orcid/api/common/exception/OrcidOAuth2AuthenticationEntryPoint.java deleted file mode 100644 index 0fbf390a4da..00000000000 --- a/orcid-api-common/src/main/java/org/orcid/api/common/exception/OrcidOAuth2AuthenticationEntryPoint.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.orcid.api.common.exception; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.orcid.jaxb.model.error_v2.OrcidError; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; -import org.springframework.security.oauth2.provider.error.DefaultOAuth2ExceptionRenderer; -import org.springframework.security.oauth2.provider.error.DefaultWebResponseExceptionTranslator; -import org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint; -import org.springframework.security.oauth2.provider.error.OAuth2ExceptionRenderer; -import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.security.web.access.AccessDeniedHandler; -import org.springframework.web.context.request.ServletWebRequest; -import org.springframework.web.servlet.HandlerExceptionResolver; -import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver; - -/** - * - * @author Will Simpson - * - */ -public class OrcidOAuth2AuthenticationEntryPoint extends OAuth2AuthenticationEntryPoint implements AccessDeniedHandler, AuthenticationEntryPoint { - - private WebResponseExceptionTranslator exceptionTranslator = new DefaultWebResponseExceptionTranslator(); - - private OAuth2ExceptionRenderer exceptionRenderer = new DefaultOAuth2ExceptionRenderer(); - - // This is from Spring MVC. - private HandlerExceptionResolver handlerExceptionResolver = new DefaultHandlerExceptionResolver(); - - public void setExceptionTranslator(WebResponseExceptionTranslator exceptionTranslator) { - this.exceptionTranslator = exceptionTranslator; - } - - public void setExceptionRenderer(OAuth2ExceptionRenderer exceptionRenderer) { - this.exceptionRenderer = exceptionRenderer; - } - - @Override - public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { - handleAsOrcidError(request, response, accessDeniedException); - - } - - public void handleAsOrcidError(HttpServletRequest request, HttpServletResponse response, Exception authException) throws IOException, ServletException { - try { - ResponseEntity result = exceptionTranslator.translate(authException); - result = (ResponseEntity) enhanceResponse(result, authException); - OrcidError orcidError = new OrcidError(); - orcidError.setResponseCode(result.getStatusCode().value()); - orcidError.setDeveloperMessage(result.getBody().getLocalizedMessage()); - ResponseEntity errorResponseEntity = new ResponseEntity<>(orcidError, result.getHeaders(), result.getStatusCode()); - exceptionRenderer.handleHttpEntityResponse(errorResponseEntity, new ServletWebRequest(request, response)); - response.flushBuffer(); - } catch (ServletException e) { - // Re-use some of the default Spring dispatcher behaviour - the - // exception came from the filter chain and - // not from an MVC handler so it won't be caught by the dispatcher - // (even if there is one) - if (handlerExceptionResolver.resolveException(request, response, this, e) == null) { - throw e; - } - } catch (IOException e) { - throw e; - } catch (RuntimeException e) { - throw e; - } catch (Exception e) { - // Wrap other Exceptions. These are not expected to happen - throw new RuntimeException(e); - } - } - - @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { - handleAsOrcidError(request, response, authException); - } - -} \ No newline at end of file diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/filter/ApiVersionCheckFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/filter/ApiVersionCheckFilter.java index dd04afa2a40..405bede5915 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/filter/ApiVersionCheckFilter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/filter/ApiVersionCheckFilter.java @@ -3,11 +3,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.core.Context; -import javax.ws.rs.ext.Provider; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.ext.Provider; import org.orcid.core.exception.OrcidBadRequestException; import org.orcid.core.locale.LocaleManager; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/filter/ApiVersionFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/filter/ApiVersionFilter.java index 921a50f7283..00fe971dff2 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/filter/ApiVersionFilter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/filter/ApiVersionFilter.java @@ -4,10 +4,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -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.orcid.core.version.ApiSection; import org.slf4j.Logger; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/filter/ClientIdAttributeFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/filter/ClientIdAttributeFilter.java index e078a4fbec5..2bb18984b3e 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/filter/ClientIdAttributeFilter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/filter/ClientIdAttributeFilter.java @@ -2,11 +2,11 @@ import java.io.IOException; -import javax.annotation.Resource; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.manager.v3.SourceManager; import org.springframework.web.filter.OncePerRequestFilter; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/filter/DefaultApiVersionFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/filter/DefaultApiVersionFilter.java index bd7538716d8..58ffd52d53d 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/filter/DefaultApiVersionFilter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/filter/DefaultApiVersionFilter.java @@ -7,14 +7,14 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.Resource; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; +import jakarta.annotation.Resource; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; import org.eclipse.jetty.http.HttpStatus; import org.orcid.core.api.OrcidApiConstants; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/filter/OboApiVersionCheckFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/filter/OboApiVersionCheckFilter.java index faabc261264..594336365b2 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/filter/OboApiVersionCheckFilter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/filter/OboApiVersionCheckFilter.java @@ -1,39 +1,26 @@ package org.orcid.api.common.filter; -import java.util.HashMap; -import java.util.Map; import java.util.regex.Matcher; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.ext.Provider; import org.apache.commons.lang3.StringUtils; -import org.orcid.core.constants.OrcidOauth2Constants; import org.orcid.core.exception.OboNotValidForApiVersionException; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.oauth.OrcidOboOAuth2Authentication; -import org.orcid.core.togglz.Features; -import org.orcid.core.utils.JsonUtils; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.core.utils.cache.redis.RedisClient; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; import org.springframework.stereotype.Component; - @Component @Provider public class OboApiVersionCheckFilter implements ContainerRequestFilter { - @Autowired - private OrcidOauth2TokenDetailService orcidOauth2TokenService; - @Autowired private RedisClient redisClient; @@ -45,7 +32,7 @@ public void filter(ContainerRequestContext request) { String version = getApiVersion(request); boolean oboRequest = isOboRequest(); - if ((oboRequest && version.startsWith("2.")) || (oboRequest && version.startsWith("3.0_rc1"))) { + if (oboRequest && (version.startsWith("2.") || version.startsWith("3.0_rc1"))) { // OBO tokens can't be used pre v3.0_rc2 throw new OboNotValidForApiVersionException(); } @@ -57,29 +44,10 @@ private boolean isOboRequest() { SecurityContext context = SecurityContextHolder.getContext(); if (context != null && context.getAuthentication() != null) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - // If the auth server token validation is on, then, the authentication type for OBO requests will be OrcidOboOAuth2Authentication - if(Features.OAUTH_TOKEN_VALIDATION.isActive()) { - if(OrcidOboOAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OrcidOboOAuth2Authentication authDetails = (OrcidOboOAuth2Authentication) authentication; - if (StringUtils.isNotBlank(authDetails.getOboClientId())) { - return true; - } - } - } else if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2AuthenticationDetails authDetails = (OAuth2AuthenticationDetails) ((OAuth2Authentication) authentication).getDetails(); - if (authDetails != null && authDetails.getTokenValue() != null) { - Map cachedAccessToken = getTokenFromCache(authDetails.getTokenValue()); - if(cachedAccessToken != null) { - if(cachedAccessToken.containsKey(OrcidOauth2Constants.IS_OBO_TOKEN)) { - return true; - } - } else { - // Fallback to database if it is not in the cache - OrcidOauth2TokenDetail tokenDetail = orcidOauth2TokenService.findIgnoringDisabledByTokenValue(authDetails.getTokenValue()); - if(tokenDetail != null) { - return tokenDetail.getOboClientDetailsId() != null; - } - } + if(OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + if (StringUtils.isNotBlank(authDetails.getOboClientId())) { + return true; } } } @@ -95,14 +63,4 @@ private String getApiVersion(ContainerRequestContext request) { return null; } - private Map getTokenFromCache(String accessTokenValue) { - if(isTokenCacheEnabled) { - String tokenJsonInfo = redisClient.get(accessTokenValue); - if(StringUtils.isNotBlank(tokenJsonInfo)) { - return JsonUtils.readObjectFromJsonString(tokenJsonInfo, HashMap.class); - } - } - return null; - } - } diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/filter/TokenTargetFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/filter/TokenTargetFilter.java index dd367992c82..ffb9feb3dff 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/filter/TokenTargetFilter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/filter/TokenTargetFilter.java @@ -3,67 +3,44 @@ import java.security.AccessControlException; import java.util.regex.Matcher; -import javax.annotation.Resource; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.ext.Provider; -import org.orcid.core.exception.OrcidUnauthorizedException; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.persistence.jpa.entities.ProfileEntity; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.utils.OrcidStringUtils; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; - -import org.glassfish.jersey.server.ContainerRequest; @Provider public class TokenTargetFilter implements ContainerRequestFilter { - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenService; + //TODO: this method is doing exactly the same that the OrcidSecutiryManagerImpl.isMyToken does, so, lets review it and leave only one. @Override public void filter(ContainerRequestContext request) { Matcher m = OrcidStringUtils.orcidPattern.matcher(request.getUriInfo().getPath()); if (m.find()) { - validateTargetRecord(m.group(), request); + validateTargetRecord(m.group()); } return ; } - private void validateTargetRecord(String targetOrcid, ContainerRequestContext request) { + private void validateTargetRecord(String targetOrcid) { // Verify if it is the owner of the token SecurityContext context = SecurityContextHolder.getContext(); if (context != null && context.getAuthentication() != null) { Authentication authentication = context.getAuthentication(); - if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Authentication oauth2Auth = (OAuth2Authentication) authentication; - Authentication userAuthentication = oauth2Auth.getUserAuthentication(); - if (userAuthentication != null) { - Object principal = userAuthentication.getPrincipal(); - if (principal instanceof ProfileEntity) { - ProfileEntity tokenOwner = (ProfileEntity) principal; - if (!targetOrcid.equals(tokenOwner.getId())) { - throwException(); - } + if (OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + if (authDetails != null) { + if (!targetOrcid.equals(authDetails.getUserOrcid())) { + throw new AccessControlException("You do not have the required permissions."); } } } } } - - private void throwException() { - RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - String apiVersion = (String) requestAttributes.getAttribute(ApiVersionFilter.API_VERSION_REQUEST_ATTRIBUTE_NAME, RequestAttributes.SCOPE_REQUEST); - if(apiVersion.equals("1.2")) { - throw new AccessControlException("You do not have the required permissions."); - } else { - throw new OrcidUnauthorizedException("Access token is for a different record"); - } - } + } diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/NotificationJsonMessageBodyWriter.java b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/NotificationJsonMessageBodyWriter.java index b29972cb9e1..f56beefcbaa 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/NotificationJsonMessageBodyWriter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/NotificationJsonMessageBodyWriter.java @@ -6,13 +6,13 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.annotation.Resource; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.annotation.Resource; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import org.orcid.core.api.OrcidApiConstants; import org.orcid.core.locale.LocaleManager; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidErrorJsonMessageBodyWriter.java b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidErrorJsonMessageBodyWriter.java index 09a626110c2..8a856ab8c36 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidErrorJsonMessageBodyWriter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidErrorJsonMessageBodyWriter.java @@ -6,13 +6,13 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.annotation.Resource; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.annotation.Resource; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import org.orcid.core.api.OrcidApiConstants; import org.orcid.core.locale.LocaleManager; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidExceptionMapper.java b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidExceptionMapper.java index c6423c3e94b..71664edecf0 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidExceptionMapper.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidExceptionMapper.java @@ -2,20 +2,20 @@ import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.*; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.solr.client.solrj.impl.HttpSolrClient.RemoteSolrException; -import org.jbibtex.TokenMgrError; +import org.jbibtex.TokenMgrException; import org.orcid.api.common.exception.JSONInputValidator; import org.orcid.api.common.filter.ApiVersionFilter; import org.orcid.api.common.util.ApiUtils; @@ -41,9 +41,6 @@ import org.springframework.context.MessageSource; import org.springframework.security.authentication.DisabledException; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; -import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; -import org.springframework.security.oauth2.common.exceptions.RedirectMismatchException; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -112,8 +109,6 @@ public Response toResponse(Throwable t) { logShortError(t, clientId); } else if (t instanceof OrcidBadRequestException) { logShortError(t, clientId); - } else if (t instanceof RedirectMismatchException) { - logShortError(t, clientId); } else if (t instanceof DuplicatedGroupIdRecordException) { logShortError(t, clientId); } else if (t instanceof OrcidNotificationException) { @@ -122,7 +117,7 @@ public Response toResponse(Throwable t) { logShortError(t, clientId); } else if (t instanceof WebApplicationException) { logShortError(t, clientId); - } else if (t instanceof TokenMgrError) { + } else if (t instanceof TokenMgrException) { logShortError(t, clientId); } else if (t instanceof InvalidPutCodeException) { logShortError(t, clientId); @@ -138,8 +133,6 @@ public Response toResponse(Throwable t) { logShortError(t, clientId); } else if(t instanceof StartDateAfterEndDateException) { logShortError(t, clientId); - } else if(t instanceof InvalidClientException) { - logShortError(t, clientId); } else if (t instanceof SearchStartParameterLimitExceededException) { logShortError(t, clientId); } else if (t instanceof InvalidDisambiguatedOrgException) { @@ -208,9 +201,6 @@ private Response legacyErrorResponse(Throwable t) { } else if (AuthenticationException.class.isAssignableFrom(t.getClass())) { OrcidMessage entity = getLegacyOrcidEntity("Authentication problem : ", t); return Response.status(Response.Status.UNAUTHORIZED).entity(entity).build(); - } else if (OAuth2Exception.class.isAssignableFrom(t.getClass())) { - OrcidMessage entity = getLegacyOrcidEntity("OAuth2 problem : ", t); - return Response.status(Response.Status.UNAUTHORIZED).entity(entity).build(); } else if (OrcidInvalidScopeException.class.isAssignableFrom(t.getClass())) { OrcidMessage entity = getLegacyOrcidEntity("OAuth2 problem : ", t); return Response.status(Response.Status.UNAUTHORIZED).entity(entity).build(); diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidJacksonJaxbJsonProvider.java b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidJacksonJaxbJsonProvider.java index ec3891de2b9..28e1d80e380 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidJacksonJaxbJsonProvider.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidJacksonJaxbJsonProvider.java @@ -7,11 +7,11 @@ import java.util.HashMap; import java.util.Map; -import javax.ws.rs.Consumes; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.Provider; import org.orcid.api.common.exception.JSONInputValidator; import org.orcid.api.common.filter.ApiVersionFilter; @@ -23,8 +23,8 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.jaxrs.cfg.Annotations; -import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; +import com.fasterxml.jackson.jakarta.rs.cfg.Annotations; +import com.fasterxml.jackson.jakarta.rs.json.JacksonXmlBindJsonProvider; /** * @author Will Simpson @@ -32,7 +32,7 @@ @Provider @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) -public class OrcidJacksonJaxbJsonProvider extends JacksonJaxbJsonProvider { +public class OrcidJacksonJaxbJsonProvider extends JacksonXmlBindJsonProvider { private JSONInputValidator jsonInputValidator = new JSONInputValidator(); diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidJacksonJaxbJsonProviderPretty.java b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidJacksonJaxbJsonProviderPretty.java index 5489002c56e..67bd66bb346 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidJacksonJaxbJsonProviderPretty.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidJacksonJaxbJsonProviderPretty.java @@ -10,11 +10,11 @@ import java.util.HashMap; import java.util.Map; -import javax.ws.rs.Consumes; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.Provider; import org.orcid.api.common.exception.JSONInputValidator; import org.orcid.api.common.filter.ApiVersionFilter; @@ -26,8 +26,8 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; -import com.fasterxml.jackson.jaxrs.cfg.Annotations; +import com.fasterxml.jackson.jakarta.rs.json.JacksonXmlBindJsonProvider; +import com.fasterxml.jackson.jakarta.rs.cfg.Annotations; @@ -38,7 +38,7 @@ @Provider @Consumes({ VND_ORCID_JSON, ORCID_JSON, "text/orcid+json" }) @Produces({ VND_ORCID_JSON, ORCID_JSON, "text/orcid+json" }) -public class OrcidJacksonJaxbJsonProviderPretty extends JacksonJaxbJsonProvider { +public class OrcidJacksonJaxbJsonProviderPretty extends JacksonXmlBindJsonProvider { private JSONInputValidator jsonInputValidator = new JSONInputValidator(); diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidMarshallerContextResolver.java b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidMarshallerContextResolver.java index 0830ec0f0f1..afd92c423da 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidMarshallerContextResolver.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidMarshallerContextResolver.java @@ -1,15 +1,15 @@ package org.orcid.api.common.jaxb; -import javax.ws.rs.Consumes; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ContextResolver; -import javax.ws.rs.ext.Provider; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ContextResolver; +import jakarta.ws.rs.ext.Provider; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; import org.apache.log4j.Logger; import org.orcid.core.api.OrcidApiConstants; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidMarshallerWrapper.java b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidMarshallerWrapper.java index fe65e940e4a..41dae17f318 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidMarshallerWrapper.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidMarshallerWrapper.java @@ -5,13 +5,13 @@ import java.io.UnsupportedEncodingException; import java.io.Writer; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.PropertyException; -import javax.xml.bind.ValidationEventHandler; -import javax.xml.bind.annotation.adapters.XmlAdapter; -import javax.xml.bind.attachment.AttachmentMarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; +import jakarta.xml.bind.PropertyException; +import jakarta.xml.bind.ValidationEventHandler; +import jakarta.xml.bind.annotation.adapters.XmlAdapter; +import jakarta.xml.bind.attachment.AttachmentMarshaller; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.Result; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidValidationJaxbContextResolver.java b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidValidationJaxbContextResolver.java index 60ec25b7b01..3f4e4d2b240 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidValidationJaxbContextResolver.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/jaxb/OrcidValidationJaxbContextResolver.java @@ -5,23 +5,23 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import javax.annotation.Resource; -import javax.ws.rs.Consumes; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.ext.ContextResolver; -import javax.ws.rs.ext.Provider; +import jakarta.annotation.Resource; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.ext.ContextResolver; +import jakarta.ws.rs.ext.Provider; import javax.xml.XMLConstants; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.MarshalException; -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.ValidationEvent; -import javax.xml.bind.ValidationEventHandler; -import javax.xml.bind.util.JAXBSource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.MarshalException; +import jakarta.xml.bind.Unmarshaller; +import jakarta.xml.bind.ValidationEvent; +import jakarta.xml.bind.ValidationEventHandler; +import jakarta.xml.bind.util.JAXBSource; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/oauth/OrcidClientCredentialEndPointDelegator.java b/orcid-api-common/src/main/java/org/orcid/api/common/oauth/OrcidClientCredentialEndPointDelegator.java deleted file mode 100644 index ade7ee9897f..00000000000 --- a/orcid-api-common/src/main/java/org/orcid/api/common/oauth/OrcidClientCredentialEndPointDelegator.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.orcid.api.common.oauth; - -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; - -/** - * @author Declan Newman (declan) Date: 18/04/2012 - */ -public interface OrcidClientCredentialEndPointDelegator { - - Response obtainOauth2Token(String authorization, MultivaluedMap formParams); - - void setTokenCacheEnabled(boolean enabled); - - boolean isTokenCacheEnabled(); -} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/oauth/OrcidClientCredentialEndPointDelegatorImpl.java b/orcid-api-common/src/main/java/org/orcid/api/common/oauth/OrcidClientCredentialEndPointDelegatorImpl.java deleted file mode 100644 index df5f9b9dedf..00000000000 --- a/orcid-api-common/src/main/java/org/orcid/api/common/oauth/OrcidClientCredentialEndPointDelegatorImpl.java +++ /dev/null @@ -1,358 +0,0 @@ -package org.orcid.api.common.oauth; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Resource; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; - -import org.apache.commons.lang.StringUtils; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.exception.OrcidInvalidScopeException; -import org.orcid.core.locale.LocaleManager; -import org.orcid.core.oauth.OAuthError; -import org.orcid.core.oauth.OAuthErrorUtils; -import org.orcid.core.utils.JsonUtils; -import org.orcid.core.utils.cache.redis.RedisClient; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.dao.OrcidOauth2AuthoriziationCodeDetailDao; -import org.orcid.persistence.dao.ProfileLastModifiedDao; -import org.orcid.persistence.jpa.entities.IndexingStatus; -import org.orcid.persistence.jpa.entities.OrcidOauth2AuthoriziationCodeDetail; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.authentication.InsufficientAuthenticationException; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; -import org.springframework.security.oauth2.common.exceptions.UnsupportedGrantTypeException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.security.oauth2.provider.endpoint.AbstractEndpoint; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -/** - * @author Declan Newman (declan) Date: 18/04/2012 - */ -@Component("orcidClientCredentialEndPointDelegator") -public class OrcidClientCredentialEndPointDelegatorImpl extends AbstractEndpoint implements OrcidClientCredentialEndPointDelegator { - - private static final Logger LOGGER = LoggerFactory.getLogger(OrcidClientCredentialEndPointDelegatorImpl.class); - - @Resource - private OrcidOauth2AuthoriziationCodeDetailDao orcidOauth2AuthoriziationCodeDetailDao; - - @Resource - protected LocaleManager localeManager; - - @Resource(name="profileLastModifiedDao") - private ProfileLastModifiedDao profileLastModifiedDao; - - @Resource - private RedisClient redisClient; - - @Value("${org.orcid.core.utils.cache.redis.enabled:true}") - private boolean isTokenCacheEnabled; - - @Transactional - public Response obtainOauth2Token(String authorization, MultivaluedMap formParams) { - String code = formParams.getFirst("code"); - String clientId = formParams.getFirst(OrcidOauth2Constants.CLIENT_ID_PARAM); - String state = formParams.getFirst(OrcidOauth2Constants.STATE_PARAM); - String redirectUri = formParams.getFirst(OrcidOauth2Constants.REDIRECT_URI_PARAM); - String refreshToken = formParams.getFirst(OrcidOauth2Constants.REFRESH_TOKEN); - String scopeList = formParams.getFirst(OrcidOauth2Constants.SCOPE_PARAM); - String grantType = formParams.getFirst(OrcidOauth2Constants.GRANT_TYPE); - Boolean revokeOld = formParams.containsKey(OrcidOauth2Constants.REVOKE_OLD) ? Boolean.valueOf(formParams.getFirst(OrcidOauth2Constants.REVOKE_OLD)) : true; - Long expiresIn = calculateExpiresIn(formParams); - //IETF Token exchange - String subjectToken = formParams.getFirst(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN); - String subjectTokenType = formParams.getFirst(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE); - String requestedTokenType = formParams.getFirst(OrcidOauth2Constants.IETF_EXCHANGE_REQUESTED_TOKEN_TYPE); - - String bearerToken = null; - Set scopes = new HashSet(); - if (StringUtils.isNotEmpty(scopeList)) { - scopes = OAuth2Utils.parseParameterList(scopeList); - } - if(OrcidOauth2Constants.REFRESH_TOKEN.equals(grantType)) { - if(!PojoUtil.isEmpty(authorization)) { - if ((authorization.toLowerCase().startsWith(OAuth2AccessToken.BEARER_TYPE.toLowerCase()))) { - String authHeaderValue = authorization.substring(OAuth2AccessToken.BEARER_TYPE.length()).trim(); - int commaIndex = authHeaderValue.indexOf(','); - if (commaIndex > 0) { - authHeaderValue = authHeaderValue.substring(0, commaIndex); - } - bearerToken = authHeaderValue; - if(PojoUtil.isEmpty(bearerToken)) { - throw new IllegalArgumentException("Refresh token request doesnt include the authorization"); - } - } - } - } - - Authentication client = getClientAuthentication(); - if (!client.isAuthenticated()) { - LOGGER.error("Not authenticated for OAuth2: clientId={}, grantType={}, refreshToken={}, code={}, scopes={}, state={}, redirectUri={}", new Object[] { - clientId, grantType, refreshToken, code, scopes, state, redirectUri }); - throw new InsufficientAuthenticationException(localeManager.resolveMessage("apiError.client_not_authenticated.exception")); - } - - /** - * Patch, update any orcid-grants scope to funding scope - * */ - for (String scope : scopes) { - if (scope.contains("orcid-grants")) { - String newScope = scope.replace("orcid-grants", "funding"); - LOGGER.info("Client {} provided a grants scope {} which will be updated to {}", new Object[] { clientId, scope, newScope }); - scopes.remove(scope); - scopes.add(newScope); - } - } - - try { - if (scopes != null) { - List toRemove = new ArrayList(); - for (String scope : scopes) { - ScopePathType scopeType = ScopePathType.fromValue(scope); - if(scopeType.isInternalScope()) { - // You should not allow any internal scope here! go away! - String message = localeManager.resolveMessage("apiError.9015.developerMessage", new Object[]{}); - throw new OrcidInvalidScopeException(message, clientId, scope); - } else if(OrcidOauth2Constants.GRANT_TYPE_CLIENT_CREDENTIALS.equals(grantType)) { - if(!scopeType.isClientCreditalScope()) - toRemove.add(scope); - } else { - if(scopeType.isClientCreditalScope()) - toRemove.add(scope); - } - } - - for (String remove : toRemove) { - scopes.remove(remove); - } - } - } catch (IllegalArgumentException iae) { - String message = localeManager.resolveMessage("apiError.9015.developerMessage", new Object[]{}); - if(scopes != null) { - message += " Provided scopes: " + String.join(",", scopes); - } - throw new OrcidInvalidScopeException(message, clientId, iae.getMessage()); - } - - try{ - OAuth2AccessToken token = generateToken(client, scopes, code, redirectUri, grantType, refreshToken, state, bearerToken, revokeOld, expiresIn, subjectToken, subjectTokenType, requestedTokenType); - - //Lets check if the user needs to be indexed - if(token != null && token.getAdditionalInformation() != null) { - if(token.getAdditionalInformation().containsKey(OrcidOauth2Constants.ORCID)) { - String orcidId = (String) token.getAdditionalInformation().get(OrcidOauth2Constants.ORCID); - if(!PojoUtil.isEmpty(orcidId)) { - profileLastModifiedDao.updateIndexingStatus(Arrays.asList(orcidId), IndexingStatus.PENDING); - } - } - } - - // Do not put the token in the cache if the token is disabled - if(token.getAdditionalInformation() != null && !token.getAdditionalInformation().containsKey(OrcidOauth2Constants.TOKEN_DISABLED)) { - setToCache(client.getName(), token); - } - removeMetadataFromToken(token); - return getResponse(token); - } catch (InvalidGrantException e){ //this needs to be caught here so the transaction doesn't roll back - OAuthError error = OAuthErrorUtils.getOAuthError(e); - return Response.status(error.getResponseStatus().getStatusCode()).entity(error).build(); - } - } - - /** - * Set the access token in the cache - * */ - protected void setToCache(String clientId, OAuth2AccessToken accessToken) { - if(isTokenCacheEnabled) { - try { - String tokenValue = accessToken.getValue(); - Map tokenData = new HashMap(); - tokenData.put(OrcidOauth2Constants.ACCESS_TOKEN, tokenValue); - tokenData.put(OrcidOauth2Constants.TOKEN_EXPIRATION_TIME, String.valueOf(accessToken.getExpiration().getTime())); - StringBuilder sb = new StringBuilder(); - accessToken.getScope().forEach(x -> {sb.append(x); sb.append(' ');}); - tokenData.put(OrcidOauth2Constants.SCOPE_PARAM, sb.toString()); - tokenData.put(OrcidOauth2Constants.ORCID, (String) accessToken.getAdditionalInformation().get(OrcidOauth2Constants.ORCID)); - tokenData.put(OrcidOauth2Constants.CLIENT_ID, clientId); - tokenData.put(OrcidOauth2Constants.RESOURCE_IDS, OrcidOauth2Constants.ORCID); - tokenData.put(OrcidOauth2Constants.APPROVED, Boolean.TRUE.toString()); - if(accessToken.getAdditionalInformation().containsKey(OrcidOauth2Constants.IS_OBO_TOKEN)) { - tokenData.put(OrcidOauth2Constants.IS_OBO_TOKEN, Boolean.TRUE.toString()); - } - redisClient.set(tokenValue, JsonUtils.convertToJsonString(tokenData)); - } catch(Exception e) { - LOGGER.info("Unable to set token in Redis cache", e); - } - } - } - - /** - * Calculates the real value of the "expires_in" param based on the current time - * - * @param formParams - * The params container - * - * @return the expiration time in milliseconds based on the param OrcidOauth2Constants.EXPIRES_IN. - * @throws IllegalArgumentException in case the parameter is not a number - * */ - private Long calculateExpiresIn(MultivaluedMap formParams) { - if(!formParams.containsKey(OrcidOauth2Constants.EXPIRES_IN)){ - return 0L; - } - - String expiresInParam = formParams.getFirst(OrcidOauth2Constants.EXPIRES_IN); - Long result = 0L; - - try { - result = Long.valueOf(expiresInParam); - } catch(Exception e) { - throw new IllegalArgumentException(expiresInParam + " is not a number"); - } - - return result == 0 ? result : (System.currentTimeMillis() + (result * 1000)); - } - - protected OAuth2AccessToken generateToken(Authentication client, Set scopes, String grantType) { - return generateToken(client, scopes, null, null, grantType, null, null, null, false, 0L, null, null, null); - } - - protected OAuth2AccessToken generateToken(Authentication client, Set scopes, String code, String redirectUri, String grantType, String refreshToken, String state, String authorization, boolean revokeOld, Long expiresIn, String subjectToken, String subjectTokenType, String requestedTokenType) { - String clientId = client.getName(); - Map authorizationParameters = new HashMap(); - - if(scopes != null) { - String scopesString = StringUtils.join(scopes, ' '); - authorizationParameters.put(OAuth2Utils.SCOPE, scopesString); - } - - authorizationParameters.put(OAuth2Utils.CLIENT_ID, clientId); - if (code != null) { - authorizationParameters.put("code", code); - OrcidOauth2AuthoriziationCodeDetail authorizationCodeEntity = orcidOauth2AuthoriziationCodeDetailDao.find(code); - - if(authorizationCodeEntity != null) { - if(orcidOauth2AuthoriziationCodeDetailDao.isPersistentToken(code)) { - authorizationParameters.put(OrcidOauth2Constants.IS_PERSISTENT, "true"); - } else { - authorizationParameters.put(OrcidOauth2Constants.IS_PERSISTENT, "false"); - } - - if(!authorizationParameters.containsKey(OAuth2Utils.SCOPE) || PojoUtil.isEmpty(authorizationParameters.get(OAuth2Utils.SCOPE))) { - //////// - // TODO: The name should change to `scopes` once the authorization server generates all authorization codes - //////// - Set newScopes = StringUtils.isNotBlank(authorizationCodeEntity.getNewScopes()) ? Stream.of(authorizationCodeEntity.getNewScopes().split(",")).map(String::trim).collect(Collectors.toSet()) : Set.of(); - - Set allScopes = new HashSet(); - allScopes.addAll(newScopes); - allScopes.addAll(authorizationCodeEntity.getScopes()); - - String scopesString = StringUtils.join(allScopes, ' '); - authorizationParameters.put(OAuth2Utils.SCOPE, scopesString); - } - - //This will pass through to the token generator as a request param. - if (authorizationCodeEntity.getNonce() !=null){ - authorizationParameters.put(OrcidOauth2Constants.NONCE, authorizationCodeEntity.getNonce()); - } - } else { - authorizationParameters.put(OrcidOauth2Constants.IS_PERSISTENT, "false"); - } - } - - //If it is a refresh token request, set the needed authorization parameters - if(OrcidOauth2Constants.REFRESH_TOKEN.equals(grantType)) { - authorizationParameters.put(OrcidOauth2Constants.AUTHORIZATION, authorization); - authorizationParameters.put(OrcidOauth2Constants.REVOKE_OLD, String.valueOf(revokeOld)); - authorizationParameters.put(OrcidOauth2Constants.EXPIRES_IN, String.valueOf(expiresIn)); - authorizationParameters.put(OrcidOauth2Constants.REFRESH_TOKEN, String.valueOf(refreshToken)); - } else if (OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE.equals(grantType)) { - authorizationParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN, String.valueOf(subjectToken)); - authorizationParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE, String.valueOf(subjectTokenType)); - authorizationParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_REQUESTED_TOKEN_TYPE, String.valueOf(requestedTokenType)); - //required so OrcidRandomValueTokenServicesImpl doesn't generate a refresh token - authorizationParameters.put(OrcidOauth2Constants.GRANT_TYPE, OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE); - } - - if (redirectUri != null) { - authorizationParameters.put(OAuth2Utils.REDIRECT_URI, redirectUri); - } - AuthorizationRequest authorizationRequest = getOAuth2RequestFactory().createAuthorizationRequest(authorizationParameters); - - TokenRequest tokenRequest = getOAuth2RequestFactory().createTokenRequest(authorizationRequest, grantType); - //Need to change this to either the DefaultTokenType or start using a different token type. - OAuth2AccessToken token = getTokenGranter().grant(grantType, tokenRequest); - Object params[] = {grantType}; - if (token == null) { - LOGGER.error("Unsupported grant type for OAuth2: clientId={}, grantType={}, code={}", new Object[] { - clientId, grantType, code}); - throw new UnsupportedGrantTypeException(localeManager.resolveMessage("apiError.unsupported_client_type.exception", params)); - } - - Long tokenId = token.getAdditionalInformation() != null ? (Long) token.getAdditionalInformation().get(OrcidOauth2Constants.TOKEN_ID) : null; - - LOGGER.info("OAuth2 access token granted: tokenId={}, clientId={}, code={}, scopes={}", new Object[] { - tokenId, clientId, code, token.getScope() }); - - return token; - } - - protected void removeMetadataFromToken(OAuth2AccessToken accessToken) { - if(accessToken != null && accessToken.getAdditionalInformation() != null) { - if(accessToken.getAdditionalInformation().containsKey(OrcidOauth2Constants.TOKEN_VERSION)) - accessToken.getAdditionalInformation().remove(OrcidOauth2Constants.TOKEN_VERSION); - if(accessToken.getAdditionalInformation().containsKey(OrcidOauth2Constants.PERSISTENT)) - accessToken.getAdditionalInformation().remove(OrcidOauth2Constants.PERSISTENT); - if(accessToken.getAdditionalInformation().containsKey(OrcidOauth2Constants.DATE_CREATED)) - accessToken.getAdditionalInformation().remove(OrcidOauth2Constants.DATE_CREATED); - if(accessToken.getAdditionalInformation().containsKey(OrcidOauth2Constants.TOKEN_ID)) - accessToken.getAdditionalInformation().remove(OrcidOauth2Constants.TOKEN_ID); - if(accessToken.getAdditionalInformation().containsKey(OrcidOauth2Constants.TOKEN_DISABLED)) - accessToken.getAdditionalInformation().remove(OrcidOauth2Constants.TOKEN_DISABLED); - } - } - - protected Response getResponse(OAuth2AccessToken accessToken) { - return Response.ok((DefaultOAuth2AccessToken)accessToken).header("Cache-Control", "no-store").header("Pragma", "no-cache").build(); - } - - protected Authentication getClientAuthentication() { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null) { - return authentication; - } else { - throw new InsufficientAuthenticationException(localeManager.resolveMessage("apiError.client_authentication_notfound.exception")); - } - - } - - public boolean isTokenCacheEnabled() { - return isTokenCacheEnabled; - } - - public void setTokenCacheEnabled(boolean isTokenCacheEnabled) { - this.isTokenCacheEnabled = isTokenCacheEnabled; - } - -} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/provider/client/ClientDetailsUserDetailsService.java b/orcid-api-common/src/main/java/org/orcid/api/common/provider/client/ClientDetailsUserDetailsService.java new file mode 100644 index 00000000000..8abc3a0d4b2 --- /dev/null +++ b/orcid-api-common/src/main/java/org/orcid/api/common/provider/client/ClientDetailsUserDetailsService.java @@ -0,0 +1,32 @@ +package org.orcid.api.common.provider.client; + +import org.apache.commons.lang.StringUtils; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; +import org.orcid.core.userDetails.MultiSecretClient; +import org.orcid.persistence.jpa.entities.ClientDetailsEntity; +import org.orcid.persistence.jpa.entities.ClientSecretEntity; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class ClientDetailsUserDetailsService implements UserDetailsService { + + @Resource(name = "clientDetailsManagerReadOnlyV3") + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; + + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + if(clientDetailsManagerReadOnly.exists(username)) { + ClientDetailsEntity client = clientDetailsManagerReadOnly.findByClientId(username); + Set secrets = client.getClientSecrets(); + List secretsList = secrets.stream().map(s -> new MultiSecretClient.Secret(s.getClientSecret(), s.isPrimary())).collect(Collectors.toList()); + return new MultiSecretClient(client.getClientId(), StringUtils.EMPTY, client.getAuthorities(), secretsList); + } else { + throw new UsernameNotFoundException("Client with id " + username + " not found"); + } + } +} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/APIAuthenticationEntryPoint.java b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/APIAuthenticationEntryPoint.java new file mode 100644 index 00000000000..58369f28cfc --- /dev/null +++ b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/APIAuthenticationEntryPoint.java @@ -0,0 +1,34 @@ +package org.orcid.api.common.security.oauth; + +import org.orcid.jaxb.model.v3.release.error.OrcidError; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class APIAuthenticationEntryPoint implements AuthenticationEntryPoint { + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { + try { + //TODO: This is NOT ready, exceptions should be handled and the proper error message returned + OrcidError orcidError = new OrcidError(); + orcidError.setResponseCode(response.getStatus()); + orcidError.setDeveloperMessage("GENERIC ERROR MESSAGE"); + + response.setStatus(HttpStatus.FORBIDDEN.value()); + response.getWriter().write(orcidError.toString()); + response.flushBuffer(); + } catch (IOException e) { + throw e; + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + // Wrap other Exceptions. These are not expected to happen + throw new RuntimeException(e); + } + } +} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidAPIAccessDeniedHandler.java b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidAPIAccessDeniedHandler.java new file mode 100644 index 00000000000..106c4d7b4ae --- /dev/null +++ b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidAPIAccessDeniedHandler.java @@ -0,0 +1,34 @@ +package org.orcid.api.common.security.oauth; + +import org.orcid.jaxb.model.v3.release.error.OrcidError; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class OrcidAPIAccessDeniedHandler implements AccessDeniedHandler { + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { + try { + //TODO: This is NOT ready, exceptions should be handled and the proper error message returned + OrcidError orcidError = new OrcidError(); + orcidError.setResponseCode(response.getStatus()); + orcidError.setDeveloperMessage("GENERIC ERROR MESSAGE"); + + response.setStatus(HttpStatus.FORBIDDEN.value()); + response.getWriter().write(orcidError.toString()); + response.flushBuffer(); + } catch (IOException e) { + throw e; + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + // Wrap other Exceptions. These are not expected to happen + throw new RuntimeException(e); + } + } +} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidBearerTokenFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidBearerTokenFilter.java new file mode 100644 index 00000000000..3e44aab21c2 --- /dev/null +++ b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidBearerTokenFilter.java @@ -0,0 +1,147 @@ +package org.orcid.api.common.security.oauth; + + +import com.google.common.collect.Sets; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; +import org.orcid.core.exception.InvalidTokenException; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; +import org.orcid.core.oauth.authorizationServer.AuthorizationServerUtil; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.annotation.Resource; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URISyntaxException; +import java.security.AccessControlException; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.Set; +import java.util.stream.Collectors; + +public class OrcidBearerTokenFilter implements Filter { + private static final Logger logger = Logger.getLogger(OrcidBearerTokenFilter.class); + + @Resource + private AuthorizationServerUtil authorizationServerUtil; + + @Resource + private APIAuthenticationEntryPoint apiAuthenticationEntryPoint; + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + final HttpServletRequest request = (HttpServletRequest) req; + final HttpServletResponse response = (HttpServletResponse) res; + + String tokenValue = extractToken(request); + if(StringUtils.isBlank(tokenValue)) { + // If the token is not present, continue the chain + chain.doFilter(request, response); + } + + try { + JSONObject tokenData = authorizationServerUtil.tokenIntrospection(tokenValue); + OrcidBearerTokenAuthentication authentication = validateTokenData(tokenValue, tokenData); + SecurityContextHolder.getContext().setAuthentication(authentication); + chain.doFilter(request, response); + } catch (URISyntaxException | InterruptedException | JSONException e) { + //TODO: Define error message and add exception type to it + apiAuthenticationEntryPoint.commence(request, response, null); + return; + } + } + + private OrcidBearerTokenAuthentication validateTokenData(String accessTokenValue, JSONObject tokenInfo) { + try { + if(tokenInfo == null) { + throw new AccessControlException("Invalid access token: Unable to obtain information from the authorization server"); + } + + boolean isTokenActive = tokenInfo.getBoolean("active"); + if(isTokenActive) { + // If the token is user revoked it might be used for DELETE requests + return buildAuthentication(accessTokenValue, tokenInfo); + } else { + ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if(RequestMethod.DELETE.name().equals(attr.getRequest().getMethod())) { + if(tokenInfo.has("USER_REVOKED") && tokenInfo.getBoolean("USER_REVOKED") == true) { + return buildAuthentication(accessTokenValue, tokenInfo); + } else { + throw new AccessControlException("Invalid access token: " + accessTokenValue); + } + } else { + throw new AccessControlException("Invalid access token: " + accessTokenValue); + } + } + } catch(AccessControlException i) { + throw i; + } catch(Exception e) { + logger.error("Exception validating token from authorization server", e); + throw new RuntimeException("Exception validating token from authorization server", e); + } + } + + private OrcidBearerTokenAuthentication buildAuthentication(String accessTokenValue, JSONObject tokenInfo) throws JSONException { + String clientId = tokenInfo.getString("client_id"); + String userOrcid = tokenInfo.getString("username"); + + OrcidBearerTokenAuthentication.Builder builder = OrcidBearerTokenAuthentication.builder(clientId, userOrcid, accessTokenValue); + + Set scopes = Arrays.stream(tokenInfo.getString("scope").split("[\\s,]+")) + .collect(Collectors.toSet()); + builder.scopes(scopes); + + // Set granted authorities + if(tokenInfo.has("clientGrantedAuthority")) { + builder.authorities(Sets.newHashSet(new SimpleGrantedAuthority(tokenInfo.getString("clientGrantedAuthority")))); + } + + if(tokenInfo.has("OBO_CLIENT_ID")) { + String oboClientId = tokenInfo.getString("OBO_CLIENT_ID"); + builder.oboClientId(oboClientId); + } + builder.authenticated(true); + return builder.build(); + } + + private String extractToken(HttpServletRequest request) { + // first check the header... + String token = extractHeaderToken(request); + + // bearer type allows a request parameter as well + if (token == null) { + logger.debug("Token not found in headers. Trying request parameters."); + token = request.getParameter("access_token"); + if (token == null) { + logger.debug("Token not found in request parameters. Not an OAuth2 request."); + } + } + + return token; + } + + private String extractHeaderToken(HttpServletRequest request) { + Enumeration headers = request.getHeaders("Authorization"); + while (headers.hasMoreElements()) { // typically there is only one (most servers enforce that) + String value = headers.nextElement(); + if ((value.toLowerCase().startsWith("bearer"))) { + String authHeaderValue = value.substring("bearer".length()).trim(); + int commaIndex = authHeaderValue.indexOf(','); + if (commaIndex > 0) { + authHeaderValue = authHeaderValue.substring(0, commaIndex); + } + return authHeaderValue; + } + } + + return null; + } +} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidMultiSecretAuthenticationProvider.java b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidMultiSecretAuthenticationProvider.java similarity index 51% rename from orcid-core/src/main/java/org/orcid/core/oauth/OrcidMultiSecretAuthenticationProvider.java rename to orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidMultiSecretAuthenticationProvider.java index 99da7f732de..465cdf2960e 100644 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidMultiSecretAuthenticationProvider.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidMultiSecretAuthenticationProvider.java @@ -1,53 +1,45 @@ -package org.orcid.core.oauth; +package org.orcid.api.common.security.oauth; -import javax.annotation.Resource; +import jakarta.annotation.Resource; -import org.orcid.core.manager.ClientDetailsManager; import org.orcid.core.manager.EncryptionManager; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.ClientSecretEntity; +import org.orcid.core.userDetails.MultiSecretClient; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.crypto.password.NoOpPasswordEncoder; /** - * + * * @author Will Simpson - * + * */ public class OrcidMultiSecretAuthenticationProvider extends DaoAuthenticationProvider { - @Resource - private ClientDetailsManager clientDetailsManager; - @Resource private EncryptionManager encryptionManager; - @SuppressWarnings("deprecation") @Override protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { - if (authentication.getCredentials() == null) { logger.debug("Authentication failed: no credentials provided"); - throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + throw new BadCredentialsException("No credentials provided for " + userDetails.getUsername()); } String presentedPassword = authentication.getCredentials().toString(); - - ClientDetailsEntity clientDetailsEntity = clientDetailsManager.findByClientId(userDetails.getUsername()); - for (ClientSecretEntity clientSecretEntity : clientDetailsEntity.getClientSecrets()) { - if(!presentedPassword.startsWith("{noop}")){ - presentedPassword = "{noop}" + presentedPassword; - } - if (getPasswordEncoder().matches(encryptionManager.decryptForInternalUse(clientSecretEntity.getClientSecret()), presentedPassword)) { + if(!presentedPassword.startsWith("{noop}")){ + presentedPassword = "{noop}" + presentedPassword; + } + + MultiSecretClient clientDetails = (MultiSecretClient) this.getUserDetailsService().loadUserByUsername(userDetails.getUsername()); + for (MultiSecretClient.Secret secret : clientDetails.getSecrets()) { + if (getPasswordEncoder().matches(encryptionManager.decryptForInternalUse(secret.getEncryptedSecret()), presentedPassword)) { return; } } logger.debug("Authentication failed: password does not match any value"); - throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + throw new BadCredentialsException("Invalid client credentials provided for " + userDetails.getUsername()); } -} +} \ No newline at end of file diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidOauth2TokenEndPointFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidOauth2TokenEndPointFilter.java deleted file mode 100644 index 96be30f8bd8..00000000000 --- a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidOauth2TokenEndPointFilter.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.orcid.api.common.security.oauth; - -import java.io.IOException; - -import javax.annotation.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.orcid.core.locale.LocaleManager; -import org.orcid.core.security.MethodNotAllowedException; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; -import org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter; -import org.springframework.web.bind.annotation.RequestMethod; - -/** - + - + - + This filter should be removed once the authorization server is inplace - + - + - + */ -@Deprecated(forRemoval = true) -public class OrcidOauth2TokenEndPointFilter extends ClientCredentialsTokenEndpointFilter { - - private final static String PUBLIC_ROLE = "ROLE_PUBLIC"; - - @Resource - private LocaleManager localeManager; - - private OrcidOauth2TokenEndPointFilter() { - super(); - } - - private OrcidOauth2TokenEndPointFilter(String path) { - super(path); - } - - @Override - public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { - if (request.getMethod().equals(RequestMethod.GET.name())) { - InvalidRequestException ire = new InvalidRequestException(localeManager.resolveMessage("apiError.token_request_callmethod.exception")); - throw new MethodNotAllowedException(localeManager.resolveMessage("apiError.token_request_callmethod.exception"), ire); - } - - String clientId = request.getParameter("client_id"); - String clientSecret = request.getParameter("client_secret"); - - // If the request is already authenticated we can assume that this - // filter is not needed - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null && authentication.isAuthenticated()) { - return authentication; - } - - if (clientId == null) { - throw new BadCredentialsException(localeManager.resolveMessage("apiError.client_credentials.exception")); - } - - if (clientSecret == null) { - clientSecret = ""; - } - - clientId = clientId.trim(); - UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(clientId, "{noop}"+clientSecret); - - authentication = this.getAuthenticationManager().authenticate(authRequest); - - if (authentication != null) { - for (GrantedAuthority auth : authentication.getAuthorities()) { - if (PUBLIC_ROLE.equals(auth.getAuthority())) { - InvalidRequestException ire = new InvalidRequestException(localeManager.resolveMessage("apiError.memberapi_access.exception")); - throw new MethodNotAllowedException(localeManager.resolveMessage("apiError.memberapi_access.exception"), ire); - } - } - } - - return authentication; - } - -} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidT1Oauth2TokenEndPointFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidT1Oauth2TokenEndPointFilter.java deleted file mode 100644 index 8af19c8a7de..00000000000 --- a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidT1Oauth2TokenEndPointFilter.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.orcid.api.common.security.oauth; - -import java.io.IOException; - -import javax.annotation.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.orcid.core.locale.LocaleManager; -import org.orcid.core.security.MethodNotAllowedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; -import org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter; -import org.springframework.web.bind.annotation.RequestMethod; - -/** - * @author Angel Montenegro (amontenegro) Date: 27/03/2014 - */ -public class OrcidT1Oauth2TokenEndPointFilter extends ClientCredentialsTokenEndpointFilter { - - @Resource - private LocaleManager localeManager; - - private static final Logger LOGGER = LoggerFactory.getLogger(OrcidT1Oauth2TokenEndPointFilter.class); - - @Override - public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { - if (request.getMethod().equals(RequestMethod.GET.name())) { - InvalidRequestException ire = new InvalidRequestException(localeManager.resolveMessage("apiError.token_request_callmethod.exception")); - throw new MethodNotAllowedException(localeManager.resolveMessage("apiError.token_request_callmethod.exception"), ire); - } - - String clientId = request.getParameter("client_id"); - String clientSecret = request.getParameter("client_secret"); - - LOGGER.info("About to attempt authentication: clientId={}", clientId); - - // If the request is already authenticated we can assume that this - // filter is not needed - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null && authentication.isAuthenticated()) { - LOGGER.info("Already got authentication in security context holder: principal={}, name={}", authentication.getPrincipal(), authentication.getName()); - return authentication; - } - - if (clientId == null) { - throw new BadCredentialsException(localeManager.resolveMessage("apiError.client_credentials.exception")); - } - - if (clientSecret == null) { - clientSecret = ""; - } - - clientId = clientId.trim(); - UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(clientId, "{noop}"+clientSecret); - - Authentication authenticationResult = this.getAuthenticationManager().authenticate(authRequest); - if (authenticationResult != null) { - LOGGER.info("Got authentication result: principal={}, name={}", authenticationResult.getPrincipal(), authenticationResult.getName()); - } - return authenticationResult; - } - -} \ No newline at end of file diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidWebOauth2TokenEndPointFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidWebOauth2TokenEndPointFilter.java deleted file mode 100644 index feb2ec39ffd..00000000000 --- a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/OrcidWebOauth2TokenEndPointFilter.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.orcid.api.common.security.oauth; - -import java.io.IOException; - -import javax.annotation.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.orcid.core.locale.LocaleManager; -import org.orcid.core.security.MethodNotAllowedException; -import org.orcid.core.togglz.Features; -import org.springframework.security.authentication.AnonymousAuthenticationToken; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; -import org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter; -import org.springframework.web.bind.annotation.RequestMethod; - -/** - * @author Shobhit Tyagi - */ -@Deprecated(forRemoval = true) -public class OrcidWebOauth2TokenEndPointFilter extends ClientCredentialsTokenEndpointFilter { - - @Resource - private LocaleManager localeManager; - - private OrcidWebOauth2TokenEndPointFilter() { - super(); - } - - private OrcidWebOauth2TokenEndPointFilter(String path) { - super(path); - } - - @Override - public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { - /** - * - * - * This filter should be removed once the authorization server is inplace - * - * - * */ - if (request.getMethod().equals(RequestMethod.GET.name())) { - InvalidRequestException ire = new InvalidRequestException(localeManager.resolveMessage("apiError.token_request_callmethod.exception")); - throw new MethodNotAllowedException(localeManager.resolveMessage("apiError.token_request_callmethod.exception"), ire); - } - - String clientId = request.getParameter("client_id"); - String clientSecret = request.getParameter("client_secret"); - - // If the request is already authenticated we can assume that this - // filter is not needed - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null && authentication.isAuthenticated()) { - return authentication; - } - - if (clientId == null) { - throw new BadCredentialsException(localeManager.resolveMessage("apiError.client_credentials.exception")); - } - - if (clientSecret == null) { - clientSecret = ""; - } - - clientId = clientId.trim(); - UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(clientId, "{noop}"+clientSecret); - authentication = this.getAuthenticationManager().authenticate(authRequest); - return authentication; - } - -} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/RevokeTokenEndpointFilter.java b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/RevokeTokenEndpointFilter.java index be3f6fae8a4..485c1842e2b 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/RevokeTokenEndpointFilter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/security/oauth/RevokeTokenEndpointFilter.java @@ -2,13 +2,13 @@ import java.io.IOException; -import javax.annotation.Resource; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.locale.LocaleManager; import org.orcid.utils.OrcidStringUtils; @@ -20,6 +20,7 @@ import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.web.filter.GenericFilterBean; +@Deprecated(since = "Since the authorization server is made the default, we dont need this filter", forRemoval = true) public class RevokeTokenEndpointFilter extends GenericFilterBean { @Resource diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/util/ApiUtils.java b/orcid-api-common/src/main/java/org/orcid/api/common/util/ApiUtils.java index f857e342472..f4ef762b5b6 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/util/ApiUtils.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/util/ApiUtils.java @@ -3,8 +3,8 @@ import java.net.URI; import java.net.URISyntaxException; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.orcid.api.common.filter.ApiVersionFilter; import org.orcid.core.locale.LocaleManager; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/util/v3/PublicRecordUtils.java b/orcid-api-common/src/main/java/org/orcid/api/common/util/v3/PublicRecordUtils.java index d65fafc9ee9..98400849c1a 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/util/v3/PublicRecordUtils.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/util/v3/PublicRecordUtils.java @@ -1,6 +1,6 @@ package org.orcid.api.common.util.v3; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.api.publicV3.server.security.PublicAPISecurityManagerV3; import org.orcid.core.manager.v3.OrcidSecurityManager; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/HtmlMessageBodyWriter.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/HtmlMessageBodyWriter.java index 72b120a9226..3f7969766b2 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/writer/HtmlMessageBodyWriter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/HtmlMessageBodyWriter.java @@ -2,18 +2,18 @@ import org.orcid.jaxb.model.message.OrcidMessage; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import java.io.IOException; import java.io.OutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import static javax.ws.rs.core.MediaType.TEXT_HTML; +import static jakarta.ws.rs.core.MediaType.TEXT_HTML; /** * @author Declan Newman (declan) Date: 02/03/2012 @@ -31,7 +31,7 @@ public class HtmlMessageBodyWriter implements MessageBodyWriter { * the type of object to be written, obtained either by * reflection of a resource method return type or via inspection * of the returned instance. - * {@link javax.ws.rs.core.GenericEntity} provides a way to + * {@link jakarta.ws.rs.core.GenericEntity} provides a way to * specify this information at runtime. * @param annotations * an array of the annotations on the resource method that @@ -58,7 +58,7 @@ public boolean isWriteable(Class type, Type genericType, Annotation[] annotat * the type of object to be written, obtained either by * reflection of a resource method return type or by inspection * of the returned instance. - * {@link javax.ws.rs.core.GenericEntity} provides a way to + * {@link jakarta.ws.rs.core.GenericEntity} provides a way to * specify this information at runtime. * @param annotations * an array of the annotations on the resource method that @@ -86,7 +86,7 @@ public long getSize(OrcidMessage message, Class type, Type genericType, Annot * the type of object to be written, obtained either by * reflection of a resource method return type or by inspection * of the returned instance. - * {@link javax.ws.rs.core.GenericEntity} provides a way to + * {@link jakarta.ws.rs.core.GenericEntity} provides a way to * specify this information at runtime. * @param annotations * an array of the annotations on the resource method that @@ -100,7 +100,7 @@ public long getSize(OrcidMessage message, Class type, Type genericType, Annot * implementation should not close the output stream. * @throws java.io.IOException * if an IO error arises - * @throws javax.ws.rs.WebApplicationException + * @throws jakarta.ws.rs.WebApplicationException * if a specific HTTP error response needs to be produced. Only * effective if thrown prior to the response being committed. */ diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/CSLItemDataListMBWriter.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/CSLItemDataListMBWriter.java index 5840c97e35b..d1eca4f966d 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/CSLItemDataListMBWriter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/CSLItemDataListMBWriter.java @@ -6,12 +6,12 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import org.orcid.core.api.OrcidApiConstants; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/CSLItemDataMBWriter.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/CSLItemDataMBWriter.java index fa23414bdf5..b43a18c19c8 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/CSLItemDataMBWriter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/CSLItemDataMBWriter.java @@ -5,12 +5,12 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import org.orcid.core.api.OrcidApiConstants; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/V3WorkToCiteprocTranslator.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/V3WorkToCiteprocTranslator.java index 1cc276860cb..1a5e7e45a29 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/V3WorkToCiteprocTranslator.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/V3WorkToCiteprocTranslator.java @@ -1,6 +1,5 @@ package org.orcid.api.common.writer.citeproc; -import java.io.IOException; import java.lang.reflect.Field; import java.text.Normalizer; import java.util.ArrayList; @@ -108,7 +107,7 @@ private CSLItemData translateFromBibtexCitation(Work work, boolean abreviate) { return item; } else throw new ParseException("Invalid Citation count"); - } catch (IOException | ParseException e) { + } catch (ParseException e) { return null; } } diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/WorkToCiteprocTranslator.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/WorkToCiteprocTranslator.java index 53b8236247c..cf6cc7deae6 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/WorkToCiteprocTranslator.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/citeproc/WorkToCiteprocTranslator.java @@ -1,6 +1,5 @@ package org.orcid.api.common.writer.citeproc; -import java.io.IOException; import java.lang.reflect.Field; import java.text.Normalizer; import java.util.ArrayList; @@ -108,7 +107,7 @@ private CSLItemData translateFromBibtexCitation(Work work, boolean abreviate) { return item; } else throw new ParseException("Invalid Citation count"); - } catch (IOException | ParseException e) { + } catch (ParseException e) { return null; } } diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/Geonames.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/Geonames.java new file mode 100644 index 00000000000..02206d456e3 --- /dev/null +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/Geonames.java @@ -0,0 +1,1529 @@ +/* CVS $Id: $ */ +package org.orcid.api.common.writer.rdf.vocabs; +import org.apache.jena.rdf.model.*; + +/** + * Vocabulary definitions from C:\Users\angel\Documents\ORCID\development\tmp\deleteme\ORCID-Source\orcid-api-common/src/main/vocabs/geonames_v3.1.rdf + * @author Auto-generated by schemagen on 26 Mar 2026 15:47 + */ +public class Geonames { + /**

The RDF model that holds the vocabulary terms

*/ + private static final Model M_MODEL = ModelFactory.createDefaultModel(); + + /**

The namespace of the vocabulary as a string

*/ + public static final String NS = "http://www.geonames.org/ontology#"; + + /**

The namespace of the vocabulary as a string

+ * @return namespace as String + * @see #NS */ + public static String getURI() {return NS;} + + /**

The namespace of the vocabulary as a resource

*/ + public static final Resource NAMESPACE = M_MODEL.createResource( NS ); + + /**

The ontology's owl:versionInfo as a string

*/ + public static final String VERSION_INFO = "Version 3.1 - 2012-10-29"; + + public static final Property alternateName = M_MODEL.createProperty( "http://www.geonames.org/ontology#alternateName" ); + + /**

Links to an RDF document containing the descriptions of children features

*/ + public static final Property childrenFeatures = M_MODEL.createProperty( "http://www.geonames.org/ontology#childrenFeatures" ); + + public static final Property colloquialName = M_MODEL.createProperty( "http://www.geonames.org/ontology#colloquialName" ); + + /**

A two letters country code in the ISO 3166 listThe countryCode value for a + * Geoname Feature is equal to the countryCode value of the parentCountry value.

+ */ + public static final Property countryCode = M_MODEL.createProperty( "http://www.geonames.org/ontology#countryCode" ); + + /**

The main category of the feature, as defined in geonames taxonomy.

*/ + public static final Property featureClass = M_MODEL.createProperty( "http://www.geonames.org/ontology#featureClass" ); + + /**

Type of the feature, as defined in geonames taxonomy.

*/ + public static final Property featureCode = M_MODEL.createProperty( "http://www.geonames.org/ontology#featureCode" ); + + public static final Property geonamesID = M_MODEL.createProperty( "http://www.geonames.org/ontology#geonamesID" ); + + public static final Property historicalName = M_MODEL.createProperty( "http://www.geonames.org/ontology#historicalName" ); + + /**

Indicates that the subject resource is located in the object feature

*/ + public static final Property locatedIn = M_MODEL.createProperty( "http://www.geonames.org/ontology#locatedIn" ); + + /**

A geonames map centered on the feature.

*/ + public static final Property locationMap = M_MODEL.createProperty( "http://www.geonames.org/ontology#locationMap" ); + + /**

The main international name of a feature. The value has no xml:lang tag.

*/ + public static final Property name = M_MODEL.createProperty( "http://www.geonames.org/ontology#name" ); + + /**

A feature close to the reference feature

*/ + public static final Property nearby = M_MODEL.createProperty( "http://www.geonames.org/ontology#nearby" ); + + /**

Links to an RDF document containing the descriptions of nearby features

*/ + public static final Property nearbyFeatures = M_MODEL.createProperty( "http://www.geonames.org/ontology#nearbyFeatures" ); + + /**

A feature sharing a common boarder with the reference feature

*/ + public static final Property neighbour = M_MODEL.createProperty( "http://www.geonames.org/ontology#neighbour" ); + + /**

Links to an RDF document containing the descriptions of neighbouring features. + * Applies when the feature has definite boarders.

+ */ + public static final Property neighbouringFeatures = M_MODEL.createProperty( "http://www.geonames.org/ontology#neighbouringFeatures" ); + + /**

A name in an official local language

*/ + public static final Property officialName = M_MODEL.createProperty( "http://www.geonames.org/ontology#officialName" ); + + public static final Property parentADM1 = M_MODEL.createProperty( "http://www.geonames.org/ontology#parentADM1" ); + + public static final Property parentADM2 = M_MODEL.createProperty( "http://www.geonames.org/ontology#parentADM2" ); + + public static final Property parentADM3 = M_MODEL.createProperty( "http://www.geonames.org/ontology#parentADM3" ); + + public static final Property parentADM4 = M_MODEL.createProperty( "http://www.geonames.org/ontology#parentADM4" ); + + public static final Property parentCountry = M_MODEL.createProperty( "http://www.geonames.org/ontology#parentCountry" ); + + /**

A feature parent of the current one, in either administrative or physical + * subdivision.

+ */ + public static final Property parentFeature = M_MODEL.createProperty( "http://www.geonames.org/ontology#parentFeature" ); + + public static final Property population = M_MODEL.createProperty( "http://www.geonames.org/ontology#population" ); + + public static final Property postalCode = M_MODEL.createProperty( "http://www.geonames.org/ontology#postalCode" ); + + public static final Property shortName = M_MODEL.createProperty( "http://www.geonames.org/ontology#shortName" ); + + /**

A Wikipedia article of which subject is the resource.

*/ + public static final Property wikipediaArticle = M_MODEL.createProperty( "http://www.geonames.org/ontology#wikipediaArticle" ); + + /**

A class of features.

*/ + public static final Resource Class = M_MODEL.createResource( "http://www.geonames.org/ontology#Class" ); + + /**

A feature code.

*/ + public static final Resource Code = M_MODEL.createResource( "http://www.geonames.org/ontology#Code" ); + + /**

A geographical feature

*/ + public static final Resource Feature = M_MODEL.createResource( "http://www.geonames.org/ontology#Feature" ); + + /**

A feature described in geonames database, uniquely defined by its geonames + * identifier

+ */ + public static final Resource GeonamesFeature = M_MODEL.createResource( "http://www.geonames.org/ontology#GeonamesFeature" ); + + /**

A Web page displaying a map

*/ + public static final Resource Map = M_MODEL.createResource( "http://www.geonames.org/ontology#Map" ); + + /**

A Document containing RDF description of one or several features.

*/ + public static final Resource RDFData = M_MODEL.createResource( "http://www.geonames.org/ontology#RDFData" ); + + /**

A Wikipedia article

*/ + public static final Resource WikipediaArticle = M_MODEL.createResource( "http://www.geonames.org/ontology#WikipediaArticle" ); + + /**

country, state, region ...

*/ + public static final Resource A = M_MODEL.createResource( "http://www.geonames.org/ontology#A" ); + + public static final Resource A_ADM1 = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADM1" ); + + public static final Resource A_ADM1H = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADM1H" ); + + public static final Resource A_ADM2 = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADM2" ); + + public static final Resource A_ADM2H = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADM2H" ); + + public static final Resource A_ADM3 = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADM3" ); + + public static final Resource A_ADM3H = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADM3H" ); + + public static final Resource A_ADM4 = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADM4" ); + + public static final Resource A_ADM4H = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADM4H" ); + + public static final Resource A_ADM5 = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADM5" ); + + public static final Resource A_ADMD = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADMD" ); + + public static final Resource A_ADMH = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ADMH" ); + + public static final Resource A_LTER = M_MODEL.createResource( "http://www.geonames.org/ontology#A.LTER" ); + + public static final Resource A_PCL = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PCL" ); + + public static final Resource A_PCLD = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PCLD" ); + + public static final Resource A_PCLF = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PCLF" ); + + public static final Resource A_PCLH = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PCLH" ); + + public static final Resource A_PCLI = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PCLI" ); + + public static final Resource A_PCLIX = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PCLIX" ); + + public static final Resource A_PCLS = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PCLS" ); + + public static final Resource A_PPCLH = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PPCLH" ); + + public static final Resource A_PPLH = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PPLH" ); + + public static final Resource A_PRSH = M_MODEL.createResource( "http://www.geonames.org/ontology#A.PRSH" ); + + public static final Resource A_TERR = M_MODEL.createResource( "http://www.geonames.org/ontology#A.TERR" ); + + public static final Resource A_ZN = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ZN" ); + + public static final Resource A_ZNB = M_MODEL.createResource( "http://www.geonames.org/ontology#A.ZNB" ); + + /**

stream, lake, ...

*/ + public static final Resource H = M_MODEL.createResource( "http://www.geonames.org/ontology#H" ); + + public static final Resource H_AIRS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.AIRS" ); + + public static final Resource H_ANCH = M_MODEL.createResource( "http://www.geonames.org/ontology#H.ANCH" ); + + public static final Resource H_BAY = M_MODEL.createResource( "http://www.geonames.org/ontology#H.BAY" ); + + public static final Resource H_BAYS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.BAYS" ); + + public static final Resource H_BGHT = M_MODEL.createResource( "http://www.geonames.org/ontology#H.BGHT" ); + + public static final Resource H_BNK = M_MODEL.createResource( "http://www.geonames.org/ontology#H.BNK" ); + + public static final Resource H_BNKR = M_MODEL.createResource( "http://www.geonames.org/ontology#H.BNKR" ); + + public static final Resource H_BNKX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.BNKX" ); + + public static final Resource H_BOG = M_MODEL.createResource( "http://www.geonames.org/ontology#H.BOG" ); + + public static final Resource H_CAPG = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CAPG" ); + + public static final Resource H_CHN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CHN" ); + + public static final Resource H_CHNL = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CHNL" ); + + public static final Resource H_CHNM = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CHNM" ); + + public static final Resource H_CHNN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CHNN" ); + + public static final Resource H_CNFL = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNFL" ); + + public static final Resource H_CNL = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNL" ); + + public static final Resource H_CNLA = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNLA" ); + + public static final Resource H_CNLB = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNLB" ); + + public static final Resource H_CNLD = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNLD" ); + + public static final Resource H_CNLI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNLI" ); + + public static final Resource H_CNLN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNLN" ); + + public static final Resource H_CNLQ = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNLQ" ); + + public static final Resource H_CNLSB = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNLSB" ); + + public static final Resource H_CNLX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CNLX" ); + + public static final Resource H_COVE = M_MODEL.createResource( "http://www.geonames.org/ontology#H.COVE" ); + + public static final Resource H_CRKT = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CRKT" ); + + public static final Resource H_CRNT = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CRNT" ); + + public static final Resource H_CUTF = M_MODEL.createResource( "http://www.geonames.org/ontology#H.CUTF" ); + + public static final Resource H_DCK = M_MODEL.createResource( "http://www.geonames.org/ontology#H.DCK" ); + + public static final Resource H_DCKB = M_MODEL.createResource( "http://www.geonames.org/ontology#H.DCKB" ); + + public static final Resource H_DOMG = M_MODEL.createResource( "http://www.geonames.org/ontology#H.DOMG" ); + + public static final Resource H_DPRG = M_MODEL.createResource( "http://www.geonames.org/ontology#H.DPRG" ); + + public static final Resource H_DTCH = M_MODEL.createResource( "http://www.geonames.org/ontology#H.DTCH" ); + + public static final Resource H_DTCHD = M_MODEL.createResource( "http://www.geonames.org/ontology#H.DTCHD" ); + + public static final Resource H_DTCHI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.DTCHI" ); + + public static final Resource H_DTCHM = M_MODEL.createResource( "http://www.geonames.org/ontology#H.DTCHM" ); + + public static final Resource H_ESTY = M_MODEL.createResource( "http://www.geonames.org/ontology#H.ESTY" ); + + public static final Resource H_FISH = M_MODEL.createResource( "http://www.geonames.org/ontology#H.FISH" ); + + public static final Resource H_FJD = M_MODEL.createResource( "http://www.geonames.org/ontology#H.FJD" ); + + public static final Resource H_FJDS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.FJDS" ); + + public static final Resource H_FLLS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.FLLS" ); + + public static final Resource H_FLLSX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.FLLSX" ); + + public static final Resource H_FLTM = M_MODEL.createResource( "http://www.geonames.org/ontology#H.FLTM" ); + + public static final Resource H_FLTT = M_MODEL.createResource( "http://www.geonames.org/ontology#H.FLTT" ); + + public static final Resource H_GLCR = M_MODEL.createResource( "http://www.geonames.org/ontology#H.GLCR" ); + + public static final Resource H_GULF = M_MODEL.createResource( "http://www.geonames.org/ontology#H.GULF" ); + + public static final Resource H_GYSR = M_MODEL.createResource( "http://www.geonames.org/ontology#H.GYSR" ); + + public static final Resource H_HBR = M_MODEL.createResource( "http://www.geonames.org/ontology#H.HBR" ); + + public static final Resource H_HBRX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.HBRX" ); + + public static final Resource H_INLT = M_MODEL.createResource( "http://www.geonames.org/ontology#H.INLT" ); + + public static final Resource H_INLTQ = M_MODEL.createResource( "http://www.geonames.org/ontology#H.INLTQ" ); + + public static final Resource H_LBED = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LBED" ); + + public static final Resource H_LGN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LGN" ); + + public static final Resource H_LGNS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LGNS" ); + + public static final Resource H_LGNX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LGNX" ); + + public static final Resource H_LK = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LK" ); + + public static final Resource H_LKC = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKC" ); + + public static final Resource H_LKI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKI" ); + + public static final Resource H_LKN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKN" ); + + public static final Resource H_LKNI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKNI" ); + + public static final Resource H_LKO = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKO" ); + + public static final Resource H_LKOI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKOI" ); + + public static final Resource H_LKS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKS" ); + + public static final Resource H_LKSB = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKSB" ); + + public static final Resource H_LKSC = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKSC" ); + + public static final Resource H_LKSI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKSI" ); + + public static final Resource H_LKSN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKSN" ); + + public static final Resource H_LKSNI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKSNI" ); + + public static final Resource H_LKX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.LKX" ); + + public static final Resource H_MFGN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.MFGN" ); + + public static final Resource H_MGV = M_MODEL.createResource( "http://www.geonames.org/ontology#H.MGV" ); + + public static final Resource H_MOOR = M_MODEL.createResource( "http://www.geonames.org/ontology#H.MOOR" ); + + public static final Resource H_MRSH = M_MODEL.createResource( "http://www.geonames.org/ontology#H.MRSH" ); + + public static final Resource H_MRSHN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.MRSHN" ); + + public static final Resource H_NRWS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.NRWS" ); + + public static final Resource H_OCN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.OCN" ); + + public static final Resource H_OVF = M_MODEL.createResource( "http://www.geonames.org/ontology#H.OVF" ); + + public static final Resource H_PND = M_MODEL.createResource( "http://www.geonames.org/ontology#H.PND" ); + + public static final Resource H_PNDI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.PNDI" ); + + public static final Resource H_PNDN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.PNDN" ); + + public static final Resource H_PNDNI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.PNDNI" ); + + public static final Resource H_PNDS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.PNDS" ); + + public static final Resource H_PNDSF = M_MODEL.createResource( "http://www.geonames.org/ontology#H.PNDSF" ); + + public static final Resource H_PNDSI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.PNDSI" ); + + public static final Resource H_PNDSN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.PNDSN" ); + + public static final Resource H_POOL = M_MODEL.createResource( "http://www.geonames.org/ontology#H.POOL" ); + + public static final Resource H_POOLI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.POOLI" ); + + public static final Resource H_RCH = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RCH" ); + + public static final Resource H_RDGG = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RDGG" ); + + public static final Resource H_RDST = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RDST" ); + + public static final Resource H_RF = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RF" ); + + public static final Resource H_RFC = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RFC" ); + + public static final Resource H_RFX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RFX" ); + + public static final Resource H_RPDS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RPDS" ); + + public static final Resource H_RSV = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RSV" ); + + public static final Resource H_RSVI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RSVI" ); + + public static final Resource H_RSVT = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RSVT" ); + + public static final Resource H_RVN = M_MODEL.createResource( "http://www.geonames.org/ontology#H.RVN" ); + + public static final Resource H_SBKH = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SBKH" ); + + public static final Resource H_SD = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SD" ); + + public static final Resource H_SEA = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SEA" ); + + public static final Resource H_SHOL = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SHOL" ); + + public static final Resource H_SILL = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SILL" ); + + public static final Resource H_SPNG = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SPNG" ); + + public static final Resource H_SPNS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SPNS" ); + + public static final Resource H_SPNT = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SPNT" ); + + public static final Resource H_STM = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STM" ); + + public static final Resource H_STMA = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMA" ); + + public static final Resource H_STMB = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMB" ); + + public static final Resource H_STMC = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMC" ); + + public static final Resource H_STMD = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMD" ); + + public static final Resource H_STMH = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMH" ); + + public static final Resource H_STMI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMI" ); + + public static final Resource H_STMIX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMIX" ); + + public static final Resource H_STMM = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMM" ); + + public static final Resource H_STMQ = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMQ" ); + + public static final Resource H_STMS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMS" ); + + public static final Resource H_STMSB = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMSB" ); + + public static final Resource H_STMX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STMX" ); + + public static final Resource H_STRT = M_MODEL.createResource( "http://www.geonames.org/ontology#H.STRT" ); + + public static final Resource H_SWMP = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SWMP" ); + + public static final Resource H_SYSI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.SYSI" ); + + public static final Resource H_TNLC = M_MODEL.createResource( "http://www.geonames.org/ontology#H.TNLC" ); + + public static final Resource H_WAD = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WAD" ); + + public static final Resource H_WADB = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WADB" ); + + public static final Resource H_WADJ = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WADJ" ); + + public static final Resource H_WADM = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WADM" ); + + public static final Resource H_WADS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WADS" ); + + public static final Resource H_WADX = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WADX" ); + + public static final Resource H_WHRL = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WHRL" ); + + public static final Resource H_WLL = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WLL" ); + + public static final Resource H_WLLQ = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WLLQ" ); + + public static final Resource H_WLLS = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WLLS" ); + + public static final Resource H_WTLD = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WTLD" ); + + public static final Resource H_WTLDI = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WTLDI" ); + + public static final Resource H_WTRC = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WTRC" ); + + public static final Resource H_WTRH = M_MODEL.createResource( "http://www.geonames.org/ontology#H.WTRH" ); + + /**

parks,area, ...

*/ + public static final Resource L = M_MODEL.createResource( "http://www.geonames.org/ontology#L" ); + + public static final Resource L_AGRC = M_MODEL.createResource( "http://www.geonames.org/ontology#L.AGRC" ); + + public static final Resource L_AMUS = M_MODEL.createResource( "http://www.geonames.org/ontology#L.AMUS" ); + + public static final Resource L_AREA = M_MODEL.createResource( "http://www.geonames.org/ontology#L.AREA" ); + + public static final Resource L_BSND = M_MODEL.createResource( "http://www.geonames.org/ontology#L.BSND" ); + + public static final Resource L_BSNP = M_MODEL.createResource( "http://www.geonames.org/ontology#L.BSNP" ); + + public static final Resource L_BTL = M_MODEL.createResource( "http://www.geonames.org/ontology#L.BTL" ); + + public static final Resource L_CLG = M_MODEL.createResource( "http://www.geonames.org/ontology#L.CLG" ); + + public static final Resource L_CMN = M_MODEL.createResource( "http://www.geonames.org/ontology#L.CMN" ); + + public static final Resource L_CNS = M_MODEL.createResource( "http://www.geonames.org/ontology#L.CNS" ); + + public static final Resource L_COLF = M_MODEL.createResource( "http://www.geonames.org/ontology#L.COLF" ); + + public static final Resource L_CONT = M_MODEL.createResource( "http://www.geonames.org/ontology#L.CONT" ); + + public static final Resource L_CST = M_MODEL.createResource( "http://www.geonames.org/ontology#L.CST" ); + + public static final Resource L_CTRB = M_MODEL.createResource( "http://www.geonames.org/ontology#L.CTRB" ); + + public static final Resource L_DEVH = M_MODEL.createResource( "http://www.geonames.org/ontology#L.DEVH" ); + + public static final Resource L_FLD = M_MODEL.createResource( "http://www.geonames.org/ontology#L.FLD" ); + + public static final Resource L_FLDI = M_MODEL.createResource( "http://www.geonames.org/ontology#L.FLDI" ); + + public static final Resource L_GASF = M_MODEL.createResource( "http://www.geonames.org/ontology#L.GASF" ); + + public static final Resource L_GRAZ = M_MODEL.createResource( "http://www.geonames.org/ontology#L.GRAZ" ); + + public static final Resource L_GVL = M_MODEL.createResource( "http://www.geonames.org/ontology#L.GVL" ); + + public static final Resource L_INDS = M_MODEL.createResource( "http://www.geonames.org/ontology#L.INDS" ); + + public static final Resource L_LAND = M_MODEL.createResource( "http://www.geonames.org/ontology#L.LAND" ); + + public static final Resource L_LCTY = M_MODEL.createResource( "http://www.geonames.org/ontology#L.LCTY" ); + + public static final Resource L_MILB = M_MODEL.createResource( "http://www.geonames.org/ontology#L.MILB" ); + + public static final Resource L_MNA = M_MODEL.createResource( "http://www.geonames.org/ontology#L.MNA" ); + + public static final Resource L_MVA = M_MODEL.createResource( "http://www.geonames.org/ontology#L.MVA" ); + + public static final Resource L_NVB = M_MODEL.createResource( "http://www.geonames.org/ontology#L.NVB" ); + + public static final Resource L_OAS = M_MODEL.createResource( "http://www.geonames.org/ontology#L.OAS" ); + + public static final Resource L_OILF = M_MODEL.createResource( "http://www.geonames.org/ontology#L.OILF" ); + + public static final Resource L_PEAT = M_MODEL.createResource( "http://www.geonames.org/ontology#L.PEAT" ); + + public static final Resource L_PRK = M_MODEL.createResource( "http://www.geonames.org/ontology#L.PRK" ); + + public static final Resource L_PRT = M_MODEL.createResource( "http://www.geonames.org/ontology#L.PRT" ); + + public static final Resource L_QCKS = M_MODEL.createResource( "http://www.geonames.org/ontology#L.QCKS" ); + + public static final Resource L_REP = M_MODEL.createResource( "http://www.geonames.org/ontology#L.REP" ); + + public static final Resource L_RES = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RES" ); + + public static final Resource L_RESA = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RESA" ); + + public static final Resource L_RESF = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RESF" ); + + public static final Resource L_RESH = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RESH" ); + + public static final Resource L_RESN = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RESN" ); + + public static final Resource L_RESP = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RESP" ); + + public static final Resource L_RESV = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RESV" ); + + public static final Resource L_RESW = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RESW" ); + + public static final Resource L_RGN = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RGN" ); + + public static final Resource L_RGNE = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RGNE" ); + + public static final Resource L_RGNH = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RGNH" ); + + public static final Resource L_RGNL = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RGNL" ); + + public static final Resource L_RNGA = M_MODEL.createResource( "http://www.geonames.org/ontology#L.RNGA" ); + + public static final Resource L_SALT = M_MODEL.createResource( "http://www.geonames.org/ontology#L.SALT" ); + + public static final Resource L_SNOW = M_MODEL.createResource( "http://www.geonames.org/ontology#L.SNOW" ); + + public static final Resource L_TRB = M_MODEL.createResource( "http://www.geonames.org/ontology#L.TRB" ); + + public static final Resource L_ZZZZZ = M_MODEL.createResource( "http://www.geonames.org/ontology#L.ZZZZZ" ); + + /**

city, village,...

*/ + public static final Resource P = M_MODEL.createResource( "http://www.geonames.org/ontology#P" ); + + public static final Resource P_PPL = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPL" ); + + public static final Resource P_PPLA = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLA" ); + + public static final Resource P_PPLA2 = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLA2" ); + + public static final Resource P_PPLA3 = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLA3" ); + + public static final Resource P_PPLA4 = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLA4" ); + + public static final Resource P_PPLC = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLC" ); + + public static final Resource P_PPLF = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLF" ); + + public static final Resource P_PPLG = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLG" ); + + public static final Resource P_PPLL = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLL" ); + + public static final Resource P_PPLQ = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLQ" ); + + public static final Resource P_PPLR = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLR" ); + + public static final Resource P_PPLS = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLS" ); + + public static final Resource P_PPLW = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLW" ); + + public static final Resource P_PPLX = M_MODEL.createResource( "http://www.geonames.org/ontology#P.PPLX" ); + + public static final Resource P_STLMT = M_MODEL.createResource( "http://www.geonames.org/ontology#P.STLMT" ); + + /**

road, railroad, ...

*/ + public static final Resource R = M_MODEL.createResource( "http://www.geonames.org/ontology#R" ); + + public static final Resource R_CSWY = M_MODEL.createResource( "http://www.geonames.org/ontology#R.CSWY" ); + + public static final Resource R_CSWYQ = M_MODEL.createResource( "http://www.geonames.org/ontology#R.CSWYQ" ); + + public static final Resource R_OILP = M_MODEL.createResource( "http://www.geonames.org/ontology#R.OILP" ); + + public static final Resource R_PRMN = M_MODEL.createResource( "http://www.geonames.org/ontology#R.PRMN" ); + + public static final Resource R_PTGE = M_MODEL.createResource( "http://www.geonames.org/ontology#R.PTGE" ); + + public static final Resource R_RD = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RD" ); + + public static final Resource R_RDA = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RDA" ); + + public static final Resource R_RDB = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RDB" ); + + public static final Resource R_RDCUT = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RDCUT" ); + + public static final Resource R_RDJCT = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RDJCT" ); + + public static final Resource R_RJCT = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RJCT" ); + + public static final Resource R_RR = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RR" ); + + public static final Resource R_RRQ = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RRQ" ); + + public static final Resource R_RTE = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RTE" ); + + public static final Resource R_RYD = M_MODEL.createResource( "http://www.geonames.org/ontology#R.RYD" ); + + public static final Resource R_ST = M_MODEL.createResource( "http://www.geonames.org/ontology#R.ST" ); + + public static final Resource R_STKR = M_MODEL.createResource( "http://www.geonames.org/ontology#R.STKR" ); + + public static final Resource R_TNL = M_MODEL.createResource( "http://www.geonames.org/ontology#R.TNL" ); + + public static final Resource R_TNLN = M_MODEL.createResource( "http://www.geonames.org/ontology#R.TNLN" ); + + public static final Resource R_TNLRD = M_MODEL.createResource( "http://www.geonames.org/ontology#R.TNLRD" ); + + public static final Resource R_TNLRR = M_MODEL.createResource( "http://www.geonames.org/ontology#R.TNLRR" ); + + public static final Resource R_TNLS = M_MODEL.createResource( "http://www.geonames.org/ontology#R.TNLS" ); + + public static final Resource R_TRL = M_MODEL.createResource( "http://www.geonames.org/ontology#R.TRL" ); + + /**

spot, building, farm, ...

*/ + public static final Resource S = M_MODEL.createResource( "http://www.geonames.org/ontology#S" ); + + public static final Resource S_ADMF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ADMF" ); + + public static final Resource S_AGRF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.AGRF" ); + + public static final Resource S_AIRB = M_MODEL.createResource( "http://www.geonames.org/ontology#S.AIRB" ); + + public static final Resource S_AIRF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.AIRF" ); + + public static final Resource S_AIRH = M_MODEL.createResource( "http://www.geonames.org/ontology#S.AIRH" ); + + public static final Resource S_AIRP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.AIRP" ); + + public static final Resource S_AIRQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.AIRQ" ); + + public static final Resource S_AMTH = M_MODEL.createResource( "http://www.geonames.org/ontology#S.AMTH" ); + + public static final Resource S_ANS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ANS" ); + + public static final Resource S_AQC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.AQC" ); + + public static final Resource S_ARCH = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ARCH" ); + + public static final Resource S_ASTR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ASTR" ); + + public static final Resource S_ASYL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ASYL" ); + + public static final Resource S_ATHF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ATHF" ); + + public static final Resource S_ATM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ATM" ); + + public static final Resource S_BANK = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BANK" ); + + public static final Resource S_BCN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BCN" ); + + public static final Resource S_BDG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BDG" ); + + public static final Resource S_BDGQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BDGQ" ); + + public static final Resource S_BLDG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BLDG" ); + + public static final Resource S_BLDO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BLDO" ); + + public static final Resource S_BP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BP" ); + + public static final Resource S_BRKS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BRKS" ); + + public static final Resource S_BRKW = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BRKW" ); + + public static final Resource S_BSTN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BSTN" ); + + public static final Resource S_BTYD = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BTYD" ); + + public static final Resource S_BUR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BUR" ); + + public static final Resource S_BUSTN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BUSTN" ); + + public static final Resource S_BUSTP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.BUSTP" ); + + public static final Resource S_CARN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CARN" ); + + public static final Resource S_CAVE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CAVE" ); + + public static final Resource S_CCL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CCL" ); + + public static final Resource S_CH = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CH" ); + + public static final Resource S_CMP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CMP" ); + + public static final Resource S_CMPL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CMPL" ); + + public static final Resource S_CMPLA = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CMPLA" ); + + public static final Resource S_CMPMN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CMPMN" ); + + public static final Resource S_CMPO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CMPO" ); + + public static final Resource S_CMPQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CMPQ" ); + + public static final Resource S_CMPRF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CMPRF" ); + + public static final Resource S_CMTY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CMTY" ); + + public static final Resource S_COMC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.COMC" ); + + public static final Resource S_CRRL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CRRL" ); + + public static final Resource S_CSNO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CSNO" ); + + public static final Resource S_CSTL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CSTL" ); + + public static final Resource S_CSTM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CSTM" ); + + public static final Resource S_CTHSE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CTHSE" ); + + public static final Resource S_CTRA = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CTRA" ); + + public static final Resource S_CTRCM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CTRCM" ); + + public static final Resource S_CTRF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CTRF" ); + + public static final Resource S_CTRM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CTRM" ); + + public static final Resource S_CTRR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CTRR" ); + + public static final Resource S_CTRS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CTRS" ); + + public static final Resource S_CVNT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.CVNT" ); + + public static final Resource S_DAM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.DAM" ); + + public static final Resource S_DAMQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.DAMQ" ); + + public static final Resource S_DAMSB = M_MODEL.createResource( "http://www.geonames.org/ontology#S.DAMSB" ); + + public static final Resource S_DARY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.DARY" ); + + public static final Resource S_DCKD = M_MODEL.createResource( "http://www.geonames.org/ontology#S.DCKD" ); + + public static final Resource S_DCKY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.DCKY" ); + + public static final Resource S_DIKE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.DIKE" ); + + public static final Resource S_DIP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.DIP" ); + + public static final Resource S_DPOF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.DPOF" ); + + public static final Resource S_EST = M_MODEL.createResource( "http://www.geonames.org/ontology#S.EST" ); + + public static final Resource S_ESTB = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ESTB" ); + + public static final Resource S_ESTC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ESTC" ); + + public static final Resource S_ESTO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ESTO" ); + + public static final Resource S_ESTR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ESTR" ); + + public static final Resource S_ESTSG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ESTSG" ); + + public static final Resource S_ESTSL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ESTSL" ); + + public static final Resource S_ESTT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ESTT" ); + + public static final Resource S_ESTX = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ESTX" ); + + public static final Resource S_FCL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.FCL" ); + + public static final Resource S_FNDY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.FNDY" ); + + public static final Resource S_FRM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.FRM" ); + + public static final Resource S_FRMQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.FRMQ" ); + + public static final Resource S_FRMS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.FRMS" ); + + public static final Resource S_FRMT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.FRMT" ); + + public static final Resource S_FT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.FT" ); + + public static final Resource S_FY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.FY" ); + + public static final Resource S_GATE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.GATE" ); + + public static final Resource S_GDN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.GDN" ); + + public static final Resource S_GHAT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.GHAT" ); + + public static final Resource S_GHSE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.GHSE" ); + + public static final Resource S_GOSP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.GOSP" ); + + public static final Resource S_GOVL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.GOVL" ); + + public static final Resource S_GRVE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.GRVE" ); + + public static final Resource S_HERM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HERM" ); + + public static final Resource S_HLT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HLT" ); + + public static final Resource S_HMSD = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HMSD" ); + + public static final Resource S_HSE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HSE" ); + + public static final Resource S_HSEC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HSEC" ); + + public static final Resource S_HSP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HSP" ); + + public static final Resource S_HSPC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HSPC" ); + + public static final Resource S_HSPD = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HSPD" ); + + public static final Resource S_HSPL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HSPL" ); + + public static final Resource S_HSTS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HSTS" ); + + public static final Resource S_HTL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HTL" ); + + public static final Resource S_HUT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HUT" ); + + public static final Resource S_HUTS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.HUTS" ); + + public static final Resource S_INSM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.INSM" ); + + public static final Resource S_ITTR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ITTR" ); + + public static final Resource S_JTY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.JTY" ); + + public static final Resource S_LDNG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.LDNG" ); + + public static final Resource S_LEPC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.LEPC" ); + + public static final Resource S_LIBR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.LIBR" ); + + public static final Resource S_LNDF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.LNDF" ); + + public static final Resource S_LOCK = M_MODEL.createResource( "http://www.geonames.org/ontology#S.LOCK" ); + + public static final Resource S_LTHSE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.LTHSE" ); + + public static final Resource S_MALL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MALL" ); + + public static final Resource S_MAR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MAR" ); + + public static final Resource S_MFG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MFG" ); + + public static final Resource S_MFGB = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MFGB" ); + + public static final Resource S_MFGC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MFGC" ); + + public static final Resource S_MFGCU = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MFGCU" ); + + public static final Resource S_MFGLM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MFGLM" ); + + public static final Resource S_MFGM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MFGM" ); + + public static final Resource S_MFGPH = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MFGPH" ); + + public static final Resource S_MFGQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MFGQ" ); + + public static final Resource S_MFGSG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MFGSG" ); + + public static final Resource S_MKT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MKT" ); + + public static final Resource S_ML = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ML" ); + + public static final Resource S_MLM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MLM" ); + + public static final Resource S_MLO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MLO" ); + + public static final Resource S_MLSG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MLSG" ); + + public static final Resource S_MLSGQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MLSGQ" ); + + public static final Resource S_MLSW = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MLSW" ); + + public static final Resource S_MLWND = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MLWND" ); + + public static final Resource S_MLWTR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MLWTR" ); + + public static final Resource S_MN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MN" ); + + public static final Resource S_MNAU = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNAU" ); + + public static final Resource S_MNC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNC" ); + + public static final Resource S_MNCR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNCR" ); + + public static final Resource S_MNCU = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNCU" ); + + public static final Resource S_MNDT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNDT" ); + + public static final Resource S_MNFE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNFE" ); + + public static final Resource S_MNMT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNMT" ); + + public static final Resource S_MNN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNN" ); + + public static final Resource S_MNNI = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNNI" ); + + public static final Resource S_MNPB = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNPB" ); + + public static final Resource S_MNPL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNPL" ); + + public static final Resource S_MNQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNQ" ); + + public static final Resource S_MNQR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNQR" ); + + public static final Resource S_MNSN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MNSN" ); + + public static final Resource S_MOLE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MOLE" ); + + public static final Resource S_MSQE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MSQE" ); + + public static final Resource S_MSSN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MSSN" ); + + public static final Resource S_MSSNQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MSSNQ" ); + + public static final Resource S_MSTY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MSTY" ); + + public static final Resource S_MTRO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MTRO" ); + + public static final Resource S_MUS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.MUS" ); + + public static final Resource S_NOV = M_MODEL.createResource( "http://www.geonames.org/ontology#S.NOV" ); + + public static final Resource S_NSY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.NSY" ); + + public static final Resource S_OBPT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.OBPT" ); + + public static final Resource S_OBS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.OBS" ); + + public static final Resource S_OBSR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.OBSR" ); + + public static final Resource S_OILJ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.OILJ" ); + + public static final Resource S_OILQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.OILQ" ); + + public static final Resource S_OILR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.OILR" ); + + public static final Resource S_OILT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.OILT" ); + + public static final Resource S_OILW = M_MODEL.createResource( "http://www.geonames.org/ontology#S.OILW" ); + + public static final Resource S_OPRA = M_MODEL.createResource( "http://www.geonames.org/ontology#S.OPRA" ); + + public static final Resource S_PAL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PAL" ); + + public static final Resource S_PGDA = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PGDA" ); + + public static final Resource S_PIER = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PIER" ); + + public static final Resource S_PKLT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PKLT" ); + + public static final Resource S_PMPO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PMPO" ); + + public static final Resource S_PMPW = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PMPW" ); + + public static final Resource S_PO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PO" ); + + public static final Resource S_PP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PP" ); + + public static final Resource S_PPQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PPQ" ); + + public static final Resource S_PRKGT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PRKGT" ); + + public static final Resource S_PRKHQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PRKHQ" ); + + public static final Resource S_PRN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PRN" ); + + public static final Resource S_PRNJ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PRNJ" ); + + public static final Resource S_PRNQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PRNQ" ); + + public static final Resource S_PS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PS" ); + + public static final Resource S_PSH = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PSH" ); + + public static final Resource S_PSTB = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PSTB" ); + + public static final Resource S_PSTC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PSTC" ); + + public static final Resource S_PSTP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PSTP" ); + + public static final Resource S_PYR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PYR" ); + + public static final Resource S_PYRS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.PYRS" ); + + public static final Resource S_QUAY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.QUAY" ); + + public static final Resource S_RDCR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RDCR" ); + + public static final Resource S_RECG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RECG" ); + + public static final Resource S_RECR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RECR" ); + + public static final Resource S_REST = M_MODEL.createResource( "http://www.geonames.org/ontology#S.REST" ); + + public static final Resource S_RET = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RET" ); + + public static final Resource S_RHSE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RHSE" ); + + public static final Resource S_RKRY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RKRY" ); + + public static final Resource S_RLG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RLG" ); + + public static final Resource S_RLGR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RLGR" ); + + public static final Resource S_RNCH = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RNCH" ); + + public static final Resource S_RSD = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RSD" ); + + public static final Resource S_RSGNL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RSGNL" ); + + public static final Resource S_RSRT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RSRT" ); + + public static final Resource S_RSTN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RSTN" ); + + public static final Resource S_RSTNQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RSTNQ" ); + + public static final Resource S_RSTP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RSTP" ); + + public static final Resource S_RSTPQ = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RSTPQ" ); + + public static final Resource S_RUIN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.RUIN" ); + + public static final Resource S_SCH = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SCH" ); + + public static final Resource S_SCHA = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SCHA" ); + + public static final Resource S_SCHC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SCHC" ); + + public static final Resource S_SCHD = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SCHD" ); + + public static final Resource S_SCHL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SCHL" ); + + public static final Resource S_SCHM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SCHM" ); + + public static final Resource S_SCHN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SCHN" ); + + public static final Resource S_SCHT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SCHT" ); + + public static final Resource S_SECP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SECP" ); + + public static final Resource S_SHPF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SHPF" ); + + public static final Resource S_SHRN = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SHRN" ); + + public static final Resource S_SHSE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SHSE" ); + + public static final Resource S_SLCE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SLCE" ); + + public static final Resource S_SNTR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SNTR" ); + + public static final Resource S_SPA = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SPA" ); + + public static final Resource S_SPLY = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SPLY" ); + + public static final Resource S_SQR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SQR" ); + + public static final Resource S_STBL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STBL" ); + + public static final Resource S_STDM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STDM" ); + + public static final Resource S_STNB = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STNB" ); + + public static final Resource S_STNC = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STNC" ); + + public static final Resource S_STNE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STNE" ); + + public static final Resource S_STNF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STNF" ); + + public static final Resource S_STNI = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STNI" ); + + public static final Resource S_STNM = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STNM" ); + + public static final Resource S_STNR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STNR" ); + + public static final Resource S_STNS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STNS" ); + + public static final Resource S_STNW = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STNW" ); + + public static final Resource S_STPS = M_MODEL.createResource( "http://www.geonames.org/ontology#S.STPS" ); + + public static final Resource S_SWT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.SWT" ); + + public static final Resource S_THTR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.THTR" ); + + public static final Resource S_TMB = M_MODEL.createResource( "http://www.geonames.org/ontology#S.TMB" ); + + public static final Resource S_TMPL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.TMPL" ); + + public static final Resource S_TNKD = M_MODEL.createResource( "http://www.geonames.org/ontology#S.TNKD" ); + + public static final Resource S_TOWR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.TOWR" ); + + public static final Resource S_TRANT = M_MODEL.createResource( "http://www.geonames.org/ontology#S.TRANT" ); + + public static final Resource S_TRIG = M_MODEL.createResource( "http://www.geonames.org/ontology#S.TRIG" ); + + public static final Resource S_TRMO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.TRMO" ); + + public static final Resource S_TWO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.TWO" ); + + public static final Resource S_UNIO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.UNIO" ); + + public static final Resource S_UNIP = M_MODEL.createResource( "http://www.geonames.org/ontology#S.UNIP" ); + + public static final Resource S_UNIV = M_MODEL.createResource( "http://www.geonames.org/ontology#S.UNIV" ); + + public static final Resource S_USGE = M_MODEL.createResource( "http://www.geonames.org/ontology#S.USGE" ); + + public static final Resource S_VETF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.VETF" ); + + public static final Resource S_WALL = M_MODEL.createResource( "http://www.geonames.org/ontology#S.WALL" ); + + public static final Resource S_WALLA = M_MODEL.createResource( "http://www.geonames.org/ontology#S.WALLA" ); + + public static final Resource S_WEIR = M_MODEL.createResource( "http://www.geonames.org/ontology#S.WEIR" ); + + public static final Resource S_WHRF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.WHRF" ); + + public static final Resource S_WRCK = M_MODEL.createResource( "http://www.geonames.org/ontology#S.WRCK" ); + + public static final Resource S_WTRW = M_MODEL.createResource( "http://www.geonames.org/ontology#S.WTRW" ); + + public static final Resource S_ZNF = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ZNF" ); + + public static final Resource S_ZOO = M_MODEL.createResource( "http://www.geonames.org/ontology#S.ZOO" ); + + /**

mountain, hill, rock, ...

*/ + public static final Resource T = M_MODEL.createResource( "http://www.geonames.org/ontology#T" ); + + public static final Resource T_ASPH = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ASPH" ); + + public static final Resource T_ATOL = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ATOL" ); + + public static final Resource T_BAR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.BAR" ); + + public static final Resource T_BCH = M_MODEL.createResource( "http://www.geonames.org/ontology#T.BCH" ); + + public static final Resource T_BCHS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.BCHS" ); + + public static final Resource T_BDLD = M_MODEL.createResource( "http://www.geonames.org/ontology#T.BDLD" ); + + public static final Resource T_BLDR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.BLDR" ); + + public static final Resource T_BLHL = M_MODEL.createResource( "http://www.geonames.org/ontology#T.BLHL" ); + + public static final Resource T_BLOW = M_MODEL.createResource( "http://www.geonames.org/ontology#T.BLOW" ); + + public static final Resource T_BNCH = M_MODEL.createResource( "http://www.geonames.org/ontology#T.BNCH" ); + + public static final Resource T_BUTE = M_MODEL.createResource( "http://www.geonames.org/ontology#T.BUTE" ); + + public static final Resource T_CAPE = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CAPE" ); + + public static final Resource T_CFT = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CFT" ); + + public static final Resource T_CLDA = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CLDA" ); + + public static final Resource T_CLF = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CLF" ); + + public static final Resource T_CNYN = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CNYN" ); + + public static final Resource T_CONE = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CONE" ); + + public static final Resource T_CRDR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CRDR" ); + + public static final Resource T_CRQ = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CRQ" ); + + public static final Resource T_CRQS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CRQS" ); + + public static final Resource T_CRTR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CRTR" ); + + public static final Resource T_CUET = M_MODEL.createResource( "http://www.geonames.org/ontology#T.CUET" ); + + public static final Resource T_DLTA = M_MODEL.createResource( "http://www.geonames.org/ontology#T.DLTA" ); + + public static final Resource T_DPR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.DPR" ); + + public static final Resource T_DSRT = M_MODEL.createResource( "http://www.geonames.org/ontology#T.DSRT" ); + + public static final Resource T_DUNE = M_MODEL.createResource( "http://www.geonames.org/ontology#T.DUNE" ); + + public static final Resource T_DVD = M_MODEL.createResource( "http://www.geonames.org/ontology#T.DVD" ); + + public static final Resource T_ERG = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ERG" ); + + public static final Resource T_FAN = M_MODEL.createResource( "http://www.geonames.org/ontology#T.FAN" ); + + public static final Resource T_FORD = M_MODEL.createResource( "http://www.geonames.org/ontology#T.FORD" ); + + public static final Resource T_FSR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.FSR" ); + + public static final Resource T_GAP = M_MODEL.createResource( "http://www.geonames.org/ontology#T.GAP" ); + + public static final Resource T_GRGE = M_MODEL.createResource( "http://www.geonames.org/ontology#T.GRGE" ); + + public static final Resource T_HDLD = M_MODEL.createResource( "http://www.geonames.org/ontology#T.HDLD" ); + + public static final Resource T_HLL = M_MODEL.createResource( "http://www.geonames.org/ontology#T.HLL" ); + + public static final Resource T_HLLS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.HLLS" ); + + public static final Resource T_HMCK = M_MODEL.createResource( "http://www.geonames.org/ontology#T.HMCK" ); + + public static final Resource T_HMDA = M_MODEL.createResource( "http://www.geonames.org/ontology#T.HMDA" ); + + public static final Resource T_INTF = M_MODEL.createResource( "http://www.geonames.org/ontology#T.INTF" ); + + public static final Resource T_ISL = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ISL" ); + + public static final Resource T_ISLET = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ISLET" ); + + public static final Resource T_ISLF = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ISLF" ); + + public static final Resource T_ISLM = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ISLM" ); + + public static final Resource T_ISLS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ISLS" ); + + public static final Resource T_ISLT = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ISLT" ); + + public static final Resource T_ISLX = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ISLX" ); + + public static final Resource T_ISTH = M_MODEL.createResource( "http://www.geonames.org/ontology#T.ISTH" ); + + public static final Resource T_KRST = M_MODEL.createResource( "http://www.geonames.org/ontology#T.KRST" ); + + public static final Resource T_LAVA = M_MODEL.createResource( "http://www.geonames.org/ontology#T.LAVA" ); + + public static final Resource T_LEV = M_MODEL.createResource( "http://www.geonames.org/ontology#T.LEV" ); + + public static final Resource T_MESA = M_MODEL.createResource( "http://www.geonames.org/ontology#T.MESA" ); + + public static final Resource T_MND = M_MODEL.createResource( "http://www.geonames.org/ontology#T.MND" ); + + public static final Resource T_MRN = M_MODEL.createResource( "http://www.geonames.org/ontology#T.MRN" ); + + public static final Resource T_MT = M_MODEL.createResource( "http://www.geonames.org/ontology#T.MT" ); + + public static final Resource T_MTS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.MTS" ); + + public static final Resource T_NKM = M_MODEL.createResource( "http://www.geonames.org/ontology#T.NKM" ); + + public static final Resource T_NTK = M_MODEL.createResource( "http://www.geonames.org/ontology#T.NTK" ); + + public static final Resource T_NTKS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.NTKS" ); + + public static final Resource T_PAN = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PAN" ); + + public static final Resource T_PANS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PANS" ); + + public static final Resource T_PASS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PASS" ); + + public static final Resource T_PEN = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PEN" ); + + public static final Resource T_PENX = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PENX" ); + + public static final Resource T_PK = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PK" ); + + public static final Resource T_PKS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PKS" ); + + public static final Resource T_PLAT = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PLAT" ); + + public static final Resource T_PLATX = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PLATX" ); + + public static final Resource T_PLDR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PLDR" ); + + public static final Resource T_PLN = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PLN" ); + + public static final Resource T_PLNX = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PLNX" ); + + public static final Resource T_PROM = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PROM" ); + + public static final Resource T_PT = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PT" ); + + public static final Resource T_PTS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.PTS" ); + + public static final Resource T_RDGB = M_MODEL.createResource( "http://www.geonames.org/ontology#T.RDGB" ); + + public static final Resource T_RDGE = M_MODEL.createResource( "http://www.geonames.org/ontology#T.RDGE" ); + + public static final Resource T_REG = M_MODEL.createResource( "http://www.geonames.org/ontology#T.REG" ); + + public static final Resource T_RK = M_MODEL.createResource( "http://www.geonames.org/ontology#T.RK" ); + + public static final Resource T_RKFL = M_MODEL.createResource( "http://www.geonames.org/ontology#T.RKFL" ); + + public static final Resource T_RKS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.RKS" ); + + public static final Resource T_SAND = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SAND" ); + + public static final Resource T_SBED = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SBED" ); + + public static final Resource T_SCRP = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SCRP" ); + + public static final Resource T_SDL = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SDL" ); + + public static final Resource T_SHOR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SHOR" ); + + public static final Resource T_SINK = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SINK" ); + + public static final Resource T_SLID = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SLID" ); + + public static final Resource T_SLP = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SLP" ); + + public static final Resource T_SPIT = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SPIT" ); + + public static final Resource T_SPUR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.SPUR" ); + + public static final Resource T_TAL = M_MODEL.createResource( "http://www.geonames.org/ontology#T.TAL" ); + + public static final Resource T_TRGD = M_MODEL.createResource( "http://www.geonames.org/ontology#T.TRGD" ); + + public static final Resource T_TRR = M_MODEL.createResource( "http://www.geonames.org/ontology#T.TRR" ); + + public static final Resource T_UPLD = M_MODEL.createResource( "http://www.geonames.org/ontology#T.UPLD" ); + + public static final Resource T_VAL = M_MODEL.createResource( "http://www.geonames.org/ontology#T.VAL" ); + + public static final Resource T_VALG = M_MODEL.createResource( "http://www.geonames.org/ontology#T.VALG" ); + + public static final Resource T_VALS = M_MODEL.createResource( "http://www.geonames.org/ontology#T.VALS" ); + + public static final Resource T_VALX = M_MODEL.createResource( "http://www.geonames.org/ontology#T.VALX" ); + + public static final Resource T_VLC = M_MODEL.createResource( "http://www.geonames.org/ontology#T.VLC" ); + + /**

undersea

*/ + public static final Resource U = M_MODEL.createResource( "http://www.geonames.org/ontology#U" ); + + public static final Resource U_APNU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.APNU" ); + + public static final Resource U_ARCU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.ARCU" ); + + public static final Resource U_ARRU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.ARRU" ); + + public static final Resource U_BDLU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.BDLU" ); + + public static final Resource U_BKSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.BKSU" ); + + public static final Resource U_BNCU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.BNCU" ); + + public static final Resource U_BNKU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.BNKU" ); + + public static final Resource U_BSNU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.BSNU" ); + + public static final Resource U_CDAU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.CDAU" ); + + public static final Resource U_CNSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.CNSU" ); + + public static final Resource U_CNYU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.CNYU" ); + + public static final Resource U_CRSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.CRSU" ); + + public static final Resource U_DEPU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.DEPU" ); + + public static final Resource U_EDGU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.EDGU" ); + + public static final Resource U_ESCU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.ESCU" ); + + public static final Resource U_FANU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.FANU" ); + + public static final Resource U_FLTU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.FLTU" ); + + public static final Resource U_FRKU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.FRKU" ); + + public static final Resource U_FRSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.FRSU" ); + + public static final Resource U_FRZU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.FRZU" ); + + public static final Resource U_FURU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.FURU" ); + + public static final Resource U_GAPU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.GAPU" ); + + public static final Resource U_GLYU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.GLYU" ); + + public static final Resource U_HLLU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.HLLU" ); + + public static final Resource U_HLSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.HLSU" ); + + public static final Resource U_HOLU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.HOLU" ); + + public static final Resource U_KNLU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.KNLU" ); + + public static final Resource U_KNSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.KNSU" ); + + public static final Resource U_LDGU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.LDGU" ); + + public static final Resource U_LEVU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.LEVU" ); + + public static final Resource U_MDVU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.MDVU" ); + + public static final Resource U_MESU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.MESU" ); + + public static final Resource U_MNDU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.MNDU" ); + + public static final Resource U_MOTU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.MOTU" ); + + public static final Resource U_MTSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.MTSU" ); + + public static final Resource U_MTU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.MTU" ); + + public static final Resource U_PKSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.PKSU" ); + + public static final Resource U_PKU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.PKU" ); + + public static final Resource U_PLFU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.PLFU" ); + + public static final Resource U_PLNU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.PLNU" ); + + public static final Resource U_PLTU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.PLTU" ); + + public static final Resource U_PNLU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.PNLU" ); + + public static final Resource U_PRVU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.PRVU" ); + + public static final Resource U_RAVU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.RAVU" ); + + public static final Resource U_RDGU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.RDGU" ); + + public static final Resource U_RDSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.RDSU" ); + + public static final Resource U_RFSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.RFSU" ); + + public static final Resource U_RFU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.RFU" ); + + public static final Resource U_RISU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.RISU" ); + + public static final Resource U_RMPU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.RMPU" ); + + public static final Resource U_RNGU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.RNGU" ); + + public static final Resource U_SCNU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SCNU" ); + + public static final Resource U_SCSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SCSU" ); + + public static final Resource U_SDLU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SDLU" ); + + public static final Resource U_SHFU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SHFU" ); + + public static final Resource U_SHLU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SHLU" ); + + public static final Resource U_SHSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SHSU" ); + + public static final Resource U_SHVU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SHVU" ); + + public static final Resource U_SILU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SILU" ); + + public static final Resource U_SLPU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SLPU" ); + + public static final Resource U_SMSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SMSU" ); + + public static final Resource U_SMU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SMU" ); + + public static final Resource U_SPRU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.SPRU" ); + + public static final Resource U_TERU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.TERU" ); + + public static final Resource U_TMSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.TMSU" ); + + public static final Resource U_TMTU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.TMTU" ); + + public static final Resource U_TNGU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.TNGU" ); + + public static final Resource U_TRGU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.TRGU" ); + + public static final Resource U_TRNU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.TRNU" ); + + public static final Resource U_VALU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.VALU" ); + + public static final Resource U_VLSU = M_MODEL.createResource( "http://www.geonames.org/ontology#U.VLSU" ); + + /**

forest, heath, ...

*/ + public static final Resource V = M_MODEL.createResource( "http://www.geonames.org/ontology#V" ); + + public static final Resource V_BUSH = M_MODEL.createResource( "http://www.geonames.org/ontology#V.BUSH" ); + + public static final Resource V_CULT = M_MODEL.createResource( "http://www.geonames.org/ontology#V.CULT" ); + + public static final Resource V_FRST = M_MODEL.createResource( "http://www.geonames.org/ontology#V.FRST" ); + + public static final Resource V_FRSTF = M_MODEL.createResource( "http://www.geonames.org/ontology#V.FRSTF" ); + + public static final Resource V_GRSLD = M_MODEL.createResource( "http://www.geonames.org/ontology#V.GRSLD" ); + + public static final Resource V_GRVC = M_MODEL.createResource( "http://www.geonames.org/ontology#V.GRVC" ); + + public static final Resource V_GRVO = M_MODEL.createResource( "http://www.geonames.org/ontology#V.GRVO" ); + + public static final Resource V_GRVP = M_MODEL.createResource( "http://www.geonames.org/ontology#V.GRVP" ); + + public static final Resource V_GRVPN = M_MODEL.createResource( "http://www.geonames.org/ontology#V.GRVPN" ); + + public static final Resource V_HTH = M_MODEL.createResource( "http://www.geonames.org/ontology#V.HTH" ); + + public static final Resource V_MDW = M_MODEL.createResource( "http://www.geonames.org/ontology#V.MDW" ); + + public static final Resource V_OCH = M_MODEL.createResource( "http://www.geonames.org/ontology#V.OCH" ); + + public static final Resource V_SCRB = M_MODEL.createResource( "http://www.geonames.org/ontology#V.SCRB" ); + + public static final Resource V_TREE = M_MODEL.createResource( "http://www.geonames.org/ontology#V.TREE" ); + + public static final Resource V_TUND = M_MODEL.createResource( "http://www.geonames.org/ontology#V.TUND" ); + + public static final Resource V_VIN = M_MODEL.createResource( "http://www.geonames.org/ontology#V.VIN" ); + + public static final Resource V_VINS = M_MODEL.createResource( "http://www.geonames.org/ontology#V.VINS" ); + +} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/PAV.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/PAV.java new file mode 100644 index 00000000000..7525af5ce2a --- /dev/null +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/PAV.java @@ -0,0 +1,273 @@ +/* CVS $Id: $ */ +package org.orcid.api.common.writer.rdf.vocabs; +import org.apache.jena.rdf.model.*; + +/** + * Vocabulary definitions from C:\Users\angel\Documents\ORCID\development\tmp\deleteme\ORCID-Source\orcid-api-common/src/main/vocabs/pav.rdf + * @author Auto-generated by schemagen on 26 Mar 2026 15:47 + */ +public class PAV { + /**

The RDF model that holds the vocabulary terms

*/ + private static final Model M_MODEL = ModelFactory.createDefaultModel(); + + /**

The namespace of the vocabulary as a string

*/ + public static final String NS = "http://purl.org/pav/"; + + /**

The namespace of the vocabulary as a string

+ * @return namespace as String + * @see #NS */ + public static String getURI() {return NS;} + + /**

The namespace of the vocabulary as a resource

*/ + public static final Resource NAMESPACE = M_MODEL.createResource( NS ); + + /**

The ontology's owl:versionInfo as a string

*/ + public static final String VERSION_INFO = "2.1.1"; + + /**

An agent that originated or gave existence to the work that is expressed by + * the digital resource. The author of the content of a resource may be different + * from the creator of the resource representation (although they are often the + * same). See pav:createdBy for a discussion. The date of authoring can be expressed + * using pav:authoredOn - note however in the case of multiple authors that there + * is no relationship in PAV identifying which agent contributed when or what. + * If capturing such lineage is desired, it should be additionally expressed + * using activity-centric provenance vocabularies, for instance with prov:wasGeneratedBy + * and prov:qualifiedAssocation.

+ */ + public static final Property authoredBy = M_MODEL.createProperty( "http://purl.org/pav/authoredBy" ); + + /**

The date this resource was authored. pav:authoredBy gives the authoring agent. + * Note that pav:authoredOn is different from pav:createdOn, although they are + * often the same. See pav:createdBy for a discussion.

+ */ + public static final Property authoredOn = M_MODEL.createProperty( "http://purl.org/pav/authoredOn" ); + + /**

The resource was contributed to by the given agent. The agent provided any + * sort of help in conceiving the work that is expressed by the digital artifact. + * Superproperty of pav:authoredBy and pav:curatedBy. Note that as pav:contributedBy + * identifies only agents that contributed to the work, knowledge or intellectual + * property, and not agents that made the digital artifact or representation + * (pav:createdBy), thus this property can be considered more precise than dct:contributor. + * See pav:createdBy for a discussion. The date of contribution can be expressed + * using pav:contributedOn - note however in the case of multiple contributors + * that there is no relationship in PAV identifying which agent contributed when + * or what. If capturing such lineage is desired, it should be additionally expressed + * using activity-centric provenance vocabularies, for instance with prov:wasGeneratedBy + * and prov:qualifiedAssocation.

+ */ + public static final Property contributedBy = M_MODEL.createProperty( "http://purl.org/pav/contributedBy" ); + + /**

The date this resource was contributed to. pav:contributedBy provides the + * agent(s) that contributed.

+ */ + public static final Property contributedOn = M_MODEL.createProperty( "http://purl.org/pav/contributedOn" ); + + /**

The geo-location of the agents when creating the resource (pav:createdBy). + * For instance a photographer takes a picture of the Eiffel Tower while standing + * in front of it.

+ */ + public static final Property createdAt = M_MODEL.createProperty( "http://purl.org/pav/createdAt" ); + + /**

An agent primary responsible for making the digital artifact or resource representation. + * This property is distinct from forming the content, which is indicated with + * pav:contributedBy or its subproperties; pav:authoredBy, which identifies who + * authored the knowledge expressed by this resource; and pav:curatedBy, which + * identifies who curated the knowledge into its current form. pav:createdBy + * is more specific than dct:createdBy - which might or might not be interpreted + * to cover this creator. For instance, the author wrote 'this species has bigger + * wings than normal' in his log book. The curator, going through the log book + * and identifying important knowledge, formalizes this as 'locus perculus has + * wingspan > 0.5m'. The creator enters this knowledge as a digital resource + * in the knowledge system, thus creating the digital artifact (say as JSON, + * RDF, XML or HTML). A different example is a news article. pav:authoredBy indicates + * the journalist who wrote the article. pav:contributedBy can indicate the artist + * who added an illustration. pav:curatedBy can indicate the editor who made + * the article conform to the news paper's style. pav:createdBy can indicate + * who put the article on the web site. The software tool used by the creator + * to make the digital resource (say Protege, Wordpress or OpenOffice) can be + * indicated with pav:createdWith. The date the digital resource was created + * can be indicated with pav:createdOn. The location the agent was at when creating + * the digital resource can be made using pav:createdAt.

+ */ + public static final Property createdBy = M_MODEL.createProperty( "http://purl.org/pav/createdBy" ); + + /**

The date of creation of the resource. pav:createdBy provides the agent(s) + * that created the resource.

+ */ + public static final Property createdOn = M_MODEL.createProperty( "http://purl.org/pav/createdOn" ); + + /**

The software/tool used by the creator (pav:createdBy) when making the digital + * resource, for instance a word processor or an annotation tool. A more independent + * software agent that creates the resource without direct interaction by a human + * creator should instead should instead by indicated using pav:createdBy.

+ */ + public static final Property createdWith = M_MODEL.createProperty( "http://purl.org/pav/createdWith" ); + + /**

An agent specialist responsible for shaping the expression in an appropriate + * format. Often the primary agent responsible for ensuring the quality of the + * representation. The curator may be different from the creator of the author + * (pav:authoredBy) and the creator of the digital resource (pav:createdBy). + * The date of curating can be expressed using pav:curatedOn - note however in + * the case of multiple curators that there is no relationship in PAV identifying + * which agent contributed when or what. If capturing such lineage is desired, + * it should be additionally expressed using activity-centric provenance vocabularies, + * for instance with prov:wasGeneratedBy and prov:qualifiedAssocation.

+ */ + public static final Property curatedBy = M_MODEL.createProperty( "http://purl.org/pav/curatedBy" ); + + /**

The date this resource was curated. pav:curatedBy gives the agent(s) that + * performed the curation.

+ */ + public static final Property curatedOn = M_MODEL.createProperty( "http://purl.org/pav/curatedOn" ); + + /**

Provided for backwards compatibility with PAV 1.2 only. Use instead the inverse + * pav:curatedBy.

+ */ + public static final Property curates = M_MODEL.createProperty( "http://purl.org/pav/curates" ); + + /**

Derived from a different resource. Derivation conserns itself with derived + * knowledge. If this resource has the same content as the other resource, but + * has simply been transcribed to fit a different model (like XML -> RDF or + * SQL -> CVS), use pav:importedFrom. If a resource was simply retrieved, + * use pav:retrievedFrom. If the content has however been further refined or + * modified, pav:derivedFrom should be used. Details about who performed the + * derivation may be indicated with pav:contributedBy and its subproperties.

+ */ + public static final Property derivedFrom = M_MODEL.createProperty( "http://purl.org/pav/derivedFrom" ); + + /**

An entity responsible for importing the data. The importer is usually a software + * entity which has done the transcription from the original source. Note that + * pav:importedBy may overlap with pav:createdWith. The source for the import + * should be given with pav:importedFrom. The time of the import should be given + * with pav:importedOn. See pav:importedFrom for a discussion of import vs. retrieve + * vs. derived.

+ */ + public static final Property importedBy = M_MODEL.createProperty( "http://purl.org/pav/importedBy" ); + + /**

The original source of imported information. Import means that the content + * has been preserved, but transcribed somehow, for instance to fit a different + * representation model. Examples of import are when the original was JSON and + * the current resource is RDF, or where the original was an document scan, and + * this resource is the plain text found through OCR. The imported resource does + * not have to be complete, but should be consistent with the knowledge conveyed + * by the original resource. If additional knowledge has been contributed, pav:derivedFrom + * would be more appropriate. If the resource has been copied verbatim from the + * original representation (e.g. downloaded), use pav:retrievedFrom. To indicate + * which agent(s) performed the import, use pav:importedBy. Use pav:importedOn + * to indicate when it happened.

+ */ + public static final Property importedFrom = M_MODEL.createProperty( "http://purl.org/pav/importedFrom" ); + + /**

The date this resource was imported from a source (pav:importedFrom). Note + * that pav:importedOn may overlap with pav:createdOn, but in cases where they + * differ, the import time indicates the time of the retrieval and transcription + * of the original source, while the creation time indicates when the final resource + * was made, for instance after user approval. If the source is later reimported, + * this should be indicated with pav:lastRefreshedOn. The source of the import + * should be given with pav:importedFrom. The agent that performed the import + * should be given with pav:importedBy. See pav:importedFrom for a discussion + * about import vs. retrieval.

+ */ + public static final Property importedOn = M_MODEL.createProperty( "http://purl.org/pav/importedOn" ); + + /**

The date of the last re-import of the resource. This property is used in addition + * to pav:importedOn if this version has been updated due to a re-import. If + * the re-import created a new resource rather than refreshing an existing, then + * pav:importedOn should be used together with pav:previousVersion.

+ */ + public static final Property lastRefreshedOn = M_MODEL.createProperty( "http://purl.org/pav/lastRefreshedOn" ); + + /**

The date of the last update of the resource. An update is a change which did + * not warrant making a new resource related using pav:previousVersion, for instance + * correcting a spelling mistake.

+ */ + public static final Property lastUpdateOn = M_MODEL.createProperty( "http://purl.org/pav/lastUpdateOn" ); + + /**

The previous version of a resource in a lineage. For instance a news article + * updated to correct factual information would point to the previous version + * of the article with pav:previousVersion. If however the content has significantly + * changed so that the two resources no longer share lineage (say a new news + * article that talks about the same facts), they should be related using pav:derivedFrom. + * A version number of this resource can be provided using the data property + * pav:version.

+ */ + public static final Property previousVersion = M_MODEL.createProperty( "http://purl.org/pav/previousVersion" ); + + /**

The original provider of the encoded information (e.g. PubMed, UniProt, Science + * Commons). The provider might not coincide with the dct:publisher, which would + * describe the current publisher of the resource. For instance if the resource + * was retrieved, imported or derived from a source, that source was published + * by the original provider. pav:providedBy provides a shortcut to indicate the + * original provider on the new resource.

+ */ + public static final Property providedBy = M_MODEL.createProperty( "http://purl.org/pav/providedBy" ); + + /**

An entity responsible for retrieving the data from an external source. The + * retrieving agent is usually a software entity, which has done the retrieval + * from the original source without performing any transcription. The source + * that was retrieved should be given with pav:retrievedFrom. The time of the + * retrieval should be indicated using pav:retrievedOn. See pav:importedFrom + * for a discussion of import vs. retrieve vs. derived.

+ */ + public static final Property retrievedBy = M_MODEL.createProperty( "http://purl.org/pav/retrievedBy" ); + + /**

The URI where a resource has been retrieved from. Retrieval indicates that + * this resource has the same representation as the original resource. If the + * resource has been somewhat transformed, use pav:importedFrom instead. The + * time of the retrieval should be indicated using pav:retrievedOn. The agent + * may be indicated with pav:retrievedBy.

+ */ + public static final Property retrievedFrom = M_MODEL.createProperty( "http://purl.org/pav/retrievedFrom" ); + + /**

The date the source for this resource was retrieved. The source that was retrieved + * should be indicated with pav:retrievedFrom. The agent that performed the retrieval + * may be specified with pav:retrievedBy.

+ */ + public static final Property retrievedOn = M_MODEL.createProperty( "http://purl.org/pav/retrievedOn" ); + + /**

The resource is related to a given source which was accessed or consulted + * (but not retrieved, imported or derived from). This access can be detailed + * with pav:sourceAccessedBy and pav:sourceAccessedOn. For instance, a curator + * (pav:curatedBy) might have consulted figures in a published paper to confirm + * that a dataset was correctly pav:importedFrom the paper's supplementary CSV + * file.

+ */ + public static final Property sourceAccessedAt = M_MODEL.createProperty( "http://purl.org/pav/sourceAccessedAt" ); + + /**

The resource is related to a source which was accessed or consulted by the + * given agent. The source(s) should be specified using pav:sourceAccessedAt, + * and the time with pav:sourceAccessedOn. For instance, the given agent could + * be a curator (also pav:curatedBy) which consulted figures in a published paper + * to confirm that a dataset was correctly pav:importedFrom the paper's supplementary + * CSV file.

+ */ + public static final Property sourceAccessedBy = M_MODEL.createProperty( "http://purl.org/pav/sourceAccessedBy" ); + + /**

The resource is related to a source which was originally accessed or consulted + * on the given date as part of creating or authoring the resource. The source(s) + * should be specified using pav:sourceAccessedAt. If the source is subsequently + * checked again (say to verify validity), this should be indicated with pav:sourceLastAccessedOn. + * In the case multiple sources being accessed at different times or by different + * agents, PAV does not distinguish who accessed when what. If such details are + * required, they may be provided by additionally using prov:qualifiedInfluence.

+ */ + public static final Property sourceAccessedOn = M_MODEL.createProperty( "http://purl.org/pav/sourceAccessedOn" ); + + /**

The resource is related to a source which was last accessed or consulted on + * the given date. The source(s) should be specified using pav:sourceAccessedAt. + * Usage of this property indicates that the source has been checked previously, + * which the initial time should be indicated with pav:sourceAccessedOn. This + * property can be useful together with pav:lastRefreshedOn or pav:lastUpdateOn + * in order to indicate a re-import or update, but could also be used alone, + * for instance when a source was simply verified and no further action was taken + * for the resource,

+ */ + public static final Property sourceLastAccessedOn = M_MODEL.createProperty( "http://purl.org/pav/sourceLastAccessedOn" ); + + /**

The version number of a resource. This is a freetext string, typical values + * are "1.5" or "21". The URI identifying the previous version can be provided + * using prov:previousVersion.

+ */ + public static final Property version = M_MODEL.createProperty( "http://purl.org/pav/version" ); + +} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/PROV.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/PROV.java new file mode 100644 index 00000000000..3d27d7e47ac --- /dev/null +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/PROV.java @@ -0,0 +1,503 @@ +/* CVS $Id: $ */ +package org.orcid.api.common.writer.rdf.vocabs; +import org.apache.jena.rdf.model.*; + +/** + * Vocabulary definitions from C:\Users\angel\Documents\ORCID\development\tmp\deleteme\ORCID-Source\orcid-api-common/src/main/vocabs/prov-o.rdf + * @author Auto-generated by schemagen on 26 Mar 2026 15:47 + */ +public class PROV { + /**

The RDF model that holds the vocabulary terms

*/ + private static final Model M_MODEL = ModelFactory.createDefaultModel(); + + /**

The namespace of the vocabulary as a string

*/ + public static final String NS = "http://www.w3.org/ns/prov#"; + + /**

The namespace of the vocabulary as a string

+ * @return namespace as String + * @see #NS */ + public static String getURI() {return NS;} + + /**

The namespace of the vocabulary as a resource

*/ + public static final Resource NAMESPACE = M_MODEL.createResource( NS ); + + /**

An object property to express the accountability of an agent towards another + * agent. The subordinate agent acted on behalf of the responsible agent in an + * actual activity.

+ */ + public static final Property actedOnBehalfOf = M_MODEL.createProperty( "http://www.w3.org/ns/prov#actedOnBehalfOf" ); + + public static final Property activity = M_MODEL.createProperty( "http://www.w3.org/ns/prov#activity" ); + + public static final Property agent = M_MODEL.createProperty( "http://www.w3.org/ns/prov#agent" ); + + public static final Property alternateOf = M_MODEL.createProperty( "http://www.w3.org/ns/prov#alternateOf" ); + + public static final Property aq = M_MODEL.createProperty( "http://www.w3.org/ns/prov#aq" ); + + /**

The Location of any resource.This property has multiple RDFS domains to suit + * multiple OWL Profiles. See <a href="#owl-profile">PROV-O OWL Profile</a>.

+ */ + public static final Property atLocation = M_MODEL.createProperty( "http://www.w3.org/ns/prov#atLocation" ); + + /**

The time at which an InstantaneousEvent occurred, in the form of xsd:dateTime.

*/ + public static final Property atTime = M_MODEL.createProperty( "http://www.w3.org/ns/prov#atTime" ); + + /**

Classify prov-o terms into three categories, including 'starting-point', 'qualifed', + * and 'extended'. This classification is used by the prov-o html document to + * gently introduce prov-o terms to its users.

+ */ + public static final Property category = M_MODEL.createProperty( "http://www.w3.org/ns/prov#category" ); + + /**

Classify prov-o terms into six components according to prov-dm, including + * 'agents-responsibility', 'alternate', 'annotations', 'collections', 'derivations', + * and 'entities-activities'. This classification is used so that readers of + * prov-o specification can find its correspondence with the prov-dm specification.

+ */ + public static final Property component = M_MODEL.createProperty( "http://www.w3.org/ns/prov#component" ); + + /**

A reference to the principal section of the PROV-CONSTRAINTS document that + * describes this concept.

+ */ + public static final Property constraints = M_MODEL.createProperty( "http://www.w3.org/ns/prov#constraints" ); + + /**

A definition quoted from PROV-DM or PROV-CONSTRAINTS that describes the concept + * expressed with this OWL term.

+ */ + public static final Property definition = M_MODEL.createProperty( "http://www.w3.org/ns/prov#definition" ); + + /**

A reference to the principal section of the PROV-DM document that describes + * this concept.

+ */ + public static final Property dm = M_MODEL.createProperty( "http://www.w3.org/ns/prov#dm" ); + + /**

A note by the OWL development team about how this term expresses the PROV-DM + * concept, or how it should be used in context of semantic web or linked data.

+ */ + public static final Property editorialNote = M_MODEL.createProperty( "http://www.w3.org/ns/prov#editorialNote" ); + + /**

When the prov-o term does not have a definition drawn from prov-dm, and the + * prov-o editor provides one.

+ */ + public static final Property editorsDefinition = M_MODEL.createProperty( "http://www.w3.org/ns/prov#editorsDefinition" ); + + /**

The time at which an activity ended. See also prov:startedAtTime.

*/ + public static final Property endedAtTime = M_MODEL.createProperty( "http://www.w3.org/ns/prov#endedAtTime" ); + + public static final Property entity = M_MODEL.createProperty( "http://www.w3.org/ns/prov#entity" ); + + public static final Property generated = M_MODEL.createProperty( "http://www.w3.org/ns/prov#generated" ); + + /**

The time at which an entity was completely created and is available for use.

*/ + public static final Property generatedAtTime = M_MODEL.createProperty( "http://www.w3.org/ns/prov#generatedAtTime" ); + + /**

This property has multiple RDFS domains to suit multiple OWL Profiles. See + * <a href="#owl-profile">PROV-O OWL Profile</a>.The _optional_ Activity + * of an Influence, which used, generated, invalidated, or was the responsibility + * of some Entity. This property is _not_ used by ActivityInfluence (use prov:activity + * instead).

+ */ + public static final Property hadActivity = M_MODEL.createProperty( "http://www.w3.org/ns/prov#hadActivity" ); + + /**

The _optional_ Generation involved in an Entity's Derivation.

*/ + public static final Property hadGeneration = M_MODEL.createProperty( "http://www.w3.org/ns/prov#hadGeneration" ); + + public static final Property hadMember = M_MODEL.createProperty( "http://www.w3.org/ns/prov#hadMember" ); + + /**

The _optional_ Plan adopted by an Agent in Association with some Activity. + * Plan specifications are out of the scope of this specification.

+ */ + public static final Property hadPlan = M_MODEL.createProperty( "http://www.w3.org/ns/prov#hadPlan" ); + + public static final Property hadPrimarySource = M_MODEL.createProperty( "http://www.w3.org/ns/prov#hadPrimarySource" ); + + /**

The _optional_ Role that an Entity assumed in the context of an Activity. + * For example, :baking prov:used :spoon; prov:qualified [ a prov:Usage; prov:entity + * :spoon; prov:hadRole roles:mixing_implement ].This property has multiple RDFS + * domains to suit multiple OWL Profiles. See <a href="#owl-profile">PROV-O + * OWL Profile</a>.

+ */ + public static final Property hadRole = M_MODEL.createProperty( "http://www.w3.org/ns/prov#hadRole" ); + + /**

The _optional_ Usage involved in an Entity's Derivation.

*/ + public static final Property hadUsage = M_MODEL.createProperty( "http://www.w3.org/ns/prov#hadUsage" ); + + public static final Property influenced = M_MODEL.createProperty( "http://www.w3.org/ns/prov#influenced" ); + + /**

Subproperties of prov:influencer are used to cite the object of an unqualified + * PROV-O triple whose predicate is a subproperty of prov:wasInfluencedBy (e.g. + * prov:used, prov:wasGeneratedBy). prov:influencer is used much like rdf:object + * is used.

+ */ + public static final Property influencer = M_MODEL.createProperty( "http://www.w3.org/ns/prov#influencer" ); + + public static final Property invalidated = M_MODEL.createProperty( "http://www.w3.org/ns/prov#invalidated" ); + + /**

The time at which an entity was invalidated (i.e., no longer usable).

*/ + public static final Property invalidatedAtTime = M_MODEL.createProperty( "http://www.w3.org/ns/prov#invalidatedAtTime" ); + + /**

PROV-O does not define all property inverses. The directionalities defined + * in PROV-O should be given preference over those not defined. However, if users + * wish to name the inverse of a PROV-O property, the local name given by prov:inverse + * should be used.

+ */ + public static final Property inverse = M_MODEL.createProperty( "http://www.w3.org/ns/prov#inverse" ); + + /**

A reference to the principal section of the PROV-DM document that describes + * this concept.

+ */ + public static final Property n = M_MODEL.createProperty( "http://www.w3.org/ns/prov#n" ); + + /**

If this Activity prov:wasAssociatedWith Agent :ag, then it can qualify the + * Association using prov:qualifiedAssociation [ a prov:Association; prov:agent + * :ag; :foo :bar ].

+ */ + public static final Property qualifiedAssociation = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedAssociation" ); + + /**

If this Entity prov:wasAttributedTo Agent :ag, then it can qualify how it + * was influenced using prov:qualifiedAttribution [ a prov:Attribution; prov:agent + * :ag; :foo :bar ].

+ */ + public static final Property qualifiedAttribution = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedAttribution" ); + + /**

If this Activity prov:wasInformedBy Activity :a, then it can qualify how it + * was influenced using prov:qualifiedCommunication [ a prov:Communication; prov:activity + * :a; :foo :bar ].

+ */ + public static final Property qualifiedCommunication = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedCommunication" ); + + /**

If this Agent prov:actedOnBehalfOf Agent :ag, then it can qualify how with + * prov:qualifiedResponsibility [ a prov:Responsibility; prov:agent :ag; :foo + * :bar ].

+ */ + public static final Property qualifiedDelegation = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedDelegation" ); + + /**

If this Entity prov:wasDerivedFrom Entity :e, then it can qualify how it was + * derived using prov:qualifiedDerivation [ a prov:Derivation; prov:entity :e; + * :foo :bar ].

+ */ + public static final Property qualifiedDerivation = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedDerivation" ); + + /**

If this Activity prov:wasEndedBy Entity :e1, then it can qualify how it was + * ended using prov:qualifiedEnd [ a prov:End; prov:entity :e1; :foo :bar ].

+ */ + public static final Property qualifiedEnd = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedEnd" ); + + /**

This annotation property links a subproperty of prov:wasInfluencedBy with + * the subclass of prov:Influence and the qualifying property that are used to + * qualify it. Example annotation: prov:wasGeneratedBy prov:qualifiedForm prov:qualifiedGeneration, + * prov:Generation . Then this unqualified assertion: :entity1 prov:wasGeneratedBy + * :activity1 . can be qualified by adding: :entity1 prov:qualifiedGeneration + * :entity1Gen . :entity1Gen a prov:Generation, prov:Influence; prov:activity + * :activity1; :customValue 1337 . Note how the value of the unqualified influence + * (prov:wasGeneratedBy :activity1) is mirrored as the value of the prov:activity + * (or prov:entity, or prov:agent) property on the influence class.

+ */ + public static final Property qualifiedForm = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedForm" ); + + /**

If this Activity prov:generated Entity :e, then it can qualify how it performed + * the Generation using prov:qualifiedGeneration [ a prov:Generation; prov:entity + * :e; :foo :bar ].

+ */ + public static final Property qualifiedGeneration = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedGeneration" ); + + /**

Because prov:qualifiedInfluence is a broad relation, the more specific relations + * (qualifiedCommunication, qualifiedDelegation, qualifiedEnd, etc.) should be + * used when applicable.

+ */ + public static final Property qualifiedInfluence = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedInfluence" ); + + /**

If this Entity prov:wasInvalidatedBy Activity :a, then it can qualify how + * it was invalidated using prov:qualifiedInvalidation [ a prov:Invalidation; + * prov:activity :a; :foo :bar ].

+ */ + public static final Property qualifiedInvalidation = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedInvalidation" ); + + /**

If this Entity prov:hadPrimarySource Entity :e, then it can qualify how using + * prov:qualifiedPrimarySource [ a prov:PrimarySource; prov:entity :e; :foo :bar + * ].

+ */ + public static final Property qualifiedPrimarySource = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedPrimarySource" ); + + /**

If this Entity prov:wasQuotedFrom Entity :e, then it can qualify how using + * prov:qualifiedQuotation [ a prov:Quotation; prov:entity :e; :foo :bar ].

+ */ + public static final Property qualifiedQuotation = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedQuotation" ); + + /**

If this Entity prov:wasRevisionOf Entity :e, then it can qualify how it was + * revised using prov:qualifiedRevision [ a prov:Revision; prov:entity :e; :foo + * :bar ].

+ */ + public static final Property qualifiedRevision = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedRevision" ); + + /**

If this Activity prov:wasStartedBy Entity :e1, then it can qualify how it + * was started using prov:qualifiedStart [ a prov:Start; prov:entity :e1; :foo + * :bar ].

+ */ + public static final Property qualifiedStart = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedStart" ); + + /**

If this Activity prov:used Entity :e, then it can qualify how it used it using + * prov:qualifiedUsage [ a prov:Usage; prov:entity :e; :foo :bar ].

+ */ + public static final Property qualifiedUsage = M_MODEL.createProperty( "http://www.w3.org/ns/prov#qualifiedUsage" ); + + public static final Property sharesDefinitionWith = M_MODEL.createProperty( "http://www.w3.org/ns/prov#sharesDefinitionWith" ); + + public static final Property specializationOf = M_MODEL.createProperty( "http://www.w3.org/ns/prov#specializationOf" ); + + /**

The time at which an activity started. See also prov:endedAtTime.

*/ + public static final Property startedAtTime = M_MODEL.createProperty( "http://www.w3.org/ns/prov#startedAtTime" ); + + /**

Classes and properties used to qualify relationships are annotated with prov:unqualifiedForm + * to indicate the property used to assert an unqualified provenance relation.

+ */ + public static final Property unqualifiedForm = M_MODEL.createProperty( "http://www.w3.org/ns/prov#unqualifiedForm" ); + + /**

A prov:Entity that was used by this prov:Activity. For example, :baking prov:used + * :spoon, :egg, :oven .

+ */ + public static final Property used = M_MODEL.createProperty( "http://www.w3.org/ns/prov#used" ); + + public static final Property value = M_MODEL.createProperty( "http://www.w3.org/ns/prov#value" ); + + /**

An prov:Agent that had some (unspecified) responsibility for the occurrence + * of this prov:Activity.

+ */ + public static final Property wasAssociatedWith = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasAssociatedWith" ); + + /**

Attribution is the ascribing of an entity to an agent.

*/ + public static final Property wasAttributedTo = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasAttributedTo" ); + + /**

The more specific subproperties of prov:wasDerivedFrom (i.e., prov:wasQuotedFrom, + * prov:wasRevisionOf, prov:hadPrimarySource) should be used when applicable.

+ */ + public static final Property wasDerivedFrom = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasDerivedFrom" ); + + /**

End is when an activity is deemed to have ended. An end may refer to an entity, + * known as trigger, that terminated the activity.

+ */ + public static final Property wasEndedBy = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasEndedBy" ); + + public static final Property wasGeneratedBy = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasGeneratedBy" ); + + /**

This property has multiple RDFS domains to suit multiple OWL Profiles. See + * <a href="#owl-profile">PROV-O OWL Profile</a>.Because prov:wasInfluencedBy + * is a broad relation, its more specific subproperties (e.g. prov:wasInformedBy, + * prov:actedOnBehalfOf, prov:wasEndedBy, etc.) should be used when applicable.

+ */ + public static final Property wasInfluencedBy = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasInfluencedBy" ); + + /**

An activity a2 is dependent on or informed by another activity a1, by way + * of some unspecified entity that is generated by a1 and used by a2.

+ */ + public static final Property wasInformedBy = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasInformedBy" ); + + public static final Property wasInvalidatedBy = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasInvalidatedBy" ); + + /**

An entity is derived from an original entity by copying, or 'quoting', some + * or all of it.

+ */ + public static final Property wasQuotedFrom = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasQuotedFrom" ); + + /**

A revision is a derivation that revises an entity into a revised version.

*/ + public static final Property wasRevisionOf = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasRevisionOf" ); + + /**

Start is when an activity is deemed to have started. A start may refer to + * an entity, known as trigger, that initiated the activity.

+ */ + public static final Property wasStartedBy = M_MODEL.createProperty( "http://www.w3.org/ns/prov#wasStartedBy" ); + + public static final Resource Activity = M_MODEL.createResource( "http://www.w3.org/ns/prov#Activity" ); + + /**

It is not recommended that the type ActivityInfluence be asserted without + * also asserting one of its more specific subclasses.ActivityInfluence provides + * additional descriptions of an Activity's binary influence upon any other kind + * of resource. Instances of ActivityInfluence use the prov:activity property + * to cite the influencing Activity.

+ */ + public static final Resource ActivityInfluence = M_MODEL.createResource( "http://www.w3.org/ns/prov#ActivityInfluence" ); + + public static final Resource Agent = M_MODEL.createResource( "http://www.w3.org/ns/prov#Agent" ); + + /**

It is not recommended that the type AgentInfluence be asserted without also + * asserting one of its more specific subclasses.AgentInfluence provides additional + * descriptions of an Agent's binary influence upon any other kind of resource. + * Instances of AgentInfluence use the prov:agent property to cite the influencing + * Agent.

+ */ + public static final Resource AgentInfluence = M_MODEL.createResource( "http://www.w3.org/ns/prov#AgentInfluence" ); + + /**

An instance of prov:Association provides additional descriptions about the + * binary prov:wasAssociatedWith relation from an prov:Activity to some prov:Agent + * that had some responsiblity for it. For example, :baking prov:wasAssociatedWith + * :baker; prov:qualifiedAssociation [ a prov:Association; prov:agent :baker; + * :foo :bar ].

+ */ + public static final Resource Association = M_MODEL.createResource( "http://www.w3.org/ns/prov#Association" ); + + /**

An instance of prov:Attribution provides additional descriptions about the + * binary prov:wasAttributedTo relation from an prov:Entity to some prov:Agent + * that had some responsible for it. For example, :cake prov:wasAttributedTo + * :baker; prov:qualifiedAttribution [ a prov:Attribution; prov:entity :baker; + * :foo :bar ].

+ */ + public static final Resource Attribution = M_MODEL.createResource( "http://www.w3.org/ns/prov#Attribution" ); + + /**

Note that there are kinds of bundles (e.g. handwritten letters, audio recordings, + * etc.) that are not expressed in PROV-O, but can be still be described by PROV-O.

+ */ + public static final Resource Bundle = M_MODEL.createResource( "http://www.w3.org/ns/prov#Bundle" ); + + public static final Resource Collection = M_MODEL.createResource( "http://www.w3.org/ns/prov#Collection" ); + + /**

An instance of prov:Communication provides additional descriptions about the + * binary prov:wasInformedBy relation from an informed prov:Activity to the prov:Activity + * that informed it. For example, :you_jumping_off_bridge prov:wasInformedBy + * :everyone_else_jumping_off_bridge; prov:qualifiedCommunication [ a prov:Communication; + * prov:activity :everyone_else_jumping_off_bridge; :foo :bar ].

+ */ + public static final Resource Communication = M_MODEL.createResource( "http://www.w3.org/ns/prov#Communication" ); + + /**

An instance of prov:Delegation provides additional descriptions about the + * binary prov:actedOnBehalfOf relation from a performing prov:Agent to some + * prov:Agent for whom it was performed. For example, :mixing prov:wasAssociatedWith + * :toddler . :toddler prov:actedOnBehalfOf :mother; prov:qualifiedDelegation + * [ a prov:Delegation; prov:entity :mother; :foo :bar ].

+ */ + public static final Resource Delegation = M_MODEL.createResource( "http://www.w3.org/ns/prov#Delegation" ); + + /**

An instance of prov:Derivation provides additional descriptions about the + * binary prov:wasDerivedFrom relation from some derived prov:Entity to another + * prov:Entity from which it was derived. For example, :chewed_bubble_gum prov:wasDerivedFrom + * :unwrapped_bubble_gum; prov:qualifiedDerivation [ a prov:Derivation; prov:entity + * :unwrapped_bubble_gum; :foo :bar ].The more specific forms of prov:Derivation + * (i.e., prov:Revision, prov:Quotation, prov:PrimarySource) should be asserted + * if they apply.

+ */ + public static final Resource Derivation = M_MODEL.createResource( "http://www.w3.org/ns/prov#Derivation" ); + + public static final Resource EmptyCollection = M_MODEL.createResource( "http://www.w3.org/ns/prov#EmptyCollection" ); + + /**

An instance of prov:End provides additional descriptions about the binary + * prov:wasEndedBy relation from some ended prov:Activity to an prov:Entity that + * ended it. For example, :ball_game prov:wasEndedBy :buzzer; prov:qualifiedEnd + * [ a prov:End; prov:entity :buzzer; :foo :bar; prov:atTime '2012-03-09T08:05:08-05:00'^^xsd:dateTime + * ].

+ */ + public static final Resource End = M_MODEL.createResource( "http://www.w3.org/ns/prov#End" ); + + public static final Resource Entity = M_MODEL.createResource( "http://www.w3.org/ns/prov#Entity" ); + + /**

It is not recommended that the type EntityInfluence be asserted without also + * asserting one of its more specific subclasses.EntityInfluence provides additional + * descriptions of an Entity's binary influence upon any other kind of resource. + * Instances of EntityInfluence use the prov:entity property to cite the influencing + * Entity.

+ */ + public static final Resource EntityInfluence = M_MODEL.createResource( "http://www.w3.org/ns/prov#EntityInfluence" ); + + /**

An instance of prov:Generation provides additional descriptions about the + * binary prov:wasGeneratedBy relation from a generated prov:Entity to the prov:Activity + * that generated it. For example, :cake prov:wasGeneratedBy :baking; prov:qualifiedGeneration + * [ a prov:Generation; prov:activity :baking; :foo :bar ].

+ */ + public static final Resource Generation = M_MODEL.createResource( "http://www.w3.org/ns/prov#Generation" ); + + /**

Because prov:Influence is a broad relation, its most specific subclasses (e.g. + * prov:Communication, prov:Delegation, prov:End, prov:Revision, etc.) should + * be used when applicable.An instance of prov:Influence provides additional + * descriptions about the binary prov:wasInfluencedBy relation from some influenced + * Activity, Entity, or Agent to the influencing Activity, Entity, or Agent. + * For example, :stomach_ache prov:wasInfluencedBy :spoon; prov:qualifiedInfluence + * [ a prov:Influence; prov:entity :spoon; :foo :bar ] . Because prov:Influence + * is a broad relation, the more specific relations (Communication, Delegation, + * End, etc.) should be used when applicable.

+ */ + public static final Resource Influence = M_MODEL.createResource( "http://www.w3.org/ns/prov#Influence" ); + + /**

An instantaneous event, or event for short, happens in the world and marks + * a change in the world, in its activities and in its entities. The term 'event' + * is commonly used in process algebra with a similar meaning. Events represent + * communications or interactions; they are assumed to be atomic and instantaneous.

+ */ + public static final Resource InstantaneousEvent = M_MODEL.createResource( "http://www.w3.org/ns/prov#InstantaneousEvent" ); + + /**

An instance of prov:Invalidation provides additional descriptions about the + * binary prov:wasInvalidatedBy relation from an invalidated prov:Entity to the + * prov:Activity that invalidated it. For example, :uncracked_egg prov:wasInvalidatedBy + * :baking; prov:qualifiedInvalidation [ a prov:Invalidation; prov:activity :baking; + * :foo :bar ].

+ */ + public static final Resource Invalidation = M_MODEL.createResource( "http://www.w3.org/ns/prov#Invalidation" ); + + public static final Resource Location = M_MODEL.createResource( "http://www.w3.org/ns/prov#Location" ); + + public static final Resource Organization = M_MODEL.createResource( "http://www.w3.org/ns/prov#Organization" ); + + public static final Resource Person = M_MODEL.createResource( "http://www.w3.org/ns/prov#Person" ); + + /**

There exist no prescriptive requirement on the nature of plans, their representation, + * the actions or steps they consist of, or their intended goals. Since plans + * may evolve over time, it may become necessary to track their provenance, so + * plans themselves are entities. Representing the plan explicitly in the provenance + * can be useful for various tasks: for example, to validate the execution as + * represented in the provenance record, to manage expectation failures, or to + * provide explanations.

+ */ + public static final Resource Plan = M_MODEL.createResource( "http://www.w3.org/ns/prov#Plan" ); + + /**

An instance of prov:PrimarySource provides additional descriptions about the + * binary prov:hadPrimarySource relation from some secondary prov:Entity to an + * earlier, primary prov:Entity. For example, :blog prov:hadPrimarySource :newsArticle; + * prov:qualifiedPrimarySource [ a prov:PrimarySource; prov:entity :newsArticle; + * :foo :bar ] .

+ */ + public static final Resource PrimarySource = M_MODEL.createResource( "http://www.w3.org/ns/prov#PrimarySource" ); + + /**

An instance of prov:Quotation provides additional descriptions about the binary + * prov:wasQuotedFrom relation from some taken prov:Entity from an earlier, larger + * prov:Entity. For example, :here_is_looking_at_you_kid prov:wasQuotedFrom :casablanca_script; + * prov:qualifiedQuotation [ a prov:Quotation; prov:entity :casablanca_script; + * :foo :bar ].

+ */ + public static final Resource Quotation = M_MODEL.createResource( "http://www.w3.org/ns/prov#Quotation" ); + + /**

An instance of prov:Revision provides additional descriptions about the binary + * prov:wasRevisionOf relation from some newer prov:Entity to an earlier prov:Entity. + * For example, :draft_2 prov:wasRevisionOf :draft_1; prov:qualifiedRevision + * [ a prov:Revision; prov:entity :draft_1; :foo :bar ].

+ */ + public static final Resource Revision = M_MODEL.createResource( "http://www.w3.org/ns/prov#Revision" ); + + public static final Resource Role = M_MODEL.createResource( "http://www.w3.org/ns/prov#Role" ); + + public static final Resource SoftwareAgent = M_MODEL.createResource( "http://www.w3.org/ns/prov#SoftwareAgent" ); + + /**

An instance of prov:Start provides additional descriptions about the binary + * prov:wasStartedBy relation from some started prov:Activity to an prov:Entity + * that started it. For example, :foot_race prov:wasStartedBy :bang; prov:qualifiedStart + * [ a prov:Start; prov:entity :bang; :foo :bar; prov:atTime '2012-03-09T08:05:08-05:00'^^xsd:dateTime + * ] .

+ */ + public static final Resource Start = M_MODEL.createResource( "http://www.w3.org/ns/prov#Start" ); + + /**

An instance of prov:Usage provides additional descriptions about the binary + * prov:used relation from some prov:Activity to an prov:Entity that it used. + * For example, :keynote prov:used :podium; prov:qualifiedUsage [ a prov:Usage; + * prov:entity :podium; :foo :bar ].

+ */ + public static final Resource Usage = M_MODEL.createResource( "http://www.w3.org/ns/prov#Usage" ); + + public static final Resource prov_o = M_MODEL.createResource( "http://www.w3.org/ns/prov-o" ); + + /**

This document is published by the Provenance Working Group (http://www.w3.org/2011/prov/wiki/Main_Page). + * If you wish to make comments regarding this document, please send them to + * public-prov-comments@w3.org (subscribe public-prov-comments-request@w3.org, + * archives http://lists.w3.org/Archives/Public/public-prov-comments/). All feedback + * is welcome.

+ */ + public static final Resource __ = M_MODEL.createResource( "http://www.w3.org/ns/prov-o#" ); + + public static final Resource prov_o_20120312 = M_MODEL.createResource( "http://www.w3.org/ns/prov-o-20120312" ); + +} diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/RDFMessageBodyWriterV2.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/RDFMessageBodyWriterV2.java index bfa176e8b69..47520076726 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/RDFMessageBodyWriterV2.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/rdf/RDFMessageBodyWriterV2.java @@ -13,14 +13,14 @@ import java.util.Arrays; import java.util.List; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.UriInfo; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.UriInfo; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import javax.xml.datatype.XMLGregorianCalendar; import org.apache.jena.datatypes.xsd.XSDDatatype; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/schemaorg/SchemaOrgMBWriterV2.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/schemaorg/SchemaOrgMBWriterV2.java index 64a73ea1ed8..ee4096481dd 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/writer/schemaorg/SchemaOrgMBWriterV2.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/schemaorg/SchemaOrgMBWriterV2.java @@ -8,13 +8,13 @@ import java.lang.reflect.Type; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.annotation.Resource; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import org.apache.commons.lang3.StringUtils; import org.orcid.api.common.writer.schemaorg.SchemaOrgDocument.SchemaOrgAddress; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/schemaorg/SchemaOrgMBWriterV3.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/schemaorg/SchemaOrgMBWriterV3.java index dfc99dc2523..3ec5459a27a 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/writer/schemaorg/SchemaOrgMBWriterV3.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/schemaorg/SchemaOrgMBWriterV3.java @@ -9,13 +9,13 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.annotation.Resource; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import org.apache.commons.lang3.StringUtils; import org.orcid.api.common.writer.schemaorg.SchemaOrgDocument.SchemaOrgAddress; diff --git a/orcid-api-common/src/main/java/org/orcid/api/common/writer/stats/StatisticsTimelineListMBWriter.java b/orcid-api-common/src/main/java/org/orcid/api/common/writer/stats/StatisticsTimelineListMBWriter.java index 003129ee8cc..94e4929afcc 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/common/writer/stats/StatisticsTimelineListMBWriter.java +++ b/orcid-api-common/src/main/java/org/orcid/api/common/writer/stats/StatisticsTimelineListMBWriter.java @@ -8,12 +8,12 @@ import java.text.SimpleDateFormat; import java.util.Date; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import org.orcid.core.api.OrcidApiConstants; import org.orcid.jaxb.model.statistics.StatisticsTimeline; diff --git a/orcid-api-common/src/main/java/org/orcid/api/publicV3/server/security/impl/PublicAPISecurityManagerV3Impl.java b/orcid-api-common/src/main/java/org/orcid/api/publicV3/server/security/impl/PublicAPISecurityManagerV3Impl.java index 98f78be111a..52245f93082 100644 --- a/orcid-api-common/src/main/java/org/orcid/api/publicV3/server/security/impl/PublicAPISecurityManagerV3Impl.java +++ b/orcid-api-common/src/main/java/org/orcid/api/publicV3/server/security/impl/PublicAPISecurityManagerV3Impl.java @@ -5,7 +5,7 @@ import java.util.Iterator; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.api.publicV3.server.security.PublicAPISecurityManagerV3; import org.orcid.core.exception.OrcidCoreExceptionMapper; diff --git a/orcid-api-common/src/main/resources/orcid-api-common-public-v3-context.xml b/orcid-api-common/src/main/resources/orcid-api-common-public-v3-context.xml index d0bc50aaf57..131e32d06be 100644 --- a/orcid-api-common/src/main/resources/orcid-api-common-public-v3-context.xml +++ b/orcid-api-common/src/main/resources/orcid-api-common-public-v3-context.xml @@ -2,6 +2,6 @@ + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/orcid-api-common/src/main/resources/orcid-oauth2-api-common-config.xml b/orcid-api-common/src/main/resources/orcid-oauth2-api-common-config.xml index 89682ff1873..4a833ebf092 100644 --- a/orcid-api-common/src/main/resources/orcid-oauth2-api-common-config.xml +++ b/orcid-api-common/src/main/resources/orcid-oauth2-api-common-config.xml @@ -1,9 +1,10 @@ + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-6.0.xsd">
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -133,4 +56,24 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/orcid-api-common/src/test/java/org/orcid/api/common/analytics/APIEndpointParserTest.java b/orcid-api-common/src/test/java/org/orcid/api/common/analytics/APIEndpointParserTest.java index f3cdcfdad3c..211c4b955aa 100644 --- a/orcid-api-common/src/test/java/org/orcid/api/common/analytics/APIEndpointParserTest.java +++ b/orcid-api-common/src/test/java/org/orcid/api/common/analytics/APIEndpointParserTest.java @@ -10,8 +10,8 @@ import org.mockito.Mock; import org.mockito.Mockito; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.SecurityContext; import org.glassfish.jersey.internal.PropertiesDelegate; import org.glassfish.jersey.server.ContainerRequest; diff --git a/orcid-api-common/src/test/java/org/orcid/api/common/analytics/AnalyticsProcessTest.java b/orcid-api-common/src/test/java/org/orcid/api/common/analytics/AnalyticsProcessTest.java index 92bf38db7d7..4a68502fa66 100644 --- a/orcid-api-common/src/test/java/org/orcid/api/common/analytics/AnalyticsProcessTest.java +++ b/orcid-api-common/src/test/java/org/orcid/api/common/analytics/AnalyticsProcessTest.java @@ -7,10 +7,10 @@ import java.net.URI; import java.security.NoSuchAlgorithmException; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.SecurityContext; import org.glassfish.jersey.internal.PropertiesDelegate; import org.glassfish.jersey.message.internal.OutboundJaxrsResponse; diff --git a/orcid-api-common/src/test/java/org/orcid/api/common/filter/ApiVersionCheckFilterTest.java b/orcid-api-common/src/test/java/org/orcid/api/common/filter/ApiVersionCheckFilterTest.java index da1d4145c64..d185ed466c9 100644 --- a/orcid-api-common/src/test/java/org/orcid/api/common/filter/ApiVersionCheckFilterTest.java +++ b/orcid-api-common/src/test/java/org/orcid/api/common/filter/ApiVersionCheckFilterTest.java @@ -8,9 +8,9 @@ import java.util.Enumeration; import java.util.List; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.ws.rs.core.SecurityContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.ws.rs.core.SecurityContext; import org.junit.Before; import org.junit.Test; diff --git a/orcid-api-common/src/test/java/org/orcid/api/common/filter/TokenTargetFilterTest.java b/orcid-api-common/src/test/java/org/orcid/api/common/filter/TokenTargetFilterTest.java index 99d936597c8..43833f491f7 100644 --- a/orcid-api-common/src/test/java/org/orcid/api/common/filter/TokenTargetFilterTest.java +++ b/orcid-api-common/src/test/java/org/orcid/api/common/filter/TokenTargetFilterTest.java @@ -15,16 +15,13 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; -import org.orcid.api.common.filter.TokenTargetFilter; -import org.orcid.core.exception.OrcidUnauthorizedException; -import org.orcid.core.oauth.OrcidOAuth2Authentication; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.jaxb.model.message.ScopePathType; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextImpl; -import org.springframework.security.oauth2.provider.OAuth2Request; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.glassfish.jersey.server.ContainerRequest; @@ -70,7 +67,7 @@ public void tokenUsedOnTheWrongUser12ApiTest() { fail(); } - @Test(expected = OrcidUnauthorizedException.class) + @Test(expected = AccessControlException.class) public void tokenUsedOnTheWrongUser20ApiTest() { setUpSecurityContext(ORCID1, CLIENT_ID, ScopePathType.READ_LIMITED); ContainerRequest request = Mockito.mock(ContainerRequest.class,RETURNS_DEEP_STUBS); @@ -93,7 +90,7 @@ public void filterInvokedOnNoOrcidEndpointTest() { filter.filter(request); } - @Test + @Test(expected = AccessControlException.class) public void readPublicTokenTest() { setUpSecurityContext(null, CLIENT_ID, ScopePathType.READ_PUBLIC); ContainerRequest request = Mockito.mock(ContainerRequest.class, RETURNS_DEEP_STUBS); @@ -104,29 +101,16 @@ public void readPublicTokenTest() { private void setUpSecurityContext(String userOrcid, String clientId, ScopePathType... scopePathTypes) { SecurityContextImpl securityContext = new SecurityContextImpl(); - OrcidOAuth2Authentication mockedAuthentication = mock(OrcidOAuth2Authentication.class); + OrcidBearerTokenAuthentication mockedAuthentication = mock(OrcidBearerTokenAuthentication.class); securityContext.setAuthentication(mockedAuthentication); SecurityContextHolder.setContext(securityContext); if(userOrcid != null) { - ProfileEntity userProfileEntity = new ProfileEntity(userOrcid); - when(mockedAuthentication.getPrincipal()).thenReturn(userProfileEntity); - Authentication userAuthentication = mock(Authentication.class); - when(userAuthentication.getPrincipal()).thenReturn(userProfileEntity); - when(mockedAuthentication.getUserAuthentication()).thenReturn(userAuthentication); + when(mockedAuthentication.getPrincipal()).thenReturn(clientId); + when(mockedAuthentication.getUserOrcid()).thenReturn(userOrcid); } else { when(mockedAuthentication.getPrincipal()).thenReturn(clientId); } - - Set scopes = new HashSet(); - if (scopePathTypes != null) { - for (ScopePathType scopePathType : scopePathTypes) { - scopes.add(scopePathType.value()); - } - } - OAuth2Request authorizationRequest = new OAuth2Request(Collections. emptyMap(), clientId, - Collections. emptyList(), true, scopes, Collections. emptySet(), null, Collections. emptySet(), - Collections. emptyMap()); - when(mockedAuthentication.getOAuth2Request()).thenReturn(authorizationRequest); + when(mockedAuthentication.isAuthenticated()).thenReturn(true); } } diff --git a/orcid-api-common/src/test/java/org/orcid/api/common/oauth/OrcidClientCredentialEndPointDelegatorTest.java b/orcid-api-common/src/test/java/org/orcid/api/common/oauth/OrcidClientCredentialEndPointDelegatorTest.java deleted file mode 100644 index 2598c1ad043..00000000000 --- a/orcid-api-common/src/test/java/org/orcid/api/common/oauth/OrcidClientCredentialEndPointDelegatorTest.java +++ /dev/null @@ -1,345 +0,0 @@ -package org.orcid.api.common.oauth; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; - -import javax.annotation.Resource; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.oauth.openid.OpenIDConnectKeyService; -import org.orcid.core.utils.JsonUtils; -import org.orcid.core.utils.SecurityContextTestUtils; -import org.orcid.core.utils.cache.redis.RedisClient; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.dao.OrcidOauth2AuthoriziationCodeDetailDao; -import org.orcid.persistence.dao.ProfileLastModifiedDao; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.IndexingStatus; -import org.orcid.persistence.jpa.entities.OrcidOauth2AuthoriziationCodeDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.test.DBUnitTest; -import org.orcid.test.OrcidJUnit4ClassRunner; -import org.orcid.test.TargetProxyHelper; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; -import org.springframework.test.context.ContextConfiguration; - - -import javax.ws.rs.core.MultivaluedHashMap; - -@RunWith(OrcidJUnit4ClassRunner.class) -@ContextConfiguration(locations = { "classpath:test-orcid-api-common-context.xml"}) -public class OrcidClientCredentialEndPointDelegatorTest extends DBUnitTest { - - private static final String CLIENT_ID_1 = "APP-5555555555555555"; - private static final String USER_ORCID = "0000-0000-0000-0001"; - - @Resource - private OrcidOauth2AuthoriziationCodeDetailDao orcidOauth2AuthoriziationCodeDetailDao; - - @Resource - private OrcidClientCredentialEndPointDelegator orcidClientCredentialEndPointDelegator; - - @Resource - private OpenIDConnectKeyService keyManager; - - @Mock - private ProfileLastModifiedDao profileLastModifiedDaoMock; - - @Mock - private RedisClient redisClientMock; - - @Resource - private ProfileLastModifiedDao profileLastModifiedDao; - - @BeforeClass - public static void initDBUnitData() throws Exception { - initDBUnitData( - Arrays.asList("/data/SubjectEntityData.xml", "/data/SourceClientDetailsEntityData.xml", "/data/ProfileEntityData.xml", "/data/RecordNameEntityData.xml")); - } - - @Before - public void before() { - MockitoAnnotations.initMocks(this); - TargetProxyHelper.injectIntoProxy(orcidClientCredentialEndPointDelegator, "profileLastModifiedDao", profileLastModifiedDaoMock); - TargetProxyHelper.injectIntoProxy(orcidClientCredentialEndPointDelegator, "redisClient", redisClientMock); - // Keep the cache disabled - orcidClientCredentialEndPointDelegator.setTokenCacheEnabled(false); - } - - @AfterClass - public static void removeDBUnitData() throws Exception { - removeDBUnitData( - Arrays.asList("/data/RecordNameEntityData.xml", "/data/ProfileEntityData.xml", "/data/SourceClientDetailsEntityData.xml", "/data/SubjectEntityData.xml")); - } - - @After - public void after() { - SecurityContextHolder.clearContext(); - TargetProxyHelper.injectIntoProxy(orcidClientCredentialEndPointDelegator, "profileLastModifiedDao", profileLastModifiedDao); - } - - private OrcidOauth2AuthoriziationCodeDetail createAuthorizationCode(String value, String clientId, String redirectUri, boolean persistent, String... scopes) { - OrcidOauth2AuthoriziationCodeDetail authorizationCode = new OrcidOauth2AuthoriziationCodeDetail(); - authorizationCode.setId(value); - authorizationCode.setApproved(true); - authorizationCode.setScopes(new HashSet(Arrays.asList(scopes))); - authorizationCode.setClientDetailsEntity(new ClientDetailsEntity(clientId)); - authorizationCode.setPersistent(persistent); - authorizationCode.setOrcid(USER_ORCID); - authorizationCode.setRedirectUri(redirectUri); - authorizationCode.setResourceIds(new HashSet(Arrays.asList("orcid"))); - authorizationCode.setAuthenticated(true); - orcidOauth2AuthoriziationCodeDetailDao.persist(authorizationCode); - return authorizationCode; - } - - @Test - public void generateAccessTokenTest() { - SecurityContextTestUtils.setUpSecurityContextForClientOnly(CLIENT_ID_1, ScopePathType.ACTIVITIES_UPDATE, ScopePathType.READ_LIMITED); - OrcidOauth2AuthoriziationCodeDetail authCode = createAuthorizationCode("code-1", CLIENT_ID_1, "http://www.APP-5555555555555555.com/redirect/oauth", true, - "/activities/update"); - MultivaluedMap formParams = new MultivaluedHashMap(); - formParams.add("client_id", CLIENT_ID_1); - formParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - formParams.add("grant_type", "authorization_code"); - formParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - formParams.add("code", authCode.getId()); - Response response = orcidClientCredentialEndPointDelegator.obtainOauth2Token(null, formParams); - assertNotNull(response); - assertNotNull(response.getEntity()); - DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) response.getEntity(); - assertNotNull(token); - assertTrue(!PojoUtil.isEmpty(token.getValue())); - assertNotNull(token.getRefreshToken()); - assertTrue(!PojoUtil.isEmpty(token.getRefreshToken().getValue())); - verify(profileLastModifiedDaoMock, times(1)).updateIndexingStatus(Mockito.any(), Mockito.any()); - } - - @Test - public void generateClientCredentialsAccessTokenTest() { - SecurityContextTestUtils.setUpSecurityContextForClientOnly(CLIENT_ID_1, ScopePathType.ACTIVITIES_UPDATE, ScopePathType.READ_LIMITED); - MultivaluedMap formParams = new MultivaluedHashMap(); - formParams.add("client_id", CLIENT_ID_1); - formParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - formParams.add("grant_type", "client_credentials"); - formParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - formParams.add("scope", "/orcid-profile/create"); - Response response = orcidClientCredentialEndPointDelegator.obtainOauth2Token(null, formParams); - assertNotNull(response); - assertNotNull(response.getEntity()); - DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) response.getEntity(); - assertNotNull(token); - assertTrue(!PojoUtil.isEmpty(token.getValue())); - assertNotNull(token.getRefreshToken()); - assertTrue(!PojoUtil.isEmpty(token.getRefreshToken().getValue())); - - verify(profileLastModifiedDaoMock, times(0)).updateIndexingStatus(Arrays.asList(USER_ORCID), IndexingStatus.PENDING); - } - - @Test(expected = InvalidScopeException.class) - public void generateClientCredentialsAccessTokenWithInvalidTokenTest() { - SecurityContextTestUtils.setUpSecurityContextForClientOnly(CLIENT_ID_1, ScopePathType.ACTIVITIES_UPDATE); - MultivaluedMap formParams = new MultivaluedHashMap(); - formParams.add("client_id", CLIENT_ID_1); - formParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - formParams.add("grant_type", "client_credentials"); - formParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - formParams.add("scope", "/activities/update"); - orcidClientCredentialEndPointDelegator.obtainOauth2Token(null, formParams); - fail(); - } - - @Test - public void generateRefreshTokenTest() { - // Generate the access token - SecurityContextTestUtils.setUpSecurityContextForClientOnly(CLIENT_ID_1, ScopePathType.ACTIVITIES_UPDATE, ScopePathType.READ_LIMITED); - OrcidOauth2AuthoriziationCodeDetail authCode = createAuthorizationCode("code-1", CLIENT_ID_1, "http://www.APP-5555555555555555.com/redirect/oauth", true, - "/activities/update"); - MultivaluedMap formParams = new MultivaluedHashMap(); - formParams.add("client_id", CLIENT_ID_1); - formParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - formParams.add("grant_type", "authorization_code"); - formParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - formParams.add("code", authCode.getId()); - Response response = orcidClientCredentialEndPointDelegator.obtainOauth2Token(null, formParams); - assertNotNull(response); - assertNotNull(response.getEntity()); - DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) response.getEntity(); - assertNotNull(token); - assertTrue(!PojoUtil.isEmpty(token.getValue())); - assertNotNull(token.getRefreshToken()); - assertTrue(!PojoUtil.isEmpty(token.getRefreshToken().getValue())); - - // Generate the refresh token - MultivaluedMap refreshTokenformParams = new MultivaluedHashMap(); - refreshTokenformParams.add("client_id", CLIENT_ID_1); - refreshTokenformParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - refreshTokenformParams.add("grant_type", "refresh_token"); - refreshTokenformParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - refreshTokenformParams.add("refresh_token", token.getRefreshToken().getValue()); - String authorization = "bearer " + token.getValue(); - Response refreshTokenResponse = orcidClientCredentialEndPointDelegator.obtainOauth2Token(authorization, refreshTokenformParams); - assertNotNull(refreshTokenResponse); - assertNotNull(refreshTokenResponse.getEntity()); - DefaultOAuth2AccessToken refreshToken = (DefaultOAuth2AccessToken) refreshTokenResponse.getEntity(); - assertNotNull(refreshToken); - assertTrue(!PojoUtil.isEmpty(refreshToken.getValue())); - assertNotNull(refreshToken.getRefreshToken()); - assertTrue(!PojoUtil.isEmpty(refreshToken.getRefreshToken().getValue())); - - // Assert that both tokens expires at the same time - assertEquals(token.getExpiration(), refreshToken.getExpiration()); - - // Try to generate another one, and fail, because parent token was - // disabled - try { - orcidClientCredentialEndPointDelegator.obtainOauth2Token(authorization, refreshTokenformParams); - } catch (InvalidTokenException e) { - assertTrue(e.getMessage().contains("Parent token is disabled")); - } - } - - @Test - public void generateRefreshTokenThatExpireAfterParentTokenTest() { - // Generate the access token - SecurityContextTestUtils.setUpSecurityContextForClientOnly(CLIENT_ID_1, ScopePathType.ACTIVITIES_UPDATE, ScopePathType.READ_LIMITED); - OrcidOauth2AuthoriziationCodeDetail authCode = createAuthorizationCode("code-1", CLIENT_ID_1, "http://www.APP-5555555555555555.com/redirect/oauth", false, - "/activities/update"); - MultivaluedMap formParams = new MultivaluedHashMap(); - formParams.add("client_id", CLIENT_ID_1); - formParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - formParams.add("grant_type", "authorization_code"); - formParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - formParams.add("code", authCode.getId()); - Response response = orcidClientCredentialEndPointDelegator.obtainOauth2Token(null, formParams); - assertNotNull(response); - assertNotNull(response.getEntity()); - DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) response.getEntity(); - assertNotNull(token); - assertTrue(!PojoUtil.isEmpty(token.getValue())); - assertNotNull(token.getRefreshToken()); - assertTrue(!PojoUtil.isEmpty(token.getRefreshToken().getValue())); - - // Generate the refresh token that expires after parent token - MultivaluedMap refreshTokenformParams = new MultivaluedHashMap(); - refreshTokenformParams.add("client_id", CLIENT_ID_1); - refreshTokenformParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - refreshTokenformParams.add("grant_type", "refresh_token"); - refreshTokenformParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - refreshTokenformParams.add("refresh_token", token.getRefreshToken().getValue()); - refreshTokenformParams.add("expires_in", String.valueOf(2 * 60 * 60)); - String authorization = "bearer " + token.getValue(); - try { - orcidClientCredentialEndPointDelegator.obtainOauth2Token(authorization, refreshTokenformParams); - } catch (IllegalArgumentException e) { - assertTrue(e.getMessage().contains("Token expiration can't be after")); - } - - // Try again with a valid expiration value - refreshTokenformParams = new MultivaluedHashMap(); - refreshTokenformParams.add("client_id", CLIENT_ID_1); - refreshTokenformParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - refreshTokenformParams.add("grant_type", "refresh_token"); - refreshTokenformParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - refreshTokenformParams.add("refresh_token", token.getRefreshToken().getValue()); - refreshTokenformParams.add("expires_in", String.valueOf(60 * 30)); - response = orcidClientCredentialEndPointDelegator.obtainOauth2Token(authorization, refreshTokenformParams); - assertNotNull(response); - assertNotNull(response.getEntity()); - DefaultOAuth2AccessToken refreshToken = (DefaultOAuth2AccessToken) response.getEntity(); - assertNotNull(refreshToken); - assertTrue(!PojoUtil.isEmpty(refreshToken.getValue())); - assertNotNull(refreshToken.getRefreshToken()); - assertTrue(!PojoUtil.isEmpty(refreshToken.getRefreshToken().getValue())); - - assertTrue(token.getExpiration().getTime() > refreshToken.getExpiration().getTime()); - } - - @Test - public void obtainOauth2TokenSetCacheTest() { - // Enable cache - orcidClientCredentialEndPointDelegator.setTokenCacheEnabled(true); - SecurityContextTestUtils.setUpSecurityContextForClientOnly(CLIENT_ID_1, ScopePathType.ACTIVITIES_UPDATE, ScopePathType.READ_LIMITED); - OrcidOauth2AuthoriziationCodeDetail authCode = createAuthorizationCode("code-1", CLIENT_ID_1, "http://www.APP-5555555555555555.com/redirect/oauth", true, - "/activities/update"); - MultivaluedMap formParams = new MultivaluedHashMap(); - formParams.add("client_id", CLIENT_ID_1); - formParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - formParams.add("grant_type", "authorization_code"); - formParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - formParams.add("code", authCode.getId()); - Response response = orcidClientCredentialEndPointDelegator.obtainOauth2Token(null, formParams); - assertNotNull(response); - assertNotNull(response.getEntity()); - DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) response.getEntity(); - assertNotNull(token); - assertTrue(!PojoUtil.isEmpty(token.getValue())); - - String tokenValue = token.getValue(); - - - Map tokenData = new HashMap(); - tokenData.put(OrcidOauth2Constants.ACCESS_TOKEN, tokenValue); - tokenData.put(OrcidOauth2Constants.TOKEN_EXPIRATION_TIME, String.valueOf(token.getExpiration().getTime())); - StringBuilder sb = new StringBuilder(); - token.getScope().forEach(x -> {sb.append(x); sb.append(' ');}); - tokenData.put(OrcidOauth2Constants.SCOPE_PARAM, sb.toString()); - tokenData.put(OrcidOauth2Constants.ORCID, (String) token.getAdditionalInformation().get(OrcidOauth2Constants.ORCID)); - tokenData.put(OrcidOauth2Constants.CLIENT_ID, CLIENT_ID_1); - tokenData.put(OrcidOauth2Constants.RESOURCE_IDS, OrcidOauth2Constants.ORCID); - tokenData.put(OrcidOauth2Constants.APPROVED, Boolean.TRUE.toString()); - - String tokenDataString = JsonUtils.convertToJsonString(tokenData); - - verify(redisClientMock, times(1)).set(Mockito.eq(tokenValue), Mockito.eq(tokenDataString)); - } - - @Test - public void obtainOauth2TokenSkipCacheTest() { - // Ensure cache is disabled - orcidClientCredentialEndPointDelegator.setTokenCacheEnabled(false); - - SecurityContextTestUtils.setUpSecurityContextForClientOnly(CLIENT_ID_1, ScopePathType.ACTIVITIES_UPDATE, ScopePathType.READ_LIMITED); - OrcidOauth2AuthoriziationCodeDetail authCode = createAuthorizationCode("code-1", CLIENT_ID_1, "http://www.APP-5555555555555555.com/redirect/oauth", true, - "/activities/update"); - MultivaluedMap formParams = new MultivaluedHashMap(); - formParams.add("client_id", CLIENT_ID_1); - formParams.add("client_secret", "DhkFj5EI0qp6GsUKi55Vja+h+bsaKpBx"); - formParams.add("grant_type", "authorization_code"); - formParams.add("redirect_uri", "http://www.APP-5555555555555555.com/redirect/oauth"); - formParams.add("code", authCode.getId()); - Response response = orcidClientCredentialEndPointDelegator.obtainOauth2Token(null, formParams); - assertNotNull(response); - assertNotNull(response.getEntity()); - DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) response.getEntity(); - assertNotNull(token); - assertTrue(!PojoUtil.isEmpty(token.getValue())); - - verify(redisClientMock, never()).set(Mockito.any(), Mockito.any()); - } -} \ No newline at end of file diff --git a/orcid-api-common/src/test/java/org/orcid/api/common/writer/citeproc/WorkToCiteprocTranslatorTest.java b/orcid-api-common/src/test/java/org/orcid/api/common/writer/citeproc/WorkToCiteprocTranslatorTest.java index 6b4ba537b97..88469d5702d 100644 --- a/orcid-api-common/src/test/java/org/orcid/api/common/writer/citeproc/WorkToCiteprocTranslatorTest.java +++ b/orcid-api-common/src/test/java/org/orcid/api/common/writer/citeproc/WorkToCiteprocTranslatorTest.java @@ -49,9 +49,9 @@ public void testBibtexWorkTranslationHyperAuthorLiteralAndMissingDOI(){ WorkToCiteprocTranslator t = new WorkToCiteprocTranslator(); CSLItemData d = t.toCiteproc(w, null, true ); - Assert.assertEquals(d.getAuthor().length, 1); - Assert.assertEquals(d.getAuthor()[0].getLiteral(), "Altshuler, D.M. and Durbin, R.M. and Abecasis, G.R. and Bentley, D.R. and Chakravarti, A. and Clark, A.G. and Donnelly, P. and Eichler, E.E. and Flicek, P. and Gabriel, S.B. and Gibbs, R.A. and Gre..."); - Assert.assertEquals(d.getDOI(), "10.1234/1234"); + Assert.assertEquals(1, d.getAuthor().length); + Assert.assertEquals("D.M. Altshuler et all.", d.getAuthor()[0].getLiteral()); + Assert.assertEquals("10.1234/1234", d.getDOI()); } @Test diff --git a/orcid-api-common/src/test/java/org/orcid/api/common/writer/rdf/RDFWriterTest.java b/orcid-api-common/src/test/java/org/orcid/api/common/writer/rdf/RDFWriterTest.java index 1412a56546f..7b41e3e6769 100644 --- a/orcid-api-common/src/test/java/org/orcid/api/common/writer/rdf/RDFWriterTest.java +++ b/orcid-api-common/src/test/java/org/orcid/api/common/writer/rdf/RDFWriterTest.java @@ -9,8 +9,8 @@ import java.net.URI; import java.util.ArrayList; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.UriInfo; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; diff --git a/orcid-api-common/src/test/resources/test-core-context.xml b/orcid-api-common/src/test/resources/test-core-context.xml index 2c1cb08e585..f53e64ed165 100644 --- a/orcid-api-common/src/test/resources/test-core-context.xml +++ b/orcid-api-common/src/test/resources/test-core-context.xml @@ -2,9 +2,9 @@ + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd"> org.springframework.security spring-security-web - - org.springframework.security.oauth - spring-security-oauth2 - - + ${project.groupId} @@ -95,8 +91,8 @@ maven-compiler-plugin false - 11 - 11 + 17 + 17 diff --git a/orcid-api-web/src/main/java/org/orcid/api/common/swagger/SwaggerUIBuilder.java b/orcid-api-web/src/main/java/org/orcid/api/common/swagger/SwaggerUIBuilder.java index e77dd97d9db..f242d54a9aa 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/common/swagger/SwaggerUIBuilder.java +++ b/orcid-api-web/src/main/java/org/orcid/api/common/swagger/SwaggerUIBuilder.java @@ -5,7 +5,7 @@ import java.util.HashMap; import java.util.Map; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; import org.orcid.core.api.OrcidApiConstants; diff --git a/orcid-api-web/src/main/java/org/orcid/api/filters/AnalyticsFilter.java b/orcid-api-web/src/main/java/org/orcid/api/filters/AnalyticsFilter.java index 0dc3be5d1ea..867df82980a 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/filters/AnalyticsFilter.java +++ b/orcid-api-web/src/main/java/org/orcid/api/filters/AnalyticsFilter.java @@ -1,9 +1,9 @@ package org.orcid.api.filters; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Context; -import javax.ws.rs.ext.Provider; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.ext.Provider; import org.orcid.api.common.analytics.AnalyticsProcess; import org.orcid.api.common.analytics.client.AnalyticsClient; @@ -20,9 +20,9 @@ import org.springframework.stereotype.Component; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerResponseFilter; -import javax.ws.rs.container.ContainerResponseContext; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerResponseFilter; +import jakarta.ws.rs.container.ContainerResponseContext; @Provider @Component diff --git a/orcid-api-web/src/main/java/org/orcid/api/member/common/WebhooksService.java b/orcid-api-web/src/main/java/org/orcid/api/member/common/WebhooksService.java index 884dee81f7e..5fa8310563d 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/member/common/WebhooksService.java +++ b/orcid-api-web/src/main/java/org/orcid/api/member/common/WebhooksService.java @@ -6,17 +6,17 @@ import static org.orcid.core.api.OrcidApiConstants.VND_ORCID_XML; import static org.orcid.core.api.OrcidApiConstants.WEBHOOKS_PATH; -import javax.annotation.Resource; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.orcid.api.member.common.delegator.WebhooksServiceDelegator; import org.springframework.stereotype.Component; diff --git a/orcid-api-web/src/main/java/org/orcid/api/member/common/delegator/WebhooksServiceDelegator.java b/orcid-api-web/src/main/java/org/orcid/api/member/common/delegator/WebhooksServiceDelegator.java index 6c7c6ac48b3..c5b081215d2 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/member/common/delegator/WebhooksServiceDelegator.java +++ b/orcid-api-web/src/main/java/org/orcid/api/member/common/delegator/WebhooksServiceDelegator.java @@ -2,7 +2,7 @@ import java.net.URI; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; public interface WebhooksServiceDelegator { Response registerWebhook(String orcid, String webhookUri, URI absolutePathUri); diff --git a/orcid-api-web/src/main/java/org/orcid/api/member/common/delegator/impl/WebhooksServiceDelegatorImpl.java b/orcid-api-web/src/main/java/org/orcid/api/member/common/delegator/impl/WebhooksServiceDelegatorImpl.java index 1fb5f6ceba5..eeeeaa014f9 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/member/common/delegator/impl/WebhooksServiceDelegatorImpl.java +++ b/orcid-api-web/src/main/java/org/orcid/api/member/common/delegator/impl/WebhooksServiceDelegatorImpl.java @@ -6,8 +6,8 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.orcid.api.member.common.delegator.WebhooksServiceDelegator; import org.orcid.core.exception.OrcidBadRequestException; diff --git a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/MemberV2ApiServiceImplV2_0.java b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/MemberV2ApiServiceImplV2_0.java index 46b3909d8d8..df81a1b024b 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/MemberV2ApiServiceImplV2_0.java +++ b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/MemberV2ApiServiceImplV2_0.java @@ -43,21 +43,21 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.orcid.api.common.swagger.SwaggerUIBuilder; import org.orcid.api.member.MemberApiServiceImplHelper; @@ -80,6 +80,7 @@ import org.orcid.jaxb.model.record_v2.WorkBulk; import org.springframework.stereotype.Component; +import org.apache.hc.core5.http.ParseException; /** * * @author Angel Montenegro @@ -709,7 +710,7 @@ public Response viewRecordRecord(@PathParam("orcid") String orcid) { @GET @Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML, VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON }) @Path(SEARCH_PATH) - public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) { + public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) throws ParseException { Map> solrParams = new HashMap<>(uriInfo.getQueryParameters()); Response xmlQueryResults = serviceDelegator.searchByQuery(solrParams); return xmlQueryResults; diff --git a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/MemberV2ApiServiceImplV2_1.java b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/MemberV2ApiServiceImplV2_1.java index 60340e62e26..dfa6e5343a5 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/MemberV2ApiServiceImplV2_1.java +++ b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/MemberV2ApiServiceImplV2_1.java @@ -43,21 +43,21 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.orcid.api.common.swagger.SwaggerUIBuilder; import org.orcid.api.member.MemberApiServiceImplHelper; @@ -80,6 +80,8 @@ import org.orcid.jaxb.model.record_v2.WorkBulk; import org.springframework.stereotype.Component; +import org.apache.hc.core5.http.ParseException; + /** * * @author Angel Montenegro @@ -708,7 +710,7 @@ public Response viewRecordRecord(@PathParam("orcid") String orcid) { @GET @Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML, VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON }) @Path(SEARCH_PATH) - public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) { + public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) throws ParseException { Map> solrParams = new HashMap<>(uriInfo.getQueryParameters()); Response xmlQueryResults = serviceDelegator.searchByQuery(solrParams); return xmlQueryResults; diff --git a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator.java b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator.java index 330ca191a32..d870b9c2fcf 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator.java +++ b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator.java @@ -3,7 +3,9 @@ import java.util.List; import java.util.Map; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; + +import org.apache.hc.core5.http.ParseException; /** * @@ -148,7 +150,7 @@ public interface MemberV2ApiServiceDelegator> solrParams); + Response searchByQuery(Map> solrParams)throws ParseException; Response viewClient(String clientId); diff --git a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/impl/MemberV2ApiServiceDelegatorImpl.java b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/impl/MemberV2ApiServiceDelegatorImpl.java index 7e1bb9f878b..3fdd502dfa1 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/impl/MemberV2ApiServiceDelegatorImpl.java +++ b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/impl/MemberV2ApiServiceDelegatorImpl.java @@ -11,8 +11,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.orcid.api.common.util.ActivityUtils; import org.orcid.api.common.util.ApiUtils; @@ -105,6 +105,8 @@ import org.springframework.context.MessageSource; import org.springframework.stereotype.Component; +import org.apache.hc.core5.http.ParseException; + /** *

* The delegator for the tier 2 API. @@ -1070,7 +1072,7 @@ public Response viewPerson(String orcid) { } @Override - public Response searchByQuery(Map> solrParams) { + public Response searchByQuery(Map> solrParams) throws ParseException { orcidSecurityManager.checkScopes(ScopePathType.READ_PUBLIC); validateSearchParams(solrParams); Search search = orcidSearchManager.findOrcidIds(solrParams); diff --git a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/impl/MemberV2ApiServiceVersionedDelegatorImpl.java b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/impl/MemberV2ApiServiceVersionedDelegatorImpl.java index af564945d77..6b09d39a77a 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/impl/MemberV2ApiServiceVersionedDelegatorImpl.java +++ b/orcid-api-web/src/main/java/org/orcid/api/memberV2/server/delegator/impl/MemberV2ApiServiceVersionedDelegatorImpl.java @@ -4,9 +4,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; import org.orcid.api.common.jaxb.OrcidValidationJaxbContextResolver; import org.orcid.api.memberV2.server.delegator.MemberV2ApiServiceDelegator; @@ -19,6 +19,8 @@ import org.orcid.jaxb.model.record.bulk.BulkElement; import org.orcid.jaxb.model.record.bulk.BulkElementContainer; +import org.apache.hc.core5.http.ParseException; + public class MemberV2ApiServiceVersionedDelegatorImpl implements MemberV2ApiServiceDelegator { @@ -531,7 +533,7 @@ public Response viewPerson(String orcid) { } @Override - public Response searchByQuery(Map> solrParams) { + public Response searchByQuery(Map> solrParams) throws ParseException { return processReponse(memberV2ApiServiceDelegator.searchByQuery(solrParams)); } diff --git a/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/MemberV3ApiServiceImplV3_0.java b/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/MemberV3ApiServiceImplV3_0.java index 4f0244c32e5..9154e67c50b 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/MemberV3ApiServiceImplV3_0.java +++ b/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/MemberV3ApiServiceImplV3_0.java @@ -66,22 +66,22 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.orcid.api.common.swagger.SwaggerUIBuilder; import org.orcid.api.member.MemberApiServiceImplHelper; @@ -111,6 +111,8 @@ import org.orcid.jaxb.model.v3.release.record.WorkBulk; import org.springframework.stereotype.Component; +import org.apache.hc.core5.http.ParseException; + @Component @Path("/v3.0") public class MemberV3ApiServiceImplV3_0 extends MemberApiServiceImplHelper { @@ -749,7 +751,7 @@ public Response viewRecordRecord(@PathParam("orcid") String orcid) { @GET @Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML, VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON }) @Path(SEARCH_PATH) - public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) { + public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) throws ParseException { Map> solrParams = new HashMap<>(uriInfo.getQueryParameters()); Response xmlQueryResults = serviceDelegator.searchByQuery(solrParams); return xmlQueryResults; @@ -758,7 +760,7 @@ public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @ @GET @Produces(TEXT_CSV) @Path(CSV_SEARCH_PATH) - public Response searchByQueryCSV(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) { + public Response searchByQueryCSV(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) throws ParseException { Map> solrParams = new HashMap<>(uriInfo.getQueryParameters()); Response csvQueryResults = serviceDelegator.searchByQueryCSV(solrParams); return csvQueryResults; diff --git a/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator.java b/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator.java index 779a60c4cd2..b86ae5cbbb6 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator.java +++ b/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator.java @@ -3,7 +3,9 @@ import java.util.List; import java.util.Map; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; + +import org.apache.hc.core5.http.ParseException; public interface MemberV3ApiServiceDelegator { @@ -145,7 +147,7 @@ public interface MemberV3ApiServiceDelegator> solrParams); + Response searchByQuery(Map> solrParams) throws ParseException; Response viewClient(String clientId); @@ -217,7 +219,7 @@ public interface MemberV3ApiServiceDelegator> solrParams); + Response searchByQueryCSV(Map> solrParams) throws ParseException; Response expandedSearchByQuery(Map> solrParams); diff --git a/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/delegator/impl/MemberV3ApiServiceDelegatorImpl.java b/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/delegator/impl/MemberV3ApiServiceDelegatorImpl.java index 4401417ffcd..96a11a68ae2 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/delegator/impl/MemberV3ApiServiceDelegatorImpl.java +++ b/orcid-api-web/src/main/java/org/orcid/api/memberV3/server/delegator/impl/MemberV3ApiServiceDelegatorImpl.java @@ -29,6 +29,7 @@ import org.orcid.jaxb.model.v3.release.record.summary.Educations; import org.orcid.jaxb.model.v3.release.record.summary.Employments; import org.orcid.jaxb.model.v3.release.record.summary.Works; +import org.orcid.jaxb.model.v3.release.record.Record; import org.orcid.jaxb.model.v3.release.search.Search; import org.orcid.jaxb.model.v3.release.search.expanded.ExpandedSearch; import org.slf4j.Logger; @@ -36,11 +37,13 @@ import org.springframework.context.MessageSource; import org.springframework.stereotype.Component; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.util.*; +import org.apache.hc.core5.http.ParseException; + @Component public class MemberV3ApiServiceDelegatorImpl implements MemberV3ApiServiceDelegator { @@ -1077,7 +1080,7 @@ public Response viewPerson(String orcid) { } @Override - public Response searchByQuery(Map> solrParams) { + public Response searchByQuery(Map> solrParams) throws ParseException { orcidSecurityManager.checkScopes(ScopePathType.READ_PUBLIC); validateSearchParams(solrParams); Search search = orcidSearchManager.findOrcidIds(solrParams); @@ -1085,7 +1088,7 @@ public Response searchByQuery(Map> solrParams) { } @Override - public Response searchByQueryCSV(Map> solrParams) { + public Response searchByQueryCSV(Map> solrParams) throws ParseException { validateSearchParams(solrParams); String search = orcidSearchManager.findOrcidIdsAsCSV(solrParams); return Response.ok(search).build(); diff --git a/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/NotificationsApiServiceDelegator.java b/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/NotificationsApiServiceDelegator.java index be48f1fc71d..d23ff5e31cd 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/NotificationsApiServiceDelegator.java +++ b/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/NotificationsApiServiceDelegator.java @@ -1,7 +1,7 @@ package org.orcid.api.notificationsV2.server.delegator; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.orcid.core.exception.OrcidNotificationAlreadyReadException; diff --git a/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/impl/NotificationsApiServiceDelegatorImpl.java b/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/impl/NotificationsApiServiceDelegatorImpl.java index 0e80bada0a4..65d2bf5bc35 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/impl/NotificationsApiServiceDelegatorImpl.java +++ b/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/impl/NotificationsApiServiceDelegatorImpl.java @@ -9,9 +9,9 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import javax.xml.datatype.XMLGregorianCalendar; import org.orcid.api.notificationsV2.server.delegator.NotificationsApiServiceDelegator; @@ -25,6 +25,7 @@ import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.core.manager.ProfileEntityManager; import org.orcid.core.manager.SourceManager; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.core.security.visibility.aop.AccessControl; import org.orcid.jaxb.model.message.ScopePathType; import org.orcid.jaxb.model.notification.permission_v2.NotificationPermissions; @@ -35,8 +36,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; import org.springframework.stereotype.Component; /** @@ -79,9 +78,9 @@ public Response findPermissionNotifications(String orcid) { // Get the client profile information Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String clientId = null; - if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Request authorizationRequest = ((OAuth2Authentication) authentication).getOAuth2Request(); - clientId = authorizationRequest.getClientId(); + if (OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + clientId = authDetails.getClientId(); } NotificationPermissions notifications = notificationManager.findPermissionsByOrcidAndClient(orcid, clientId, 0, MAX_NOTIFICATIONS_AVAILABLE); diff --git a/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/impl/NotificationsApiServiceVersionedDelegatorImpl.java b/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/impl/NotificationsApiServiceVersionedDelegatorImpl.java index 406b2c220dc..edbb831f7ed 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/impl/NotificationsApiServiceVersionedDelegatorImpl.java +++ b/orcid-api-web/src/main/java/org/orcid/api/notificationsV2/server/delegator/impl/NotificationsApiServiceVersionedDelegatorImpl.java @@ -2,9 +2,9 @@ import static org.orcid.core.api.OrcidApiConstants.STATUS_OK_MESSAGE; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.orcid.api.memberV2.server.delegator.MemberV2ApiServiceDelegator; import org.orcid.api.notificationsV2.server.delegator.NotificationsApiServiceDelegator; diff --git a/orcid-api-web/src/main/java/org/orcid/api/notificationsV3/server/delegator/NotificationsApiServiceDelegator.java b/orcid-api-web/src/main/java/org/orcid/api/notificationsV3/server/delegator/NotificationsApiServiceDelegator.java index 77c0c0e97c8..b4a602bf2bf 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/notificationsV3/server/delegator/NotificationsApiServiceDelegator.java +++ b/orcid-api-web/src/main/java/org/orcid/api/notificationsV3/server/delegator/NotificationsApiServiceDelegator.java @@ -1,7 +1,7 @@ package org.orcid.api.notificationsV3.server.delegator; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.orcid.core.exception.OrcidNotificationAlreadyReadException; diff --git a/orcid-api-web/src/main/java/org/orcid/api/notificationsV3/server/delegator/impl/NotificationsApiServiceDelegatorImpl.java b/orcid-api-web/src/main/java/org/orcid/api/notificationsV3/server/delegator/impl/NotificationsApiServiceDelegatorImpl.java index 35708ce47a4..a263438befd 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/notificationsV3/server/delegator/impl/NotificationsApiServiceDelegatorImpl.java +++ b/orcid-api-web/src/main/java/org/orcid/api/notificationsV3/server/delegator/impl/NotificationsApiServiceDelegatorImpl.java @@ -12,6 +12,7 @@ import org.orcid.core.manager.v3.NotificationValidationManager; import org.orcid.core.manager.v3.OrcidSecurityManager; import org.orcid.core.manager.v3.ProfileEntityManager; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.core.security.visibility.aop.AccessControl; import org.orcid.jaxb.model.message.ScopePathType; import org.orcid.jaxb.model.v3.release.notification.Notification; @@ -20,13 +21,11 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; import org.springframework.stereotype.Component; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import java.net.URI; import java.net.URISyntaxException; import java.security.AccessControlException; @@ -81,9 +80,9 @@ public Response findPermissionNotifications(String orcid) { // Get the client profile information Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String clientId = null; - if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Request authorizationRequest = ((OAuth2Authentication) authentication).getOAuth2Request(); - clientId = authorizationRequest.getClientId(); + if (OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + clientId = authDetails.getClientId(); } NotificationPermissions notifications = notificationManager.findPermissionsByOrcidAndClient(orcid, clientId, 0, MAX_NOTIFICATIONS_AVAILABLE); diff --git a/orcid-api-web/src/main/java/org/orcid/api/swagger/MemberSwaggerResource.java b/orcid-api-web/src/main/java/org/orcid/api/swagger/MemberSwaggerResource.java index 863ab40b9ab..c796ee9ce9f 100644 --- a/orcid-api-web/src/main/java/org/orcid/api/swagger/MemberSwaggerResource.java +++ b/orcid-api-web/src/main/java/org/orcid/api/swagger/MemberSwaggerResource.java @@ -5,10 +5,10 @@ import io.swagger.models.auth.OAuth2Definition; import io.swagger.util.Json;*/ -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Application; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Application; +import jakarta.ws.rs.core.MediaType; import org.orcid.core.api.OrcidApiConstants; import org.orcid.jaxb.model.message.ScopePathType; diff --git a/orcid-api-web/src/main/resources/orcid-api-security-context.xml b/orcid-api-web/src/main/resources/orcid-api-security-context.xml index 501ce70e75c..6d2ffc63a86 100644 --- a/orcid-api-web/src/main/resources/orcid-api-security-context.xml +++ b/orcid-api-web/src/main/resources/orcid-api-security-context.xml @@ -2,10 +2,8 @@ + http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-6.0.xsd"> @@ -18,122 +16,33 @@ - - + - - - - - - - - - - - - - - - - - - - - - - + + - - + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -143,7 +52,5 @@ - - - + \ No newline at end of file diff --git a/orcid-api-web/src/main/resources/orcid-api-web-context.xml b/orcid-api-web/src/main/resources/orcid-api-web-context.xml index 3f5585c9dbf..38e48372d16 100644 --- a/orcid-api-web/src/main/resources/orcid-api-web-context.xml +++ b/orcid-api-web/src/main/resources/orcid-api-web-context.xml @@ -4,25 +4,17 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> + + - - @@ -40,7 +32,6 @@ - diff --git a/orcid-api-web/src/main/webapp/WEB-INF/web.xml b/orcid-api-web/src/main/webapp/WEB-INF/web.xml index a37cb5608e1..2c59261c3b0 100644 --- a/orcid-api-web/src/main/webapp/WEB-INF/web.xml +++ b/orcid-api-web/src/main/webapp/WEB-INF/web.xml @@ -105,16 +105,6 @@ /* - - clientCredentialsTokenEndpointFilter - org.springframework.web.filter.DelegatingFilterProxy - - - - clientCredentialsTokenEndpointFilter - /oauth/token - - springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy @@ -138,7 +128,6 @@ clientIdAttributeFilter * - jersey diff --git a/orcid-api-web/src/test/java/org/orcid/api/member/server/validator/JSONInputValidatorTest.java b/orcid-api-web/src/test/java/org/orcid/api/member/server/validator/JSONInputValidatorTest.java index d1dafca7934..4285fb6cef3 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/member/server/validator/JSONInputValidatorTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/member/server/validator/JSONInputValidatorTest.java @@ -2,7 +2,7 @@ import java.io.IOException; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBException; import org.junit.Test; import org.orcid.api.common.exception.JSONInputValidator; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ActivitiesSummaryTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ActivitiesSummaryTest.java index 9143d0ea9a8..3b188cc168b 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ActivitiesSummaryTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ActivitiesSummaryTest.java @@ -10,8 +10,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_AddressesTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_AddressesTest.java index d9cba2d5b71..fa8119565b5 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_AddressesTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_AddressesTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_BiogrphyTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_BiogrphyTest.java index 2dadf092f2d..b3e57a4fcb7 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_BiogrphyTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_BiogrphyTest.java @@ -8,8 +8,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EducationsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EducationsTest.java index afabd7f6ca6..e9b18cec5e0 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EducationsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EducationsTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EmailsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EmailsTest.java index 3c2160ca378..f1d3309cb12 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EmailsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EmailsTest.java @@ -5,8 +5,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EmploymentsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EmploymentsTest.java index 7f24e226825..4ad4701e881 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EmploymentsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_EmploymentsTest.java @@ -16,9 +16,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ExternalIdentifiersTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ExternalIdentifiersTest.java index 87f4fdda96e..7e4c706c5a2 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ExternalIdentifiersTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ExternalIdentifiersTest.java @@ -12,9 +12,9 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_FundingTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_FundingTest.java index a9f3437ca1d..6a7f0083370 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_FundingTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_FundingTest.java @@ -14,9 +14,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.orcid.test.DBUnitTest; import org.orcid.test.helper.Utils; import org.junit.After; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_GeneralTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_GeneralTest.java index 12be925f9b8..11f7208f137 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_GeneralTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_GeneralTest.java @@ -14,10 +14,11 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; +import org.apache.hc.core5.http.ParseException; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -109,6 +110,7 @@ public class MemberV2ApiServiceDelegator_GeneralTest extends DBUnitTest { @Before public void before() throws Exception { + initDBUnitData(DATA_FILES); MockitoAnnotations.initMocks(this); Map map = new HashMap(); map.put(EmailFrequencyManager.ADMINISTRATIVE_CHANGE_NOTIFICATIONS, String.valueOf(Float.MAX_VALUE)); @@ -808,7 +810,7 @@ public void testOrcidProfileCreate_CAN_CRUDOnUnclaimedAccounts() { } @Test - public void testSearchByQuery() { + public void testSearchByQuery() throws ParseException { Search search = new Search(); Result result = new Result(); result.setOrcidIdentifier(new OrcidIdentifier("some-orcid-id")); @@ -833,7 +835,7 @@ public void testSearchByQuery() { } @Test(expected = OrcidBadRequestException.class) - public void testSearchByQueryTooManyRows() { + public void testSearchByQueryTooManyRows() throws ParseException { Map> params = new HashMap<>(); params.put("rows", Arrays.asList(Integer.toString(OrcidSearchManager.MAX_SEARCH_ROWS + 20))); @@ -850,7 +852,7 @@ public void testSearchByQueryTooManyRows() { } @Test(expected = AccessControlException.class) - public void testSearchByQueryBadScope() { + public void testSearchByQueryBadScope() throws ParseException { OrcidSecurityManager orcidSecurityManager = Mockito.mock(OrcidSecurityManagerImpl.class); Mockito.doThrow(new AccessControlException("some problem with scope")).when(orcidSecurityManager).checkScopes(Mockito.any(ScopePathType.class)); @@ -867,7 +869,7 @@ public void testViewClientNonExistent() { } @Test - public void testViewClient() { + public void testViewClient() throws ParseException { Response response = serviceDelegator.viewClient("APP-6666666666666666"); assertNotNull(response.getEntity()); assertTrue(response.getEntity() instanceof ClientSummary); diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_GroupIdTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_GroupIdTest.java index 7287af89772..4a5a791a59d 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_GroupIdTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_GroupIdTest.java @@ -10,9 +10,9 @@ import java.util.GregorianCalendar; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_KeywordsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_KeywordsTest.java index 2fc47fe4ba5..e54d9d1255e 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_KeywordsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_KeywordsTest.java @@ -11,11 +11,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_OtherNamesTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_OtherNamesTest.java index 0310cff5d3b..3f884bf7471 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_OtherNamesTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_OtherNamesTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.orcid.test.DBUnitTest; import org.orcid.test.helper.Utils; import org.junit.AfterClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_PeerReviewsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_PeerReviewsTest.java index 91b34708d7c..87150f14f42 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_PeerReviewsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_PeerReviewsTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_PersonalDetailsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_PersonalDetailsTest.java index 5f2f3781cb0..d526f828ffe 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_PersonalDetailsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_PersonalDetailsTest.java @@ -10,8 +10,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ReadPersonTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ReadPersonTest.java index 20e5179a09a..1b5e5b707ad 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ReadPersonTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ReadPersonTest.java @@ -5,8 +5,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ReadRecordTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ReadRecordTest.java index 0bc956dea96..7865fbd55a5 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ReadRecordTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ReadRecordTest.java @@ -5,8 +5,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ResearcherUrlsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ResearcherUrlsTest.java index ba36d60ebbc..0c04054faa4 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ResearcherUrlsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_ResearcherUrlsTest.java @@ -14,9 +14,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_WorksTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_WorksTest.java index 21e931b1012..ac9c4ad87db 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_WorksTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceDelegator_WorksTest.java @@ -14,9 +14,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.After; import org.junit.AfterClass; @@ -110,7 +110,8 @@ public class MemberV2ApiServiceDelegator_WorksTest extends DBUnitTest { private NotificationManager notificationManager; @Before - public void before() { + public void before() throws Exception { + initDBUnitData(DATA_FILES); MockitoAnnotations.initMocks(this); Map map = new HashMap(); map.put(EmailFrequencyManager.ADMINISTRATIVE_CHANGE_NOTIFICATIONS, String.valueOf(Float.MAX_VALUE)); @@ -667,7 +668,7 @@ public void testUpdateWorkLeavingVisibilityNullTest() { assertEquals(Visibility.PUBLIC, work.getVisibility()); } - @Test(expected = NoResultException.class) + @Test public void testDeleteWork() { SecurityContextTestUtils.setUpSecurityContext("4444-4444-4444-4447", ScopePathType.READ_LIMITED, ScopePathType.ACTIVITIES_UPDATE); Response response = serviceDelegator.viewWork("4444-4444-4444-4447", 9L); @@ -678,8 +679,6 @@ public void testDeleteWork() { response = serviceDelegator.deleteWork("4444-4444-4444-4447", 9L); assertNotNull(response); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); - - serviceDelegator.viewWork("4444-4444-4444-4447", 9L); } @Test diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceVersionedDelegatorTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceVersionedDelegatorTest.java index ec1d8c2b01c..f0e4a850319 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceVersionedDelegatorTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV2/server/delegator/MemberV2ApiServiceVersionedDelegatorTest.java @@ -12,11 +12,12 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang.time.DateUtils; +import org.apache.hc.core5.http.ParseException; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -63,6 +64,8 @@ import org.orcid.test.TargetProxyHelper; import org.springframework.beans.factory.annotation.Value; import org.springframework.test.context.ContextConfiguration; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; @RunWith(OrcidJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:test-orcid-api-web-context.xml" }) @@ -87,6 +90,9 @@ public class MemberV2ApiServiceVersionedDelegatorTest extends DBUnitTest { @Resource private ProfileDao profileDao; + + @Resource + private PlatformTransactionManager transactionManager; @Resource private V2VersionConverterChain v2VersionConverterChain; @@ -1508,7 +1514,7 @@ public void test03ViewPerson() { } @Test - public void testSearchByQuery() { + public void testSearchByQuery() throws ParseException { MockitoAnnotations.initMocks(this); Search search = new Search(); Result result = new Result(); @@ -1536,7 +1542,7 @@ public void testViewClientNonExistent() { } @Test - public void testViewClient() { + public void testViewClient() throws ParseException { Response response = serviceDelegator.viewClient("APP-6666666666666666"); assertNotNull(response.getEntity()); assertTrue(response.getEntity() instanceof ClientSummary); @@ -1993,10 +1999,14 @@ private void assertProtocol(String url, boolean isHttps) { } private void updateProfileSubmissionDate(String orcid, int increment) { - // Update the submission date so it is long enough - ProfileEntity profileEntity = profileDao.find(orcid); - profileEntity.setSubmissionDate(DateUtils.addDays(new Date(), increment)); - profileDao.merge(profileEntity); - profileDao.flush(); + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.execute(status -> { + // Update the submission date so it is long enough + ProfileEntity profileEntity = profileDao.find(orcid); + profileEntity.setSubmissionDate(DateUtils.addDays(new Date(), increment)); + profileDao.merge(profileEntity); + profileDao.flush(); + return null; + }); } } diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegatorErrorsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegatorErrorsTest.java index e4cc59146fd..cea91278298 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegatorErrorsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegatorErrorsTest.java @@ -10,9 +10,9 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang.time.DateUtils; import org.junit.AfterClass; @@ -63,6 +63,8 @@ import org.orcid.test.OrcidJUnit4ClassRunner; import org.springframework.beans.factory.annotation.Value; import org.springframework.test.context.ContextConfiguration; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; @RunWith(OrcidJUnit4ClassRunner.class) @@ -79,6 +81,9 @@ public class MemberV3ApiServiceDelegatorErrorsTest extends DBUnitTest { @Resource private ProfileDao profileDao; + @Resource + private PlatformTransactionManager transactionManager; + @Value("${org.orcid.core.works.bulk.read.max:100}") private Long bulkReadSize; @@ -2083,10 +2088,14 @@ private void assertProtocol(String url) { } private void updateProfileSubmissionDate(String orcid, int increment) { - // Update the submission date so it is long enough - ProfileEntity profileEntity = profileDao.find(orcid); - profileEntity.setSubmissionDate(DateUtils.addDays(new Date(), increment)); - profileDao.merge(profileEntity); - profileDao.flush(); + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.execute(status -> { + // Update the submission date so it is long enough + ProfileEntity profileEntity = profileDao.find(orcid); + profileEntity.setSubmissionDate(DateUtils.addDays(new Date(), increment)); + profileDao.merge(profileEntity); + profileDao.flush(); + return null; + }); } } diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ActivitiesSummaryTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ActivitiesSummaryTest.java index f21cdb6c516..5e2ed1fd92b 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ActivitiesSummaryTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ActivitiesSummaryTest.java @@ -10,8 +10,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_AddressesTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_AddressesTest.java index 6a0e7d3d366..35847844494 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_AddressesTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_AddressesTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_BiogrphyTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_BiogrphyTest.java index 17406ff3ad6..dea0a4203ec 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_BiogrphyTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_BiogrphyTest.java @@ -8,8 +8,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_DistinctionsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_DistinctionsTest.java index 159560a73a8..dc656efbe8f 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_DistinctionsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_DistinctionsTest.java @@ -10,11 +10,11 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; -import org.apache.http.HttpStatus; +import org.apache.hc.core5.http.HttpStatus; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EducationsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EducationsTest.java index 041f43dc0c9..ec21287dd65 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EducationsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EducationsTest.java @@ -10,11 +10,11 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; -import org.apache.http.HttpStatus; +import org.apache.hc.core5.http.HttpStatus; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EmailsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EmailsTest.java index 93256c9adc5..0de07fc6b68 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EmailsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EmailsTest.java @@ -9,8 +9,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EmploymentsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EmploymentsTest.java index 501ddde13b6..842b5e56847 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EmploymentsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_EmploymentsTest.java @@ -10,11 +10,11 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; -import org.apache.http.HttpStatus; +import org.apache.hc.core5.http.HttpStatus; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ExternalIdentifiersTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ExternalIdentifiersTest.java index bc9e95cef52..4c6154e44f2 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ExternalIdentifiersTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ExternalIdentifiersTest.java @@ -12,9 +12,9 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_FundingTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_FundingTest.java index 3818f6d2c1f..1f713d42302 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_FundingTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_FundingTest.java @@ -14,9 +14,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_GeneralTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_GeneralTest.java index a9962ccb336..9010bbc6078 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_GeneralTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_GeneralTest.java @@ -15,10 +15,11 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; +import org.apache.hc.core5.http.ParseException; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -118,6 +119,7 @@ public class MemberV3ApiServiceDelegator_GeneralTest extends DBUnitTest { @Before public void before() throws Exception { + initDBUnitData(DATA_FILES); MockitoAnnotations.initMocks(this); IssnValidator mockIssnValidator = Mockito.mock(IssnValidator.class); when(mockIssnValidator.issnValid(Mockito.anyString())).thenReturn(true); @@ -807,7 +809,7 @@ public void testOrcidProfileCreate_CAN_CRUDOnUnclaimedAccounts() { } @Test - public void testSearchByQuery() { + public void testSearchByQuery() throws ParseException { Search search = new Search(); Result result = new Result(); result.setOrcidIdentifier(new OrcidIdentifier("some-orcid-id")); @@ -832,7 +834,7 @@ public void testSearchByQuery() { } @Test(expected = OrcidBadRequestException.class) - public void testSearchByQueryTooManyRows() { + public void testSearchByQueryTooManyRows() throws ParseException { Map> params = new HashMap<>(); params.put("rows", Arrays.asList(Integer.toString(OrcidSearchManager.MAX_SEARCH_ROWS + 20))); @@ -849,7 +851,7 @@ public void testSearchByQueryTooManyRows() { } @Test(expected = AccessControlException.class) - public void testSearchByQueryBadScope() { + public void testSearchByQueryBadScope() throws ParseException { OrcidSecurityManager orcidSecurityManager = Mockito.mock(OrcidSecurityManagerImpl.class); Mockito.doThrow(new AccessControlException("some problem with scope")).when(orcidSecurityManager).checkScopes(Mockito.any(ScopePathType.class)); @@ -866,7 +868,7 @@ public void testViewClientNonExistent() { } @Test - public void testViewClient() { + public void testViewClient() throws ParseException { Response response = serviceDelegator.viewClient("APP-6666666666666666"); assertNotNull(response.getEntity()); assertTrue(response.getEntity() instanceof ClientSummary); diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_GroupIdTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_GroupIdTest.java index bdeb4db805f..0dfec01b63a 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_GroupIdTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_GroupIdTest.java @@ -10,9 +10,9 @@ import java.util.GregorianCalendar; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_InvitedPositionsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_InvitedPositionsTest.java index 0977148be11..9ebe3029d4f 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_InvitedPositionsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_InvitedPositionsTest.java @@ -10,11 +10,11 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; -import org.apache.http.HttpStatus; +import org.apache.hc.core5.http.HttpStatus; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_KeywordsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_KeywordsTest.java index e763d7d6e39..8aaa445cb20 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_KeywordsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_KeywordsTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_MembershipsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_MembershipsTest.java index c39ab1fc53c..22e43c0ea0e 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_MembershipsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_MembershipsTest.java @@ -10,11 +10,11 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; -import org.apache.http.HttpStatus; +import org.apache.hc.core5.http.HttpStatus; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_OtherNamesTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_OtherNamesTest.java index c72598d875e..2f894a170d0 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_OtherNamesTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_OtherNamesTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_PeerReviewsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_PeerReviewsTest.java index ad055ea6f69..d0696ea6998 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_PeerReviewsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_PeerReviewsTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_PersonalDetailsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_PersonalDetailsTest.java index 9a66ab9e149..026cb556be6 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_PersonalDetailsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_PersonalDetailsTest.java @@ -10,8 +10,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_QualificationsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_QualificationsTest.java index b697e26daff..71aaa4cf20b 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_QualificationsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_QualificationsTest.java @@ -10,11 +10,11 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; -import org.apache.http.HttpStatus; +import org.apache.hc.core5.http.HttpStatus; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ReadPersonTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ReadPersonTest.java index 8ae4784160a..921f0602b67 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ReadPersonTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ReadPersonTest.java @@ -5,8 +5,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ReadRecordTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ReadRecordTest.java index 80d8dea980b..d9160768901 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ReadRecordTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ReadRecordTest.java @@ -5,8 +5,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ResearcherUrlsTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ResearcherUrlsTest.java index b430009c7b4..52c3eca0f37 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ResearcherUrlsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ResearcherUrlsTest.java @@ -14,9 +14,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ServicesTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ServicesTest.java index f0308a4dff1..cd273519423 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ServicesTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_ServicesTest.java @@ -10,11 +10,11 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; -import org.apache.http.HttpStatus; +import org.apache.hc.core5.http.HttpStatus; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_WorksTest.java b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_WorksTest.java index aa34513bd26..12819562718 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_WorksTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/memberV3/server/delegator/MemberV3ApiServiceDelegator_WorksTest.java @@ -14,9 +14,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.junit.After; import org.junit.AfterClass; @@ -120,6 +120,11 @@ public static void removeDBUnitData() throws Exception { removeDBUnitData(DATA_FILES); } + @Before + public void resetDBUnitDataBeforeEachTest() throws Exception { + initDBUnitData(DATA_FILES); + } + @Test(expected = OrcidUnauthorizedException.class) public void testViewWorkWrongToken() { SecurityContextTestUtils.setUpSecurityContext("some-other-user", ScopePathType.READ_LIMITED); @@ -650,7 +655,7 @@ public void testUpdateWorkLeavingVisibilityNullTest() { assertEquals(Visibility.PUBLIC, work.getVisibility()); } - @Test(expected = NoResultException.class) + @Test public void testDeleteWork() { SecurityContextTestUtils.setUpSecurityContext("4444-4444-4444-4447", ScopePathType.READ_LIMITED, ScopePathType.ACTIVITIES_UPDATE); Response response = serviceDelegator.viewWork("4444-4444-4444-4447", 9L); @@ -661,8 +666,6 @@ public void testDeleteWork() { response = serviceDelegator.deleteWork("4444-4444-4444-4447", 9L); assertNotNull(response); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); - - serviceDelegator.viewWork("4444-4444-4444-4447", 9L); } @Test diff --git a/orcid-api-web/src/test/java/org/orcid/api/t2/OAuthOrcidApiService.java b/orcid-api-web/src/test/java/org/orcid/api/t2/OAuthOrcidApiService.java index 5c15c655f41..11b644703d1 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/t2/OAuthOrcidApiService.java +++ b/orcid-api-web/src/test/java/org/orcid/api/t2/OAuthOrcidApiService.java @@ -1,10 +1,10 @@ package org.orcid.api.t2; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import static org.orcid.core.api.OrcidApiConstants.*; diff --git a/orcid-api-web/src/test/java/org/orcid/api/t2/server/delegator/NotificationsApiServiceDelegatorTest.java b/orcid-api-web/src/test/java/org/orcid/api/t2/server/delegator/NotificationsApiServiceDelegatorTest.java index b428c079362..ec2553b0908 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/t2/server/delegator/NotificationsApiServiceDelegatorTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/t2/server/delegator/NotificationsApiServiceDelegatorTest.java @@ -7,7 +7,7 @@ import java.util.ArrayList; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; import org.junit.Before; import org.junit.Test; diff --git a/orcid-api-web/src/test/java/org/orcid/api/util/ApiUtilsTest.java b/orcid-api-web/src/test/java/org/orcid/api/util/ApiUtilsTest.java index 4ae252811d6..5a9c7de9789 100644 --- a/orcid-api-web/src/test/java/org/orcid/api/util/ApiUtilsTest.java +++ b/orcid-api-web/src/test/java/org/orcid/api/util/ApiUtilsTest.java @@ -8,8 +8,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.Before; import org.junit.Test; diff --git a/orcid-api-web/src/test/java/org/orcid/test/helper/Utils.java b/orcid-api-web/src/test/java/org/orcid/test/helper/Utils.java index 8f1750d0391..3c481dfc21e 100644 --- a/orcid-api-web/src/test/java/org/orcid/test/helper/Utils.java +++ b/orcid-api-web/src/test/java/org/orcid/test/helper/Utils.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; import org.orcid.jaxb.model.common_v2.Country; import org.orcid.jaxb.model.common_v2.Filterable; diff --git a/orcid-api-web/src/test/java/org/orcid/test/helper/v3/Utils.java b/orcid-api-web/src/test/java/org/orcid/test/helper/v3/Utils.java index 4712ab582e3..3e909677c84 100644 --- a/orcid-api-web/src/test/java/org/orcid/test/helper/v3/Utils.java +++ b/orcid-api-web/src/test/java/org/orcid/test/helper/v3/Utils.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; import org.orcid.jaxb.model.common.FundingType; import org.orcid.jaxb.model.common.Iso3166Country; diff --git a/orcid-api-web/src/test/resources/test-core-context.xml b/orcid-api-web/src/test/resources/test-core-context.xml index 2c1cb08e585..f53e64ed165 100644 --- a/orcid-api-web/src/test/resources/test-core-context.xml +++ b/orcid-api-web/src/test/resources/test-core-context.xml @@ -2,9 +2,9 @@ + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> spring-jdbc - org.springframework.security.oauth - spring-security-oauth2 + org.springframework + spring-web + 6.0.23 + + + org.springframework.security + spring-security-web org.freemarker @@ -92,9 +97,9 @@ commons-codec - javax.mail - mail - 1.4.4 + com.sun.mail + jakarta.mail + 2.0.1 commons-io @@ -119,17 +124,22 @@ jakarta.xml.bind jakarta.xml.bind-api - 2.3.3 + 3.0.1 jakarta.activation jakarta.activation-api 2.1.0 - + + + org.eclipse.angus + angus-activation + 2.0.2 + com.sun.xml.bind jaxb-impl - 2.3.6 + 3.0.2 runtime @@ -140,17 +150,14 @@ 1.5.4 - org.apache.httpcomponents - httpclient + org.apache.httpcomponents.client5 + httpclient5 + 5.3.1 args4j args4j - - org.aspectj - aspectjrt - org.aspectj aspectjweaver @@ -161,8 +168,8 @@ compile - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api compile @@ -226,14 +233,24 @@ org.apache.activemq activemq-broker - 5.13.3 + ${activemq.version} de.undercouch citeproc-java - 0.6 + 3.5.0 + + + org.jbibtex + jbibtex + 1.0.20 + + + org.antlr + antlr4-runtime + 4.13.1 org.mozilla @@ -288,23 +305,23 @@ 3.6 - - javax.jms - javax.jms-api - 2.0.1 - + + jakarta.jms + jakarta.jms-api + 3.1.0 + - javax.ws.rs - javax.ws.rs-api + jakarta.ws.rs + jakarta.ws.rs-api redis.clients jedis - 3.7.1 + 4.3.1 @@ -324,8 +341,8 @@ maven-compiler-plugin false - 11 - 11 + 17 + 17 diff --git a/orcid-core/src/main/java/org/orcid/core/adapter/impl/MapperFacadeFactory.java b/orcid-core/src/main/java/org/orcid/core/adapter/impl/MapperFacadeFactory.java index be940ba3cd1..fb82c94c6f0 100644 --- a/orcid-core/src/main/java/org/orcid/core/adapter/impl/MapperFacadeFactory.java +++ b/orcid-core/src/main/java/org/orcid/core/adapter/impl/MapperFacadeFactory.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.TreeSet; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.adapter.converter.CreditNameConverter; @@ -153,6 +153,10 @@ public class MapperFacadeFactory implements FactoryBean { @Resource private EncryptionManager encryptionManager; + public void setEncryptionManager(EncryptionManager encryptionManager) { + this.encryptionManager = encryptionManager; + } + @Resource private WorkContributorRoleConverter workContributorsRoleConverter; @@ -1063,7 +1067,11 @@ public void mapBtoA(ClientDetailsEntity b, Client a, MappingContext context) { if (b.getClientSecrets() != null) { for (ClientSecretEntity entity : b.getClientSecrets()) { if (entity.isPrimary()) { - a.setDecryptedSecret(encryptionManager.decryptForInternalUse(entity.getClientSecret())); + String clientSecret = entity.getClientSecret(); + if (encryptionManager != null) { + clientSecret = encryptionManager.decryptForInternalUse(clientSecret); + } + a.setDecryptedSecret(clientSecret); } } } diff --git a/orcid-core/src/main/java/org/orcid/core/adapter/v3/impl/MapperFacadeFactory.java b/orcid-core/src/main/java/org/orcid/core/adapter/v3/impl/MapperFacadeFactory.java index cc4b1a9daf3..c5b358d2f84 100644 --- a/orcid-core/src/main/java/org/orcid/core/adapter/v3/impl/MapperFacadeFactory.java +++ b/orcid-core/src/main/java/org/orcid/core/adapter/v3/impl/MapperFacadeFactory.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.TreeSet; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.adapter.converter.EmptyStringToNullConverter; @@ -185,6 +185,10 @@ public class MapperFacadeFactory implements FactoryBean { @Resource private EncryptionManager encryptionManager; + public void setEncryptionManager(EncryptionManager encryptionManager) { + this.encryptionManager = encryptionManager; + } + @Resource(name = "PIDNormalizationService") private PIDNormalizationService norm; @@ -1221,7 +1225,11 @@ public void mapBtoA(ClientDetailsEntity b, Client a, MappingContext context) { if (b.getClientSecrets() != null) { for (ClientSecretEntity entity : b.getClientSecrets()) { if (entity.isPrimary()) { - a.setDecryptedSecret(encryptionManager.decryptForInternalUse(entity.getClientSecret())); + String clientSecret = entity.getClientSecret(); + if (encryptionManager != null) { + clientSecret = encryptionManager.decryptForInternalUse(clientSecret); + } + a.setDecryptedSecret(clientSecret); } } } diff --git a/orcid-core/src/main/java/org/orcid/core/aop/ProfileLastModifiedAspect.java b/orcid-core/src/main/java/org/orcid/core/aop/ProfileLastModifiedAspect.java index dfa98e251f1..c06501d4da1 100644 --- a/orcid-core/src/main/java/org/orcid/core/aop/ProfileLastModifiedAspect.java +++ b/orcid-core/src/main/java/org/orcid/core/aop/ProfileLastModifiedAspect.java @@ -2,7 +2,7 @@ import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.StringUtils; import org.aspectj.lang.JoinPoint; @@ -17,6 +17,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.PriorityOrdered; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -46,6 +48,9 @@ public class ProfileLastModifiedAspect implements PriorityOrdered { @Resource private RedisClient redisClient; + + @Resource + private PlatformTransactionManager transactionManager; @Value("${org.orcid.core.utils.cache.redis.summary.enabled:false}") private boolean isSummaryCacheEnabled; @@ -128,7 +133,8 @@ public void updateLastModifiedDateAndIndexingStatus(String orcid) { return; } try { - profileLastModifiedDao.updateLastModifiedDateAndIndexingStatus(orcid, IndexingStatus.PENDING); + new TransactionTemplate(transactionManager) + .executeWithoutResult(status -> profileLastModifiedDao.updateLastModifiedDateAndIndexingStatus(orcid, IndexingStatus.PENDING)); } catch(Exception e) { LOGGER.error("Unable to update last modified and indexing status for " + orcid, e); } @@ -150,7 +156,8 @@ public void updateLastModifiedDate(String orcid) { return; } try { - profileLastModifiedDao.updateLastModifiedDateWithoutResult(orcid); + new TransactionTemplate(transactionManager) + .executeWithoutResult(status -> profileLastModifiedDao.updateLastModifiedDateWithoutResult(orcid)); } catch(Exception e) { LOGGER.error("Unable to update last modified for " + orcid, e); } diff --git a/orcid-core/src/main/java/org/orcid/core/api/rate_limit/PapiRateLimitRedisClient.java b/orcid-core/src/main/java/org/orcid/core/api/rate_limit/PapiRateLimitRedisClient.java index 6a21d23335c..cb310ba317a 100644 --- a/orcid-core/src/main/java/org/orcid/core/api/rate_limit/PapiRateLimitRedisClient.java +++ b/orcid-core/src/main/java/org/orcid/core/api/rate_limit/PapiRateLimitRedisClient.java @@ -4,7 +4,7 @@ import java.util.Date; import java.util.HashMap; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.StringUtils; import org.orcid.core.utils.cache.redis.RedisClient; diff --git a/orcid-core/src/main/java/org/orcid/core/cache/OrcidString.java b/orcid-core/src/main/java/org/orcid/core/cache/OrcidString.java index 2e32f4ed327..4814347f34e 100644 --- a/orcid-core/src/main/java/org/orcid/core/cache/OrcidString.java +++ b/orcid-core/src/main/java/org/orcid/core/cache/OrcidString.java @@ -18,7 +18,7 @@ import java.io.Serializable; -import javax.mail.MethodNotSupportedException; +import jakarta.mail.MethodNotSupportedException; import org.orcid.persistence.jpa.entities.OrcidAware; diff --git a/orcid-core/src/main/java/org/orcid/core/cache/impl/FeaturedGroupedWorksExtendedRetriever.java b/orcid-core/src/main/java/org/orcid/core/cache/impl/FeaturedGroupedWorksExtendedRetriever.java index 539583ecde7..d74df5a3297 100644 --- a/orcid-core/src/main/java/org/orcid/core/cache/impl/FeaturedGroupedWorksExtendedRetriever.java +++ b/orcid-core/src/main/java/org/orcid/core/cache/impl/FeaturedGroupedWorksExtendedRetriever.java @@ -5,7 +5,7 @@ import org.orcid.core.manager.v3.read_only.WorkManagerReadOnly; import org.orcid.pojo.WorkSummaryExtended; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.List; public class FeaturedGroupedWorksExtendedRetriever implements Retriever> { diff --git a/orcid-core/src/main/java/org/orcid/core/cache/impl/GroupedWorksExtendedRetriever.java b/orcid-core/src/main/java/org/orcid/core/cache/impl/GroupedWorksExtendedRetriever.java index df045b716a4..f94fc16b688 100644 --- a/orcid-core/src/main/java/org/orcid/core/cache/impl/GroupedWorksExtendedRetriever.java +++ b/orcid-core/src/main/java/org/orcid/core/cache/impl/GroupedWorksExtendedRetriever.java @@ -5,8 +5,8 @@ import org.orcid.core.manager.v3.read_only.WorkManagerReadOnly; import org.orcid.pojo.WorksExtended; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; public class GroupedWorksExtendedRetriever implements Retriever { diff --git a/orcid-core/src/main/java/org/orcid/core/cache/impl/GroupedWorksRetriever.java b/orcid-core/src/main/java/org/orcid/core/cache/impl/GroupedWorksRetriever.java index f1f0fe1e9b6..a63e4543763 100644 --- a/orcid-core/src/main/java/org/orcid/core/cache/impl/GroupedWorksRetriever.java +++ b/orcid-core/src/main/java/org/orcid/core/cache/impl/GroupedWorksRetriever.java @@ -16,8 +16,8 @@ */ package org.orcid.core.cache.impl; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.orcid.core.cache.OrcidString; import org.orcid.core.cache.Retriever; diff --git a/orcid-core/src/main/java/org/orcid/core/cache/impl/ProfileEntityRetriever.java b/orcid-core/src/main/java/org/orcid/core/cache/impl/ProfileEntityRetriever.java index 94fe7e8c312..7d9e061e0d7 100644 --- a/orcid-core/src/main/java/org/orcid/core/cache/impl/ProfileEntityRetriever.java +++ b/orcid-core/src/main/java/org/orcid/core/cache/impl/ProfileEntityRetriever.java @@ -16,7 +16,7 @@ */ package org.orcid.core.cache.impl; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.orcid.core.cache.OrcidString; import org.orcid.core.cache.Retriever; diff --git a/orcid-core/src/main/java/org/orcid/core/cache/impl/SalesForceConnectionEntityRetriever.java b/orcid-core/src/main/java/org/orcid/core/cache/impl/SalesForceConnectionEntityRetriever.java index 164ac2c317c..6a2ad78fd67 100644 --- a/orcid-core/src/main/java/org/orcid/core/cache/impl/SalesForceConnectionEntityRetriever.java +++ b/orcid-core/src/main/java/org/orcid/core/cache/impl/SalesForceConnectionEntityRetriever.java @@ -18,7 +18,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.cache.OrcidString; import org.orcid.core.cache.Retriever; diff --git a/orcid-core/src/main/java/org/orcid/core/cache/impl/WorksTitleRetriever.java b/orcid-core/src/main/java/org/orcid/core/cache/impl/WorksTitleRetriever.java index 20de0e63079..cb3669b6cab 100644 --- a/orcid-core/src/main/java/org/orcid/core/cache/impl/WorksTitleRetriever.java +++ b/orcid-core/src/main/java/org/orcid/core/cache/impl/WorksTitleRetriever.java @@ -6,7 +6,7 @@ import org.orcid.pojo.ActivityTitle; import org.orcid.pojo.WorkSummaryExtended; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.List; public class WorksTitleRetriever implements Retriever> { diff --git a/orcid-core/src/main/java/org/orcid/core/cli/AnonymizeWorksFromCSV.java b/orcid-core/src/main/java/org/orcid/core/cli/AnonymizeWorksFromCSV.java index cbe22cf9599..5d4f96f5e5b 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/AnonymizeWorksFromCSV.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/AnonymizeWorksFromCSV.java @@ -7,7 +7,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; diff --git a/orcid-core/src/main/java/org/orcid/core/cli/AnonymizeWorksFromGetMyData.java b/orcid-core/src/main/java/org/orcid/core/cli/AnonymizeWorksFromGetMyData.java index fcbafc2c567..2273ed238d1 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/AnonymizeWorksFromGetMyData.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/AnonymizeWorksFromGetMyData.java @@ -8,7 +8,7 @@ import java.util.Iterator; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.io.FileUtils; diff --git a/orcid-core/src/main/java/org/orcid/core/cli/CorrectBadClientSourceData.java b/orcid-core/src/main/java/org/orcid/core/cli/CorrectBadClientSourceData.java index 207b3f14f2b..17e9cdac4b0 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/CorrectBadClientSourceData.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/CorrectBadClientSourceData.java @@ -5,7 +5,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.jaxb.model.clientgroup.ClientType; import org.orcid.persistence.dao.AddressDao; diff --git a/orcid-core/src/main/java/org/orcid/core/cli/CorrectBadOrgData.java b/orcid-core/src/main/java/org/orcid/core/cli/CorrectBadOrgData.java index 9cf5cd84ba1..d884f7e3c07 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/CorrectBadOrgData.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/CorrectBadOrgData.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; @@ -196,7 +196,7 @@ private void findDuplicateOrgs() { String city = (String) o[1]; String region = (String) o[2]; String country = (String) o[3]; - Long orgDisambiguatedId = ((BigInteger) o[4]).longValue(); + Long orgDisambiguatedId = ((Number) o[4]).longValue(); duplicateOrgDetails.add(new OrgDetails(name, city, region, country, orgDisambiguatedId)); }); } diff --git a/orcid-core/src/main/java/org/orcid/core/cli/CorrectClientProfileSourceIdReferences.java b/orcid-core/src/main/java/org/orcid/core/cli/CorrectClientProfileSourceIdReferences.java index a9339554101..dbac5694680 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/CorrectClientProfileSourceIdReferences.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/CorrectClientProfileSourceIdReferences.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; diff --git a/orcid-core/src/main/java/org/orcid/core/cli/DeleteActiveMQQueue.java b/orcid-core/src/main/java/org/orcid/core/cli/DeleteActiveMQQueue.java index bb6a330941c..d95b3140300 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/DeleteActiveMQQueue.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/DeleteActiveMQQueue.java @@ -1,8 +1,8 @@ package org.orcid.core.cli; -import javax.jms.ConnectionFactory; -import javax.jms.JMSException; -import javax.jms.Session; +import jakarta.jms.ConnectionFactory; +import jakarta.jms.JMSException; +import jakarta.jms.Session; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.command.ActiveMQDestination; diff --git a/orcid-core/src/main/java/org/orcid/core/cli/LoadFundRefData.java b/orcid-core/src/main/java/org/orcid/core/cli/LoadFundRefData.java index 2cb7103f48c..57e701bc7ae 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/LoadFundRefData.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/LoadFundRefData.java @@ -7,7 +7,7 @@ import java.net.http.HttpResponse; import java.util.HashMap; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; diff --git a/orcid-core/src/main/java/org/orcid/core/cli/NormalizeISNIs.java b/orcid-core/src/main/java/org/orcid/core/cli/NormalizeISNIs.java index ac958801f48..5c627982c53 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/NormalizeISNIs.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/NormalizeISNIs.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.orgs.extId.normalizer.impl.ISNIOrgDisambiguatedExternalIdNormalizer; import org.orcid.persistence.dao.OrgDisambiguatedExternalIdentifierDao; diff --git a/orcid-core/src/main/java/org/orcid/core/cli/ViewMQStatistics.java b/orcid-core/src/main/java/org/orcid/core/cli/ViewMQStatistics.java index 76a0941ef7d..4456953d483 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/ViewMQStatistics.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/ViewMQStatistics.java @@ -2,15 +2,15 @@ import java.util.Enumeration; -import javax.jms.Connection; -import javax.jms.ConnectionFactory; -import javax.jms.JMSException; -import javax.jms.MapMessage; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Queue; -import javax.jms.Session; +import jakarta.jms.Connection; +import jakarta.jms.ConnectionFactory; +import jakarta.jms.JMSException; +import jakarta.jms.MapMessage; +import jakarta.jms.Message; +import jakarta.jms.MessageConsumer; +import jakarta.jms.MessageProducer; +import jakarta.jms.Queue; +import jakarta.jms.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/orcid-core/src/main/java/org/orcid/core/cli/anonymize/XMLDeserializer.java b/orcid-core/src/main/java/org/orcid/core/cli/anonymize/XMLDeserializer.java index a63001a3708..4467877d10e 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/anonymize/XMLDeserializer.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/anonymize/XMLDeserializer.java @@ -7,10 +7,10 @@ import java.io.StringReader; import java.io.StringWriter; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.annotation.adapters.NormalizedStringAdapter; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.Marshaller; +import jakarta.xml.bind.Unmarshaller; +import jakarta.xml.bind.annotation.adapters.NormalizedStringAdapter; public class XMLDeserializer { diff --git a/orcid-core/src/main/java/org/orcid/core/cli/logs/ApiAccessLogsAnalyser.java b/orcid-core/src/main/java/org/orcid/core/cli/logs/ApiAccessLogsAnalyser.java index 59cb42985b3..d6e2973a3cd 100644 --- a/orcid-core/src/main/java/org/orcid/core/cli/logs/ApiAccessLogsAnalyser.java +++ b/orcid-core/src/main/java/org/orcid/core/cli/logs/ApiAccessLogsAnalyser.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Map; -import javax.persistence.NoResultException; +import jakarta.persistence.NoResultException; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; diff --git a/orcid-core/src/main/java/org/orcid/core/common/manager/EventManager.java b/orcid-core/src/main/java/org/orcid/core/common/manager/EventManager.java index 5772b4db982..495b5f71ba9 100644 --- a/orcid-core/src/main/java/org/orcid/core/common/manager/EventManager.java +++ b/orcid-core/src/main/java/org/orcid/core/common/manager/EventManager.java @@ -1,6 +1,6 @@ package org.orcid.core.common.manager; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.orcid.persistence.jpa.entities.EventType; diff --git a/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EmailDomainManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EmailDomainManagerImpl.java index 0170775e9b9..924d77d8bb1 100644 --- a/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EmailDomainManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EmailDomainManagerImpl.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.ehcache.Cache; import org.orcid.core.common.manager.EmailDomainManager; diff --git a/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EmailFrequencyManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EmailFrequencyManagerImpl.java index 3214056bf86..afef5f52b36 100644 --- a/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EmailFrequencyManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EmailFrequencyManagerImpl.java @@ -4,8 +4,8 @@ import java.util.Map; import java.util.UUID; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.orcid.core.common.manager.EmailFrequencyManager; import org.orcid.core.manager.ProfileEntityCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EventManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EventManagerImpl.java index daf630de743..a3afa780451 100644 --- a/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EventManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/common/manager/impl/EventManagerImpl.java @@ -5,8 +5,8 @@ import java.nio.charset.StandardCharsets; import java.util.Date; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.orcid.core.common.manager.EventManager; diff --git a/orcid-core/src/main/java/org/orcid/core/common/manager/impl/SummaryManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/common/manager/impl/SummaryManagerImpl.java index 226c3f8d6be..097c3473e20 100644 --- a/orcid-core/src/main/java/org/orcid/core/common/manager/impl/SummaryManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/common/manager/impl/SummaryManagerImpl.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; diff --git a/orcid-core/src/main/java/org/orcid/core/common/util/AuthenticationUtils.java b/orcid-core/src/main/java/org/orcid/core/common/util/AuthenticationUtils.java index 7732dfe426a..36e61614d35 100644 --- a/orcid-core/src/main/java/org/orcid/core/common/util/AuthenticationUtils.java +++ b/orcid-core/src/main/java/org/orcid/core/common/util/AuthenticationUtils.java @@ -1,6 +1,7 @@ package org.orcid.core.common.util; import org.apache.commons.lang3.StringUtils; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.core.security.OrcidRoles; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,8 +12,6 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.security.web.authentication.switchuser.SwitchUserGrantedAuthority; @@ -43,10 +42,10 @@ public static String retrieveActiveSourceId() { } else if (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication.getClass())) { // Token endpoint return ((UsernamePasswordAuthenticationToken) authentication).getName(); - } else if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { + } else if (OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { // API - OAuth2Request authorizationRequest = ((OAuth2Authentication) authentication).getOAuth2Request(); - return authorizationRequest.getClientId(); + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + return authDetails.getClientId(); } else { // Normal web user return AuthenticationUtils.retrieveEffectiveOrcid(); @@ -66,10 +65,10 @@ public static String retrieveRealUserOrcid() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null) { return null; - } else if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { + } else if (OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { // API - OAuth2Request authorizationRequest = ((OAuth2Authentication) authentication).getOAuth2Request(); - return authorizationRequest.getClientId(); + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + return authDetails.getClientId(); } // Delegation mode String realUserIfInDelegationMode = getRealUserIfInDelegationMode(authentication); @@ -90,12 +89,6 @@ public static boolean isDelegatedByAnAdmin() { SwitchUserGrantedAuthority suga = (SwitchUserGrantedAuthority) authority; Authentication sourceAuthentication = suga.getSource(); - LOGGER.trace("isDelegatedByAnAdmin"); - LOGGER.trace("Authentication: {}", sourceAuthentication); - LOGGER.trace("Authentication type: {}", sourceAuthentication.getClass().getName()); - LOGGER.trace("User Details type: {}", sourceAuthentication.getDetails().getClass()); - LOGGER.trace("Source authorities: {}", sourceAuthentication.getAuthorities()); - if (sourceAuthentication instanceof UsernamePasswordAuthenticationToken) { if(sourceAuthentication.getAuthorities() != null) { return sourceAuthentication.getAuthorities().contains(adminAuthority); diff --git a/orcid-core/src/main/java/org/orcid/core/cron/CleanOldClientKeysCronJob.java b/orcid-core/src/main/java/org/orcid/core/cron/CleanOldClientKeysCronJob.java index 360a2419927..73c5dcfb956 100644 --- a/orcid-core/src/main/java/org/orcid/core/cron/CleanOldClientKeysCronJob.java +++ b/orcid-core/src/main/java/org/orcid/core/cron/CleanOldClientKeysCronJob.java @@ -2,7 +2,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.persistence.dao.ClientDetailsDao; import org.orcid.persistence.dao.ClientSecretDao; import org.orcid.persistence.jpa.entities.ClientSecretEntity; diff --git a/orcid-core/src/main/java/org/orcid/core/crossref/CrossRefMetadata.java b/orcid-core/src/main/java/org/orcid/core/crossref/CrossRefMetadata.java index 18fc74ba873..950d8f60fb1 100644 --- a/orcid-core/src/main/java/org/orcid/core/crossref/CrossRefMetadata.java +++ b/orcid-core/src/main/java/org/orcid/core/crossref/CrossRefMetadata.java @@ -1,6 +1,6 @@ package org.orcid.core.crossref; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/orcid-core/src/main/java/org/orcid/core/exception/InvalidTokenException.java b/orcid-core/src/main/java/org/orcid/core/exception/InvalidTokenException.java new file mode 100644 index 00000000000..796439f9cb6 --- /dev/null +++ b/orcid-core/src/main/java/org/orcid/core/exception/InvalidTokenException.java @@ -0,0 +1,9 @@ +package org.orcid.core.exception; + +public class InvalidTokenException extends ApplicationException { + private static final long serialVersionUID = 1L; + + public InvalidTokenException(String s) { + super(s); + } +} diff --git a/orcid-core/src/main/java/org/orcid/core/exception/OrcidApiException.java b/orcid-core/src/main/java/org/orcid/core/exception/OrcidApiException.java index 0d66b3fda16..d60f8d61ffc 100644 --- a/orcid-core/src/main/java/org/orcid/core/exception/OrcidApiException.java +++ b/orcid-core/src/main/java/org/orcid/core/exception/OrcidApiException.java @@ -1,6 +1,6 @@ package org.orcid.core.exception; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.jaxb.model.message.ErrorDesc; import org.orcid.jaxb.model.message.OrcidMessage; diff --git a/orcid-core/src/main/java/org/orcid/core/exception/OrcidBadRequestException.java b/orcid-core/src/main/java/org/orcid/core/exception/OrcidBadRequestException.java index 192afe57ec5..b0674a7e678 100644 --- a/orcid-core/src/main/java/org/orcid/core/exception/OrcidBadRequestException.java +++ b/orcid-core/src/main/java/org/orcid/core/exception/OrcidBadRequestException.java @@ -1,6 +1,6 @@ package org.orcid.core.exception; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; /** * @author Declan Newman (declan) Date: 01/03/2012 diff --git a/orcid-core/src/main/java/org/orcid/core/exception/OrcidCoreExceptionMapper.java b/orcid-core/src/main/java/org/orcid/core/exception/OrcidCoreExceptionMapper.java index d09e1f386e6..9fab5413a4e 100644 --- a/orcid-core/src/main/java/org/orcid/core/exception/OrcidCoreExceptionMapper.java +++ b/orcid-core/src/main/java/org/orcid/core/exception/OrcidCoreExceptionMapper.java @@ -4,10 +4,10 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import org.apache.commons.lang3.text.StrSubstitutor; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -20,7 +20,6 @@ import org.orcid.jaxb.model.v3.release.error.OrcidError; import org.springframework.context.MessageSource; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; import com.fasterxml.jackson.core.JsonParseException; @@ -83,7 +82,6 @@ public class OrcidCoreExceptionMapper { // 401 HTTP_STATUS_AND_ERROR_CODE_BY_THROWABLE_TYPE.put(AuthenticationException.class, new ImmutablePair<>(Response.Status.UNAUTHORIZED, 9002)); - HTTP_STATUS_AND_ERROR_CODE_BY_THROWABLE_TYPE.put(OAuth2Exception.class, new ImmutablePair<>(Response.Status.UNAUTHORIZED, 9003)); HTTP_STATUS_AND_ERROR_CODE_BY_THROWABLE_TYPE.put(OrcidUnauthorizedException.class, new ImmutablePair<>(Response.Status.UNAUTHORIZED, 9017)); HTTP_STATUS_AND_ERROR_CODE_BY_THROWABLE_TYPE.put(OrcidInvalidScopeException.class, new ImmutablePair<>(Response.Status.UNAUTHORIZED, 9015)); diff --git a/orcid-core/src/main/java/org/orcid/core/exception/OrcidForbiddenException.java b/orcid-core/src/main/java/org/orcid/core/exception/OrcidForbiddenException.java index 31d9abfe13e..8b091b0bcd9 100644 --- a/orcid-core/src/main/java/org/orcid/core/exception/OrcidForbiddenException.java +++ b/orcid-core/src/main/java/org/orcid/core/exception/OrcidForbiddenException.java @@ -1,6 +1,6 @@ package org.orcid.core.exception; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; public class OrcidForbiddenException extends OrcidApiException { /** diff --git a/orcid-core/src/main/java/org/orcid/core/exception/OrcidUnauthorizedException.java b/orcid-core/src/main/java/org/orcid/core/exception/OrcidUnauthorizedException.java index 0f6eed0a5e8..18291ab1183 100644 --- a/orcid-core/src/main/java/org/orcid/core/exception/OrcidUnauthorizedException.java +++ b/orcid-core/src/main/java/org/orcid/core/exception/OrcidUnauthorizedException.java @@ -1,6 +1,6 @@ package org.orcid.core.exception; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; /** * @author Declan Newman (declan) Date: 01/03/2012 diff --git a/orcid-core/src/main/java/org/orcid/core/exception/SearchStartParameterLimitExceededException.java b/orcid-core/src/main/java/org/orcid/core/exception/SearchStartParameterLimitExceededException.java index f6c53ef69a8..4bca5758eb1 100644 --- a/orcid-core/src/main/java/org/orcid/core/exception/SearchStartParameterLimitExceededException.java +++ b/orcid-core/src/main/java/org/orcid/core/exception/SearchStartParameterLimitExceededException.java @@ -1,6 +1,6 @@ package org.orcid.core.exception; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; public class SearchStartParameterLimitExceededException extends OrcidApiException { diff --git a/orcid-core/src/main/java/org/orcid/core/filters/PingFilter.java b/orcid-core/src/main/java/org/orcid/core/filters/PingFilter.java index bfca76903dd..30e525ecab0 100644 --- a/orcid-core/src/main/java/org/orcid/core/filters/PingFilter.java +++ b/orcid-core/src/main/java/org/orcid/core/filters/PingFilter.java @@ -1,9 +1,9 @@ package org.orcid.core.filters; -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.springframework.web.filter.OncePerRequestFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/orcid-core/src/main/java/org/orcid/core/groupIds/issn/IssnClient.java b/orcid-core/src/main/java/org/orcid/core/groupIds/issn/IssnClient.java index 837ee681476..9397dbbbcfc 100644 --- a/orcid-core/src/main/java/org/orcid/core/groupIds/issn/IssnClient.java +++ b/orcid-core/src/main/java/org/orcid/core/groupIds/issn/IssnClient.java @@ -6,7 +6,7 @@ import java.net.http.HttpResponse; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.codehaus.jettison.json.JSONArray; diff --git a/orcid-core/src/main/java/org/orcid/core/locale/LocaleManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/locale/LocaleManagerImpl.java index 57d34c40fc2..163a2bf2e14 100644 --- a/orcid-core/src/main/java/org/orcid/core/locale/LocaleManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/locale/LocaleManagerImpl.java @@ -5,7 +5,7 @@ import java.util.Map; import java.util.ResourceBundle; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.LocaleUtils; import org.orcid.core.manager.CountryManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/OrcidSearchManager.java b/orcid-core/src/main/java/org/orcid/core/manager/OrcidSearchManager.java index 1d4aa684e99..1294fc581ac 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/OrcidSearchManager.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/OrcidSearchManager.java @@ -4,6 +4,8 @@ import java.util.Map; import org.orcid.jaxb.model.search_v2.Search; +import org.apache.hc.core5.http.ParseException; + /** * Class to retrieve OrcidMessage objects (with nested Search Results) relating @@ -24,5 +26,5 @@ public interface OrcidSearchManager { static final int MAX_SEARCH_ROWS = 200; - Search findOrcidIds(Map> queryParameters); + Search findOrcidIds(Map> queryParameters) throws ParseException; } \ No newline at end of file diff --git a/orcid-core/src/main/java/org/orcid/core/manager/OrcidSecurityManager.java b/orcid-core/src/main/java/org/orcid/core/manager/OrcidSecurityManager.java index 39b4372dd79..eefd492405f 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/OrcidSecurityManager.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/OrcidSecurityManager.java @@ -2,7 +2,7 @@ import java.util.Collection; -import javax.persistence.NoResultException; +import jakarta.persistence.NoResultException; import org.orcid.core.exception.DeactivatedException; import org.orcid.core.exception.LockedException; @@ -56,5 +56,4 @@ public interface OrcidSecurityManager { void checkAndFilter(String orcid, Record record); - String getOrcidFromToken(); } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/ProfileEntityManager.java b/orcid-core/src/main/java/org/orcid/core/manager/ProfileEntityManager.java index 5a2eb26c5c5..f048f069e74 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/ProfileEntityManager.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/ProfileEntityManager.java @@ -19,7 +19,7 @@ public interface ProfileEntityManager extends ProfileEntityManagerReadOnly { boolean hasBeenGivenPermissionTo(String giverOrcid, String receiverOrcid); - boolean existsAndNotClaimedAndBelongsTo(String messageOrcid, String clientId); + boolean existsAndNotClaimedAndBelongsTo(String messageOrcid, String clientId); boolean isProfileDeprecated(String orcid); @@ -39,8 +39,6 @@ public interface ProfileEntityManager extends ProfileEntityManagerReadOnly { boolean reviewProfile(String orcid); - void disableApplication(Long tokenId, String userOrcid); - String getOrcidHash(String orcid) throws NoSuchAlgorithmException; String retrivePublicDisplayName(String orcid); diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ActivityManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ActivityManagerImpl.java index 050fb3ff4e1..25a13b4228e 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ActivityManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ActivityManagerImpl.java @@ -3,7 +3,7 @@ import java.util.LinkedHashMap; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.ActivityManager; import org.orcid.core.manager.AffiliationsManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/AddressManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/AddressManagerImpl.java index b2df894a4c2..42dc27a893e 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/AddressManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/AddressManagerImpl.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/AdminManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/AdminManagerImpl.java index 2ac845aed12..4c8a052099d 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/AdminManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/AdminManagerImpl.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/AffiliationsManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/AffiliationsManagerImpl.java index 052e2feb901..8052d6e31fd 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/AffiliationsManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/AffiliationsManagerImpl.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.AffiliationsManager; import org.orcid.core.manager.NotificationManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/BackupCodeManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/BackupCodeManagerImpl.java index 1b85e107d60..f2358678dfa 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/BackupCodeManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/BackupCodeManagerImpl.java @@ -4,7 +4,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.RandomStringUtils; import org.orcid.core.manager.BackupCodeManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/BibtexManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/BibtexManagerImpl.java index fd58eacf66b..944a85c6ab6 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/BibtexManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/BibtexManagerImpl.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.ActivitiesSummaryManager; import org.orcid.core.manager.BibtexManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/BiographyManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/BiographyManagerImpl.java index 2007875cd53..6dade968644 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/BiographyManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/BiographyManagerImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.BiographyManager; import org.orcid.core.manager.ProfileEntityCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ClientDetailsEntityCacheManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ClientDetailsEntityCacheManagerImpl.java index b1e331c8235..84c4a099a4f 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ClientDetailsEntityCacheManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ClientDetailsEntityCacheManagerImpl.java @@ -2,7 +2,7 @@ import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.ehcache.Cache; import org.orcid.core.manager.ClientDetailsEntityCacheManager; @@ -11,7 +11,6 @@ import org.orcid.core.utils.ReleaseNameUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; public class ClientDetailsEntityCacheManagerImpl implements ClientDetailsEntityCacheManager { @@ -26,20 +25,19 @@ public class ClientDetailsEntityCacheManagerImpl implements ClientDetailsEntityC @Resource(name = "clientDetailsEntityIdPCache") private Cache clientDetailsIdPCache; - private String releaseName = ReleaseNameUtils.getReleaseName(); + private final String releaseName = ReleaseNameUtils.getReleaseName(); @Override public ClientDetailsEntity retrieve(String clientId) throws IllegalArgumentException { Object key = new ClientIdCacheKey(clientId, releaseName); Date dbDate = retrieveLastModifiedDate(clientId); - ; ClientDetailsEntity clientDetails = clientDetailsCache.get(key); if (needsFresh(dbDate, clientDetails)) { clientDetails = clientDetailsCache.get(key); if (needsFresh(dbDate, clientDetails)) { clientDetails = clientDetailsManager.findByClientId(clientId); if (clientDetails == null) - throw new InvalidClientException("Client not found: " + clientId); + throw new IllegalArgumentException("Client not found: " + clientId); clientDetailsCache.put(key, clientDetails); } } @@ -88,7 +86,7 @@ private Date retrieveLastModifiedDate(String clientId) { Date date = null; try { date = clientDetailsManager.getLastModified(clientId); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { LOG.debug("Missing lastModifiedDate clientId:" + clientId); } return date; @@ -98,7 +96,7 @@ private Date retrieveLastModifiedDateByIdP(String idp) { Date date = null; try { date = clientDetailsManager.getLastModifiedByIdp(idp); - } catch (javax.persistence.NoResultException e) { + } catch (jakarta.persistence.NoResultException e) { LOG.debug("Missing lastModifiedDate idp:" + idp); } return date; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ClientDetailsManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ClientDetailsManagerImpl.java index 664f0415403..1d52f346c07 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ClientDetailsManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ClientDetailsManagerImpl.java @@ -9,7 +9,7 @@ import java.util.TreeSet; import java.util.UUID; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.AppIdGenerationManager; import org.orcid.core.manager.ClientDetailsManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/CountryManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/CountryManagerImpl.java index 8e9a849167a..dd606a9ea99 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/CountryManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/CountryManagerImpl.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.io.IOUtils; import org.orcid.core.manager.CountryManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/DOIManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/DOIManagerImpl.java index 031cf469889..08e8418e58e 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/DOIManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/DOIManagerImpl.java @@ -3,7 +3,7 @@ import java.net.MalformedURLException; import java.net.URL; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.ehcache.Cache; import org.orcid.core.manager.DOIManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/DoiBibtexCacheEntryFactory.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/DoiBibtexCacheEntryFactory.java index 809c293c58b..9dddb34f538 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/DoiBibtexCacheEntryFactory.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/DoiBibtexCacheEntryFactory.java @@ -3,7 +3,7 @@ import java.net.http.HttpClient; import java.net.http.HttpResponse; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.ehcache.spi.loaderwriter.CacheLoaderWriter; import org.orcid.core.utils.http.HttpRequestUtils; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/EncryptionManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/EncryptionManagerImpl.java index 5288c614584..153ff50b6f2 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/EncryptionManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/EncryptionManagerImpl.java @@ -15,7 +15,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Required; import org.springframework.security.crypto.password.PasswordEncoder; public class EncryptionManagerImpl implements EncryptionManager,PasswordEncoder, InitializingBean { @@ -46,22 +45,18 @@ public void setIterationCountForInternalEncryption(int iterationCountForInternal this.iterationCountForInternalEncyrption = iterationCountForInternalEncyrption; } - @Required public void setInternalEncryptor(PBEStringEncryptor internalEncryptor) { this.internalEncryptor = internalEncryptor; } - @Required public void setLegacyExternalEncryptor(PBEStringEncryptor legacyExternalEncryptor) { this.legacyExternalEncryptor = legacyExternalEncryptor; } - @Required public void setExternalEncryptor(PBEStringEncryptor externalEncryptor) { this.externalEncryptor = externalEncryptor; } - @Required public void setPasswordEncryptor(StringDigester passwordEncryptor) { this.passwordEncryptor = passwordEncryptor; } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ExternalIdentifierManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ExternalIdentifierManagerImpl.java index 52c41dacf33..de580bf54e7 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ExternalIdentifierManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ExternalIdentifierManagerImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/GroupIdRecordManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/GroupIdRecordManagerImpl.java index 62ede48ca9c..37e3bfd7596 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/GroupIdRecordManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/GroupIdRecordManagerImpl.java @@ -4,7 +4,7 @@ import java.net.URISyntaxException; import java.util.GregorianCalendar; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.codehaus.jettison.json.JSONException; import org.orcid.core.exception.*; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentifierTypeManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentifierTypeManagerImpl.java index 28fecb0b7a3..ad6b25bd544 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentifierTypeManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentifierTypeManagerImpl.java @@ -11,7 +11,7 @@ import java.util.SortedMap; import java.util.TreeMap; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.collections4.trie.PatriciaTrie; import org.orcid.core.adapter.impl.IdentifierTypePOJOConverter; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentityProviderManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentityProviderManagerImpl.java index 9cf59e8cf6e..52b13758e45 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentityProviderManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentityProviderManagerImpl.java @@ -6,8 +6,8 @@ import java.util.Optional; import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.ehcache.Cache; import org.orcid.core.locale.LocaleManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentityProviderNameCacheEntryFactory.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentityProviderNameCacheEntryFactory.java index fad7ec303a2..7d790b37666 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentityProviderNameCacheEntryFactory.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/IdentityProviderNameCacheEntryFactory.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.ehcache.spi.loaderwriter.CacheLoaderWriter; import org.orcid.core.manager.IdentityProviderManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/InstitutionalSignInManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/InstitutionalSignInManagerImpl.java index eedd84844d3..ff7fb780bc6 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/InstitutionalSignInManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/InstitutionalSignInManagerImpl.java @@ -12,13 +12,13 @@ import java.util.Set; import java.util.regex.Pattern; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.manager.ClientDetailsEntityCacheManager; import org.orcid.core.manager.InstitutionalSignInManager; import org.orcid.core.manager.NotificationManager; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.core.utils.JsonUtils; import org.orcid.persistence.dao.UserConnectionDao; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; @@ -51,8 +51,8 @@ public class InstitutionalSignInManagerImpl implements InstitutionalSignInManage @Resource protected ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - @Resource - protected OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; + @Resource(name = "clientDetailsManagerReadOnlyV3") + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; @Resource protected NotificationManager notificationManager; @@ -90,7 +90,7 @@ public void createUserConnectionAndNotify(String idType, String remoteUserId, St public void sendNotification(String userOrcid, String providerId) throws UnsupportedEncodingException { try { ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieveByIdP(providerId); - boolean clientKnowsUser = orcidOauth2TokenDetailService.doesClientKnowUser(clientDetails.getClientId(), userOrcid); + boolean clientKnowsUser = clientDetailsManagerReadOnly.doesClientKnowUser(clientDetails.getClientId(), userOrcid); // If the client doesn't know about the user yet, send a // notification if (!clientKnowsUser) { diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/NotificationManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/NotificationManagerImpl.java index cb03186855a..b7cbe530f1d 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/NotificationManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/NotificationManagerImpl.java @@ -15,7 +15,7 @@ import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.codec.binary.Base64; import org.orcid.core.adapter.JpaJaxbNotificationAdapter; @@ -30,8 +30,8 @@ import org.orcid.core.manager.SourceManager; import org.orcid.core.manager.read_only.EmailManagerReadOnly; import org.orcid.core.manager.read_only.impl.ManagerReadOnlyBaseImpl; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.core.manager.v3.read_only.GivenPermissionToManagerReadOnly; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.togglz.Features; import org.orcid.core.utils.SourceEntityUtils; import org.orcid.jaxb.model.clientgroup.RedirectUriType; @@ -46,7 +46,6 @@ import org.orcid.jaxb.model.notification_v2.Notification; import org.orcid.jaxb.model.notification_v2.NotificationType; import org.orcid.model.notification.institutional_sign_in_v2.NotificationInstitutionalConnection; -import org.orcid.persistence.dao.GenericDao; import org.orcid.persistence.dao.NotificationDao; import org.orcid.persistence.dao.ProfileDao; import org.orcid.persistence.dao.ProfileEventDao; @@ -56,11 +55,9 @@ import org.orcid.persistence.jpa.entities.NotificationEntity; import org.orcid.persistence.jpa.entities.NotificationInstitutionalConnectionEntity; import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.persistence.jpa.entities.ProfileEventEntity; import org.orcid.persistence.jpa.entities.SourceEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Required; import org.springframework.context.MessageSource; import org.springframework.transaction.annotation.Transactional; @@ -101,9 +98,6 @@ public class NotificationManagerImpl extends ManagerReadOnlyBaseImpl implements @Resource private SourceManager sourceManager; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - @Resource private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; @@ -121,10 +115,12 @@ public class NotificationManagerImpl extends ManagerReadOnlyBaseImpl implements @Resource private SourceEntityUtils sourceEntityUtils; + + @Resource(name = "clientDetailsManagerReadOnlyV3") + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; private static final Logger LOGGER = LoggerFactory.getLogger(NotificationManagerImpl.class); - @Required public void setEncryptionManager(EncryptionManager encryptionManager) { this.encryptionManager = encryptionManager; } @@ -273,7 +269,7 @@ public List filterActionedNotificationAlerts(Collection { // Filter only INSTITUTIONAL_CONNECTION notifications if (NotificationType.INSTITUTIONAL_CONNECTION.equals(n.getNotificationType())) { - boolean alreadyConnected = orcidOauth2TokenDetailService.doesClientKnowUser(n.getSource().retrieveSourcePath(), userOrcid); + boolean alreadyConnected = clientDetailsManagerReadOnly.doesClientKnowUser(n.getSource().retrieveSourcePath(), userOrcid); if (alreadyConnected) { flagAsArchived(userOrcid, n.getPutCode(), false); } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/NotificationValidationManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/NotificationValidationManagerImpl.java index 7e3fa3bb4f5..fb8eb51c813 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/NotificationValidationManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/NotificationValidationManagerImpl.java @@ -3,7 +3,7 @@ import java.net.URI; import java.net.URISyntaxException; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.exception.OrcidValidationException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidGenerationManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidGenerationManagerImpl.java index abcb572ee20..0f942a53aec 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidGenerationManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidGenerationManagerImpl.java @@ -2,7 +2,7 @@ import java.util.Random; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.ehcache.Cache; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidSearchManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidSearchManagerImpl.java index 19278d47e48..14d89265df0 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidSearchManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidSearchManagerImpl.java @@ -4,7 +4,7 @@ import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.OrcidSearchManager; import org.orcid.core.manager.OrcidSecurityManager; @@ -14,6 +14,7 @@ import org.orcid.jaxb.model.common_v2.OrcidIdentifier; import org.orcid.jaxb.model.search_v2.Result; import org.orcid.jaxb.model.search_v2.Search; +import org.apache.hc.core5.http.ParseException; public class OrcidSearchManagerImpl implements OrcidSearchManager { @@ -27,7 +28,7 @@ public class OrcidSearchManagerImpl implements OrcidSearchManager { private OrcidSolrProfileClient orcidSolrProfileClient; @Override - public Search findOrcidIds(Map> queryParameters) { + public Search findOrcidIds(Map> queryParameters) throws ParseException{ Search search = new Search(); OrcidSolrResults orcidSolrResults = orcidSolrProfileClient.findByDocumentCriteria(queryParameters); if (orcidSolrResults != null && orcidSolrResults.getResults() != null) { diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidSecurityManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidSecurityManagerImpl.java index 225e4b148e2..2f81cf9e1b0 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidSecurityManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidSecurityManagerImpl.java @@ -1,6 +1,5 @@ package org.orcid.core.manager.impl; -import java.security.AccessControlException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -10,8 +9,8 @@ import java.util.Objects; import java.util.Set; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import javax.xml.datatype.XMLGregorianCalendar; import org.orcid.core.exception.DeactivatedException; @@ -26,8 +25,7 @@ import org.orcid.core.manager.OrcidSecurityManager; import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.core.manager.SourceManager; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.security.OrcidRoles; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.core.security.OrcidUserDetailsService; import org.orcid.core.utils.SourceEntityUtils; import org.orcid.jaxb.model.clientgroup.ClientType; @@ -62,8 +60,6 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; import org.orcid.core.exception.OrcidUnauthorizedException; /** @@ -82,9 +78,6 @@ public class OrcidSecurityManagerImpl implements OrcidSecurityManager { @Resource private SourceManager sourceManager; - @Resource - private OrcidOauth2TokenDetailService orcidOauthTokenDetailService; - @Resource private ProfileEntityCacheManager profileEntityCacheManager; @@ -115,10 +108,9 @@ public boolean isAdmin() { public String getClientIdFromAPIRequest() { SecurityContext context = SecurityContextHolder.getContext(); Authentication authentication = context.getAuthentication(); - if (authentication != null && OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) authentication; - OAuth2Request request = oAuth2Authentication.getOAuth2Request(); - return request.getClientId(); + if (authentication != null && OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + return authDetails.getClientId(); } return null; } @@ -224,13 +216,15 @@ public void checkScopes(ScopePathType... requiredScopes) { //Verify the client is not a public client checkClientType(); - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - Set requestedScopes = ScopePathType.getScopesFromStrings(authorizationRequest.getScope()); - for (ScopePathType scope : requestedScopes) { - for (ScopePathType requiredScope : requiredScopes) { - if (scope.hasScope(requiredScope)) { - return; + Authentication authentication = getAuthentication(); + if(OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + Set allowedScopes = ((OrcidBearerTokenAuthentication) authentication).getScopes(); + for (String scope : allowedScopes) { + ScopePathType allowed = ScopePathType.fromValue(scope); + for (ScopePathType requiredScope : requiredScopes) { + if (allowed.hasScope(requiredScope)) { + return; + } } } } @@ -450,10 +444,10 @@ public void checkAndFilter(String orcid, WorkBulk workBulk, ScopePathType scopeP String clientId = null; - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - if(oAuth2Authentication != null) { - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - clientId = authorizationRequest.getClientId(); + Authentication authentication = getAuthentication(); + if(authentication != null) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + clientId = authDetails.getClientId(); } List filteredElements = new ArrayList<>(); @@ -621,10 +615,10 @@ private void checkAndFilter(String orcid, VisibilityType element, ScopePathType // Check if the client is the source of the element if (element instanceof Filterable) { Filterable filterable = (Filterable) element; - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - if (oAuth2Authentication != null) { - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - String clientId = authorizationRequest.getClientId(); + Authentication authentication = getAuthentication(); + if (authentication != null) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + String clientId = authDetails.getClientId(); if (clientId.equals(filterable.retrieveSourcePath())) { // The client doing the request is the source of the element return; @@ -696,105 +690,59 @@ private void checkVisibility(VisibilityType element, ScopePathType requiredScope throw new IllegalArgumentException("Only 'read-only' scopes are allowed"); } } - - private boolean isNonClientCredentialScope(OAuth2Authentication oAuth2Authentication) { - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - Set requestedScopes = ScopePathType.getCombinedScopesFromStringsAsStrings(authorizationRequest.getScope()); - for (String scopeName : requestedScopes) { - ScopePathType scopePathType = ScopePathType.fromValue(scopeName); - if (!scopePathType.isClientCreditalScope()) { - return true; - } - } - return false; - } - - private boolean clientIsProfileSource(String clientId, ProfileEntity profile) { - Boolean claimed = profile.getClaimed(); - SourceEntity source = profile.getSource(); - return source != null && (claimed == null || !claimed) && clientId.equals(SourceEntityUtils.getSourceId(source)); - } - - private OAuth2Authentication getOAuth2Authentication() { - SecurityContext context = SecurityContextHolder.getContext(); - if (context != null && context.getAuthentication() != null) { - Authentication authentication = context.getAuthentication(); - if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) authentication; - return oAuth2Authentication; - } else { - for (GrantedAuthority grantedAuth : authentication.getAuthorities()) { - if ("ROLE_ANONYMOUS".equals(grantedAuth.getAuthority())) { - // Assume that anonymous authority is like not having - // authority at all - return null; - } - } - - throw new AccessControlException( - "Cannot access method with authentication type " + authentication != null ? authentication.toString() : ", as it's null!"); - } - } else { - throw new IllegalStateException("No security context found. This is bad!"); - } - } private void isMyToken(String orcid) { - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - if (oAuth2Authentication == null) { + Authentication authentication = getAuthentication(); + if (authentication == null) { throw new OrcidUnauthorizedException("No OAuth2 authentication found"); } //Verify the client is not a public client checkClientType(); - - String clientId = sourceManager.retrieveSourceOrcid(); - ProfileEntity profile = profileEntityCacheManager.retrieve(orcid); - Authentication userAuthentication = oAuth2Authentication.getUserAuthentication(); - if (userAuthentication != null) { - Object principal = userAuthentication.getPrincipal(); - if (principal instanceof ProfileEntity) { - ProfileEntity profileEntity = (ProfileEntity) principal; - if (!orcid.equals(profileEntity.getId())) { - throw new OrcidUnauthorizedException("Access token is for a different record"); + + if(OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + String userOrcid = authDetails.getUserOrcid(); + // Client credentials flow (no user ORCID) – allow through + if (userOrcid == null) { + Set scopes = authDetails.getScopes(); + if (scopes != null && scopes.contains(ScopePathType.ORCID_PROFILE_CREATE.value())) { + ProfileEntity profile = profileEntityCacheManager.retrieve(orcid); + if (profile != null && Boolean.TRUE.equals(profile.getClaimed())) { + throw new IllegalStateException("Non client credential scope found in client request"); + } } - } else { - throw new OrcidUnauthorizedException("Missing user authentication"); + return; + } + if (orcid.equals(userOrcid)) { + return; } - } else if (isNonClientCredentialScope(oAuth2Authentication) && !clientIsProfileSource(clientId, profile)) { - throw new IllegalStateException("Non client credential scope found in client request"); } + throw new OrcidUnauthorizedException("Access token is for a different record"); } private void checkClientType() { String clientId = sourceManager.retrieveSourceOrcid(); - ClientDetailsEntity client = clientDetailsEntityCacheManager.retrieve(clientId); if(client.getClientType() == null || ClientType.PUBLIC_CLIENT.name().equals(client.getClientType())) { throw new OrcidUnauthorizedException("The client application is forbidden to perform the action."); } } - - @Override - public String getOrcidFromToken(){ - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - if (oAuth2Authentication == null) { - throw new OrcidUnauthorizedException("No OAuth2 authentication found"); - } - - checkScopes(ScopePathType.AUTHENTICATE); - - Authentication userAuthentication = oAuth2Authentication.getUserAuthentication(); - if (userAuthentication != null) { - Object principal = userAuthentication.getPrincipal(); - if (principal instanceof ProfileEntity) { - ProfileEntity profileEntity = (ProfileEntity) principal; - return profileEntity.getId(); - } else { - throw new OrcidUnauthorizedException("Missing user authentication"); + + private Authentication getAuthentication() { + SecurityContext context = SecurityContextHolder.getContext(); + if (context != null && context.getAuthentication() != null) { + Authentication authentication = context.getAuthentication(); + for (GrantedAuthority grantedAuth : authentication.getAuthorities()) { + if ("ROLE_ANONYMOUS".equals(grantedAuth.getAuthority())) { + // Assume that anonymous authority is like not having + // authority at all + return null; + } } + return authentication; } else { - throw new IllegalStateException("Non client credential scope found in client request"); + throw new IllegalStateException("No security context found. This is bad!"); } } } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidUrlManager.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidUrlManager.java index 705c302a8d6..8790dfab096 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidUrlManager.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrcidUrlManager.java @@ -2,12 +2,14 @@ import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.constants.OrcidOauth2Constants; import org.slf4j.Logger; @@ -27,6 +29,7 @@ public class OrcidUrlManager { private static Pattern fileNamePattern = Pattern.compile("https{0,1}:\\/\\/[^\\/]*(.*){0,1}"); private static String PROTOCALL_PATTREN = "http[s]{0,1}:\\/\\/"; + private static final String SAVED_REQUEST_CONTINUE_PARAM = "continue"; public static Pattern SAVED_REQUEST_PATTERN = Pattern .compile("/(my-orcid|inbox|account|account/confirm-deactivate-orcid/[^/]+|developer-tools|self-service(/[^/]+)?|manage-members|admin-actions)(\\?|$)|(oauth/(?![^?]*\\.json))"); @@ -231,6 +234,7 @@ public String determineFullTargetUrlFromSavedRequest(HttpServletRequest request, } if (url != null) { + url = stripSavedRequestInternalParameters(url); String contextPath = request.getContextPath(); // Remove the context path if it looks like we are configured to // run behind nginx. @@ -247,4 +251,31 @@ public String determineFullTargetUrlFromSavedRequest(HttpServletRequest request, return url; } + + private String stripSavedRequestInternalParameters(String url) { + try { + URI uri = new URI(url); + String query = uri.getRawQuery(); + if (query == null || query.isEmpty()) { + return url; + } + + List keptParameters = new ArrayList<>(); + for (String parameter : query.split("&")) { + if (!SAVED_REQUEST_CONTINUE_PARAM.equals(parameter) && !parameter.startsWith(SAVED_REQUEST_CONTINUE_PARAM + "=")) { + keptParameters.add(parameter); + } + } + + if (keptParameters.size() == query.split("&").length) { + return url; + } + + String rebuiltQuery = keptParameters.isEmpty() ? null : String.join("&", keptParameters); + return new URI(uri.getScheme(), uri.getAuthority(), uri.getPath(), rebuiltQuery, uri.getFragment()).toString(); + } catch (URISyntaxException e) { + LOGGER.debug("Unable to strip saved request parameters from {}", url, e); + return url; + } + } } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrgDisambiguatedManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrgDisambiguatedManagerImpl.java index 029d42fdf2f..65904bfe804 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrgDisambiguatedManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrgDisambiguatedManagerImpl.java @@ -8,8 +8,8 @@ import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.tuple.Pair; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrgManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrgManagerImpl.java index 4ba3bbc03ba..0b98c0c0eed 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/OrgManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/OrgManagerImpl.java @@ -3,7 +3,7 @@ import java.io.Writer; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.InvalidDisambiguatedOrgException; import org.orcid.core.manager.OrgManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/OtherNameManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/OtherNameManagerImpl.java index 695336f9e85..5ec17d4b868 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/OtherNameManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/OtherNameManagerImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/PeerReviewManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/PeerReviewManagerImpl.java index 58d161de081..8225f22ca10 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/PeerReviewManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/PeerReviewManagerImpl.java @@ -7,7 +7,7 @@ import java.util.Map; import java.util.Optional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.exception.GroupIdRecordNotFoundException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/PreferenceManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/PreferenceManagerImpl.java index bde29bf929d..aff2fbc918f 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/PreferenceManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/PreferenceManagerImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.PreferenceManager; import org.orcid.core.manager.v3.ProfileHistoryEventManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileEntityCacheManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileEntityCacheManagerImpl.java index 09c075d0dd3..921d8c75b4c 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileEntityCacheManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileEntityCacheManagerImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.cache.GenericCacheManager; import org.orcid.core.cache.OrcidString; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileEntityManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileEntityManagerImpl.java index e711732854a..5381db8981f 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileEntityManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileEntityManagerImpl.java @@ -4,7 +4,7 @@ import java.util.Date; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.manager.EncryptionManager; @@ -13,7 +13,6 @@ import org.orcid.core.manager.read_only.RecordNameManagerReadOnly; import org.orcid.core.manager.read_only.impl.ProfileEntityManagerReadOnlyImpl; import org.orcid.core.manager.v3.EmailManager; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.jaxb.model.clientgroup.MemberType; import org.orcid.jaxb.model.common_v2.Locale; import org.orcid.jaxb.model.record_v2.Name; @@ -33,9 +32,6 @@ public class ProfileEntityManagerImpl extends ProfileEntityManagerReadOnlyImpl i @Resource(name = "emailManagerV3") private EmailManager emailManagerV3; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenService; - @Resource private RecordNameManager recordNameManager; @@ -132,11 +128,6 @@ public boolean unreviewProfile(String orcid) { return profileDao.unreviewProfile(orcid); } - @Override - public void disableApplication(Long tokenId, String userOrcid) { - orcidOauth2TokenService.disableAccessToken(tokenId, userOrcid); - } - @Override public String getOrcidHash(String orcid) throws NoSuchAlgorithmException { if (PojoUtil.isEmpty(orcid)) { diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileFundingManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileFundingManagerImpl.java index 859da93e66c..33b5fcd0b4b 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileFundingManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileFundingManagerImpl.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.NotificationManager; import org.orcid.core.manager.OrcidSecurityManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileKeywordManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileKeywordManagerImpl.java index c60b0749615..c76de4d7e1d 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileKeywordManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ProfileKeywordManagerImpl.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/RecordNameManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/RecordNameManagerImpl.java index ac261e3da8a..d595718a100 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/RecordNameManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/RecordNameManagerImpl.java @@ -2,7 +2,7 @@ import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.RecordNameManager; import org.orcid.core.manager.SourceNameCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ReferenceDataManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ReferenceDataManagerImpl.java index 68153128955..d2aaf6fe8c4 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ReferenceDataManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ReferenceDataManagerImpl.java @@ -3,7 +3,7 @@ import java.util.Map; import java.util.TreeMap; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.ReferenceDataManager; import org.orcid.persistence.dao.GenericDao; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/RegistrationManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/RegistrationManagerImpl.java index 3759cb92210..b1ffb1318aa 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/RegistrationManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/RegistrationManagerImpl.java @@ -7,7 +7,7 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.common.manager.EmailFrequencyManager; import org.orcid.core.manager.AdminManager; @@ -46,8 +46,6 @@ import org.orcid.pojo.ajaxForm.Text; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Required; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionCallback; @@ -103,7 +101,6 @@ public class RegistrationManagerImpl implements RegistrationManager { @Resource private OrgDisambiguatedManager orgDisambiguatedManager; - @Required public void setEncryptionManager(EncryptionManager encryptionManager) { this.encryptionManager = encryptionManager; } @@ -166,7 +163,7 @@ public String doInTransaction(TransactionStatus status) { if(PojoUtil.isEmpty(duplicateAdditionalAddress)){ duplicateAdditionalAddress = emailAddressAdditional; } else { - throw new InvalidRequestException("More than 2 duplicate emails"); + throw new IllegalArgumentException("More than 2 duplicate emails"); } } } @@ -220,7 +217,7 @@ public String doInTransaction(TransactionStatus status) { }); return orcidId; } catch (Exception e) { - throw new InvalidRequestException("Unable to register user due: " + e.getMessage(), e.getCause()); + throw new IllegalArgumentException("Unable to register user due: " + e.getMessage(), e.getCause()); } } @@ -336,7 +333,7 @@ private String createMinimalProfile(Registration registration, boolean usedCaptc * @param emailAddress * The email we want to check */ - private void checkAutoDeprecateIsEnabledForEmail(String emailAddress) throws InvalidRequestException { + private void checkAutoDeprecateIsEnabledForEmail(String emailAddress) { // If the email doesn't exists, just return if (!emailManager.emailExists(emailAddress)) { return; @@ -344,12 +341,12 @@ private void checkAutoDeprecateIsEnabledForEmail(String emailAddress) throws Inv // Check the record is not claimed if (profileEntityManager.isProfileClaimedByEmail(emailAddress)) { - throw new InvalidRequestException("Email " + emailAddress + " already exists and is claimed, so, it can't be used again"); + throw new IllegalArgumentException("Email " + emailAddress + " already exists and is claimed, so, it can't be used again"); } // Check the auto deprecate is enabled for this email address if (!emailManager.isAutoDeprecateEnableForEmail(emailAddress)) { - throw new InvalidRequestException("Autodeprecate is not enabled for " + emailAddress); + throw new IllegalArgumentException("Autodeprecate is not enabled for " + emailAddress); } } @@ -363,7 +360,7 @@ private String getOrcidIdFromEmail(String emailAddress) { Map emailMap = emailManager.findOricdIdsByCommaSeparatedEmails(emailAddress); String unclaimedOrcid = emailMap == null ? null : emailMap.get(emailAddress); if (PojoUtil.isEmpty(unclaimedOrcid)) { - throw new InvalidRequestException("Unable to find orcid id for " + emailAddress); + throw new IllegalArgumentException("Unable to find orcid id for " + emailAddress); } return unclaimedOrcid; } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/ResearcherUrlManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/ResearcherUrlManagerImpl.java index ccf5b3fd2bc..f02b634d1e9 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/ResearcherUrlManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/ResearcherUrlManagerImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/SourceManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/SourceManagerImpl.java index b4f7453cb33..99dbf62272e 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/SourceManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/SourceManagerImpl.java @@ -2,25 +2,20 @@ import java.util.Collection; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.common.util.AuthenticationUtils; import org.orcid.core.manager.ClientDetailsManager; import org.orcid.core.manager.SourceManager; import org.orcid.core.manager.SourceNameCacheManager; import org.orcid.core.manager.read_only.impl.ManagerReadOnlyBaseImpl; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.persistence.dao.ProfileDao; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.orcid.persistence.jpa.entities.SourceEntity; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; -import org.springframework.security.web.authentication.switchuser.SwitchUserGrantedAuthority; /** * @@ -49,29 +44,26 @@ public SourceEntity retrieveSourceEntity() { if (authentication == null) { return null; } - - // API - if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Request authorizationRequest = ((OAuth2Authentication) authentication).getOAuth2Request(); - String clientId = authorizationRequest.getClientId(); + + SourceEntity sourceEntity = new SourceEntity(); + // API authentication + if (OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + String clientId = authDetails.getClientId(); ClientDetailsEntity clientDetails = clientDetailsManager.findByClientId(clientId); - SourceEntity sourceEntity = new SourceEntity(); - ClientDetailsEntity sourceClient = new ClientDetailsEntity(clientId, clientDetails.getClientName()); sourceClient.setUserOBOEnabled(clientDetails.isUserOBOEnabled()); - sourceEntity.setSourceClient(sourceClient); - - return sourceEntity; + sourceEntity.setSourceClient(sourceClient); + } else { + // User authentication + String userOrcid = AuthenticationUtils.retrieveEffectiveOrcid(); + if (userOrcid == null) { + // Must be system role + return null; + } + sourceEntity.setSourceProfile(new ProfileEntity(userOrcid)); + sourceEntity.setCachedSourceName(sourceNameCacheManager.retrieve(userOrcid)); } - String userOrcid = AuthenticationUtils.retrieveEffectiveOrcid(); - if(userOrcid == null){ - // Must be system role - return null; - } - // Normal web user - SourceEntity sourceEntity = new SourceEntity(); - sourceEntity.setSourceProfile(new ProfileEntity(userOrcid)); - sourceEntity.setCachedSourceName(sourceNameCacheManager.retrieve(userOrcid)); return sourceEntity; } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/SourceNameCacheManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/SourceNameCacheManagerImpl.java index c567e21a9d7..414af291970 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/SourceNameCacheManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/SourceNameCacheManagerImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.StringUtils; import org.ehcache.Cache; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/StatusManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/StatusManagerImpl.java index f7898b9c925..9564d0b346d 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/StatusManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/StatusManagerImpl.java @@ -4,8 +4,8 @@ import java.util.LinkedHashMap; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.PersistenceException; +import jakarta.annotation.Resource; +import jakarta.persistence.PersistenceException; import org.orcid.core.manager.StatusManager; import org.orcid.persistence.dao.MiscDao; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/SubjectManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/SubjectManagerImpl.java index 25f37b9cd87..373e3db144f 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/SubjectManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/SubjectManagerImpl.java @@ -3,7 +3,7 @@ import java.util.Map; import java.util.TreeMap; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.SubjectManager; import org.orcid.persistence.dao.GenericDao; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/TemplateManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/TemplateManagerImpl.java index 68530f367dd..2ac57446c24 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/TemplateManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/TemplateManagerImpl.java @@ -5,7 +5,7 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.locale.LocaleManager; import org.orcid.core.manager.TemplateManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/TwoFactorAuthenticationManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/TwoFactorAuthenticationManagerImpl.java index 9b5426f5c20..21761d9dedb 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/TwoFactorAuthenticationManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/TwoFactorAuthenticationManagerImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.jboss.aerogear.security.otp.Totp; import org.jboss.aerogear.security.otp.api.Base32; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/UserConnectionManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/UserConnectionManagerImpl.java index e95927b5547..91f9392e2d3 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/UserConnectionManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/UserConnectionManagerImpl.java @@ -2,7 +2,7 @@ import java.util.*; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.constants.OrcidOauth2Constants; import org.orcid.core.manager.NotificationManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/WebhookManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/WebhookManagerImpl.java index 90ea0b2a43c..fbee1f1b970 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/WebhookManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/WebhookManagerImpl.java @@ -16,7 +16,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.WebhookManager; import org.orcid.core.utils.http.HttpRequestUtils; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/WorkEntityCacheManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/WorkEntityCacheManagerImpl.java index a26693c58ea..ec476ccce89 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/WorkEntityCacheManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/WorkEntityCacheManagerImpl.java @@ -10,7 +10,7 @@ import java.util.function.Function; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.collections4.ListUtils; import org.ehcache.Cache; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/impl/WorkManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/impl/WorkManagerImpl.java index f56fb8dc841..11b52d8a7fb 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/impl/WorkManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/impl/WorkManagerImpl.java @@ -10,7 +10,7 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.converter.ContributorsRolesAndSequencesConverterV2; import org.orcid.core.exception.ExceedMaxNumberOfElementsException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/ClientDetailsManagerReadOnly.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/ClientDetailsManagerReadOnly.java index 8cbdf99badd..af9d9e67fd3 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/ClientDetailsManagerReadOnly.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/ClientDetailsManagerReadOnly.java @@ -4,9 +4,8 @@ import java.util.List; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.springframework.security.oauth2.provider.ClientDetailsService; -public interface ClientDetailsManagerReadOnly extends ClientDetailsService { +public interface ClientDetailsManagerReadOnly { ClientDetailsEntity findByClientId(String orcid); List getAll(); diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/AddressManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/AddressManagerReadOnlyImpl.java index 9e4578eed85..e13d79d673c 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/AddressManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/AddressManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbAddressAdapter; import org.orcid.core.manager.read_only.AddressManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/AffiliationsManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/AffiliationsManagerReadOnlyImpl.java index 21352d7d5b0..6b3c960a1dc 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/AffiliationsManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/AffiliationsManagerReadOnlyImpl.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbEducationAdapter; import org.orcid.core.adapter.JpaJaxbEmploymentAdapter; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ClientDetailsManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ClientDetailsManagerReadOnlyImpl.java index fed04a51b54..ee266e5616d 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ClientDetailsManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ClientDetailsManagerReadOnlyImpl.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.orcid.core.adapter.JpaJaxbClientAdapter; import org.orcid.core.manager.EncryptionManager; @@ -17,8 +17,6 @@ import org.orcid.persistence.jpa.entities.ClientDetailsEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; -import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; public class ClientDetailsManagerReadOnlyImpl implements ClientDetailsManagerReadOnly { @@ -49,31 +47,6 @@ public void setClientSecretDao(ClientSecretDao clientSecretDao) { public void setClientRedirectDao(ClientRedirectDao clientRedirectDao) { this.clientRedirectDao = clientRedirectDao; } - - /** - * Load a client by the client id. This method must NOT return null. - * - * @param clientId - * The client id. - * @return The client details. - * @throws org.springframework.security.oauth2.common.exceptions.OAuth2Exception - * If the client account is locked, expired, disabled, or for - * any other reason. - */ - @Override - public ClientDetailsEntity loadClientByClientId(String clientId) throws OAuth2Exception { - ClientDetailsEntity clientDetails = findByClientId(clientId); - if (clientDetails != null) { - if (!clientDetails.getClientId().equals(clientId)) - LOGGER.error("Client getClientId doesn't match. Requested: " + clientId + " Returned: " + clientDetails.getClientId()); - if (!clientDetails.getId().equals(clientId)) - LOGGER.error("Client getId() doesn't match. Requested: " + clientId + " Returned: " + clientDetails.getId()); - clientDetails.setDecryptedClientSecret(encryptionManager.decryptForInternalUse(clientDetails.getClientSecretForJpa())); - return clientDetails; - } else { - throw new InvalidClientException("Client not found: " + clientId); - } - } @Override public ClientDetailsEntity findByClientId(String clientId) { diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ClientManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ClientManagerReadOnlyImpl.java index afe2763ae22..193105b5e69 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ClientManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ClientManagerReadOnlyImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbClientAdapter; import org.orcid.core.manager.read_only.ClientManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/EmailManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/EmailManagerReadOnlyImpl.java index 0a4a20b6364..bc04f5a173d 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/EmailManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/EmailManagerReadOnlyImpl.java @@ -7,7 +7,7 @@ import java.util.TreeMap; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.adapter.JpaJaxbEmailAdapter; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ExternalIdentifierManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ExternalIdentifierManagerReadOnlyImpl.java index e543b6b73fe..eaf1db0d4a6 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ExternalIdentifierManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ExternalIdentifierManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbExternalIdentifierAdapter; import org.orcid.core.manager.read_only.ExternalIdentifierManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/GroupIdRecordManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/GroupIdRecordManagerReadOnlyImpl.java index 8240a5164b1..c4c739a9318 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/GroupIdRecordManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/GroupIdRecordManagerReadOnlyImpl.java @@ -3,8 +3,8 @@ import java.util.List; import java.util.Optional; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.orcid.core.adapter.JpaJaxbGroupIdRecordAdapter; import org.orcid.core.exception.GroupIdRecordNotFoundException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/OtherNameManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/OtherNameManagerReadOnlyImpl.java index 6f9cce7e70a..27ec88e772f 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/OtherNameManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/OtherNameManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbOtherNameAdapter; import org.orcid.core.manager.read_only.OtherNameManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/PeerReviewManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/PeerReviewManagerReadOnlyImpl.java index 54a8362bf22..a3d50bba7ac 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/PeerReviewManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/PeerReviewManagerReadOnlyImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbPeerReviewAdapter; import org.orcid.core.manager.read_only.PeerReviewManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/PersonDetailsManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/PersonDetailsManagerReadOnlyImpl.java index 2663944909d..7e766f6e3f3 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/PersonDetailsManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/PersonDetailsManagerReadOnlyImpl.java @@ -36,7 +36,7 @@ import liquibase.repackaged.org.apache.commons.lang3.StringUtils; -import javax.annotation.Resource; +import jakarta.annotation.Resource; public class PersonDetailsManagerReadOnlyImpl extends ManagerReadOnlyBaseImpl implements PersonDetailsManagerReadOnly { diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ProfileFundingManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ProfileFundingManagerReadOnlyImpl.java index 2801e82eb9d..30536301c55 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ProfileFundingManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ProfileFundingManagerReadOnlyImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbFundingAdapter; import org.orcid.core.manager.read_only.ProfileFundingManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ProfileKeywordManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ProfileKeywordManagerReadOnlyImpl.java index 8b5e72e2cd2..d91af3764f0 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ProfileKeywordManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ProfileKeywordManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbKeywordAdapter; import org.orcid.core.manager.read_only.ProfileKeywordManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordCorrectionsManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordCorrectionsManagerReadOnlyImpl.java index 7c3e126fc80..93933a80440 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordCorrectionsManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordCorrectionsManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbInvalidRecordDataChangeAdapter; import org.orcid.core.manager.read_only.RecordCorrectionsManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordManagerReadOnlyImpl.java index cad178049c5..f5820e586bf 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordManagerReadOnlyImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.read_only.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.core.manager.impl.OrcidUrlManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordNameManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordNameManagerReadOnlyImpl.java index 4d509854c85..cf88c7167c4 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordNameManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/RecordNameManagerReadOnlyImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.read_only.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbNameAdapter; import org.orcid.core.manager.read_only.RecordNameManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ResearcherUrlManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ResearcherUrlManagerReadOnlyImpl.java index eea0f0c45ce..b6ae42e0629 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ResearcherUrlManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/ResearcherUrlManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbResearcherUrlAdapter; import org.orcid.core.manager.read_only.ResearcherUrlManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/WorkManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/WorkManagerReadOnlyImpl.java index 6f2cb414396..0d2bc41fa82 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/WorkManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/read_only/impl/WorkManagerReadOnlyImpl.java @@ -6,7 +6,7 @@ import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.JpaJaxbWorkAdapter; import org.orcid.core.exception.ExceedMaxNumberOfPutCodesException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/EmailManager.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/EmailManager.java index 9779888603f..02a6dd480f8 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/EmailManager.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/EmailManager.java @@ -3,7 +3,7 @@ import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.orcid.core.manager.v3.read_only.EmailManagerReadOnly; import org.orcid.jaxb.model.v3.release.common.Visibility; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/OrcidSearchManager.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/OrcidSearchManager.java index 6396623fbaf..c3ad9d9c1dd 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/OrcidSearchManager.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/OrcidSearchManager.java @@ -6,6 +6,9 @@ import org.orcid.jaxb.model.v3.release.search.Search; import org.orcid.jaxb.model.v3.release.search.expanded.ExpandedSearch; +import org.apache.hc.core5.http.ParseException; + + /** * Class to retrieve OrcidMessage objects (with nested Search Results) relating * to all the information that could be found given the search criteria found. @@ -25,11 +28,11 @@ public interface OrcidSearchManager { static final int MAX_SEARCH_ROWS = 1000; - Search findOrcidIds(Map> queryParameters); + Search findOrcidIds(Map> queryParameters) throws ParseException; - Search findOrcidsByQuery(String query, Integer start, Integer rows); + Search findOrcidsByQuery(String query, Integer start, Integer rows) throws ParseException; - String findOrcidIdsAsCSV(Map> solrParams); + String findOrcidIdsAsCSV(Map> solrParams) throws ParseException; ExpandedSearch expandedSearch(Map> solrParams); } \ No newline at end of file diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/OrcidSecurityManager.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/OrcidSecurityManager.java index ca2426afc3f..fb2721cdb90 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/OrcidSecurityManager.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/OrcidSecurityManager.java @@ -2,7 +2,7 @@ import java.util.Collection; -import javax.persistence.NoResultException; +import jakarta.persistence.NoResultException; import org.orcid.core.exception.DeactivatedException; import org.orcid.core.exception.LockedException; @@ -57,6 +57,4 @@ public interface OrcidSecurityManager { void checkAndFilter(String orcid, Person person); void checkAndFilter(String orcid, Record record); - - String getOrcidFromToken(); } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ActivityManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ActivityManagerImpl.java index cbf8ef4b645..0e8469f91b7 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ActivityManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ActivityManagerImpl.java @@ -3,7 +3,7 @@ import java.util.LinkedHashMap; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.ActivityManager; import org.orcid.core.manager.v3.AffiliationsManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/AddressManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/AddressManagerImpl.java index 996eac8440e..ac27b34f90d 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/AddressManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/AddressManagerImpl.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/AffiliationsManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/AffiliationsManagerImpl.java index d8cb5665d6e..664ed3c93e0 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/AffiliationsManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/AffiliationsManagerImpl.java @@ -6,8 +6,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.orcid.core.manager.ClientDetailsEntityCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/BibtexManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/BibtexManagerImpl.java index 6f0d30623c8..728b803eaf5 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/BibtexManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/BibtexManagerImpl.java @@ -3,8 +3,8 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.orcid.core.manager.DOIManager; import org.orcid.core.manager.v3.ActivitiesSummaryManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/BiographyManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/BiographyManagerImpl.java index 00e58330015..fb99436d598 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/BiographyManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/BiographyManagerImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.v3.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.BiographyManager; import org.orcid.core.manager.ProfileEntityCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ClientDetailsManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ClientDetailsManagerImpl.java index 71a60d5940a..50ca724433c 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ClientDetailsManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ClientDetailsManagerImpl.java @@ -11,7 +11,7 @@ import java.util.TreeSet; import java.util.UUID; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.time.DateUtils; import org.orcid.core.exception.ClientAlreadyActiveException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ClientManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ClientManagerImpl.java index 2b0a41ca74a..6837887043a 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ClientManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ClientManagerImpl.java @@ -9,8 +9,8 @@ import java.util.Set; import java.util.UUID; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.orcid.core.adapter.v3.JpaJaxbClientAdapter; import org.orcid.core.constants.OrcidOauth2Constants; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/EmailManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/EmailManagerImpl.java index 5b59dd67221..4efb86aa875 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/EmailManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/EmailManagerImpl.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.orcid.core.manager.v3.EmailManager; @@ -90,13 +90,13 @@ public boolean verifyPrimaryEmail(String orcid) { profileEmailDomainManager.processDomain(orcid, primaryEmail); } return result; - } catch (javax.persistence.NoResultException nre) { + } catch (jakarta.persistence.NoResultException nre) { String alternativePrimaryEmail = emailDao.findNewestVerifiedOrNewestEmail(orcid); emailDao.updatePrimary(orcid, alternativePrimaryEmail); String message = String.format("User with orcid %s have no primary email, so, we are setting the newest verified email, or, the newest email in case non is verified as the primary one", orcid); LOGGER.error(message); throw nre; - } catch (javax.persistence.NonUniqueResultException nure) { + } catch (jakarta.persistence.NonUniqueResultException nure) { String alternativePrimaryEmail = emailDao.findNewestPrimaryEmail(orcid); emailDao.updatePrimary(orcid, alternativePrimaryEmail); String message = String.format("User with orcid %s have more than one primary email, so, we are setting the latest modified primary as the primary one", orcid); diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ExternalIdentifierManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ExternalIdentifierManagerImpl.java index 4bff791ffcd..823a80a1f65 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ExternalIdentifierManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ExternalIdentifierManagerImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/FindMyStuffManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/FindMyStuffManagerImpl.java index b377a551d1b..1c64c4e67d1 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/FindMyStuffManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/FindMyStuffManagerImpl.java @@ -10,15 +10,15 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbNotificationAdapter; import org.orcid.core.manager.ClientDetailsEntityCacheManager; import org.orcid.core.manager.impl.OrcidUrlManager; import org.orcid.core.manager.v3.FindMyStuffManager; import org.orcid.core.manager.v3.NotificationManager; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.core.manager.v3.read_only.WorkManagerReadOnly; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.utils.v3.identifiers.finders.Finder; import org.orcid.jaxb.model.clientgroup.RedirectUriType; import org.orcid.jaxb.model.v3.release.notification.Notification; @@ -50,15 +50,15 @@ public class FindMyStuffManagerImpl implements FindMyStuffManager { @Resource private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - @Resource(name = "jpaJaxbNotificationAdapterV3") private JpaJaxbNotificationAdapter notificationAdapter; @Resource private FindMyStuffHistoryDao findMyStuffHistoryDao; + @Resource(name = "clientDetailsManagerReadOnlyV3") + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; + @Resource List finders = new ArrayList(); @@ -111,7 +111,7 @@ public List findIfAppropriate(String orcid) { } // check for existing permissions for (Finder f : finders) { - if (f.isEnabled() && orcidOauth2TokenDetailService.doesClientKnowUser(f.getRelatedClientId(), orcid)) + if (f.isEnabled() && clientDetailsManagerReadOnly.doesClientKnowUser(f.getRelatedClientId(), orcid)) skipServices.add(f.getFinderName()); } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GivenPermissionToManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GivenPermissionToManagerImpl.java index 94536c33262..468f5a99d33 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GivenPermissionToManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GivenPermissionToManagerImpl.java @@ -3,7 +3,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.GivenPermissionToManager; import org.orcid.core.manager.v3.NotificationManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupIdRecordManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupIdRecordManagerImpl.java index 9e75ee8e5dc..fe9c2704bc3 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupIdRecordManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupIdRecordManagerImpl.java @@ -4,7 +4,7 @@ import java.net.URISyntaxException; import java.util.GregorianCalendar; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.codehaus.jettison.json.JSONException; import org.orcid.core.exception.*; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupingSuggestionManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupingSuggestionManagerImpl.java index 0eb9b524244..39bd24ec935 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupingSuggestionManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupingSuggestionManagerImpl.java @@ -3,7 +3,7 @@ import java.util.List; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.MissingGroupableExternalIDException; import org.orcid.core.manager.v3.GroupingSuggestionManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupingSuggestionsCacheManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupingSuggestionsCacheManagerImpl.java index 3e578ffdb97..c60adc19980 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupingSuggestionsCacheManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/GroupingSuggestionsCacheManagerImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.ehcache.Cache; import org.orcid.core.manager.v3.GroupingSuggestionsCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/MembersManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/MembersManagerImpl.java index 1a3ca18dcf4..fa779430c27 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/MembersManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/MembersManagerImpl.java @@ -9,7 +9,7 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.StringUtils; import org.orcid.core.common.manager.EmailFrequencyManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/NotificationManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/NotificationManagerImpl.java index f8c5c2e98ec..763d40b3bf1 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/NotificationManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/NotificationManagerImpl.java @@ -16,9 +16,9 @@ import org.orcid.core.manager.v3.NotificationManager; import org.orcid.core.manager.v3.RecordNameManager; import org.orcid.core.manager.v3.SourceManager; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.core.manager.v3.read_only.EmailManagerReadOnly; import org.orcid.core.manager.v3.read_only.impl.ManagerReadOnlyBaseImpl; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.togglz.Features; import org.orcid.core.utils.ReleaseNameUtils; import org.orcid.core.utils.SourceEntityUtils; @@ -42,14 +42,12 @@ import org.orcid.persistence.jpa.entities.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Required; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.MessageSource; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.io.UnsupportedEncodingException; -import java.math.BigInteger; import java.net.URLEncoder; import java.text.MessageFormat; import java.time.Instant; @@ -102,9 +100,6 @@ public class NotificationManagerImpl extends ManagerReadOnlyBaseImpl implements @Resource(name = "sourceManagerV3") private SourceManager sourceManager; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - @Resource private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; @@ -129,6 +124,9 @@ public class NotificationManagerImpl extends ManagerReadOnlyBaseImpl implements @Resource(name = "recordNameManagerV3") private RecordNameManager recordNameManagerV3; + @Resource(name = "clientDetailsManagerReadOnlyV3") + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; + @Value("${org.orcid.notifications.auto.archive.days:181}") private Integer autoArchiveDays; @@ -141,12 +139,12 @@ public class NotificationManagerImpl extends ManagerReadOnlyBaseImpl implements @Value("${org.orcid.notifications.auto.delete.batchsize:25000}") private Integer autoDeleteBatchSize; - @Required + public void setTemplateManager(TemplateManager templateManager) { this.templateManager = templateManager; } - @Required + public void setEncryptionManager(EncryptionManager encryptionManager) { this.encryptionManager = encryptionManager; } @@ -543,7 +541,7 @@ public List filterActionedNotificationAlerts(Collection { // Filter only INSTITUTIONAL_CONNECTION notifications if (NotificationType.INSTITUTIONAL_CONNECTION.equals(n.getNotificationType())) { - boolean alreadyConnected = orcidOauth2TokenDetailService.doesClientKnowUser(n.getSource().retrieveSourcePath(), userOrcid); + boolean alreadyConnected = clientDetailsManagerReadOnly.doesClientKnowUser(n.getSource().retrieveSourcePath(), userOrcid); if (alreadyConnected) { flagAsArchived(userOrcid, n.getPutCode(), false); } @@ -783,8 +781,7 @@ public Integer deleteOffsetNotifications() { toDelete = notificationDao.findNotificationsToDeleteByOffset((notificationDeleteOffset == null ? 10000 : notificationDeleteOffset), recordsPerBatch); LOGGER.info("Got batch of {} notifications to delete", toDelete.size()); for (Object[] o : toDelete) { - BigInteger big = (BigInteger) o[0]; - Long id = big.longValue(); + Long id = ((Number) o[0]).longValue(); String orcid = (String) o[1]; LOGGER.info("About to delete old notification: id={}, orcid={}", new Object[] { id, orcid }); notificationDao.deleteNotificationItemByNotificationId(id); diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/NotificationValidationManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/NotificationValidationManagerImpl.java index d9ba343c9be..c12861d73d2 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/NotificationValidationManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/NotificationValidationManagerImpl.java @@ -3,7 +3,7 @@ import java.net.URI; import java.net.URISyntaxException; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.exception.OrcidValidationException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrcidSearchManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrcidSearchManagerImpl.java index cbffaa57bd9..0a43a957b3e 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrcidSearchManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrcidSearchManagerImpl.java @@ -7,9 +7,9 @@ import java.util.Set; import java.util.TreeSet; -import javax.annotation.Resource; +import jakarta.annotation.Resource; -import org.apache.http.client.ClientProtocolException; +import org.apache.hc.client5.http.ClientProtocolException; import org.orcid.core.exception.ApplicationException; import org.orcid.core.manager.v3.OrcidSearchManager; import org.orcid.core.manager.v3.OrcidSecurityManager; @@ -25,6 +25,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.hc.core5.http.ParseException; + + public class OrcidSearchManagerImpl implements OrcidSearchManager { private static final Logger LOGGER = LoggerFactory.getLogger(OrcidSearchManagerImpl.class); @@ -42,7 +45,7 @@ public class OrcidSearchManagerImpl implements OrcidSearchManager { private CSVSolrClient csvSolrClient; @Override - public Search findOrcidIds(Map> queryParameters) { + public Search findOrcidIds(Map> queryParameters) throws ParseException { Search search = new Search(); OrcidSolrResults orcidSolrResults = orcidSolrProfileClient.findByDocumentCriteria(queryParameters); setSearchResults(orcidSolrResults, search); @@ -50,7 +53,7 @@ public Search findOrcidIds(Map> queryParameters) { } @Override - public Search findOrcidsByQuery(String query, Integer start, Integer rows) { + public Search findOrcidsByQuery(String query, Integer start, Integer rows) throws ParseException { Search search = new Search(); OrcidSolrResults orcidSolrResults = orcidSolrProfileClient.findByDocumentCriteria(query, start, rows); setSearchResults(orcidSolrResults, search); @@ -71,7 +74,7 @@ private void setSearchResults(OrcidSolrResults solrResults, Search searchResults } @Override - public String findOrcidIdsAsCSV(Map> solrParams) { + public String findOrcidIdsAsCSV(Map> solrParams) throws ParseException { try { return csvSolrClient.findCSVByDocumentCriteria(solrParams); } catch (ClientProtocolException e) { diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrcidSecurityManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrcidSecurityManagerImpl.java index 894e448237f..3e8987f695c 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrcidSecurityManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrcidSecurityManagerImpl.java @@ -1,6 +1,5 @@ package org.orcid.core.manager.v3.impl; -import java.security.AccessControlException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -10,8 +9,8 @@ import java.util.Objects; import java.util.Set; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import javax.xml.datatype.XMLGregorianCalendar; import org.orcid.core.exception.DeactivatedException; @@ -28,8 +27,7 @@ import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.core.manager.v3.OrcidSecurityManager; import org.orcid.core.manager.v3.SourceManager; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.security.OrcidRoles; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.core.security.OrcidUserDetailsService; import org.orcid.core.utils.SourceEntityUtils; import org.orcid.jaxb.model.clientgroup.ClientType; @@ -67,12 +65,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; /** * @@ -90,9 +84,6 @@ public class OrcidSecurityManagerImpl implements OrcidSecurityManager { @Resource(name = "sourceManagerV3") private SourceManager sourceManager; - @Resource - private OrcidOauth2TokenDetailService orcidOauthTokenDetailService; - @Resource private ProfileEntityCacheManager profileEntityCacheManager; @@ -128,10 +119,9 @@ public boolean isPasswordConfirmationRequired() { public String getClientIdFromAPIRequest() { SecurityContext context = SecurityContextHolder.getContext(); Authentication authentication = context.getAuthentication(); - if (authentication != null && OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) authentication; - OAuth2Request request = oAuth2Authentication.getOAuth2Request(); - return request.getClientId(); + if (authentication != null && OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + return authDetails.getClientId(); } return null; } @@ -246,15 +236,19 @@ private void checkScopes(boolean tokenAlreadyChecked, ScopePathType... requiredS checkClientType(); } - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - Set requestedScopes = ScopePathType.getScopesFromStrings(authorizationRequest.getScope()); - for (ScopePathType scope : requestedScopes) { - for (ScopePathType requiredScope : requiredScopes) - if (scope.hasScope(requiredScope)) { - return; + Authentication authentication = getAuthentication(); + if (authentication != null) { + Set allowedScopes = ((OrcidBearerTokenAuthentication) authentication).getScopes(); + for (String scope : allowedScopes) { + ScopePathType allowed = ScopePathType.fromValue(scope); + for (ScopePathType requiredScope : requiredScopes) { + if (allowed.hasScope(requiredScope)) { + return; + } } + } } + throw new OrcidAccessControlException(); } @@ -541,10 +535,9 @@ public void checkAndFilter(String orcid, WorkBulk workBulk, ScopePathType scopeP } String clientId = null; - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - if (oAuth2Authentication != null) { - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - clientId = authorizationRequest.getClientId(); + Authentication authentication = getAuthentication(); + if (authentication != null) { + clientId = ((OrcidBearerTokenAuthentication) authentication).getClientId(); } List filteredElements = new ArrayList<>(); @@ -725,13 +718,14 @@ private void checkAndFilter(String orcid, VisibilityType element, ScopePathType // Check if the client is the source of the element if (element instanceof Filterable) { Filterable filterable = (Filterable) element; - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - if (oAuth2Authentication != null) { - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - String clientId = authorizationRequest.getClientId(); - if (clientId.equals(filterable.retrieveSourcePath())) { - // The client doing the request is the source of the element - return; + Authentication authentication = getAuthentication(); + if (authentication != null) { + if(OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + String clientId = ((OrcidBearerTokenAuthentication) authentication).getClientId(); + if (clientId.equals(filterable.retrieveSourcePath())) { + // The client doing the request is the source of the element + return; + } } } } @@ -783,75 +777,35 @@ private void checkVisibility(VisibilityType element, ScopePathType requiredScope } } - private boolean isNonClientCredentialScope(OAuth2Authentication oAuth2Authentication) { - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - Set requestedScopes = ScopePathType.getCombinedScopesFromStringsAsStrings(authorizationRequest.getScope()); - for (String scopeName : requestedScopes) { - ScopePathType scopePathType = ScopePathType.fromValue(scopeName); - if (!scopePathType.isClientCreditalScope()) { - return true; - } - } - return false; - } - - private boolean clientIsProfileSource(String clientId, ProfileEntity profile) { - Boolean claimed = profile.getClaimed(); - SourceEntity source = profile.getSource(); - return source != null && (claimed == null || !claimed) && clientId.equals(SourceEntityUtils.getSourceId(source)); - } - - private OAuth2Authentication getOAuth2Authentication() { - SecurityContext context = SecurityContextHolder.getContext(); - if (context != null && context.getAuthentication() != null) { - Authentication authentication = context.getAuthentication(); - if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) authentication; - return oAuth2Authentication; - } else { - for (GrantedAuthority grantedAuth : authentication.getAuthorities()) { - if ("ROLE_ANONYMOUS".equals(grantedAuth.getAuthority())) { - // Assume that anonymous authority is like not having - // authority at all - return null; - } - } - - throw new AccessControlException( - "Cannot access method with authentication type " + authentication != null ? authentication.toString() : ", as it's null!"); - } - } else { - throw new IllegalStateException("No security context found. This is bad!"); - } - } - + //TODO: this method is doing exactly the same that the TokenTargetFilter does, so, lets review it and leave only one. private void isMyToken(String orcid) { - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - if (oAuth2Authentication == null) { + Authentication authentication = getAuthentication(); + if (authentication == null) { throw new OrcidUnauthorizedException("No OAuth2 authentication found"); } - // Verify the client is not a public client + //Verify the client is not a public client checkClientType(); - String clientId = sourceManager.retrieveActiveSourceId(); - Authentication userAuthentication = oAuth2Authentication.getUserAuthentication(); - if (userAuthentication != null) { - Object principal = userAuthentication.getPrincipal(); - if (principal instanceof ProfileEntity) { - ProfileEntity profileEntity = (ProfileEntity) principal; - if (!orcid.equals(profileEntity.getId())) { - throw new OrcidUnauthorizedException("Access token is for a different record"); + if(OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + String userOrcid = authDetails.getUserOrcid(); + // Client credentials flow (no user ORCID) – allow through + if (userOrcid == null) { + Set scopes = authDetails.getScopes(); + if (scopes != null && scopes.contains(ScopePathType.ORCID_PROFILE_CREATE.value())) { + ProfileEntity profile = profileEntityCacheManager.retrieve(orcid); + if (profile != null && Boolean.TRUE.equals(profile.getClaimed())) { + throw new IllegalStateException("Non client credential scope found in client request"); + } } - } else { - throw new OrcidUnauthorizedException("Missing user authentication"); + return; } - } else if (isNonClientCredentialScope(oAuth2Authentication)) { - ProfileEntity profile = profileEntityCacheManager.retrieve(orcid); - if(!clientIsProfileSource(clientId, profile)) { - throw new IllegalStateException("Non client credential scope found in client request"); + if (orcid.equals(userOrcid)) { + return; } } + throw new OrcidUnauthorizedException("Access token is for a different record"); } private void checkClientType() { @@ -862,26 +816,20 @@ private void checkClientType() { } } - @Override - public String getOrcidFromToken() { - OAuth2Authentication oAuth2Authentication = getOAuth2Authentication(); - if (oAuth2Authentication == null) { - throw new OrcidUnauthorizedException("No OAuth2 authentication found"); - } - - checkScopes(false, ScopePathType.AUTHENTICATE); - - Authentication userAuthentication = oAuth2Authentication.getUserAuthentication(); - if (userAuthentication != null) { - Object principal = userAuthentication.getPrincipal(); - if (principal instanceof ProfileEntity) { - ProfileEntity profileEntity = (ProfileEntity) principal; - return profileEntity.getId(); - } else { - throw new OrcidUnauthorizedException("Missing user authentication"); + private Authentication getAuthentication() { + SecurityContext context = SecurityContextHolder.getContext(); + if (context != null && context.getAuthentication() != null) { + Authentication authentication = context.getAuthentication(); + for (GrantedAuthority grantedAuth : authentication.getAuthorities()) { + if ("ROLE_ANONYMOUS".equals(grantedAuth.getAuthority())) { + // Assume that anonymous authority is like not having + // authority at all + return null; + } } + return authentication; } else { - throw new IllegalStateException("Non client credential scope found in client request"); + throw new IllegalStateException("No security context found. This is bad!"); } } } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrgAffiliationRelationEntityCacheManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrgAffiliationRelationEntityCacheManagerImpl.java index aad2202801c..c66f5663e7c 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrgAffiliationRelationEntityCacheManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrgAffiliationRelationEntityCacheManagerImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.cache.GenericCacheManager; import org.orcid.core.cache.OrcidString; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrgManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrgManagerImpl.java index 60c7f89e10a..99c0902c452 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrgManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OrgManagerImpl.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.InvalidDisambiguatedOrgException; import org.orcid.core.manager.v3.OrgManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OtherNameManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OtherNameManagerImpl.java index e12b77b40a9..ae5d6ce7422 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OtherNameManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/OtherNameManagerImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/PeerReviewManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/PeerReviewManagerImpl.java index 2d392b760a3..ceb09d26916 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/PeerReviewManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/PeerReviewManagerImpl.java @@ -7,7 +7,7 @@ import java.util.Map; import java.util.Optional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.exception.OrcidValidationException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEmailDomainManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEmailDomainManagerImpl.java index 3c6bb730d7c..68d9d779230 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEmailDomainManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEmailDomainManagerImpl.java @@ -16,7 +16,7 @@ import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.*; /** diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEntityManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEntityManagerImpl.java index 1ed149a59c8..2c24615ac43 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEntityManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileEntityManagerImpl.java @@ -9,7 +9,7 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.StringUtils; import org.orcid.core.common.manager.EmailFrequencyManager; @@ -22,8 +22,8 @@ import org.orcid.core.manager.v3.*; import org.orcid.core.manager.v3.read_only.RecordNameManagerReadOnly; import org.orcid.core.manager.v3.read_only.impl.ProfileEntityManagerReadOnlyImpl; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.profile.history.ProfileHistoryEventType; +import org.orcid.core.utils.cache.redis.RedisClient; import org.orcid.jaxb.model.clientgroup.MemberType; import org.orcid.jaxb.model.common.AvailableLocales; import org.orcid.jaxb.model.message.ScopePathType; @@ -44,6 +44,7 @@ import org.orcid.pojo.ajaxForm.Text; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.cache.annotation.Cacheable; import org.springframework.context.NoSuchMessageException; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; @@ -66,9 +67,6 @@ public class ProfileEntityManagerImpl extends ProfileEntityManagerReadOnlyImpl i @Resource(name = "peerReviewManagerV3") private PeerReviewManager peerReviewManager; - @Resource - private ProfileEntityCacheManager profileEntityCacheManager; - @Resource(name = "workManagerV3") private WorkManager workManager; @@ -105,15 +103,9 @@ public class ProfileEntityManagerImpl extends ProfileEntityManagerReadOnlyImpl i @Resource(name = "notificationManagerV3") private NotificationManager notificationManager; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenService; - @Resource private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - @Resource - private OrcidUrlManager orcidUrlManager; - @Resource private LocaleManager localeManager; @@ -126,9 +118,6 @@ public class ProfileEntityManagerImpl extends ProfileEntityManagerReadOnlyImpl i @Resource private TransactionTemplate transactionTemplate; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - @Resource(name = "profileHistoryEventManagerV3") private ProfileHistoryEventManager profileHistoryEventManager; @@ -147,6 +136,15 @@ public class ProfileEntityManagerImpl extends ProfileEntityManagerReadOnlyImpl i @Resource private ProfileEmailDomainManager profileEmailDomainManager; + @Resource(name="orcidOauth2TokenDetailDaoReadOnly") + private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDaoReadOnly; + + @Resource(name="orcidOauth2TokenDetailDao") + private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao; + + @Resource + private RedisClient redisClient; + @Override public boolean orcidExists(String orcid) { return profileDao.orcidExists(orcid); @@ -292,13 +290,21 @@ public boolean unreviewProfile(String orcid) { @Override public void disableClientAccess(String clientDetailsId, String userOrcid) { - orcidOauth2TokenService.disableClientAccess(clientDetailsId, userOrcid); + List userTokens = orcidOauth2TokenDetailDaoReadOnly.findByUserName(userOrcid); + if(userTokens != null && !userTokens.isEmpty()) { + for(OrcidOauth2TokenDetail token : userTokens) { + if(clientDetailsId.equals(token.getClientDetailsId())) { + redisClient.remove(token.getTokenValue()); + } + } + } + // And then disable all user tokens + orcidOauth2TokenDetailDao.disableClientAccessTokensByUserOrcid(userOrcid, clientDetailsId); } @Override public List getApplications(String orcid) { - // TODO: Use the authorization server to build this list of tokens - List tokenDetails = orcidOauth2TokenService.findByUserName(orcid); + List tokenDetails = orcidOauth2TokenDetailDaoReadOnly.findByUserName(orcid); Map distinctApplications = new HashMap<>(); for (OrcidOauth2TokenDetail token : tokenDetails) { if ((token.getTokenDisabled() == null || !token.getTokenDisabled()) && token.getOboClientDetailsId() == null) { @@ -649,7 +655,7 @@ private void clearRecord(String orcid, Boolean disableTokens) { if (disableTokens) { // Disable any token that belongs to this record - orcidOauth2TokenDetailService.disableAccessTokenByUserOrcid(orcid, RevokeReason.RECORD_DEACTIVATED); + orcidOauth2TokenDetailDao.disableAccessTokenByUserOrcid(orcid, RevokeReason.RECORD_DEACTIVATED.name()); } // Change default visibility to private diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileFundingManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileFundingManagerImpl.java index 62eb974beb4..eb1c31aac0a 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileFundingManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileFundingManagerImpl.java @@ -2,7 +2,7 @@ import java.util.*; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.ClientDetailsEntityCacheManager; import org.orcid.core.manager.ProfileEntityCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileHistoryEventManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileHistoryEventManagerImpl.java index 0114f6e62f7..31a0c778542 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileHistoryEventManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileHistoryEventManagerImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.ProfileHistoryEventManager; import org.orcid.core.profile.history.ProfileHistoryEventType; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileInterstitialFlagManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileInterstitialFlagManagerImpl.java index ebef8eae167..3719832e0c5 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileInterstitialFlagManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileInterstitialFlagManagerImpl.java @@ -6,7 +6,7 @@ import org.orcid.persistence.jpa.entities.ProfileInterstitialFlagEntity; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; /** * diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileKeywordManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileKeywordManagerImpl.java index 9eea8781519..ba716b0a982 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileKeywordManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ProfileKeywordManagerImpl.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/RecordNameManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/RecordNameManagerImpl.java index 5a89adc9864..972179eb6f9 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/RecordNameManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/RecordNameManagerImpl.java @@ -2,7 +2,7 @@ import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.SourceNameCacheManager; import org.orcid.core.manager.v3.RecordNameManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ResearchResourceManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ResearchResourceManagerImpl.java index 457cb357d48..377ed96a1dd 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ResearchResourceManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ResearchResourceManagerImpl.java @@ -2,8 +2,8 @@ import java.util.*; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.orcid.core.adapter.v3.JpaJaxbResearchResourceAdapter; import org.orcid.core.manager.ClientDetailsEntityCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ResearcherUrlManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ResearcherUrlManagerImpl.java index f99d412b013..4b1747ee2ce 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ResearcherUrlManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/ResearcherUrlManagerImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.ApplicationException; import org.orcid.core.exception.OrcidDuplicatedElementException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/SourceManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/SourceManagerImpl.java index aab12c28ebf..ed477529f4b 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/SourceManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/SourceManagerImpl.java @@ -1,19 +1,13 @@ package org.orcid.core.manager.v3.impl; -import java.util.Collection; - -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.common.util.AuthenticationUtils; import org.orcid.core.manager.ClientDetailsManager; import org.orcid.core.manager.SourceNameCacheManager; import org.orcid.core.manager.v3.SourceManager; -import org.orcid.core.oauth.OrcidOAuth2Authentication; -import org.orcid.core.oauth.OrcidOauth2UserAuthentication; -import org.orcid.core.oauth.OrcidOboOAuth2Authentication; -import org.orcid.core.security.OrcidRoles; -import org.orcid.core.togglz.Features; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.jaxb.model.v3.release.common.Source; import org.orcid.jaxb.model.v3.release.common.SourceClientId; import org.orcid.jaxb.model.v3.release.common.SourceName; @@ -21,18 +15,10 @@ import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; import org.orcid.persistence.dao.ProfileDao; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.orcid.persistence.jpa.entities.SourceEntity; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; -import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; -import org.springframework.security.web.authentication.switchuser.SwitchUserGrantedAuthority; /** * @@ -71,66 +57,39 @@ public Source retrieveActiveSource() { if (authentication == null) { return null; } - - // API - if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Request authorizationRequest = ((OAuth2Authentication) authentication).getOAuth2Request(); - String clientId = authorizationRequest.getClientId(); + Source source = new Source(); + + // API authentication + if (OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + String clientId = authDetails.getClientId(); ClientDetailsEntity clientDetails = clientDetailsManager.findByClientId(clientId); - Source source = new Source(); + source.setSourceClientId(new SourceClientId(clientId)); source.setSourceName(new SourceName(clientDetails.getClientName())); - - //OBO if needed - if(Features.OAUTH_TOKEN_VALIDATION.isActive()) { - if(OrcidOboOAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OrcidOboOAuth2Authentication authDetails = (OrcidOboOAuth2Authentication) authentication; - if (StringUtils.isNotBlank(authDetails.getOboClientId())) { - ClientDetailsEntity oboClientDetails = clientDetailsManager.findByClientId(authDetails.getOboClientId()); - source.setAssertionOriginClientId(new SourceClientId(oboClientDetails.getClientId())); - source.setAssertionOriginName(new SourceName(oboClientDetails.getClientName())); - } else { - if(clientDetails.isUserOBOEnabled() && authDetails.getUserAuthentication() != null && OrcidOauth2UserAuthentication.class.isAssignableFrom(authDetails.getUserAuthentication().getClass())) { - OrcidOauth2UserAuthentication userAuth = (OrcidOauth2UserAuthentication) authDetails.getUserAuthentication(); - ProfileEntity profile = (ProfileEntity) userAuth.getPrincipal(); - source.setAssertionOriginOrcid(new SourceOrcid(profile.getId())); - source.setAssertionOriginName(new SourceName(sourceNameCacheManager.retrieve(profile.getId()))); - } - } - } else { - OrcidOAuth2Authentication authDetails = (OrcidOAuth2Authentication) authentication; - if(clientDetails.isUserOBOEnabled() && authDetails.getUserAuthentication() != null && OrcidOauth2UserAuthentication.class.isAssignableFrom(authDetails.getUserAuthentication().getClass())) { - OrcidOauth2UserAuthentication userAuth = (OrcidOauth2UserAuthentication) authDetails.getUserAuthentication(); - ProfileEntity profile = (ProfileEntity) userAuth.getPrincipal(); - source.setAssertionOriginOrcid(new SourceOrcid(profile.getId())); - source.setAssertionOriginName(new SourceName(sourceNameCacheManager.retrieve(profile.getId()))); - } - } - } else { - OAuth2AuthenticationDetails authDetails = (OAuth2AuthenticationDetails) ((OAuth2Authentication) authentication).getDetails(); - if (authDetails != null && authDetails.getTokenValue() != null) { //check here because mock tests can't cope otherwise. - // TODO: Use the authorization server to build this list of tokens - OrcidOauth2TokenDetail tokenDetail = orcidOauth2TokenDetailDao.findByTokenValue(authDetails.getTokenValue()); - if (!StringUtils.isEmpty(tokenDetail.getOboClientDetailsId())) { - ClientDetailsEntity oboClientDetails = clientDetailsManager.findByClientId(tokenDetail.getOboClientDetailsId()); - source.setAssertionOriginClientId(new SourceClientId(oboClientDetails.getClientId())); - source.setAssertionOriginName(new SourceName(oboClientDetails.getClientName())); - } else if (tokenDetail.getOrcid() != null && clientDetails.isUserOBOEnabled()) { - source.setAssertionOriginOrcid(new SourceOrcid(tokenDetail.getOrcid())); - source.setAssertionOriginName(new SourceName(sourceNameCacheManager.retrieve(tokenDetail.getOrcid()))); - } - } + + // Check member OBO + if(StringUtils.isNotBlank(authDetails.getOboClientId())) { + String oboClientId = authDetails.getOboClientId(); + ClientDetailsEntity oboClientDetails = clientDetailsManager.findByClientId(oboClientId); + source.setAssertionOriginClientId(new SourceClientId(oboClientId)); + source.setAssertionOriginName(new SourceName(oboClientDetails.getClientName())); + } else if(clientDetails.isUserOBOEnabled()){ + // Check user OBO + source.setAssertionOriginOrcid(new SourceOrcid(authDetails.getUserOrcid())); + source.setAssertionOriginName(new SourceName(sourceNameCacheManager.retrieve(authDetails.getUserOrcid()))); } - return source; - } - String userOrcid = AuthenticationUtils.retrieveEffectiveOrcid(); - if(userOrcid == null){ - // Must be system role - return null; + } else { + // User authentication + String userOrcid = AuthenticationUtils.retrieveEffectiveOrcid(); + if(userOrcid == null){ + // Must be system role + return null; + } + // Normal web user + source.setSourceOrcid(new SourceOrcid(userOrcid)); } - // Normal web user - Source source = new Source(); - source.setSourceOrcid(new SourceOrcid(userOrcid)); + return source; } @@ -144,25 +103,24 @@ public SourceEntity retrieveActiveSourceEntity() { if (authentication == null) { return null; } - - // API - if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Request authorizationRequest = ((OAuth2Authentication) authentication).getOAuth2Request(); - String clientId = authorizationRequest.getClientId(); + + SourceEntity sourceEntity = new SourceEntity(); + // API authentication + if (OrcidBearerTokenAuthentication.class.isAssignableFrom(authentication.getClass())) { + OrcidBearerTokenAuthentication authDetails = (OrcidBearerTokenAuthentication) authentication; + String clientId = authDetails.getClientId(); ClientDetailsEntity clientDetails = clientDetailsManager.findByClientId(clientId); - SourceEntity sourceEntity = new SourceEntity(); - sourceEntity.setSourceClient(new ClientDetailsEntity(clientId, clientDetails.getClientName())); - return sourceEntity; - } - String userOrcid = AuthenticationUtils.retrieveEffectiveOrcid(); - if(userOrcid == null){ - // Must be system role - return null; + sourceEntity.setSourceClient(new ClientDetailsEntity(clientId, clientDetails.getClientName())); + } else { + // User authentication + String userOrcid = AuthenticationUtils.retrieveEffectiveOrcid(); + if (userOrcid == null) { + // Must be system role + return null; + } + sourceEntity.setSourceProfile(new ProfileEntity(userOrcid)); + sourceEntity.setCachedSourceName(sourceNameCacheManager.retrieve(userOrcid)); } - // Normal web user - SourceEntity sourceEntity = new SourceEntity(); - sourceEntity.setSourceProfile(new ProfileEntity(userOrcid)); - sourceEntity.setCachedSourceName(sourceNameCacheManager.retrieve(userOrcid)); return sourceEntity; } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/SpamManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/SpamManagerImpl.java index 4e29535419c..36f30f03ed8 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/SpamManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/SpamManagerImpl.java @@ -2,7 +2,7 @@ import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.ProfileEntityManager; import org.orcid.core.manager.v3.SpamManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorkManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorkManagerImpl.java index d48199e9feb..6e1d6c2d040 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorkManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorkManagerImpl.java @@ -10,7 +10,7 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.adapter.jsonidentifier.converter.JSONWorkExternalIdentifiersConverterV3; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorksCacheManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorksCacheManagerImpl.java index 83ff1774af8..1338f83606f 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorksCacheManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorksCacheManagerImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.v3.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.cache.GenericCacheManager; import org.orcid.core.cache.OrcidString; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorksExtendedCacheManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorksExtendedCacheManagerImpl.java index 7849108a2dd..94f37db383a 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorksExtendedCacheManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/impl/WorksExtendedCacheManagerImpl.java @@ -7,7 +7,7 @@ import org.orcid.pojo.WorkSummaryExtended; import org.orcid.pojo.WorksExtended; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.List; public class WorksExtendedCacheManagerImpl implements WorksExtendedCacheManager { diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/ClientDetailsManagerReadOnly.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/ClientDetailsManagerReadOnly.java index 74c2b38e6b5..59efcea9ec9 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/ClientDetailsManagerReadOnly.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/ClientDetailsManagerReadOnly.java @@ -5,9 +5,8 @@ import org.orcid.jaxb.model.v3.release.client.ClientSummary; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.springframework.security.oauth2.provider.ClientDetailsService; -public interface ClientDetailsManagerReadOnly extends ClientDetailsService { +public interface ClientDetailsManagerReadOnly { ClientDetailsEntity findByClientId(String orcid); List getAll(); @@ -44,4 +43,5 @@ public interface ClientDetailsManagerReadOnly extends ClientDetailsService { ClientSummary getClientSummary(String clientId); + boolean doesClientKnowUser(String clientId, String userOrcid); } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/ProfileEntityManagerReadOnly.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/ProfileEntityManagerReadOnly.java index 4c0d563f5c3..8235234bc4a 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/ProfileEntityManagerReadOnly.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/ProfileEntityManagerReadOnly.java @@ -13,4 +13,6 @@ public interface ProfileEntityManagerReadOnly extends ManagerReadOnlyBase { Boolean isOrcidValidAsDelegate(String orcid); Boolean haveMemberPushedWorksOrAffiliationsToRecord(String orcid, String clientId); + + Boolean hasToken(String userName, long lastModified); } \ No newline at end of file diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/AddressManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/AddressManagerReadOnlyImpl.java index c5e00c2eb62..6beb4479d30 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/AddressManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/AddressManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbAddressAdapter; import org.orcid.core.manager.v3.read_only.AddressManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/AffiliationsManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/AffiliationsManagerReadOnlyImpl.java index a6ac3ad8380..91e662ed677 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/AffiliationsManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/AffiliationsManagerReadOnlyImpl.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbDistinctionAdapter; import org.orcid.core.adapter.v3.JpaJaxbEducationAdapter; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ClientDetailsManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ClientDetailsManagerReadOnlyImpl.java index 50819febf2b..c3fbaffd1f9 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ClientDetailsManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ClientDetailsManagerReadOnlyImpl.java @@ -1,35 +1,39 @@ package org.orcid.core.manager.v3.read_only.impl; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.orcid.core.adapter.v3.JpaJaxbClientAdapter; import org.orcid.core.manager.EncryptionManager; import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; +import org.orcid.jaxb.model.message.ScopePathType; import org.orcid.jaxb.model.v3.release.client.ClientSummary; import org.orcid.persistence.dao.ClientDetailsDao; import org.orcid.persistence.dao.ClientRedirectDao; import org.orcid.persistence.dao.ClientSecretDao; +import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; +import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; +import org.orcid.pojo.ajaxForm.PojoUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; -import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; public class ClientDetailsManagerReadOnlyImpl implements ClientDetailsManagerReadOnly { - private static final Logger LOGGER = LoggerFactory.getLogger(ClientDetailsManagerReadOnlyImpl.class); - + private static final Logger LOGGER = LoggerFactory.getLogger(ClientDetailsManagerReadOnlyImpl.class); + + private final List CLIENT_KNOW_USER_SCOPES = Arrays.asList(ScopePathType.ACTIVITIES_UPDATE.value(), ScopePathType.AFFILIATIONS_CREATE.value(), ScopePathType.AFFILIATIONS_UPDATE.value()); + @Resource(name = "jpaJaxbClientAdapterV3") protected JpaJaxbClientAdapter jpaJaxbClientAdapter; @Resource - protected EncryptionManager encryptionManager; + protected EncryptionManager encryptionManager; + + @Resource(name="orcidOauth2TokenDetailDaoReadOnly") + private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDaoReadOnly; private ClientDetailsDao clientDetailsDao; @@ -51,31 +55,6 @@ public void setClientRedirectDao(ClientRedirectDao clientRedirectDao) { this.clientRedirectDao = clientRedirectDao; } - /** - * Load a client by the client id. This method must NOT return null. - * - * @param clientId - * The client id. - * @return The client details. - * @throws org.springframework.security.oauth2.common.exceptions.OAuth2Exception - * If the client account is locked, expired, disabled, or for - * any other reason. - */ - @Override - public ClientDetailsEntity loadClientByClientId(String clientId) throws OAuth2Exception { - ClientDetailsEntity clientDetails = findByClientId(clientId); - if (clientDetails != null) { - if (!clientDetails.getClientId().equals(clientId)) - LOGGER.error("Client getClientId doesn't match. Requested: " + clientId + " Returned: " + clientDetails.getClientId()); - if (!clientDetails.getId().equals(clientId)) - LOGGER.error("Client getId() doesn't match. Requested: " + clientId + " Returned: " + clientDetails.getId()); - clientDetails.setDecryptedClientSecret(encryptionManager.decryptForInternalUse(clientDetails.getClientSecretForJpa())); - return clientDetails; - } else { - throw new InvalidClientException("Client not found: " + clientId); - } - } - @Override public ClientDetailsEntity findByClientId(String clientId) { ClientDetailsEntity result = null; @@ -201,4 +180,25 @@ public ClientSummary getClientSummary(String clientId) { return jpaJaxbClientAdapter.toClientSummary(clientDetailsEntity); } + @Override + public boolean doesClientKnowUser(String clientId, String userOrcid) { + List existingTokens = orcidOauth2TokenDetailDaoReadOnly.findByClientIdAndUserName(clientId, userOrcid); + if (existingTokens == null || existingTokens.isEmpty()) { + return false; + } + Date now = new Date(); + for (OrcidOauth2TokenDetail token : existingTokens) { + if (token.getTokenExpiration() != null && token.getTokenExpiration().after(now) && (token.getTokenDisabled() == null || !token.getTokenDisabled())) { + // Verify the token have at least one of the required scopes + if(!PojoUtil.isEmpty(token.getScope())) { + for(String scope : token.getScope().split(" ")) { + if(CLIENT_KNOW_USER_SCOPES.contains(scope.trim())) { + return true; + } + } + } + } + } + return false; + } } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ClientManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ClientManagerReadOnlyImpl.java index aadb30b5616..314cf0f309f 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ClientManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ClientManagerReadOnlyImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbClientAdapter; import org.orcid.core.manager.v3.read_only.ClientManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/EmailManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/EmailManagerReadOnlyImpl.java index 0f9b0e08a9f..518fe985f5d 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/EmailManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/EmailManagerReadOnlyImpl.java @@ -9,7 +9,7 @@ import java.util.TreeMap; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.adapter.v3.JpaJaxbEmailAdapter; @@ -114,14 +114,14 @@ public boolean isPrimaryEmailVerified(String orcid) { try { String primaryEmail = emailDao.findPrimaryEmail(orcid).getEmail(); return emailDao.isVerified(orcid, primaryEmail); - } catch (javax.persistence.NoResultException nre) { + } catch (jakarta.persistence.NoResultException nre) { String alternativePrimaryEmail = emailDao.findNewestVerifiedOrNewestEmail(orcid); emailDao.updatePrimary(orcid, alternativePrimaryEmail); String message = String.format("User with orcid %s have no primary email, so, we are setting the newest verified email, or, the newest email in case non is verified as the primary one", orcid); LOGGER.error(message); throw nre; - } catch (javax.persistence.NonUniqueResultException nure) { + } catch (jakarta.persistence.NonUniqueResultException nure) { String alternativePrimaryEmail = emailDao.findNewestPrimaryEmail(orcid); emailDao.updatePrimary(orcid, alternativePrimaryEmail); diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ExternalIdentifierManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ExternalIdentifierManagerReadOnlyImpl.java index 611ffa104db..ccc7ccc343c 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ExternalIdentifierManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ExternalIdentifierManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbExternalIdentifierAdapter; import org.orcid.core.manager.v3.read_only.ExternalIdentifierManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GivenPermissionToManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GivenPermissionToManagerReadOnlyImpl.java index bff0477f981..b6110caeef6 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GivenPermissionToManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GivenPermissionToManagerReadOnlyImpl.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.read_only.GivenPermissionToManagerReadOnly; import org.orcid.core.manager.v3.read_only.RecordNameManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GroupIdRecordManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GroupIdRecordManagerReadOnlyImpl.java index 9c1ce37467d..2644484dca5 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GroupIdRecordManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GroupIdRecordManagerReadOnlyImpl.java @@ -3,8 +3,8 @@ import java.util.List; import java.util.Optional; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.orcid.core.adapter.v3.JpaJaxbGroupIdRecordAdapter; import org.orcid.core.exception.GroupIdRecordNotFoundException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GroupingSuggestionManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GroupingSuggestionManagerReadOnlyImpl.java index 789e9449380..50cbf3c8553 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GroupingSuggestionManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/GroupingSuggestionManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.GroupingSuggestionsCacheManager; import org.orcid.core.manager.v3.read_only.GroupingSuggestionManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/OtherNameManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/OtherNameManagerReadOnlyImpl.java index 8e767095758..a91e0ed1c05 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/OtherNameManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/OtherNameManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbOtherNameAdapter; import org.orcid.core.manager.v3.read_only.OtherNameManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/PeerReviewManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/PeerReviewManagerReadOnlyImpl.java index 34dea3c161a..7305435a9c4 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/PeerReviewManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/PeerReviewManagerReadOnlyImpl.java @@ -4,7 +4,7 @@ import java.util.*; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbPeerReviewAdapter; import org.orcid.core.manager.impl.ClientDetailsManagerImpl; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/PersonDetailsManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/PersonDetailsManagerReadOnlyImpl.java index a31f7905ad4..97ad83a9af3 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/PersonDetailsManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/PersonDetailsManagerReadOnlyImpl.java @@ -35,7 +35,7 @@ import liquibase.repackaged.org.apache.commons.lang3.StringUtils; -import javax.annotation.Resource; +import jakarta.annotation.Resource; public class PersonDetailsManagerReadOnlyImpl extends ManagerReadOnlyBaseImpl implements PersonDetailsManagerReadOnly { diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileEmailDomainManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileEmailDomainManagerReadOnlyImpl.java index 5d54da3dfef..15fda28dab7 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileEmailDomainManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileEmailDomainManagerReadOnlyImpl.java @@ -6,7 +6,7 @@ import org.orcid.persistence.dao.ProfileEmailDomainDao; import org.orcid.persistence.jpa.entities.ProfileEmailDomainEntity; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.List; /** diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileEntityManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileEntityManagerReadOnlyImpl.java index 02ec8989336..76593c005a1 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileEntityManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileEntityManagerReadOnlyImpl.java @@ -3,11 +3,18 @@ import java.text.SimpleDateFormat; import org.orcid.core.manager.v3.read_only.ProfileEntityManagerReadOnly; +import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; import org.orcid.persistence.dao.ProfileDao; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.orcid.pojo.ajaxForm.PojoUtil; +import org.springframework.cache.annotation.Cacheable; -public class ProfileEntityManagerReadOnlyImpl extends ManagerReadOnlyBaseImpl implements ProfileEntityManagerReadOnly { +import jakarta.annotation.Resource; + +public class ProfileEntityManagerReadOnlyImpl extends ManagerReadOnlyBaseImpl implements ProfileEntityManagerReadOnly { + + @Resource(name="orcidOauth2TokenDetailDaoReadOnly") + private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDaoReadOnly; protected ProfileDao profileDao; @@ -68,4 +75,10 @@ public Boolean haveMemberPushedWorksOrAffiliationsToRecord(String orcid, String } return profileDao.haveMemberPushedWorksOrAffiliationsToRecord(orcid, clientId); } + + @Override + @Cacheable(value = "count-tokens", key = "#userName.concat('-').concat(#lastModified)") + public Boolean hasToken(String userName, long lastModified) { + return orcidOauth2TokenDetailDaoReadOnly.hasToken(userName); + } } diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileFundingManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileFundingManagerReadOnlyImpl.java index bf9673d1c98..630936fc4d9 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileFundingManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileFundingManagerReadOnlyImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbFundingAdapter; import org.orcid.core.manager.v3.read_only.ProfileFundingManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileInterstitialFlagManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileInterstitialFlagManagerReadOnlyImpl.java index 34ba8a9ee9c..a964b481ee4 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileInterstitialFlagManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileInterstitialFlagManagerReadOnlyImpl.java @@ -6,7 +6,7 @@ import org.orcid.persistence.dao.ProfileInterstitialFlagDao; import org.orcid.persistence.jpa.entities.ProfileInterstitialFlagEntity; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.List; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileKeywordManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileKeywordManagerReadOnlyImpl.java index 50096829da5..adda4d7e910 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileKeywordManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ProfileKeywordManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbKeywordAdapter; import org.orcid.core.manager.v3.read_only.ProfileKeywordManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/RecordManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/RecordManagerReadOnlyImpl.java index efb9a5bcba7..f56766673ca 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/RecordManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/RecordManagerReadOnlyImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.v3.read_only.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.core.manager.SourceNameCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/RecordNameManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/RecordNameManagerReadOnlyImpl.java index 27fe5aa5e63..067419fb3a6 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/RecordNameManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/RecordNameManagerReadOnlyImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.v3.read_only.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.adapter.v3.JpaJaxbNameAdapter; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ResearchResourceManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ResearchResourceManagerReadOnlyImpl.java index 33bf5ed06b2..156c766ab08 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ResearchResourceManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ResearchResourceManagerReadOnlyImpl.java @@ -3,8 +3,8 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.orcid.core.adapter.v3.JpaJaxbResearchResourceAdapter; import org.orcid.core.manager.v3.read_only.ResearchResourceManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ResearcherUrlManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ResearcherUrlManagerReadOnlyImpl.java index 5f31e63c238..0fe18c28289 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ResearcherUrlManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/ResearcherUrlManagerReadOnlyImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbResearcherUrlAdapter; import org.orcid.core.manager.v3.read_only.ResearcherUrlManagerReadOnly; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/SpamManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/SpamManagerReadOnlyImpl.java index 8f10f4ff899..ec0826855c2 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/SpamManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/SpamManagerReadOnlyImpl.java @@ -1,6 +1,6 @@ package org.orcid.core.manager.v3.read_only.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.JpaJaxbSpamAdapter; import org.orcid.core.manager.v3.ProfileEntityManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/WorkManagerReadOnlyImpl.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/WorkManagerReadOnlyImpl.java index 1e8e27389b3..49a0feb935e 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/WorkManagerReadOnlyImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/read_only/impl/WorkManagerReadOnlyImpl.java @@ -9,8 +9,8 @@ import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import org.orcid.core.adapter.jsonidentifier.converter.JSONWorkExternalIdentifiersConverterV3; import org.orcid.core.adapter.v3.JpaJaxbWorkAdapter; @@ -101,9 +101,6 @@ public class WorkManagerReadOnlyImpl extends ManagerReadOnlyBaseImpl implements @Resource private JSONWorkExternalIdentifiersConverterV3 jsonWorkExternalIdentifiersConverterV3; - @Resource(name = "clientDetailsManagerReadOnlyV3") - private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; - @Resource protected ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/validator/ActivityValidator.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/validator/ActivityValidator.java index 8f310d1a961..27d66a58e00 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/validator/ActivityValidator.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/validator/ActivityValidator.java @@ -12,7 +12,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.exception.ActivityIdentifierValidationException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/v3/validator/ExternalIDValidator.java b/orcid-core/src/main/java/org/orcid/core/manager/v3/validator/ExternalIDValidator.java index eaae9602bdc..7f7c3151e80 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/v3/validator/ExternalIDValidator.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/v3/validator/ExternalIDValidator.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.ActivityIdentifierValidationException; import org.orcid.core.manager.IdentifierTypeManager; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/validator/ActivityValidator.java b/orcid-core/src/main/java/org/orcid/core/manager/validator/ActivityValidator.java index f4e86b931f0..61b13881e06 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/validator/ActivityValidator.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/validator/ActivityValidator.java @@ -12,7 +12,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.exception.ActivityIdentifierValidationException; diff --git a/orcid-core/src/main/java/org/orcid/core/manager/validator/ExternalIDValidator.java b/orcid-core/src/main/java/org/orcid/core/manager/validator/ExternalIDValidator.java index c6586cd4330..aff6028442d 100644 --- a/orcid-core/src/main/java/org/orcid/core/manager/validator/ExternalIDValidator.java +++ b/orcid-core/src/main/java/org/orcid/core/manager/validator/ExternalIDValidator.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.ActivityIdentifierValidationException; import org.orcid.core.manager.IdentifierTypeManager; diff --git a/orcid-core/src/main/java/org/orcid/core/messaging/JmsMessageSender.java b/orcid-core/src/main/java/org/orcid/core/messaging/JmsMessageSender.java index d855e4bb3fd..c5757a79928 100644 --- a/orcid-core/src/main/java/org/orcid/core/messaging/JmsMessageSender.java +++ b/orcid-core/src/main/java/org/orcid/core/messaging/JmsMessageSender.java @@ -2,7 +2,7 @@ import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.utils.listener.LastModifiedMessage; import org.orcid.utils.solr.entities.OrgDisambiguatedSolrDocument; diff --git a/orcid-core/src/main/java/org/orcid/core/model/EducationQualification.java b/orcid-core/src/main/java/org/orcid/core/model/EducationQualification.java index bdd2de9f6e8..533a0cff7e0 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/EducationQualification.java +++ b/orcid-core/src/main/java/org/orcid/core/model/EducationQualification.java @@ -2,11 +2,11 @@ import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import org.orcid.jaxb.model.v3.release.common.FuzzyDate; diff --git a/orcid-core/src/main/java/org/orcid/core/model/EducationQualifications.java b/orcid-core/src/main/java/org/orcid/core/model/EducationQualifications.java index f20f1a9e3dd..4caa1e04843 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/EducationQualifications.java +++ b/orcid-core/src/main/java/org/orcid/core/model/EducationQualifications.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/EmailDomain.java b/orcid-core/src/main/java/org/orcid/core/model/EmailDomain.java index 5b1686f6e99..76f0ae765a8 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/EmailDomain.java +++ b/orcid-core/src/main/java/org/orcid/core/model/EmailDomain.java @@ -2,12 +2,12 @@ import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlTransient; +import jakarta.xml.bind.annotation.XmlType; import org.orcid.jaxb.model.v3.release.common.FuzzyDate; import org.orcid.jaxb.model.v3.release.common.VerificationDate; diff --git a/orcid-core/src/main/java/org/orcid/core/model/EmailDomains.java b/orcid-core/src/main/java/org/orcid/core/model/EmailDomains.java index 138c28add94..2d703846bf9 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/EmailDomains.java +++ b/orcid-core/src/main/java/org/orcid/core/model/EmailDomains.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/Employment.java b/orcid-core/src/main/java/org/orcid/core/model/Employment.java index a2ab224d1a8..20d72d04e03 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/Employment.java +++ b/orcid-core/src/main/java/org/orcid/core/model/Employment.java @@ -3,11 +3,11 @@ import java.io.Serializable; import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import org.orcid.jaxb.model.v3.release.common.FuzzyDate; import org.orcid.jaxb.model.v3.release.record.AffiliationType; diff --git a/orcid-core/src/main/java/org/orcid/core/model/Employments.java b/orcid-core/src/main/java/org/orcid/core/model/Employments.java index 102ee8dad07..db75b922299 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/Employments.java +++ b/orcid-core/src/main/java/org/orcid/core/model/Employments.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/ExternalIdentifier.java b/orcid-core/src/main/java/org/orcid/core/model/ExternalIdentifier.java index a2c6d01ffa1..d804381e135 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/ExternalIdentifier.java +++ b/orcid-core/src/main/java/org/orcid/core/model/ExternalIdentifier.java @@ -2,11 +2,11 @@ import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/ExternalIdentifiers.java b/orcid-core/src/main/java/org/orcid/core/model/ExternalIdentifiers.java index c6b0894ff43..9df687754ee 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/ExternalIdentifiers.java +++ b/orcid-core/src/main/java/org/orcid/core/model/ExternalIdentifiers.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/Fundings.java b/orcid-core/src/main/java/org/orcid/core/model/Fundings.java index 628c6ce7735..2cf679f38a3 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/Fundings.java +++ b/orcid-core/src/main/java/org/orcid/core/model/Fundings.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/ItemsCount.java b/orcid-core/src/main/java/org/orcid/core/model/ItemsCount.java index 164ff01e5fc..0bf87c6c5ff 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/ItemsCount.java +++ b/orcid-core/src/main/java/org/orcid/core/model/ItemsCount.java @@ -2,10 +2,10 @@ import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/PeerReviews.java b/orcid-core/src/main/java/org/orcid/core/model/PeerReviews.java index 0dd0c61b285..dd797f0085c 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/PeerReviews.java +++ b/orcid-core/src/main/java/org/orcid/core/model/PeerReviews.java @@ -3,11 +3,11 @@ import java.io.Serializable; import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/ProfessionalActivities.java b/orcid-core/src/main/java/org/orcid/core/model/ProfessionalActivities.java index ab0fbcd795e..00796514103 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/ProfessionalActivities.java +++ b/orcid-core/src/main/java/org/orcid/core/model/ProfessionalActivities.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/ProfessionalActivity.java b/orcid-core/src/main/java/org/orcid/core/model/ProfessionalActivity.java index fb2a1e8e01f..be9d3bec491 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/ProfessionalActivity.java +++ b/orcid-core/src/main/java/org/orcid/core/model/ProfessionalActivity.java @@ -2,11 +2,11 @@ import java.util.Objects; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; import org.orcid.jaxb.model.v3.release.common.FuzzyDate; diff --git a/orcid-core/src/main/java/org/orcid/core/model/RecordSummary.java b/orcid-core/src/main/java/org/orcid/core/model/RecordSummary.java index cc8189048da..e6689b2c372 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/RecordSummary.java +++ b/orcid-core/src/main/java/org/orcid/core/model/RecordSummary.java @@ -3,13 +3,13 @@ import java.io.Serializable; import java.util.Objects; -import javax.annotation.Resource; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; -import javax.xml.bind.annotation.XmlType; +import jakarta.annotation.Resource; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlTransient; +import jakarta.xml.bind.annotation.XmlType; import org.orcid.core.manager.impl.OrcidUrlManager; import org.orcid.jaxb.model.v3.release.common.CreatedDate; diff --git a/orcid-core/src/main/java/org/orcid/core/model/ResearchResources.java b/orcid-core/src/main/java/org/orcid/core/model/ResearchResources.java index 3748e41b223..e0d5973d701 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/ResearchResources.java +++ b/orcid-core/src/main/java/org/orcid/core/model/ResearchResources.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/Works.java b/orcid-core/src/main/java/org/orcid/core/model/Works.java index 1404d68aa15..5a305401eb6 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/Works.java +++ b/orcid-core/src/main/java/org/orcid/core/model/Works.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orcid-core/src/main/java/org/orcid/core/model/package-info.java b/orcid-core/src/main/java/org/orcid/core/model/package-info.java index 75d5bd31108..0320e5fc652 100644 --- a/orcid-core/src/main/java/org/orcid/core/model/package-info.java +++ b/orcid-core/src/main/java/org/orcid/core/model/package-info.java @@ -1,7 +1,7 @@ -@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.orcid.org/ns/record", xmlns = { - @javax.xml.bind.annotation.XmlNs(prefix = "activities", namespaceURI = "http://www.orcid.org/ns/activities"), - @javax.xml.bind.annotation.XmlNs(prefix = "common", namespaceURI = "http://www.orcid.org/ns/common"), - @javax.xml.bind.annotation.XmlNs(prefix = "summary", namespaceURI = "http://www.orcid.org/ns/summary")}, - elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://www.orcid.org/ns/record", xmlns = { + @jakarta.xml.bind.annotation.XmlNs(prefix = "activities", namespaceURI = "http://www.orcid.org/ns/activities"), + @jakarta.xml.bind.annotation.XmlNs(prefix = "common", namespaceURI = "http://www.orcid.org/ns/common"), + @jakarta.xml.bind.annotation.XmlNs(prefix = "summary", namespaceURI = "http://www.orcid.org/ns/summary")}, + elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED) package org.orcid.core.model; diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/IETFExchangeTokenGranter.java b/orcid-core/src/main/java/org/orcid/core/oauth/IETFExchangeTokenGranter.java deleted file mode 100644 index f63cef7844f..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/IETFExchangeTokenGranter.java +++ /dev/null @@ -1,346 +0,0 @@ -package org.orcid.core.oauth; - -import java.io.Serializable; -import java.text.ParseException; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; - -import org.apache.commons.lang3.StringUtils; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.constants.RevokeReason; -import org.orcid.core.exception.OrcidInvalidScopeException; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.ProfileEntityManager; -import org.orcid.core.oauth.openid.OpenIDConnectKeyService; -import org.orcid.core.oauth.openid.OpenIDConnectTokenEnhancer; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.dao.MemberOBOWhitelistedClientDao; -import org.orcid.persistence.dao.OrcidOauth2AuthoriziationCodeDetailDao; -import org.orcid.persistence.dao.ProfileDao; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.MemberOBOWhitelistedClientEntity; -import org.orcid.persistence.jpa.entities.OrcidGrantedAuthority; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.TokenGranter; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; -import org.springframework.security.oauth2.provider.token.TokenStore; - -import com.google.common.collect.Sets; -import com.nimbusds.jose.JOSEException; -import com.nimbusds.jwt.JWTClaimsSet; -import com.nimbusds.jwt.SignedJWT; - -/** - * Spec: https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-15 - * - * @author tom - * - */ -public class IETFExchangeTokenGranter implements TokenGranter { - - private static final Logger LOGGER = LoggerFactory.getLogger(IETFExchangeTokenGranter.class); - - private AuthorizationServerTokenServices tokenServices; - - @Resource(name = "orcidOauth2AuthoriziationCodeDetailDao") - private OrcidOauth2AuthoriziationCodeDetailDao orcidOauth2AuthoriziationCodeDetailDao; - @Resource(name = "orcidTokenStore") - private TokenStore tokenStore; - @Resource - private OpenIDConnectKeyService openIDConnectKeyService; - @Resource - private OrcidOauth2TokenDetailService orcidOauthTokenDetailService; - @Resource - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - @Resource - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - @Resource - private ProfileEntityManager profileEntityManager; - @Resource - private ProfileDao profileDao; - @Resource - private MemberOBOWhitelistedClientDao memberOBOWhitelistedClientDao; - - @Resource - OpenIDConnectTokenEnhancer openIDConnectTokenEnhancer; - - private final List doNotAllowDeleteOnTheseRevokeReasons = List.of(RevokeReason.CLIENT_REVOKED, RevokeReason.STAFF_REVOKED, RevokeReason.RECORD_DEACTIVATED, RevokeReason.AUTH_CODE_REUSED); - - public IETFExchangeTokenGranter(AuthorizationServerTokenServices tokenServices) { - this.tokenServices = tokenServices; - } - - /** - * Invoked by OrcidClientCredentialEndPointDelegatorImpl.obtainOauth2Token - * and OrcidClientCredentialEndPointDelegatorImpl.generateToken - * - */ - @Override - public OAuth2AccessToken grant(String grantType, TokenRequest tokenRequest) { - if (!OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE.equals(grantType)) { - return null; - } - - // General request validation - // extract params - String subjectToken = tokenRequest.getRequestParameters().get(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN); - String subjectTokenType = tokenRequest.getRequestParameters().get(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE); - String requestedTokenType = tokenRequest.getRequestParameters().get(OrcidOauth2Constants.IETF_EXCHANGE_REQUESTED_TOKEN_TYPE); - - // check we have the right request params - if (StringUtils.isEmpty(subjectToken) || StringUtils.isEmpty(subjectTokenType) || StringUtils.isEmpty(requestedTokenType)) { - throw new IllegalArgumentException("Missing IETF Token exchange request parameter(s). Required: " + OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN + " " - + OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE + " " + OrcidOauth2Constants.IETF_EXCHANGE_REQUESTED_TOKEN_TYPE); - } - - // Must have one of each token type - if (!(subjectTokenType.equals(OrcidOauth2Constants.IETF_EXCHANGE_ID_TOKEN) || subjectTokenType.equals(OrcidOauth2Constants.IETF_EXCHANGE_ACCESS_TOKEN)) - || !(requestedTokenType.equals(OrcidOauth2Constants.IETF_EXCHANGE_ID_TOKEN) || requestedTokenType.equals(OrcidOauth2Constants.IETF_EXCHANGE_ACCESS_TOKEN)) - || subjectTokenType.equals(requestedTokenType)) { - throw new IllegalArgumentException("Invalid IETF token exchange token type(s) supported tokens types are " + OrcidOauth2Constants.IETF_EXCHANGE_ID_TOKEN + " " - + OrcidOauth2Constants.IETF_EXCHANGE_ACCESS_TOKEN); - } - - // Verify requesting client is enabled - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(tokenRequest.getClientId()); - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetails); - - // Verify requesting client has grant type - // TODO: consider if we need a similar check to see original client has - // enabled OBO...? - if (!clientDetails.getAuthorizedGrantTypes().contains(OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE)) { - throw new IllegalArgumentException("Client does not have " + OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE + " enabled"); - } - - if (requestedTokenType.equals(OrcidOauth2Constants.IETF_EXCHANGE_ACCESS_TOKEN) && subjectTokenType.equals(OrcidOauth2Constants.IETF_EXCHANGE_ID_TOKEN)) { - JWTClaimsSet claimsSet = parseIdToken(subjectToken); - String oboClient = claimsSet.getAudience().get(0); - String oboOrcid = claimsSet.getSubject(); - // IMPORTANT: ID tokens should work even when they are expired, so, we should never check the token expiration. - // claimsSet.getExpirationTime(); - - if (oboClientWhitelisted(oboClient, clientDetails.getId())) { - return generateAccessToken(tokenRequest, oboClient, oboOrcid); - } else { - throw new IllegalArgumentException(String.format("Client %s cannot act on behalf of client %s", clientDetails.getId(), oboClient)); - } - } else if (requestedTokenType.equals(OrcidOauth2Constants.IETF_EXCHANGE_ID_TOKEN) && subjectTokenType.equals(OrcidOauth2Constants.IETF_EXCHANGE_ACCESS_TOKEN)) { - return generateIdToken(tokenRequest, subjectToken); - } - throw new IllegalArgumentException( - "Supported tokens types are " + OrcidOauth2Constants.IETF_EXCHANGE_ID_TOKEN + " " + OrcidOauth2Constants.IETF_EXCHANGE_ACCESS_TOKEN); - } - - private boolean oboClientWhitelisted(String oboClient, String clientDetailsId) { - List whitelist = memberOBOWhitelistedClientDao.getWhitelistForClient(oboClient); - if (whitelist == null || whitelist.isEmpty()) { - return true; - } - - for (MemberOBOWhitelistedClientEntity item : whitelist) { - if (item.getWhitelistedClientDetailsEntity().getId().equals(clientDetailsId)) { - return true; - } - } - return false; - } - - private JWTClaimsSet parseIdToken(String token) { - try { - SignedJWT claims = SignedJWT.parse(token); - if (!openIDConnectKeyService.verify(claims)) { - throw new IllegalArgumentException("Invalid id token signature"); - } - return claims.getJWTClaimsSet(); - } catch (ParseException e) { - throw new IllegalArgumentException("Unexpected id token value, cannot parse the id_token"); - } - } - - /** - * Create an id token and return it. Note this uses the weird convention of - * returning the id_token in the access_token property of the response. - * Example: - * - * { "access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4 - * 6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l - * eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic2NvcGUiOiJzdGF0dXMgZmVlZ - * CIsInN1YiI6InVzZXJAZXhhbXBsZS5uZXQiLCJhY3QiOnsic3ViIjoiYWRtaW5AZX - * hhbXBsZS5uZXQifX0.3paKl9UySKYB5ng6_cUtQ2qlO8Rc_y7Mea7IwEXTcYbNdwG - * 9-G1EKCFe5fW3H0hwX-MSZ49Wpcb1SiAZaOQBtw", - * "issued_token_type":"urn:ietf:params:oauth:token-type:id_token", - * "token_type":"N_A", "expires_in":3600 } - * - * @param tokenRequest - * @param subjectToken - * @return - */ - private OAuth2AccessToken generateIdToken(TokenRequest tokenRequest, String subjectToken) { - OAuth2AccessToken existing = tokenStore.readAccessToken(subjectToken); - OrcidOauth2TokenDetail detail = orcidOauthTokenDetailService.findNonDisabledByTokenValue(subjectToken); - if (detail == null) { - throw new IllegalArgumentException("access_token does not exist or is disabled"); - } - if (!detail.getClientDetailsId().equals(tokenRequest.getClientId())) { - throw new IllegalArgumentException("Clients can only exchange their own access_tokens for id_tokens"); - } - if (existing.isExpired()) { - throw new IllegalArgumentException("access_token has expired"); - } - - try { - String idTok = openIDConnectTokenEnhancer.buildIdToken(existing, detail.getOrcid(), tokenRequest.getClientId(), - tokenRequest.getRequestParameters().get(OrcidOauth2Constants.NONCE)); - return new DefaultOAuth2AccessToken(IETFTokenExchangeResponse.idToken(idTok)); - } catch (JOSEException e) { - throw new RuntimeException("Could not sign ID token"); - } catch (ParseException e) { - throw new RuntimeException("Generated unparsable ID token"); - } - } - - /** - * Create new id_token based on existing access token. - * - * @param tokenRequest - * @param subjectToken - * @return - */ - private OAuth2AccessToken generateAccessToken(TokenRequest tokenRequest, String OBOClient, String OBOOrcid) { - // Verify the token DOES NOT belong to requesting client (use refresh - // instead!) - // NOTE: this is now disabled. You can generate your own. - if (OBOClient.equals(tokenRequest.getClientId())) { - throw new IllegalArgumentException("Attempt to exchange own id_token, use refresh token instead"); - } - - // verify OBO client is enabled - ClientDetailsEntity clientDetailsOBO = clientDetailsEntityCacheManager.retrieve(OBOClient); - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetailsOBO); - - // Calculate scopes (include in response additionalInformation) - // get list of all tokens for original client. We have to base this on - // previous tokens, as you can't revoke a code. - // this means only "token id_token" requests will work (not code - // id_token). Just means we must never enable "code id_token". - List details = orcidOauthTokenDetailService.findByClientIdAndUserName(OBOClient, OBOOrcid); - Set activeScopesOBO = Sets.newHashSet(); - Set inactiveScopesOBO = Sets.newHashSet(); - boolean issueRevokedToken = false; - boolean isRevoked = false; - RevokeReason revokeReason = null; - // Lets consider token expiration time anything that goes beyond this date - Date now = new Date(); - for (OrcidOauth2TokenDetail d : details) { - Set scopesInToken = ScopePathType.getScopesFromSpaceSeparatedString(d.getScope()); - // If token is expired, we should ignore it - if (d.getTokenExpiration().after(now)) { - // If token is disabled, we should know if it have the /activities/update scope on it - if(d.getTokenDisabled() == null || !d.getTokenDisabled()) { - activeScopesOBO.addAll(scopesInToken); - } else { - if(scopesInToken.contains(ScopePathType.ACTIVITIES_UPDATE)) { - //Save the revoke reason - try { - revokeReason = StringUtils.isEmpty(d.getRevokeReason()) ? null : RevokeReason.valueOf(d.getRevokeReason()); - } catch(Exception e) { - //In case a weird revoke reason was added or is empty, leave the revoke reason null - } - // Keep only the /activities/update scope if the token was not revoked by a client or staff member - if (revokeReason == null || !doNotAllowDeleteOnTheseRevokeReasons.contains(revokeReason)) { - // We keen this scope even on user deactivated tokens so the member can still delete their own data from records - LOGGER.info("Storing /activites/update scope from deactivated token, this will allow members to delete even if the permission was revoked"); - inactiveScopesOBO.add(ScopePathType.ACTIVITIES_UPDATE); - } else { - isRevoked = true; - } - } else { - LOGGER.info("Ignoring disabled token because it is disabled and doesn't have the /activities/update scope"); - } - } - } - } - - Set scopesOBO = Sets.newHashSet(); - - // If the list of inactive scopes contains /activities/update AND the list of active scopes doesn't, then, we should issue a revoked token that allows obo members to delete - if(inactiveScopesOBO.contains(ScopePathType.ACTIVITIES_UPDATE) && !activeScopesOBO.contains(ScopePathType.ACTIVITIES_UPDATE)) { - issueRevokedToken = true; - scopesOBO.addAll(inactiveScopesOBO); - } else { - issueRevokedToken = false; - scopesOBO.addAll(activeScopesOBO); - } - - if (scopesOBO.isEmpty()) { - if (isRevoked) { - throw new OrcidInvalidScopeException("There are no active tokens with valid scopes for this account"); - } - throw new OrcidInvalidScopeException("The id_token is not associated with a valid scope"); - } - Set combinedOBOScopes = new HashSet(); - for (ScopePathType scope : scopesOBO) { - combinedOBOScopes.addAll(scope.combined()); - } - - // do we have requested scopes? - String requestedScopesString = tokenRequest.getRequestParameters().get(OrcidOauth2Constants.SCOPE_PARAM); - Set requestedScopes = ScopePathType.getScopesFromSpaceSeparatedString(requestedScopesString); - if (requestedScopes != null && !requestedScopes.isEmpty()) { - scopesOBO = Sets.intersection(combinedOBOScopes, requestedScopes); - } - if (scopesOBO.isEmpty()) { - throw new OrcidInvalidScopeException("The requested scope(s) are not available from this id_token"); - } - Set tokenScopes = Sets.newHashSet(); - for (ScopePathType s : scopesOBO) { - tokenScopes.add(s.value()); - } - - // Create access token for calling client - ProfileEntity profileEntity = profileEntityManager.findByOrcid(OBOOrcid); - List authorities = profileDao.getGrantedAuthoritiesForProfile(profileEntity.getId()); - profileEntity.setAuthorities(authorities); - OrcidOauth2UserAuthentication userAuth = new OrcidOauth2UserAuthentication(profileEntity, true); - - Map requestParameters = tokenRequest.getRequestParameters(); - String clientId = tokenRequest.getClientId(); - boolean approved = true; - Set resourceIds = null; - String redirectUri = null; - Set responseTypes = Sets.newHashSet("token"); - Map extensionProperties = null; - OAuth2Request request = new OAuth2Request(requestParameters, clientId, authorities, approved, tokenScopes, resourceIds, redirectUri, responseTypes, - extensionProperties); - - OAuth2Authentication authentication = new OAuth2Authentication(request, userAuth); - OAuth2AccessToken token; - if(issueRevokedToken) { - if(!(tokenServices instanceof OrcidRandomValueTokenServices)) { - throw new OrcidInvalidScopeException("Unable to instantiate the tokenServices as a OrcidRandomValueTokenServices"); - } - OrcidRandomValueTokenServices orcidRandomValueTokenServices = (OrcidRandomValueTokenServices) tokenServices; - token = orcidRandomValueTokenServices.createRevokedAccessToken(authentication, revokeReason); - } else { - token = tokenServices.createAccessToken(authentication); - } - - return new DefaultOAuth2AccessToken(IETFTokenExchangeResponse.accessToken(token)); - // Note, redirect_uri is left blank. - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/IETFTokenExchangeResponse.java b/orcid-core/src/main/java/org/orcid/core/oauth/IETFTokenExchangeResponse.java deleted file mode 100644 index 9c81fe501f6..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/IETFTokenExchangeResponse.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.orcid.core.oauth; - -import java.text.ParseException; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.orcid.core.constants.OrcidOauth2Constants; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.OAuth2RefreshToken; - -import com.nimbusds.jwt.SignedJWT; - -import static org.orcid.core.constants.OrcidOauth2Constants.TOKEN_DISABLED; -import static org.orcid.core.constants.OrcidOauth2Constants.IS_OBO_TOKEN; - -public class IETFTokenExchangeResponse implements OAuth2AccessToken { - - private Map additionalInformation = new HashMap(); - private Set scope = new HashSet(); - private OAuth2RefreshToken refreshToken = null; - private String tokenType; - private Date expiration; - private String value; - private int expiresIn; - - public static IETFTokenExchangeResponse idToken(String idToken) throws ParseException { - IETFTokenExchangeResponse token = new IETFTokenExchangeResponse(); - token.additionalInformation.put("issued_token_type", OrcidOauth2Constants.IETF_EXCHANGE_ID_TOKEN ); - token.value = idToken; - token.tokenType = "N_A"; - SignedJWT claims = SignedJWT.parse(idToken); - token.expiration = claims.getJWTClaimsSet().getExpirationTime(); - return token; - } - - public static IETFTokenExchangeResponse accessToken(OAuth2AccessToken accessToken) { - IETFTokenExchangeResponse token = new IETFTokenExchangeResponse(); - token.additionalInformation.put("issued_token_type", OrcidOauth2Constants.IETF_EXCHANGE_ACCESS_TOKEN ); - token.value = accessToken.getValue(); - token.tokenType="bearer"; - token.expiration = accessToken.getExpiration(); - token.expiresIn = accessToken.getExpiresIn(); - token.scope = accessToken.getScope(); - if (accessToken.getAdditionalInformation().containsKey("orcid")) { - token.additionalInformation.put("orcid",accessToken.getAdditionalInformation().get("orcid")); - } - if (accessToken.getAdditionalInformation().containsKey("name")) { - token.additionalInformation.put("name",accessToken.getAdditionalInformation().get("name")); - } - if(accessToken.getAdditionalInformation().containsKey(TOKEN_DISABLED)) { - token.additionalInformation.put(TOKEN_DISABLED, "true"); - } - if(accessToken.getAdditionalInformation().containsKey(IS_OBO_TOKEN)) { - token.additionalInformation.put(IS_OBO_TOKEN, "true"); - } - - return token; - } - - private IETFTokenExchangeResponse() { - - } - - - @Override - public Map getAdditionalInformation() { - return additionalInformation; - } - - @Override - public Set getScope() { - return scope; - } - - @Override - public OAuth2RefreshToken getRefreshToken() { - return refreshToken; - } - - @Override - public String getTokenType() { - return tokenType; - } - - @Override - public boolean isExpired() { - return false; - } - - @Override - public Date getExpiration() { - return expiration; - } - - @Override - public int getExpiresIn() { - return expiresIn; - } - - @Override - public String getValue() { - return value; - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OAuthError.java b/orcid-core/src/main/java/org/orcid/core/oauth/OAuthError.java index e61dd176b67..93b697299f1 100644 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OAuthError.java +++ b/orcid-core/src/main/java/org/orcid/core/oauth/OAuthError.java @@ -1,6 +1,6 @@ package org.orcid.core.oauth; -import javax.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.Response.Status; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OAuthErrorUtils.java b/orcid-core/src/main/java/org/orcid/core/oauth/OAuthErrorUtils.java index 83548f13281..d0fba7fa494 100644 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OAuthErrorUtils.java +++ b/orcid-core/src/main/java/org/orcid/core/oauth/OAuthErrorUtils.java @@ -1,18 +1,13 @@ package org.orcid.core.oauth; -import javax.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.Response.Status; -import de.undercouch.citeproc.helper.tool.MissingArgumentException; import org.orcid.core.exception.ClientDeactivatedException; import org.orcid.core.exception.DeactivatedException; import org.orcid.core.exception.LockedException; import org.orcid.core.exception.OrcidDeprecatedException; import org.orcid.core.exception.OrcidInvalidScopeException; import org.springframework.security.authentication.InsufficientAuthenticationException; -import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; -import org.springframework.security.oauth2.common.exceptions.UnsupportedGrantTypeException; public class OAuthErrorUtils { @@ -25,36 +20,21 @@ public static OAuthError getOAuthError(Throwable t) { } else if (ClientDeactivatedException.class.isAssignableFrom(t.getClass())) { error.setError(OAuthError.UNAUTHORIZED_CLIENT); error.setResponseStatus(Status.BAD_REQUEST); - } else if (UnsupportedGrantTypeException.class.isAssignableFrom(t.getClass())) { - error.setError(OAuthError.UNSUPPORTED_GRANT_TYPE); - error.setResponseStatus(Status.BAD_REQUEST); } else if (OrcidInvalidScopeException.class.isAssignableFrom(t.getClass())) { error.setError(OAuthError.INVALID_SCOPE); error.setResponseStatus(Status.UNAUTHORIZED); - } else if (InvalidScopeException.class.isAssignableFrom(t.getClass())) { - error.setError(OAuthError.INVALID_SCOPE); - error.setResponseStatus(Status.BAD_REQUEST); } else if (InsufficientAuthenticationException.class.isAssignableFrom(t.getClass())) { error.setError(OAuthError.UNAUTHORIZED_CLIENT); error.setResponseStatus(Status.UNAUTHORIZED); } else if (IllegalArgumentException.class.isAssignableFrom(t.getClass())) { error.setError(OAuthError.INVALID_REQUEST); error.setResponseStatus(Status.BAD_REQUEST); - } else if (InvalidGrantException.class.isAssignableFrom(t.getClass())) { - error.setError(OAuthError.INVALID_GRANT); - error.setResponseStatus(Status.BAD_REQUEST); } else if(DeactivatedException.class.isAssignableFrom(t.getClass())) { error.setError(OAuthError.UNAUTHORIZED_CLIENT); error.setResponseStatus(Status.BAD_REQUEST); } else if(OrcidDeprecatedException.class.isAssignableFrom(t.getClass())) { error.setError(OAuthError.UNAUTHORIZED_CLIENT); error.setResponseStatus(Status.BAD_REQUEST); - } else if (InvalidTokenException.class.isAssignableFrom(t.getClass())) { - error.setError(OAuthError.UNAUTHORIZED_CLIENT); - error.setResponseStatus(Status.BAD_REQUEST); - } else if(MissingArgumentException.class.isAssignableFrom(t.getClass())) { - error.setError(OAuthError.UNAUTHORIZED_CLIENT); - error.setResponseStatus(Status.BAD_REQUEST); } else { error.setError(OAuthError.SERVER_ERROR); error.setResponseStatus(Status.INTERNAL_SERVER_ERROR); diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidAuthorizationCodeTokenGranter.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidAuthorizationCodeTokenGranter.java deleted file mode 100644 index 41a88f1d548..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidAuthorizationCodeTokenGranter.java +++ /dev/null @@ -1,166 +0,0 @@ -package org.orcid.core.oauth; - -import java.util.Calendar; -import java.util.Date; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Resource; - -import org.apache.commons.lang.StringUtils; -import org.orcid.core.constants.RevokeReason; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator; -import org.orcid.persistence.dao.OrcidOauth2AuthoriziationCodeDetailDao; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.OrcidOauth2AuthoriziationCodeDetail; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; -import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; -import org.springframework.security.oauth2.common.exceptions.RedirectMismatchException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.ClientDetails; -import org.springframework.security.oauth2.provider.ClientDetailsService; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.OAuth2RequestFactory; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices; -import org.springframework.security.oauth2.provider.token.AbstractTokenGranter; -import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; - -public class OrcidAuthorizationCodeTokenGranter extends AbstractTokenGranter { - - private static final Logger LOGGER = LoggerFactory.getLogger(OrcidAuthorizationCodeTokenGranter.class); - - private static final String GRANT_TYPE = "authorization_code"; - - private final AuthorizationCodeServices authorizationCodeServices; - - @Value("${org.orcid.core.oauth.auth_code.expiration_minutes:1440}") - private int authorizationCodeExpiration; - - @Resource(name = "orcidOauth2AuthoriziationCodeDetailDao") - private OrcidOauth2AuthoriziationCodeDetailDao orcidOauth2AuthoriziationCodeDetailDao; - - @Resource - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - - @Resource - private OrcidOauth2TokenDetailService orcidOauthTokenDetailService; - - public OrcidAuthorizationCodeTokenGranter(AuthorizationServerTokenServices tokenServices, AuthorizationCodeServices authorizationCodeServices, - ClientDetailsService clientDetailsService, OAuth2RequestFactory oAuth2RequestFactory) { - super(tokenServices, clientDetailsService, oAuth2RequestFactory, GRANT_TYPE); - this.authorizationCodeServices = authorizationCodeServices; - } - - @Override - protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) { - - Map parameters = tokenRequest.getRequestParameters(); - String authorizationCode = parameters.get("code"); - String redirectUri = parameters.get(OAuth2Utils.REDIRECT_URI); - - LOGGER.info("Getting OAuth2 authentication: code={}, clientId={}, scope={}", new Object[] { authorizationCode, - tokenRequest.getClientId(), tokenRequest.getScope() }); - - if (authorizationCode == null) { - throw new OAuth2Exception("An authorization code must be supplied."); - } - - //Validate the client is active - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(tokenRequest.getClientId()); - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetails); - - //Validate scopes - OrcidOauth2AuthoriziationCodeDetail codeDetails = orcidOauth2AuthoriziationCodeDetailDao.find(authorizationCode); - - if(codeDetails == null) { - int numDisabled = orcidOauthTokenDetailService.disableAccessTokenByCodeAndClient(authorizationCode, tokenRequest.getClientId(), RevokeReason.AUTH_CODE_REUSED); - if (numDisabled > 0) { - throw new InvalidGrantException("Reused authorization code: " + authorizationCode); - } - throw new InvalidGrantException("Invalid authorization code: " + authorizationCode); - } else { - //////// - // TODO: The name should change to `scopes` once the authorization server generates all authorization codes - //////// - Set newScopes = StringUtils.isNotBlank(codeDetails.getNewScopes()) ? Stream.of(codeDetails.getNewScopes().split(",")).map(String::trim).collect(Collectors.toSet()) : Set.of(); - - // Check auth code expiration - Date tokenCreationDate = codeDetails.getDateCreated(); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(tokenCreationDate); - calendar.add(Calendar.MINUTE, authorizationCodeExpiration); - Date tokenExpirationDate = calendar.getTime(); - - if(tokenExpirationDate.before(new Date())) { - throw new IllegalArgumentException("Authorization code has expired"); - } - - // Check granted scopes - //////// - // TODO: these granted scopes should be the newScopes set once the authorization server generate all authorization codes - //////// - Set grantedScopes = codeDetails.getScopes(); - // Add the new scopes to the list of scopes - grantedScopes.addAll(newScopes); - - Set requestScopes = tokenRequest.getScope(); - - for(String requestScope : requestScopes) { - if(!grantedScopes.contains(requestScope)) { - throw new InvalidScopeException("Invalid scopes: " + requestScope + " available scopes for this code are: " + grantedScopes); - } - } - - } - - //Consume code - OAuth2Authentication storedAuth; - try{ - storedAuth = authorizationCodeServices.consumeAuthorizationCode(authorizationCode); - }catch(InvalidGrantException e){ - throw e; - } - - OAuth2Request pendingAuthorizationRequest = storedAuth.getOAuth2Request(); - //Regenerate the authorization request but now with the request parameters - pendingAuthorizationRequest = pendingAuthorizationRequest.createOAuth2Request(parameters); - - LOGGER.debug("Found pending authorization request: redirectUri={}, clientId={}, scope={}, is_approved={}", new Object[] { pendingAuthorizationRequest.getRedirectUri(), - pendingAuthorizationRequest.getClientId(), pendingAuthorizationRequest.getScope(), pendingAuthorizationRequest.isApproved() }); - // https://jira.springsource.org/browse/SECOAUTH-333 - // This might be null, if the authorization was done without the - // redirect_uri parameter - String redirectUriApprovalParameter = pendingAuthorizationRequest.getRequestParameters().get(OAuth2Utils.REDIRECT_URI); - - if ((redirectUri != null || redirectUriApprovalParameter != null) && !pendingAuthorizationRequest.getRedirectUri().equals(redirectUri)) { - throw new RedirectMismatchException("Redirect URI mismatch."); - } - - String pendingClientId = pendingAuthorizationRequest.getClientId(); - String clientId = client.getClientId(); - if (clientId != null && !clientId.equals(pendingClientId)) { - LOGGER.error("Exception exchanging authentication code {}, client ID mismatch: pendingClientId={}, authorizationRequest.clientId={}", - new Object[] { authorizationCode, pendingClientId, clientId }); - // just a sanity check. - throw new InvalidClientException("Client ID mismatch"); - } - - Authentication userAuth = storedAuth.getUserAuthentication(); - return new OAuth2Authentication(pendingAuthorizationRequest, userAuth); - - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2ClientAuthentication.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidBearerTokenAuthentication.java similarity index 68% rename from orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2ClientAuthentication.java rename to orcid-core/src/main/java/org/orcid/core/oauth/OrcidBearerTokenAuthentication.java index 657b889f468..fe23c616974 100644 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2ClientAuthentication.java +++ b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidBearerTokenAuthentication.java @@ -5,21 +5,33 @@ import org.springframework.security.core.GrantedAuthority; import java.util.Collection; +import java.util.Set; /** * @author Declan Newman (declan) Date: 17/04/2012 */ -public class OrcidOauth2ClientAuthentication implements Authentication { +public class OrcidBearerTokenAuthentication implements Authentication { /** * */ private static final long serialVersionUID = 1L; - private ClientDetailsEntity clientDetails; + private String clientId; + private String userOrcid; + private String token; + private Set scopes; + private Set authorities; private boolean authenticated = false; + private String oboClientId; - public OrcidOauth2ClientAuthentication(ClientDetailsEntity clientDetails) { - this.clientDetails = clientDetails; + private OrcidBearerTokenAuthentication(Builder builder) { + this.clientId = builder.clientId; + this.userOrcid = builder.userOrcid; + this.token = builder.token; + this.scopes = builder.scopes; + this.authorities = builder.authorities; + this.authenticated = builder.authenticated; + this.oboClientId = builder.oboClientId; } /** @@ -38,7 +50,7 @@ public OrcidOauth2ClientAuthentication(ClientDetailsEntity clientDetails) { */ @Override public Collection getAuthorities() { - return clientDetails.getAuthorities(); + return this.authorities; } /** @@ -52,7 +64,7 @@ public Collection getAuthorities() { */ @Override public Object getCredentials() { - return clientDetails.getClientSecret(); + return this.token; } /** @@ -64,7 +76,7 @@ public Object getCredentials() { */ @Override public Object getDetails() { - return clientDetails.getAuthorizedGrantTypes(); + return null; } /** @@ -83,7 +95,7 @@ public Object getDetails() { */ @Override public Object getPrincipal() { - return clientDetails; + return clientId; } /** @@ -123,7 +135,7 @@ public boolean isAuthenticated() { * parameter (which would indicate the authentication token is trusted - a * potential security risk) the implementation should throw an * {@link IllegalArgumentException}. - * + * * @param isAuthenticated * true if the token should be trusted (which may * result in an exception) or false if the token @@ -141,6 +153,66 @@ public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentExce @Override public String getName() { - return clientDetails.getClientName(); + return this.clientId; + } + + public String getClientId() { + return clientId; + } + + public String getUserOrcid() { + return userOrcid; + } + + public Set getScopes() { + return scopes; + } + + public String getOboClientId() { + return this.oboClientId; + } + + public static Builder builder(String clientId, String userOrcid, String token) { + return new Builder(clientId, userOrcid, token); + } + + public static class Builder { + private final String clientId; + private final String userOrcid; + private final String token; + private Set scopes; + private Set authorities; + private boolean authenticated = false; + private String oboClientId; + + private Builder(String clientId, String userOrcid, String token) { + this.clientId = clientId; + this.userOrcid = userOrcid; + this.token = token; + } + + public Builder scopes(Set scopes) { + this.scopes = scopes; + return this; + } + + public Builder authorities(Set authorities) { + this.authorities = authorities; + return this; + } + + public Builder authenticated(boolean authenticated) { + this.authenticated = authenticated; + return this; + } + + public Builder oboClientId(String oboClientId) { + this.oboClientId = oboClientId; + return this; + } + + public OrcidBearerTokenAuthentication build() { + return new OrcidBearerTokenAuthentication(this); + } } } diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidClientCredentialsChecker.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidClientCredentialsChecker.java deleted file mode 100644 index 02df6b90366..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidClientCredentialsChecker.java +++ /dev/null @@ -1,122 +0,0 @@ -package org.orcid.core.oauth; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; - -import org.apache.commons.lang.StringUtils; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.ClientDetails; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.OAuth2RequestFactory; -import org.springframework.security.oauth2.provider.TokenRequest; - -/** - * @author Declan Newman (declan) Date: 10/05/2012 - */ -public class OrcidClientCredentialsChecker { - - @Resource - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - - private final OAuth2RequestFactory oAuth2RequestFactory; - - public void setOrcidOAuth2RequestValidator(OrcidOAuth2RequestValidator orcidOAuth2RequestValidator) { - this.orcidOAuth2RequestValidator = orcidOAuth2RequestValidator; - } - - public OrcidClientCredentialsChecker(OAuth2RequestFactory oAuth2RequestFactory) { - this.oAuth2RequestFactory = oAuth2RequestFactory; - } - - public void setClientDetailsEntityCacheManager(ClientDetailsEntityCacheManager clientDetailsEntityCacheManager) { - this.clientDetailsEntityCacheManager = clientDetailsEntityCacheManager; - } - - public OAuth2Request validateCredentials(String grantType, TokenRequest tokenRequest) { - String clientId = tokenRequest.getClientId(); - String scopesString = tokenRequest.getRequestParameters().get(OrcidOauth2Constants.SCOPE_PARAM); - Set scopes = new HashSet(); - if(!PojoUtil.isEmpty(scopesString)) { - scopes = OAuth2Utils.parseParameterList(scopesString); - } - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(clientId); - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetails); - validateGrantType(grantType, clientDetails); - if (scopes != null) { - validateScope(clientDetails, scopes); - } - - Map authorizationParams = new HashMap(); - authorizationParams.putAll(tokenRequest.getRequestParameters()); - authorizationParams.put(OrcidOauth2Constants.GRANT_TYPE, grantType); - authorizationParams.put(OAuth2Utils.SCOPE, StringUtils.join(scopes, ' ')); - authorizationParams.put(OAuth2Utils.CLIENT_ID, clientId); - - AuthorizationRequest authorizationRequest = oAuth2RequestFactory.createAuthorizationRequest(authorizationParams); - authorizationRequest.setAuthorities(clientDetails.getAuthorities()); - authorizationRequest.setResourceIds(clientDetails.getResourceIds()); - authorizationRequest.setApproved(true); - - return oAuth2RequestFactory.createOAuth2Request(authorizationRequest); - } - - private void validateScope(ClientDetails clientDetails, Set scopes) { - if (clientDetails.isScoped()) { - Set validScope = clientDetails.getScope(); - if (scopes.isEmpty()) { - throw new InvalidScopeException("Invalid scope (none)"); - } else if (!containsAny(validScope, ScopePathType.ORCID_PROFILE_CREATE, ScopePathType.WEBHOOK, - ScopePathType.PREMIUM_NOTIFICATION, ScopePathType.GROUP_ID_RECORD_READ, ScopePathType.GROUP_ID_RECORD_UPDATE) - && !scopes.contains(ScopePathType.READ_PUBLIC.value()) && scopes.size() == 1) { - throw new InvalidScopeException("Invalid scope" + (scopes != null && scopes.size() > 1 ? "s: " : ": " + "") + OAuth2Utils.formatParameterList(scopes), - validScope); - } - - // The Read public does not have to be granted. It's the implied - // read level. We let this through, regardless - if (scopes.size() == 1 && scopes.iterator().next().equals(ScopePathType.READ_PUBLIC.value())) { - return; - } - - for (String scope : scopes) { - if (!validScope.contains(scope)) { - throw new InvalidScopeException("Invalid scope: " + scope, validScope); - } - } - } - - } - - private boolean containsAny(Set scopes, ScopePathType... scopePathTypes) { - for (ScopePathType scopePathType : scopePathTypes) { - if (scopes.contains(scopePathType.value())) { - return true; - } - } - return false; - } - - private void validateGrantType(String grantType, ClientDetails clientDetails) { - Collection authorizedGrantTypes = clientDetails.getAuthorizedGrantTypes(); - if (authorizedGrantTypes != null && !authorizedGrantTypes.isEmpty() && !authorizedGrantTypes.contains(grantType)) { - throw new InvalidGrantException("Unauthorized grant type: " + grantType); - } - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidClientCredentialsTokenGranter.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidClientCredentialsTokenGranter.java deleted file mode 100644 index 8b0460e8305..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidClientCredentialsTokenGranter.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.orcid.core.oauth; - -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.TokenGranter; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; - -/** - * @author Declan Newman (declan) Date: 10/05/2012 - */ -public class OrcidClientCredentialsTokenGranter implements TokenGranter { - - private static final String CLIENT_CREDENTIALS = "client_credentials"; - - private final OrcidClientCredentialsChecker clientCredentialsChecker; - - private final AuthorizationServerTokenServices tokenServices; - - public OrcidClientCredentialsTokenGranter(OrcidClientCredentialsChecker clientCredentialsChecker, AuthorizationServerTokenServices tokenServices) { - this.clientCredentialsChecker = clientCredentialsChecker; - this.tokenServices = tokenServices; - } - - @Override - public OAuth2AccessToken grant(String grantType, TokenRequest tokenRequest) { - if (!CLIENT_CREDENTIALS.equals(grantType)) { - return null; - } - - OAuth2Request authorizationRequest = clientCredentialsChecker.validateCredentials(grantType, tokenRequest); - - return tokenServices.createAccessToken(new OAuth2Authentication(authorizationRequest, null)); - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidImplicitTokenGranter.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidImplicitTokenGranter.java deleted file mode 100644 index 00aedf8e939..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidImplicitTokenGranter.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.orcid.core.oauth; - -import java.util.List; - -import javax.annotation.Resource; - -import org.orcid.core.manager.ProfileEntityManager; -import org.orcid.persistence.dao.ProfileDao; -import org.orcid.persistence.jpa.entities.OrcidGrantedAuthority; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.springframework.security.authentication.InsufficientAuthenticationException; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.provider.ClientDetails; -import org.springframework.security.oauth2.provider.ClientDetailsService; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.OAuth2RequestFactory; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.security.oauth2.provider.implicit.ImplicitTokenGranter; -import org.springframework.security.oauth2.provider.implicit.ImplicitTokenRequest; -import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; - -public class OrcidImplicitTokenGranter extends ImplicitTokenGranter { - @Resource - private ProfileEntityManager profileEntityManager; - @Resource - private ProfileDao profileDao; - - protected OrcidImplicitTokenGranter(AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService, OAuth2RequestFactory requestFactory) { - super(tokenServices, clientDetailsService, requestFactory); - } - - /** - * Note, client must have implicit scope in client_authorized_grant_type - * table to get this far. Otherwise request will be rejected by - * OrcidClientCredentialsChecker - * - */ - @Override - protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest clientToken) { - Authentication userAuthSpring = SecurityContextHolder.getContext().getAuthentication(); - if (userAuthSpring == null || !userAuthSpring.isAuthenticated()) { - throw new InsufficientAuthenticationException("There is no currently logged in user"); - } - OAuth2Request request = ((ImplicitTokenRequest) clientToken).getOAuth2Request(); - ProfileEntity profileEntity = profileEntityManager.findByOrcid(userAuthSpring.getName()); - List authorities = profileDao.getGrantedAuthoritiesForProfile(profileEntity.getId()); - profileEntity.setAuthorities(authorities); - - OrcidOauth2UserAuthentication userAuth = new OrcidOauth2UserAuthentication(profileEntity, - userAuthSpring.isAuthenticated()); - OAuth2Authentication result = new OAuth2Authentication(request, userAuth); - return result; - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOAuth2Authentication.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOAuth2Authentication.java deleted file mode 100644 index 4d65aced1f7..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOAuth2Authentication.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.orcid.core.oauth; - -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.util.Assert; - -/** - * @author Declan Newman (declan) Date: 10/05/2012 - */ -public class OrcidOAuth2Authentication extends OAuth2Authentication { - - /** - * - */ - private static final long serialVersionUID = 1L; - private String activeToken; - - /** - * Construct an OAuth 2 authentication. Since some grant types don't require - * user authentication, the user authentication may be null. The active - * token cannot be null as this is needed for subsequent changes to the - * scopes when writing. - * - * @param authorizationRequest - * The authorization request (must not be null). - * @param userAuthentication - * The user authentication (possibly null). - * @param activeToken - * The token that has been used to authenticate the client - */ - - public OrcidOAuth2Authentication(AuthorizationRequest authorizationRequest, Authentication userAuthentication, String activeToken) { - super(authorizationRequest.createOAuth2Request(), userAuthentication); - Assert.hasText(activeToken, "The active token must have a value."); - this.activeToken = activeToken; - } - - public String getActiveToken() { - return activeToken; - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2AuthInfo.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2AuthInfo.java deleted file mode 100644 index 9f617402109..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2AuthInfo.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.orcid.core.oauth; - -import java.util.Set; - -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; - -public class OrcidOauth2AuthInfo { - - private String clientId; - - private Set scopes; - - private String userOrcid; - - public OrcidOauth2AuthInfo(String clientId, Set scopes, String userOrcid) { - this.clientId = clientId; - this.scopes = scopes; - this.userOrcid = userOrcid; - } - - public OrcidOauth2AuthInfo(OAuth2Authentication oauth2Authentication) { - if (oauth2Authentication != null) { - init(oauth2Authentication.getOAuth2Request(), oauth2Authentication.getUserAuthentication()); - } - } - - private void init(OAuth2Request authRequest, Authentication userAuthentication) { - if (authRequest != null) { - clientId = authRequest.getClientId(); - scopes = authRequest.getScope(); - if (userAuthentication != null) { - Object principal = userAuthentication.getPrincipal(); - if (principal != null) { - if (ProfileEntity.class.isAssignableFrom(principal.getClass())) { - userOrcid = ((ProfileEntity) principal).getId(); - } else if (UserDetails.class.isAssignableFrom(principal.getClass())) { - userOrcid = ((UserDetails) principal).getUsername(); - } - } - } - } - } - - public String getClientId() { - return clientId; - } - - public void setClientId(String clientId) { - this.clientId = clientId; - } - - public Set getScopes() { - return scopes; - } - - public void setScopes(Set scopes) { - this.scopes = scopes; - } - - public String getUserOrcid() { - return userOrcid; - } - - public void setUserOrcid(String userOrcid) { - this.userOrcid = userOrcid; - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2TokenDetailService.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2TokenDetailService.java deleted file mode 100644 index a26fbe676c5..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2TokenDetailService.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.orcid.core.oauth; - -import java.util.List; -import java.util.Set; - -import org.orcid.core.constants.RevokeReason; -import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; - -/** - * @author Declan Newman (declan) Date: 19/04/2012 - */ -public interface OrcidOauth2TokenDetailService { - - void setOrcidOauth2TokenDetailDao(OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao); - - OrcidOauth2TokenDetail findNonDisabledByTokenValue(String token); - - OrcidOauth2TokenDetail findIgnoringDisabledByTokenValue(String token); - - OrcidOauth2TokenDetail findByRefreshTokenValue(String refreshTokenValue); - - void removeByRefreshTokenValue(String refreshToken); - - List findByAuthenticationKey(String authKey); - - List findByUserName(String userName); - - List findByClientId(String clientId); - - List findByClientIdAndUserName(String clientId, String userName); - - boolean doesClientKnowUser(String clientId, String userName); - - /** - * This should NOT delete the row, but merely set it as disabled - * - * @param accessToken - * the value to use to identify the row containing the access - * token - */ - void disableAccessToken(String accessToken); - - /** - * This should NOT delete the row, but merely set it as disabled and store the revoke date - * - * @param accessToken - * the value to use to identify the row containing the access - * token - */ - void revokeAccessToken(String accessToken); - - void disableAccessTokenByRefreshToken(String refreshTokenValue); - - /** - * This should NOT delete the row, but merely set it as disabled - * - * @param tokenId - * the id of the token that should be disabled - * @param userOrcid - * the id of the user owner of the token - */ - void disableAccessToken(Long tokenId, String userOrcid); - - void createNew(OrcidOauth2TokenDetail detail); - - boolean hasToken(String userName, long lastModified); - - int disableAccessTokenByCodeAndClient(String authorizationCode, String clientID, RevokeReason reason); - - /** - * This should NOT delete the row, but merely set it as disabled - * - * @param userOrcid - * the id of the user owner of the token - */ - void disableAccessTokenByUserOrcid(String userOrcid, RevokeReason reason); - - void disableClientAccess(String clientDetailsId, String userOrcid); - - boolean updateScopes(String acessToken, Set newScopes); - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOboOAuth2Authentication.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOboOAuth2Authentication.java deleted file mode 100644 index 0ddd50b8c7f..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOboOAuth2Authentication.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.orcid.core.oauth; - -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.util.Assert; - -/** - * @author Declan Newman (declan) Date: 10/05/2012 - */ -public class OrcidOboOAuth2Authentication extends OrcidOAuth2Authentication { - private static final long serialVersionUID = 4582917463028491537L; - private String oboClientId; - - /** - * Construct an OAuth 2 authentication. Since some grant types don't require - * user authentication, the user authentication may be null. The active - * token cannot be null as this is needed for subsequent changes to the - * scopes when writing. - * - * @param oboClientId - * The client id of the OBO client - * @param authorizationRequest - * The authorization request (must not be null). - * @param userAuthentication - * The user authentication (possibly null). - * @param activeToken - * The token that has been used to authenticate the client - */ - - public OrcidOboOAuth2Authentication(String oboClientId, AuthorizationRequest authorizationRequest, Authentication userAuthentication, String activeToken) { - super(authorizationRequest, userAuthentication, activeToken); - Assert.hasText(oboClientId, "The oboClientId must have a value."); - this.oboClientId = oboClientId; - } - - public String getOboClientId() { - return oboClientId; - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidRandomValueTokenServices.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidRandomValueTokenServices.java deleted file mode 100644 index ff97d162734..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidRandomValueTokenServices.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.orcid.core.oauth; - -import java.util.Collection; - -import org.orcid.core.constants.RevokeReason; -import org.orcid.core.oauth.service.OrcidTokenStore; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; -import org.springframework.security.oauth2.provider.token.TokenEnhancer; - -/** - * @author Angel Montenegro - * */ -public interface OrcidRandomValueTokenServices extends AuthorizationServerTokenServices { - - OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException; - - OAuth2Authentication loadAuthentication(String accessTokenValue) throws AuthenticationException; - - int getWriteValiditySeconds(); - - int getReadValiditySeconds(); - - void setOrcidtokenStore(OrcidTokenStore orcidtokenStore); - - void setCustomTokenEnhancer(TokenEnhancer customTokenEnhancer); - - boolean longLifeTokenExist(String clientId, String userId, Collection scopes); - - OAuth2AccessToken createRevokedAccessToken(OAuth2Authentication authentication, RevokeReason revokeReason) throws AuthenticationException; - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidRefreshTokenChecker.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidRefreshTokenChecker.java deleted file mode 100644 index bf845fd6a9a..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidRefreshTokenChecker.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.orcid.core.oauth; - -import java.util.Date; -import java.util.HashSet; -import java.util.Set; - -import javax.annotation.Resource; -import javax.persistence.NoResultException; - -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.TokenRequest; - -/** - * @author Angel Montenegro - */ -public class OrcidRefreshTokenChecker { - @Resource - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - - @Resource - private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao; - - public void validateRequest(String grantType, TokenRequest tokenRequest, Long requestTimeInMillis) { - String authorization = tokenRequest.getRequestParameters().get(OrcidOauth2Constants.AUTHORIZATION); - String clientId = tokenRequest.getClientId(); - String scopes = tokenRequest.getRequestParameters().get(OAuth2Utils.SCOPE); - Long expireIn = tokenRequest.getRequestParameters().containsKey(OrcidOauth2Constants.EXPIRES_IN) - ? Long.valueOf(tokenRequest.getRequestParameters().get(OrcidOauth2Constants.EXPIRES_IN)) : 0L; - String refreshToken = tokenRequest.getRequestParameters().get(OrcidOauth2Constants.REFRESH_TOKEN); - - OrcidOauth2TokenDetail token = null; - try { - token = orcidOauth2TokenDetailDao.findByRefreshTokenValue(refreshToken); - } catch (NoResultException e) { - throw new InvalidTokenException("Unable to find refresh token", e); - } - - // Verify the token belongs to this client - if (!clientId.equals(token.getClientDetailsId())) { - throw new IllegalArgumentException("This token does not belong to the given client"); - } - - // Verify client is enabled - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(clientId); - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetails); - - // Verify the token is not expired - if (token.getTokenExpiration() != null) { - if (token.getTokenExpiration().before(new Date())) { - throw new InvalidTokenException("Access token expired: " + authorization); - } - } - - // Verify access token and refresh token are linked - if (!refreshToken.equals(token.getRefreshTokenValue())) { - throw new InvalidTokenException("Token and refresh token does not match"); - } - - // Verify the token is not disabled - if (token.getTokenDisabled() != null && token.getTokenDisabled()) { - throw new InvalidTokenException("Parent token is disabled"); - } - - // Verify scopes are not wider than the token scopes - if (PojoUtil.isEmpty(scopes)) { - scopes = token.getScope(); - } else { - Set requiredScopes = ScopePathType.getScopesFromSpaceSeparatedString(scopes); - Set simpleTokenScopes = ScopePathType.getScopesFromSpaceSeparatedString(token.getScope()); - // This collection contains all tokens that should be allowed given - // the scopes that the parent token contains - Set combinedTokenScopes = new HashSet(); - for (ScopePathType scope : simpleTokenScopes) { - combinedTokenScopes.addAll(scope.combined()); - } - - // Check that all requiredScopes are included in the list of - // combinedTokenScopes - for (ScopePathType scope : requiredScopes) { - if (!combinedTokenScopes.contains(scope)) { - throw new InvalidScopeException("The given scope '" + scope.value() + "' is not allowed for the parent token"); - } - } - } - - // Validate the expiration for the new token is no later than the parent - // token expiration. - long parentTokenExpiration = token.getTokenExpiration() == null ? System.currentTimeMillis() : token.getTokenExpiration().getTime(); - if (expireIn > parentTokenExpiration) { - throw new IllegalArgumentException("Token expiration can't be after " + token.getTokenExpiration()); - } - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidRefreshTokenTokenGranter.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidRefreshTokenTokenGranter.java deleted file mode 100644 index 38c79595a67..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidRefreshTokenTokenGranter.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.orcid.core.oauth; - -import org.orcid.core.constants.OrcidOauth2Constants; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.provider.TokenGranter; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; - -/** - * @author Angel Montenegro - */ -public class OrcidRefreshTokenTokenGranter implements TokenGranter { - private final OrcidRefreshTokenChecker orcidRefreshTokenChecker; - - private final AuthorizationServerTokenServices tokenServices; - - public OrcidRefreshTokenTokenGranter(OrcidRefreshTokenChecker orcidRefreshTokenChecker, AuthorizationServerTokenServices tokenServices) { - this.orcidRefreshTokenChecker = orcidRefreshTokenChecker; - this.tokenServices = tokenServices; - } - - @Override - public OAuth2AccessToken grant(String grantType, TokenRequest tokenRequest) { - if (!OrcidOauth2Constants.REFRESH_TOKEN.equals(grantType)) { - return null; - } - - Long requestTimeInMillis = System.currentTimeMillis(); - orcidRefreshTokenChecker.validateRequest(grantType, tokenRequest, requestTimeInMillis); - - //If no exception is thrown we are ready to create the new token - String refreshToken = tokenRequest.getRequestParameters().get(OrcidOauth2Constants.REFRESH_TOKEN); - - return tokenServices.refreshAccessToken(refreshToken, tokenRequest); - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidTokenEnhancer.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidTokenEnhancer.java deleted file mode 100644 index d725577f6b1..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidTokenEnhancer.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.orcid.core.oauth; - -import java.util.HashMap; -import java.util.Map; - -import javax.annotation.Resource; - -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.ProfileEntityManager; -import org.orcid.persistence.dao.OrcidOauth2AuthoriziationCodeDetailDao; -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.token.TokenEnhancer; - -public class OrcidTokenEnhancer implements TokenEnhancer { - @Resource - private ProfileEntityManager profileEntityManager; - - @Resource - private OrcidOauth2AuthoriziationCodeDetailDao orcidOauth2AuthoriziationCodeDetailDao; - - @Override - public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { - if (!(accessToken instanceof DefaultOAuth2AccessToken)) - throw new UnsupportedOperationException("At this time we can handle only tokens of type DefaultOauth2AccessToken"); - DefaultOAuth2AccessToken result = (DefaultOAuth2AccessToken) accessToken; - OrcidOauth2AuthInfo authInfo = new OrcidOauth2AuthInfo(authentication); - String userOrcid = authInfo.getUserOrcid(); - - Map additionalInfo = new HashMap(); - if (result.getAdditionalInformation() != null && !result.getAdditionalInformation().isEmpty()) { - additionalInfo.putAll(result.getAdditionalInformation()); - } - - if (!OrcidOauth2Constants.IMPLICIT_GRANT_TYPE.equals(authentication.getOAuth2Request().getGrantType())){ - // If the additional info object already contains the orcid info, leave - // it - if (!additionalInfo.containsKey("orcid")) { - additionalInfo.put("orcid", userOrcid); - } - - // If the additional info object already contains the name info, leave - // it - if (!additionalInfo.containsKey("name")) { - if (userOrcid != null) { - String name = profileEntityManager.retrivePublicDisplayName(userOrcid); - additionalInfo.put("name", name); - } - } - } - - // Overwrite token version - additionalInfo.put(OrcidOauth2Constants.TOKEN_VERSION, OrcidOauth2Constants.PERSISTENT_TOKEN); - - // Overwrite persistent flag - if (isPersistentTokenEnabled(authentication.getOAuth2Request())) { - additionalInfo.put(OrcidOauth2Constants.PERSISTENT, true); - } else { - additionalInfo.put(OrcidOauth2Constants.PERSISTENT, false); - } - - // Put the updated additional info object in the result - result.setAdditionalInformation(additionalInfo); - - return result; - } - - /** - * Checks the authorization code to verify if the user enable the persistent - * token or not - * */ - private boolean isPersistentTokenEnabled(OAuth2Request authorizationRequest) { - if (authorizationRequest != null) { - Map params = authorizationRequest.getRequestParameters(); - if (params != null) { - if (params.containsKey(OrcidOauth2Constants.IS_PERSISTENT)) { - String isPersistent = params.get(OrcidOauth2Constants.IS_PERSISTENT); - if (Boolean.valueOf(isPersistent)) { - return true; - } - } else if (params.containsKey("code")) { - String code = params.get("code"); - if (orcidOauth2AuthoriziationCodeDetailDao.find(code) != null) { - if (orcidOauth2AuthoriziationCodeDetailDao.isPersistentToken(code)) { - return true; - } - } - } else if (params.get(OrcidOauth2Constants.RESPONSE_TYPE_PARAM) != null - && params.get(OrcidOauth2Constants.RESPONSE_TYPE_PARAM).contains(OrcidOauth2Constants.IMPLICIT_TOKEN_RESPONSE_TYPE) - && "true".equals(params.get(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN))){ - //for implicit generation, use the query string parameter. - return true; - } - } - } - - return false; - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2UserAuthentication.java b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidUserAuthentication.java similarity index 96% rename from orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2UserAuthentication.java rename to orcid-core/src/main/java/org/orcid/core/oauth/OrcidUserAuthentication.java index 77d1fdd28b4..f9bede234af 100644 --- a/orcid-core/src/main/java/org/orcid/core/oauth/OrcidOauth2UserAuthentication.java +++ b/orcid-core/src/main/java/org/orcid/core/oauth/OrcidUserAuthentication.java @@ -2,7 +2,7 @@ import java.util.Collection; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.manager.v3.read_only.RecordNameManagerReadOnly; @@ -15,7 +15,7 @@ /** * @author Declan Newman (declan) Date: 17/04/2012 */ -public class OrcidOauth2UserAuthentication implements Authentication { +public class OrcidUserAuthentication implements Authentication { /** * @@ -27,7 +27,7 @@ public class OrcidOauth2UserAuthentication implements Authentication { @Resource(name = "recordNameManagerReadOnlyV3") private RecordNameManagerReadOnly recordNameManagerReadOnlyV3; - public OrcidOauth2UserAuthentication(ProfileEntity profileEntity, boolean authenticated) { + public OrcidUserAuthentication(ProfileEntity profileEntity, boolean authenticated) { Assert.notNull(profileEntity, "Cannot instantiate an OrcidOauth2UserAuthentication will a null profile"); this.profileEntity = profileEntity; this.authenticated = authenticated; diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/authorizationServer/AuthorizationServerUtil.java b/orcid-core/src/main/java/org/orcid/core/oauth/authorizationServer/AuthorizationServerUtil.java index 3015f6a4555..f19e9caf12a 100644 --- a/orcid-core/src/main/java/org/orcid/core/oauth/authorizationServer/AuthorizationServerUtil.java +++ b/orcid-core/src/main/java/org/orcid/core/oauth/authorizationServer/AuthorizationServerUtil.java @@ -9,12 +9,11 @@ import org.orcid.core.togglz.Features; import org.orcid.core.utils.http.HttpRequestUtils; import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; import org.springframework.stereotype.Component; -import javax.annotation.Resource; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/openid/OpenIDConnectTokenEnhancer.java b/orcid-core/src/main/java/org/orcid/core/oauth/openid/OpenIDConnectTokenEnhancer.java deleted file mode 100644 index 3d6931442c4..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/openid/OpenIDConnectTokenEnhancer.java +++ /dev/null @@ -1,154 +0,0 @@ -package org.orcid.core.oauth.openid; - -import java.util.Calendar; -import java.util.Date; -import java.util.Map; -import java.util.UUID; - -import javax.annotation.Resource; - -import org.apache.commons.lang.StringUtils; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.ProfileEntityCacheManager; -import org.orcid.core.manager.read_only.PersonDetailsManagerReadOnly; -import org.orcid.jaxb.model.clientgroup.ClientType; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.jaxb.model.record_v2.Person; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.token.TokenEnhancer; - -import com.nimbusds.jose.JOSEException; -import com.nimbusds.jose.JWSAlgorithm; -import com.nimbusds.jwt.JWTClaimsSet; -import com.nimbusds.jwt.JWTClaimsSet.Builder; -import com.nimbusds.jwt.SignedJWT; -import com.nimbusds.oauth2.sdk.token.BearerAccessToken; -import com.nimbusds.openid.connect.sdk.claims.AccessTokenHash; - -/** - * This class creates and appends JWT id_tokens to the response. - * - * @author tom - * - */ -public class OpenIDConnectTokenEnhancer implements TokenEnhancer { - - @Value("${org.orcid.core.baseUri}") - private String path; - - @Resource - private ProfileEntityCacheManager profileEntityCacheManager; - - @Resource - private PersonDetailsManagerReadOnly personDetailsManagerReadOnly; - - @Resource - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource - private OpenIDConnectKeyService keyManager; - - @Value("${org.orcid.core.token.read_validity_seconds:631138519}") - private int readValiditySeconds; - - @Override - public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { - // We check for a nonce and max_age which are added back into request by - // OrcidClientCredentialEndPointDelegatorImpl - Map params = authentication.getOAuth2Request().getRequestParameters(); - - // only add if we're using openid scope. - // only add in implicit flow if response_type id_token is present - String scopes = params.get(OrcidOauth2Constants.SCOPE_PARAM); - if (PojoUtil.isEmpty(scopes) || !ScopePathType.getScopesFromSpaceSeparatedString(scopes).contains(ScopePathType.OPENID)) { - return accessToken; - } - // inject the OpenID Connect "id_token" (authn). This is distinct from - // the access token (authz), so is for transporting info to the client - // only - // this means we do not have to support using them for authentication - // purposes. Some APIs support it, but it is not part of the spec. - try { - String idTok = buildIdToken(accessToken, authentication.getName(), params.get(OrcidOauth2Constants.CLIENT_ID_PARAM),params.get(OrcidOauth2Constants.NONCE) ); - accessToken.getAdditionalInformation().put(OrcidOauth2Constants.ID_TOKEN, idTok); - } catch (JOSEException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - } - - return accessToken; - - } - - public String buildIdToken(OAuth2AccessToken accessToken, String orcid, String clientID, String nonce) throws JOSEException { - Builder claims = new JWTClaimsSet.Builder(); - claims.audience(clientID); - claims.subject(orcid); - claims.issuer(path); - claims.claim("at_hash", createAccessTokenHash(accessToken.getValue())); - - Date now = new Date(); - Calendar twentyFourHrs = Calendar.getInstance(); - twentyFourHrs.setTime(now); - twentyFourHrs.add(Calendar.DAY_OF_YEAR, 1); - - claims.issueTime(now); - claims.expirationTime(twentyFourHrs.getTime()); - - claims.jwtID(UUID.randomUUID().toString()); - if (nonce != null) - claims.claim(OrcidOauth2Constants.NONCE, nonce); - - ProfileEntity e = profileEntityCacheManager.retrieve(orcid); - - claims.claim(OrcidOauth2Constants.AUTH_TIME, e.getLastLogin()); - - // If it is a member, include AMR - ClientDetailsEntity c = clientDetailsEntityCacheManager.retrieve(clientID); - - if (StringUtils.isNotEmpty(c.getClientType()) && !ClientType.PUBLIC_CLIENT.equals(ClientType.valueOf(c.getClientType()))) { - claims.claim(OrcidOauth2Constants.AUTHENTICATION_METHODS_REFERENCES, (e.getUsing2FA() ? OrcidOauth2Constants.AMR_MFA : OrcidOauth2Constants.AMR_PWD)); - } - - Person person = personDetailsManagerReadOnly.getPublicPersonDetails(orcid); - if (person.getName() != null) { - if (person.getName().getCreditName() != null) { - claims.claim("name", person.getName().getCreditName().getContent()); - } - if (person.getName().getFamilyName() != null) { - claims.claim("family_name", person.getName().getFamilyName().getContent()); - } - if (person.getName().getGivenNames() != null) { - claims.claim("given_name", person.getName().getGivenNames().getContent()); - } - } - - SignedJWT signedJWT = keyManager.sign(claims.build()); - return signedJWT.serialize(); - } - - /** - * Access Token hash value. If the ID Token is issued with an access_token - * in an Implicit Flow, this is REQUIRED, which is the case for this subset - * of OpenID Connect. Its value is the base64url encoding of the left-most - * half of the hash of the octets of the ASCII representation of the - * access_token value, where the hash algorithm used is the hash algorithm - * used in the alg Header Parameter of the ID Token's JOSE Header. For - * instance, if the alg is RS256, hash the access_token value with SHA-256, - * then take the left-most 128 bits and base64url-encode them. The at_hash - * value is a case-sensitive string. - * - * @param accessToken - * @return - */ - private String createAccessTokenHash(String accessToken) { - return AccessTokenHash.compute(new BearerAccessToken(accessToken), JWSAlgorithm.RS256).toString(); - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/security/OrcidOauthRedirectResolver.java b/orcid-core/src/main/java/org/orcid/core/oauth/security/OrcidOauthRedirectResolver.java deleted file mode 100644 index 4c790a3ad92..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/security/OrcidOauthRedirectResolver.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.orcid.core.oauth.security; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; - -import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; -import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; -import org.springframework.security.oauth2.common.exceptions.RedirectMismatchException; -import org.springframework.security.oauth2.provider.ClientDetails; -import org.springframework.security.oauth2.provider.endpoint.DefaultRedirectResolver; -import org.springframework.util.StringUtils; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; - -public class OrcidOauthRedirectResolver extends DefaultRedirectResolver { - - private Collection redirectGrantTypes = Arrays.asList("implicit", "authorization_code"); - - public OrcidOauthRedirectResolver() { - - } - - @Override - public void setRedirectGrantTypes(Collection redirectGrantTypes) { - this.redirectGrantTypes = new HashSet(redirectGrantTypes); - } - - @Override - public String resolveRedirect(String requestedRedirect, ClientDetails client) throws OAuth2Exception { - Set authorizedGrantTypes = client.getAuthorizedGrantTypes(); - if (authorizedGrantTypes.isEmpty()) { - throw new InvalidGrantException("A client must have at least one authorized grant type."); - } - if (!containsRedirectGrantType(authorizedGrantTypes)) { - throw new InvalidGrantException("A redirect_uri can only be used by implicit or authorization_code grant types."); - } - - Set registeredRedirectUris = client.getRegisteredRedirectUri(); - if (registeredRedirectUris == null || registeredRedirectUris.isEmpty()) { - throw new InvalidRequestException("At least one redirect_uri must be registered with the client."); - } - - // There must be at least one redirect uri that is the root of the requested redirect uri - for(String registeredRedirectUri : registeredRedirectUris) { - if(requestedRedirect != null && redirectMatches(requestedRedirect, registeredRedirectUri.trim())) { - return requestedRedirect; - } - } - throw new RedirectMismatchException("Unable to find a matching redirect_uri for the client."); - } - - /** - * @param grantTypes - * some grant types - * @return true if the supplied grant types includes one or more of the - * redirect types - */ - private boolean containsRedirectGrantType(Set grantTypes) { - for (String type : grantTypes) { - if (redirectGrantTypes.contains(type)) { - return true; - } - } - return false; - } - - @Override - protected boolean redirectMatches(String requestedRedirect, String redirectUri) { - UriComponents requestedRedirectUri = UriComponentsBuilder.fromUriString(requestedRedirect).build(); - UriComponents registeredRedirectUri = UriComponentsBuilder.fromUriString(redirectUri).build(); - - String requestedRedirectUriPath = (requestedRedirectUri.getPath() != null ? requestedRedirectUri.getPath() : ""); - String registeredRedirectUriPath = (registeredRedirectUri.getPath() != null ? registeredRedirectUri.getPath() : ""); - - boolean portMatch = registeredRedirectUri.getPort() == requestedRedirectUri.getPort(); - boolean hostMatch = hostMatches(registeredRedirectUri.getHost(), requestedRedirectUri.getHost()); - boolean schemeMatch = isEqual(registeredRedirectUri.getScheme(), requestedRedirectUri.getScheme()); - boolean userInfoMatch = isEqual(registeredRedirectUri.getUserInfo(), requestedRedirectUri.getUserInfo()); - boolean pathMatch = StringUtils.cleanPath(requestedRedirectUriPath).startsWith(StringUtils.cleanPath(registeredRedirectUriPath)); - - return schemeMatch && userInfoMatch && hostMatch && portMatch && pathMatch; - } - - private boolean isEqual(String str1, String str2) { - return Objects.equals(str1, str2); - } - - @Override - protected boolean hostMatches(String registered, String requested) { - return isEqual(registered, requested); - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/service/NamespacedRandomCodeGenerator.java b/orcid-core/src/main/java/org/orcid/core/oauth/service/NamespacedRandomCodeGenerator.java deleted file mode 100644 index 75de0827790..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/service/NamespacedRandomCodeGenerator.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.orcid.core.oauth.service; - -import java.util.concurrent.ThreadLocalRandom; -import java.util.concurrent.TimeUnit; - -import org.springframework.security.oauth2.common.util.RandomValueStringGenerator; - -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; - -public class NamespacedRandomCodeGenerator { - - private static final Cache codeCache = CacheBuilder.newBuilder().maximumSize(100000).expireAfterWrite(10, TimeUnit.MINUTES).build(); - private RandomValueStringGenerator generator = new RandomValueStringGenerator(5); - private static final String base62 = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - - private int start; - private int end; - - /** Each node needs a local cache of authentication codes. - * When creating a new code the cache is checked to ensure it's not already been issued. - * If it has, regenerate until unique code is used. - * - * Each node requires its own code namespace in order to prevent clashes across nodes. - * This will be the first character of the authorisation code. - * Note this must be a range of prefixes, not a single char. - * Using a single char would reduce the amount of randomness drastically. - * - * Split the base62 namespace into 3 chunks, last chuck may be bigger than the others. - * Use a namespaced random char + 5 random chars to create code. - */ - public NamespacedRandomCodeGenerator(int node, int numberOfNodes){ - int range = 62 / numberOfNodes; - start = (node - 1) * range; - end = start + range - 1; - if (node == numberOfNodes) - end = 61; - } - - /** - * @return a 6 char base62 code specific to this node. - */ - public synchronized String nextRandomCode(){ - String suffix = generator.generate(); - String code; - do { - int position = ThreadLocalRandom.current().nextInt(end - start + 1);//excludes last number - code = base62.charAt(position + start) + suffix; - } while (codeCache.getIfPresent(code) != null); - codeCache.put(code, code); - return code; - }; -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidAuthorizationCodeServiceImpl.java b/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidAuthorizationCodeServiceImpl.java deleted file mode 100644 index 4e29910b401..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidAuthorizationCodeServiceImpl.java +++ /dev/null @@ -1,196 +0,0 @@ -package org.orcid.core.oauth.service; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Resource; -import javax.persistence.NoResultException; - -import org.apache.commons.lang.StringUtils; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.ProfileEntityCacheManager; -import org.orcid.core.oauth.OrcidOauth2AuthInfo; -import org.orcid.core.oauth.OrcidOauth2UserAuthentication; -import org.orcid.persistence.dao.OrcidOauth2AuthoriziationCodeDetailDao; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.OrcidOauth2AuthoriziationCodeDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.code.RandomValueAuthorizationCodeServices; -import org.springframework.security.web.authentication.WebAuthenticationDetails; -import org.springframework.stereotype.Service; - -/** - * @author Declan Newman (declan) Date: 23/04/2012 - */ -@Service("orcidAuthorizationCodeService") -public class OrcidAuthorizationCodeServiceImpl extends RandomValueAuthorizationCodeServices { - - private static final String CLIENT_ID = "client_id"; - - private static final String STATE = "state"; - - private static final String SCOPE = "scope"; - - private static final String REDIRECT_URI = "redirect_uri"; - - private static final String RESPONSE_TYPE = "response_type"; - - @Resource(name = "orcidOauth2AuthoriziationCodeDetailDao") - private OrcidOauth2AuthoriziationCodeDetailDao orcidOauth2AuthoriziationCodeDetailDao; - - @Resource(name = "profileEntityCacheManager") - private ProfileEntityCacheManager profileEntityCacheManager; - - @Resource - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - private static final Logger LOGGER = LoggerFactory.getLogger(OrcidAuthorizationCodeServiceImpl.class); - - @Resource - private NamespacedRandomCodeGenerator generator; - - @Override - public String createAuthorizationCode(OAuth2Authentication authentication) { - String code = generator.nextRandomCode(); - store(code, authentication); - return code; - } - - @Override - protected void store(String code, OAuth2Authentication authentication) { - OrcidOauth2AuthoriziationCodeDetail detail = getDetailFromAuthorization(code, authentication); - if (detail == null) { - throw new IllegalArgumentException("Cannot persist the authorisation code as the user and/or client " + "cannot be found"); - } - orcidOauth2AuthoriziationCodeDetailDao.persist(detail); - OrcidOauth2AuthInfo authInfo = new OrcidOauth2AuthInfo(authentication); - LOGGER.info("Storing authorization code: code={}, clientId={}, scopes={}, userOrcid={}", new Object[] { code, authInfo.getClientId(), authInfo.getScopes(), - authInfo.getUserOrcid() }); - } - - @Override - protected OAuth2Authentication remove(String code) { - OrcidOauth2AuthoriziationCodeDetail detail = orcidOauth2AuthoriziationCodeDetailDao.removeAndReturn(code); - if (detail == null) { - LOGGER.info("No such authorization code to remove: code={}", - new Object[] { code }); - return null; - } - - //////// - // TODO: The name should change to `scopes` once the authorization server generates all authorization codes - //////// - Set newScopes = StringUtils.isNotBlank(detail.getNewScopes()) ? Stream.of(detail.getNewScopes().split(",")).map(String::trim).collect(Collectors.toSet()) : Set.of(); - Set scopes = detail.getScopes(); - scopes.addAll(newScopes); - String clientId = detail.getClientDetailsEntity().getId(); - - LOGGER.info("Removed authorization code: code={}, clientId={}, scopes={}, userOrcid={}", new Object[] { code, clientId, scopes, - detail.getOrcid() }); - - - OAuth2Request oAuth2Request = new OAuth2Request(Collections. emptyMap(), clientId, Collections. emptyList(), true, scopes, detail.getResourceIds(), detail.getRedirectUri(), new HashSet(Arrays.asList(detail.getResponseType())), Collections. emptyMap()); - Authentication userAuth = getUserAuthentication(detail); - return new OAuth2Authentication(oAuth2Request, userAuth); - } - - private OrcidOauth2UserAuthentication getUserAuthentication(OrcidOauth2AuthoriziationCodeDetail detail) { - ProfileEntity profile = profileEntityCacheManager.retrieve(detail.getOrcid()); - return new OrcidOauth2UserAuthentication(profile, detail.getAuthenticated()); - } - - private OrcidOauth2AuthoriziationCodeDetail getDetailFromAuthorization(String code, OAuth2Authentication authentication) { - OAuth2Request oAuth2Request = authentication.getOAuth2Request(); - OrcidOauth2AuthoriziationCodeDetail detail = new OrcidOauth2AuthoriziationCodeDetail(); - Map requestParameters = oAuth2Request.getRequestParameters(); - if (requestParameters != null && !requestParameters.isEmpty()) { - String clientId = (String) requestParameters.get(CLIENT_ID); - ClientDetailsEntity clientDetails = getClientDetails(clientId); - - if (clientDetails == null) { - return null; - } - - detail.setScopes(OAuth2Utils.parseParameterList((String)requestParameters.get(SCOPE))); - detail.setState((String)requestParameters.get(STATE)); - detail.setRedirectUri((String)requestParameters.get(REDIRECT_URI)); - detail.setResponseType((String)requestParameters.get(RESPONSE_TYPE)); - detail.setClientDetailsEntity(clientDetails); - - //persist the openID params if present - if (requestParameters.get(OrcidOauth2Constants.NONCE) != null) - detail.setNonce((String)requestParameters.get(OrcidOauth2Constants.NONCE)); - } - - detail.setId(code); - detail.setApproved(authentication.getOAuth2Request().isApproved()); - Authentication userAuthentication = authentication.getUserAuthentication(); - Object principal = userAuthentication.getDetails(); - - String orcid = userAuthentication.getName(); - - if (orcid == null) { - return null; - } - - detail.setOrcid(orcid); - detail.setAuthenticated(userAuthentication.isAuthenticated()); - Set authorities = getStringSetFromGrantedAuthorities(authentication.getAuthorities()); - detail.setAuthorities(authorities); - Object authenticationDetails = userAuthentication.getDetails(); - if (authenticationDetails instanceof WebAuthenticationDetails) { - detail.setSessionId(((WebAuthenticationDetails) authenticationDetails).getSessionId()); - } - - boolean isPersistentTokenEnabledByUser = false; - //Set token version to persistent token - //TODO: As of Jan 2015 all tokens will be new tokens, so, we will have to remove the token version code and - //treat all tokens as new tokens - detail.setVersion(Long.valueOf(OrcidOauth2Constants.PERSISTENT_TOKEN)); - if(requestParameters.containsKey(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN)) { - String grantPersitentToken = (String)requestParameters.get(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN); - if(Boolean.parseBoolean(grantPersitentToken)) { - isPersistentTokenEnabledByUser = true; - } - } - - detail.setPersistent(isPersistentTokenEnabledByUser); - - return detail; - } - - private ClientDetailsEntity getClientDetails(String clientId) { - try { - return clientDetailsEntityCacheManager.retrieve(clientId); - } catch (NoResultException e) { - return null; - } - } - - private Set getStringSetFromGrantedAuthorities(Collection authorities) { - Set stringSet = new HashSet(); - if (authorities != null && !authorities.isEmpty()) { - for (GrantedAuthority authority : authorities) { - stringSet.add(authority.getAuthority()); - } - } - return stringSet; - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidAuthorizationEndpoint.java b/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidAuthorizationEndpoint.java deleted file mode 100644 index e586c118a79..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidAuthorizationEndpoint.java +++ /dev/null @@ -1,173 +0,0 @@ -package org.orcid.core.oauth.service; - -import java.net.URI; -import java.net.URISyntaxException; -import java.security.Principal; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator.OpenIDConnectScopesToIgnore; -import org.orcid.jaxb.model.message.ScopePathType; -import org.springframework.security.oauth2.common.exceptions.ClientAuthenticationException; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; -import org.springframework.security.oauth2.common.exceptions.RedirectMismatchException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.ClientDetails; -import org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint; -import org.springframework.web.HttpSessionRequiredException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.support.SessionStatus; -import org.springframework.web.context.request.ServletWebRequest; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.view.RedirectView; - -@RequestMapping(value = "/oauth/authorize") -public class OrcidAuthorizationEndpoint extends AuthorizationEndpoint { - - private String redirectUriError = "forward:/oauth/error/redirect-uri-mismatch"; - private String oauthError = "forward:/oauth/error"; - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - - @Override - @ExceptionHandler(HttpSessionRequiredException.class) - public ModelAndView handleHttpSessionRequiredException(HttpSessionRequiredException e, ServletWebRequest webRequest) throws Exception { - return new ModelAndView("redirect:" + buildRedirectUri(webRequest).toString()); - } - - @Override - @ExceptionHandler(OAuth2Exception.class) - public ModelAndView handleOAuth2Exception(OAuth2Exception e, ServletWebRequest webRequest) throws Exception { - logger.info("Handling OAuth2 error: " + e.getSummary()); - if (e instanceof RedirectMismatchException) { - return new ModelAndView(redirectUriError); - } else if (e instanceof ClientAuthenticationException) { - return new ModelAndView(oauthError); - } - - return super.handleOAuth2Exception(e, webRequest); - } - - @Override - @RequestMapping - public ModelAndView authorize(Map model, - @RequestParam Map requestParameters, SessionStatus sessionStatus, Principal principal) { - try { - modifyRequestParameters(requestParameters); - } catch (InvalidScopeException ise) { - String redirectUri = requestParameters.get("redirect_uri"); - String redirectUriWithParams = ""; - if(redirectUri != null) { - redirectUriWithParams = redirectUri; - } - redirectUriWithParams += "?error=invalid_scope&error_description=" + ise.getMessage(); - RedirectView rView = new RedirectView(redirectUriWithParams); - - ModelAndView error = new ModelAndView(); - error.setView(rView); - return error; - } - return super.authorize(model, requestParameters, sessionStatus, principal); - } - - private void modifyRequestParameters(Map requestParameters) throws InvalidScopeException { - for (Map.Entry entry : requestParameters.entrySet()) { - requestParameters.put(entry.getKey(), entry.getValue().trim()); - } - String scopes = requestParameters.get(OAuth2Utils.SCOPE); - if (scopes != null) { - requestParameters.put(OAuth2Utils.SCOPE, trimClientCredentialScopes(scopes.trim().replaceAll(" +", " "))); - } - // if we have an id_token response_type but no token scope, add it in. - // this is because spring can't cope without the 'token' response type. - if(isOpenIdWithTokenResponseType(requestParameters.get(OAuth2Utils.SCOPE), requestParameters.get(OAuth2Utils.RESPONSE_TYPE))) { - requestParameters.put(OAuth2Utils.RESPONSE_TYPE, "id_token token"); - } - } - - /** - * Validate if the given client have the defined scope - * @param scopes a space or comma separated list of scopes - * @param clientDetails - * @param responseType - * @throws InvalidScopeException in case the given client doesnt have any of the given scopes - * */ - public void validateScope(String scopes, ClientDetails clientDetails, String responseType) throws InvalidScopeException { - Map parameters = new HashMap(); - parameters.put(OAuth2Utils.SCOPE, scopes); - - //Check the user have permissions to the other scopes - orcidOAuth2RequestValidator.validateParameters(parameters, clientDetails,responseType); - } - - private URI buildRedirectUri(ServletWebRequest webRequest) throws URISyntaxException { - String[] referers = webRequest.getHeaderValues("referer"); - if (referers != null && referers.length > 0) { - return new URI(referers[0]); - } - String uri = "/session-expired"; - String contextPath = webRequest.getContextPath(); - if (contextPath != null) { - uri = contextPath + uri; - } - return new URI(uri); - } - - private String trimClientCredentialScopes(String scopes) throws InvalidScopeException { - String result = scopes; - for (String scope : OAuth2Utils.parseParameterList(scopes)) { - if (StringUtils.isNotBlank(scope)) { - if (OpenIDConnectScopesToIgnore.contains(scope)) {//remove openid connect scopes we do not support. - result = result.replaceAll(scope, ""); - continue; - } - ScopePathType scopeType = null; - try { - scopeType = ScopePathType.fromValue(scope); - } catch (Exception e) { - throw new InvalidScopeException("Invalid scope: " + scope); - } - if (scopeType.isClientCreditalScope()) { - if (result.contains(ScopePathType.ORCID_PROFILE_CREATE.getContent())) - result = result.replaceAll(ScopePathType.ORCID_PROFILE_CREATE.getContent(), ""); - else if (result.contains(ScopePathType.READ_PUBLIC.getContent())) - result = result.replaceAll(ScopePathType.READ_PUBLIC.getContent(), ""); - else if (result.contains(ScopePathType.WEBHOOK.getContent())) - result = result.replaceAll(ScopePathType.WEBHOOK.getContent(), ""); - } - } - } - - return result; - } - - public OrcidOAuth2RequestValidator getOrcidOAuth2RequestValidator() { - return orcidOAuth2RequestValidator; - } - - public void setOrcidOAuth2RequestValidator(OrcidOAuth2RequestValidator orcidOAuth2RequestValidator) { - this.orcidOAuth2RequestValidator = orcidOAuth2RequestValidator; - } - - public boolean isOpenIdWithTokenResponseType(String scopes, String responseTypes) { - // if we have an id_token response_type but no token scope, add it in. - // this is because spring can't cope without the 'token' response type. - List scopesList = Arrays.stream(scopes.split("\\s+")).map(String::trim).collect(Collectors.toList()); - boolean isOpenId = scopesList.contains(ScopePathType.OPENID.value()); - if (isOpenId && responseTypes != null) { - List responseTypeList = Arrays.stream(responseTypes.split("\\s+")).collect(Collectors.toList()); - if (responseTypeList != null - && (responseTypeList.contains(OrcidOauth2Constants.ID_TOKEN) || responseTypeList.contains(OrcidOauth2Constants.IMPLICIT_TOKEN_RESPONSE_TYPE))) { - return true; - } - } - return false; - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidOAuth2RequestValidator.java b/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidOAuth2RequestValidator.java deleted file mode 100644 index 565a82e6683..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidOAuth2RequestValidator.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.orcid.core.oauth.service; - -import java.util.Map; -import java.util.Set; - -import org.orcid.core.exception.ClientDeactivatedException; -import org.orcid.core.exception.LockedException; -import org.orcid.core.manager.ProfileEntityCacheManager; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.ClientDetails; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestValidator; - -public class OrcidOAuth2RequestValidator extends DefaultOAuth2RequestValidator { - - public static enum ImplicitScopes { - OPENID("openid"), AUTHENTICATE("/authenticate"); - private String value; - ImplicitScopes(String v){ - value=v; - } - public static boolean isValid(Set test) { - for (String t : test){ - boolean found = false; - for (ImplicitScopes scope : ImplicitScopes.values()) { - if (scope.value.equals(t)) { - found = true; - } - } - if (!found) - return false; - } - return true; - } - public String toString(){ - return value; - } - }; - - public static enum OpenIDConnectScopesToIgnore { - PROFILE("profile"), EMAIL("email"), ADDRESS("address"), PHONE("phone"), OFFLINE_ACCESS("offline_access"); - private String value; - OpenIDConnectScopesToIgnore(String v){ - value = v; - } - public static boolean contains(String test) { - for (OpenIDConnectScopesToIgnore scope : OpenIDConnectScopesToIgnore.values()) { - if (scope.value.equals(test)) { - return true; - } - } - return false; - } - public String toString(){ - return value; - } - } - - private ProfileEntityCacheManager profileEntityCacheManager; - - public OrcidOAuth2RequestValidator(ProfileEntityCacheManager profileEntityCacheManager) { - this.profileEntityCacheManager = profileEntityCacheManager; - } - - //called by spring AuthorizationEndpoint using unmodified parameter map - //also called by LoginController before login. - public void validateParameters(Map parameters, ClientDetails clientDetails, String responseType) { - if (parameters.containsKey("scope")) { - if (clientDetails.isScoped()) { - Set validScope = clientDetails.getScope(); - for (String scope : OAuth2Utils.parseParameterList(parameters.get("scope"))) { - if (OpenIDConnectScopesToIgnore.contains(scope)) {//ignore openid scopes - continue; - } - ScopePathType scopeType = null; - try { - scopeType = ScopePathType.fromValue(scope); - } catch(Exception e) { - throw new InvalidScopeException("Invalid scope: " + scope); - } - if (scopeType.isClientCreditalScope()) - throw new InvalidScopeException("Invalid scope: " + scope); - if (!validScope.contains(scope)) - throw new InvalidScopeException("Invalid scope: " + scope); - } - } - } - } - - public void validateClientIsEnabled(ClientDetailsEntity clientDetails) throws LockedException { - ProfileEntity memberEntity = profileEntityCacheManager.retrieve(clientDetails.getGroupProfileId()); - //If it is locked - if(!memberEntity.isAccountNonLocked()) { - throw new LockedException("The client is locked"); - } - - if (clientDetails.getDeactivatedDate() != null) { - throw new ClientDeactivatedException(clientDetails.getClientId()); - } - } - - //included for clarity - @Override - public void validateScope(AuthorizationRequest authorizationRequest, ClientDetails client) throws InvalidScopeException { - super.validateScope(authorizationRequest, client); - } - - @Override - public void validateScope(TokenRequest tokenRequest, ClientDetails client) throws InvalidScopeException { - super.validateScope(tokenRequest, client); - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidOauth2TokenDetailServiceImpl.java b/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidOauth2TokenDetailServiceImpl.java deleted file mode 100644 index 5b1cbc6c4cb..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidOauth2TokenDetailServiceImpl.java +++ /dev/null @@ -1,281 +0,0 @@ -package org.orcid.core.oauth.service; - -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Set; - -import javax.annotation.Resource; -import javax.persistence.NoResultException; - -import org.apache.commons.lang3.StringUtils; -import org.orcid.core.constants.RevokeReason; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.utils.cache.redis.RedisClient; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -/** - * @author Declan Newman (declan) Date: 19/04/2012 - */ -@Service -public class OrcidOauth2TokenDetailServiceImpl implements OrcidOauth2TokenDetailService { - - private static final Logger LOGGER = LoggerFactory.getLogger(OrcidOauth2TokenDetailServiceImpl.class); - - @Resource(name="orcidOauth2TokenDetailDao") - private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao; - - @Resource(name="orcidOauth2TokenDetailDaoReadOnly") - private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDaoReadOnly; - - @Resource - private RedisClient redisClient; - - @Value("${org.orcid.core.utils.cache.redis.enabled:true}") - private boolean isTokenCacheEnabled; - - @Override - public void setOrcidOauth2TokenDetailDao(OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao) { - this.orcidOauth2TokenDetailDao = orcidOauth2TokenDetailDao; - } - - @Override - public OrcidOauth2TokenDetail findNonDisabledByTokenValue(String token) { - if(StringUtils.isBlank(token)) { - return null; - } - try { - return orcidOauth2TokenDetailDaoReadOnly.findNonDisabledByTokenValue(token); - } catch (NoResultException e) { - LOGGER.debug("No token found for token value {}", e, token); - return null; - } - } - - @Override - public OrcidOauth2TokenDetail findIgnoringDisabledByTokenValue(String token) { - try { - return orcidOauth2TokenDetailDaoReadOnly.findByTokenValue(token); - } catch (NoResultException e) { - LOGGER.debug("No token found for token value {}", e, token); - return null; - } - } - - @Override - public OrcidOauth2TokenDetail findByRefreshTokenValue(String refreshTokenValue) { - try { - return orcidOauth2TokenDetailDaoReadOnly.findByRefreshTokenValue(refreshTokenValue); - } catch (NoResultException e) { - LOGGER.debug("No token found for refresh token value {}", e, refreshTokenValue); - return null; - } - } - - @Override - @Transactional - public void removeByRefreshTokenValue(String refreshToken) { - orcidOauth2TokenDetailDao.removeByRefreshTokenValue(refreshToken); - } - - @Override - public List findByAuthenticationKey(String authKey) { - try { - return orcidOauth2TokenDetailDaoReadOnly.findByAuthenticationKey(authKey); - } catch (NoResultException e) { - LOGGER.debug("No token found for auth token {}", e, authKey); - return null; - } - } - - @Override - public List findByUserName(String userName) { - try { - return orcidOauth2TokenDetailDaoReadOnly.findByUserName(userName); - } catch (NoResultException e) { - LOGGER.debug("No token found for username {}", e, userName); - return null; - } - } - - @Override - @Cacheable(value = "count-tokens", key = "#userName.concat('-').concat(#lastModified)") - public boolean hasToken(String userName, long lastModified) { - return orcidOauth2TokenDetailDaoReadOnly.hasToken(userName); - } - - @Override - public List findByClientId(String clientId) { - try { - return orcidOauth2TokenDetailDaoReadOnly.findByClientId(clientId); - } catch (NoResultException e) { - LOGGER.debug("No token found for client id {}", e, clientId); - return null; - } - } - - /** - * This should NOT delete the row, but merely set it as disabled - * - * @param accessToken - * the value to use to identify the row containing the access - * token - */ - @Override - @Transactional - public void disableAccessToken(String accessToken) { - orcidOauth2TokenDetailDao.disableAccessToken(accessToken); - } - - @Override - @Transactional - public void revokeAccessToken(String accessToken) { - // Remove the token from the cache - if(isTokenCacheEnabled) { - redisClient.remove(accessToken); - } - // Revoke the token - orcidOauth2TokenDetailDao.revokeAccessToken(accessToken); - } - - /** - * This should NOT delete the row, but merely set it as disabled - * - * @param tokenId - * the id of the token that should be disabled - * @param userOrcid - * the id of the user owner of the token - */ - @Override - @Transactional - public void disableAccessToken(Long tokenId, String userOrcid) { - if(PojoUtil.isEmpty(userOrcid) || tokenId == null) { - throw new IllegalArgumentException("One of the provided params is empty: userOrcid='" + userOrcid + "' tokenId='" + String.valueOf(tokenId) + "'"); - } - - //Iterate over all tokens that belongs to this user and client, to remove all the ones that have the same scopes - OrcidOauth2TokenDetail tokenToDisable = orcidOauth2TokenDetailDaoReadOnly.find(tokenId); - String scopesToDisableString = tokenToDisable.getScope(); - Set scopesToDisable = ScopePathType.getScopesFromSpaceSeparatedString(scopesToDisableString); - - List allTokens = orcidOauth2TokenDetailDaoReadOnly.findByClientIdAndUserName(tokenToDisable.getClientDetailsId(), userOrcid); - //Iterate over all tokens and verify we disable all the ones that have the same scopes - for(OrcidOauth2TokenDetail token : allTokens) { - if(token.getTokenDisabled() == null || !token.getTokenDisabled()) { - if(!PojoUtil.isEmpty(token.getScope())) { - Set tokenScopes = ScopePathType.getScopesFromSpaceSeparatedString(token.getScope()); - if(scopesToDisable.equals(tokenScopes)) { - orcidOauth2TokenDetailDao.disableAccessTokenById(token.getId(), userOrcid); - } - } - } - } - } - - /** - * This should NOT delete the row, but merely remove the value from it - * - * @param refreshTokenValue - * the value to use to identify the row containing the access - * token - */ - @Override - @Transactional - public void disableAccessTokenByRefreshToken(String refreshTokenValue) { - orcidOauth2TokenDetailDao.disableAccessTokenByRefreshToken(refreshTokenValue); - } - - @Override - @Transactional - public void createNew(OrcidOauth2TokenDetail detail) { - orcidOauth2TokenDetailDao.persist(detail); - orcidOauth2TokenDetailDao.flush(); - } - - @Override - public List findByClientIdAndUserName(String clientId, String userName) { - try { - return orcidOauth2TokenDetailDaoReadOnly.findByClientIdAndUserName(clientId, userName); - } catch (NoResultException e) { - LOGGER.debug("No token found for client id {}", e, clientId); - return null; - } - } - - @Override - public boolean doesClientKnowUser(String clientId, String userOrcid) { - List existingTokens = orcidOauth2TokenDetailDaoReadOnly.findByClientIdAndUserName(clientId, userOrcid); - if (existingTokens == null || existingTokens.isEmpty()) { - return false; - } - Date now = new Date(); - for (OrcidOauth2TokenDetail token : existingTokens) { - if (token.getTokenExpiration() != null && token.getTokenExpiration().after(now) && (token.getTokenDisabled() == null || !token.getTokenDisabled())) { - // Verify the token have at least one of the required scopes - List scopes = Arrays.asList(ScopePathType.ACTIVITIES_UPDATE.value(), ScopePathType.AFFILIATIONS_CREATE.value(), ScopePathType.AFFILIATIONS_UPDATE.value()); - if(!PojoUtil.isEmpty(token.getScope())) { - for(String scope : token.getScope().split(" ")) { - if(scopes.contains(scope.trim())) { - return true; - } - } - } - } - } - return false; - } - - @Override - @Transactional - public int disableAccessTokenByCodeAndClient(String authorizationCode, String clientID, RevokeReason reason) { - // Find the tokens to disable - List tokensToDisable = orcidOauth2TokenDetailDao.findAccessTokenByCodeAndClient(authorizationCode, clientID); - // Remove them from the cache - for(String accessToken : tokensToDisable) { - LOGGER.info("Token {} will be disabled because auth code {} was reused", accessToken, authorizationCode); - if(isTokenCacheEnabled) { - redisClient.remove(accessToken); - } - } - // Disable them - return orcidOauth2TokenDetailDao.disableAccessTokenByCodeAndClient(authorizationCode, clientID, reason.name()); - } - - @Override - @Transactional - public void disableAccessTokenByUserOrcid(String userOrcid, RevokeReason reason) { - orcidOauth2TokenDetailDao.disableAccessTokenByUserOrcid(userOrcid, reason.name()); - } - - @Override - @Transactional - public void disableClientAccess(String clientDetailsId, String userOrcid) { - // As a security measure, remove any user tokens from the cache - List userTokens = findByUserName(userOrcid); - if(userTokens != null && !userTokens.isEmpty()) { - for(OrcidOauth2TokenDetail token : userTokens) { - if(clientDetailsId.equals(token.getClientDetailsId())) { - redisClient.remove(token.getTokenValue()); - } - } - } - // And then disable all user tokens - orcidOauth2TokenDetailDao.disableClientAccessTokensByUserOrcid(userOrcid, clientDetailsId); - } - - @Override - @Transactional - public boolean updateScopes(String acessToken, Set newScopes) { - return orcidOauth2TokenDetailDao.updateScopes(acessToken, OAuth2Utils.formatParameterList(newScopes)); - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidRandomValueTokenServicesImpl.java b/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidRandomValueTokenServicesImpl.java deleted file mode 100644 index 7ea84be6b88..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidRandomValueTokenServicesImpl.java +++ /dev/null @@ -1,556 +0,0 @@ -package org.orcid.core.oauth.service; - -import java.util.*; - -import javax.annotation.Resource; -import javax.persistence.PersistenceException; - -import javassist.compiler.SyntaxError; -import org.apache.commons.lang3.StringUtils; -import org.codehaus.jettison.json.JSONException; -import org.codehaus.jettison.json.JSONObject; -import org.hibernate.exception.ConstraintViolationException; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.constants.RevokeReason; -import org.orcid.core.exception.ClientDeactivatedException; -import org.orcid.core.exception.LockedException; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.ProfileEntityManager; -import org.orcid.core.oauth.*; -import org.orcid.core.oauth.authorizationServer.AuthorizationServerUtil; -import org.orcid.core.togglz.Features; -import org.orcid.core.utils.JsonUtils; -import org.orcid.core.utils.cache.redis.RedisClient; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.dao.OrcidOauth2AuthoriziationCodeDetailDao; -import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; -import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.OAuth2RefreshToken; -import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.security.oauth2.provider.token.AuthenticationKeyGenerator; -import org.springframework.security.oauth2.provider.token.DefaultTokenServices; -import org.springframework.security.oauth2.provider.token.TokenEnhancer; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import com.google.common.collect.Sets; - -/** - * @author Declan Newman (declan) Date: 11/05/2012 - */ -public class OrcidRandomValueTokenServicesImpl extends DefaultTokenServices implements OrcidRandomValueTokenServices { - private static final Logger LOGGER = LoggerFactory.getLogger(OrcidRandomValueTokenServicesImpl.class); - - @Value("${org.orcid.core.token.write_validity_seconds:3600}") - private int writeValiditySeconds; - @Value("${org.orcid.core.token.read_validity_seconds:631138519}") - private int readValiditySeconds; - @Value("${org.orcid.core.token.implicit_validity_seconds:600}") - private int implicitValiditySeconds; - @Value("${org.orcid.core.token.write_validity_seconds:3600}") - private int ietfTokenExchangeValiditySeconds; - - private OrcidTokenStore orcidTokenStore; - - private TokenEnhancer customTokenEnhancer; - - @Resource(name="orcidOauth2AuthoriziationCodeDetailDaoReadOnly") - private OrcidOauth2AuthoriziationCodeDetailDao orcidOauth2AuthoriziationCodeDetailDaoReadOnly; - - @Resource - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - @Resource - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - private boolean customSupportRefreshToken; - - @Resource(name="orcidOauth2TokenDetailDao") - private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao; - - @Resource - private ProfileEntityManager profileEntityManager; - - @Resource - private AuthenticationKeyGenerator authenticationKeyGenerator; - - @Resource - private RedisClient redisClient; - - @Value("${org.orcid.core.utils.cache.redis.enabled:true}") - private boolean isTokenCacheEnabled; - - @Resource - private AuthorizationServerUtil authorizationServerUtil; - - public void setCustomSupportRefreshToken(boolean customSupportRefreshToken) { - this.customSupportRefreshToken = customSupportRefreshToken; - } - - @Override - public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException { - - //Do we have an implicit request with update permissions? - if (OrcidOauth2Constants.IMPLICIT_GRANT_TYPE.equals(authentication.getOAuth2Request().getGrantType())) { - // authentication.getOAuth2Request().getResponseTypes().contains("token")) { - Collection combinedStrings = ScopePathType.getCombinedScopesFromStringsAsStrings(authentication.getOAuth2Request().getScope()); - Set requestedScopes = ScopePathType.getScopesFromStrings(combinedStrings); - Set allowedScopes = Sets.newHashSet(); - for (ScopePathType s: requestedScopes) { - if (ScopePathType.AUTHENTICATE.equals(s) || ScopePathType.READ_PUBLIC.equals(s) || ScopePathType.OPENID.equals(s)) { - allowedScopes.add(s.value()); - } - } - //If so, create a long life update token in the background - if (requestedScopes.size() != allowedScopes.size()) { - //create token behind the scenes. - DefaultOAuth2AccessToken accessToken = new DefaultOAuth2AccessToken(UUID.randomUUID().toString()); - accessToken.setExpiration(new Date(System.currentTimeMillis() + (readValiditySeconds * 1000L))); - accessToken.setScope(authentication.getOAuth2Request().getScope()); - accessToken = new DefaultOAuth2AccessToken(customTokenEnhancer.enhance(accessToken, authentication)); - //accessToken.setAdditionalInformation(Maps.newHashMap()); - orcidTokenStore.storeAccessToken(accessToken, authentication); - - //create a read only token request - OAuth2Request r = authentication.getOAuth2Request().narrowScope(allowedScopes); - authentication = new OAuth2Authentication(r, authentication.getUserAuthentication()); - } - } - - //create the regular token - DefaultOAuth2AccessToken accessToken = generateAccessToken(authentication); - try { - orcidTokenStore.storeAccessToken(accessToken, authentication); - } catch(PersistenceException e) { - // In the unlikely case that there is a constraint violation, lets try to generate the token one more time - if(e.getCause() instanceof ConstraintViolationException) { - accessToken = generateAccessToken(authentication); - try { - orcidTokenStore.storeAccessToken(accessToken, authentication); - return accessToken; - } catch(Exception e2) { - // Just throw the first exception - } - - } - OrcidOauth2AuthInfo authInfo = new OrcidOauth2AuthInfo(authentication); - LOGGER.error("Exception creating access token for client {}, scopes {} and user {}", new Object[] {authInfo.getClientId(), authInfo.getScopes(), authInfo.getUserOrcid()}); - LOGGER.error("Error info", e); - throw e; - } - return accessToken; - } - - private DefaultOAuth2AccessToken generateAccessToken(OAuth2Authentication authentication) { - DefaultOAuth2AccessToken accessToken = new DefaultOAuth2AccessToken(UUID.randomUUID().toString()); - int validitySeconds = getAccessTokenValiditySeconds(authentication.getOAuth2Request()); - if (validitySeconds > 0) { - accessToken.setExpiration(new Date(System.currentTimeMillis() + (validitySeconds * 1000L))); - } - accessToken.setScope(authentication.getOAuth2Request().getScope()); - - if(customTokenEnhancer != null) { - accessToken = new DefaultOAuth2AccessToken(customTokenEnhancer.enhance(accessToken, authentication)); - } - - if(!OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE.equals(authentication.getOAuth2Request().getGrantType()) - && this.isSupportRefreshToken(authentication.getOAuth2Request())) { - OAuth2RefreshToken refreshToken = new DefaultOAuth2RefreshToken(UUID.randomUUID().toString()); - accessToken.setRefreshToken(refreshToken); - } - return accessToken; - } - - /** - * The access token validity period in seconds - * - * @param authorizationRequest - * the current authorization request - * @return the access token validity period in seconds - */ - @Override - protected int getAccessTokenValiditySeconds(OAuth2Request authorizationRequest) { - Set requestedScopes = ScopePathType.getScopesFromStrings(authorizationRequest.getScope()); - if (isClientCredentialsGrantType(authorizationRequest)) { - boolean allAreClientCredentialsScopes = true; - - if (requestedScopes.size() == 1) { - if (requestedScopes.stream().findFirst().get().isInternalScope()) { - return readValiditySeconds; - } - } - - for (ScopePathType scope : requestedScopes) { - if (!scope.isClientCreditalScope()) { - allAreClientCredentialsScopes = false; - break; - } - } - - if (allAreClientCredentialsScopes) { - return readValiditySeconds; - } - } else if(OrcidOauth2Constants.IMPLICIT_GRANT_TYPE.equals(authorizationRequest.getGrantType())){ - return implicitValiditySeconds; - } else if(OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE.equals(authorizationRequest.getGrantType())) { - return ietfTokenExchangeValiditySeconds; - } else if (isPersistentTokenEnabled(authorizationRequest)) { - return readValiditySeconds; - } - - return writeValiditySeconds; - } - - public int getWriteValiditySeconds() { - return writeValiditySeconds; - } - - public int getReadValiditySeconds() { - return readValiditySeconds; - } - - /** - * Checks the authorization code to verify if the user enable the persistent - * token or not - * */ - private boolean isPersistentTokenEnabled(OAuth2Request authorizationRequest) { - if (authorizationRequest != null) { - Map params = authorizationRequest.getRequestParameters(); - if (params != null) { - if (params.containsKey(OrcidOauth2Constants.IS_PERSISTENT)) { - String isPersistent = params.get(OrcidOauth2Constants.IS_PERSISTENT); - if (Boolean.valueOf(isPersistent)) { - return true; - } - } else if (params.containsKey("code")) { - String code = params.get("code"); - if (orcidOauth2AuthoriziationCodeDetailDaoReadOnly.find(code) != null) { - if (orcidOauth2AuthoriziationCodeDetailDaoReadOnly.isPersistentToken(code)) { - return true; - } - } - } - } - } - - return false; - } - - /** - * Checks if the authorization request grant type is client_credentials - * */ - private boolean isClientCredentialsGrantType(OAuth2Request authorizationRequest) { - Map params = authorizationRequest.getRequestParameters(); - if (params != null) { - if (params.containsKey(OrcidOauth2Constants.GRANT_TYPE)) { - String grantType = params.get(OrcidOauth2Constants.GRANT_TYPE); - if (OrcidOauth2Constants.GRANT_TYPE_CLIENT_CREDENTIALS.equals(grantType)) - return true; - } - } - return false; - } - - private OAuth2Authentication loadAuthenticationFromAuthorizationServer(String accessTokenValue) { - try { - JSONObject tokenInfo = authorizationServerUtil.tokenIntrospection(accessTokenValue); - if(tokenInfo == null) { - throw new InvalidTokenException("Invalid access token: Unable to obtain information from the authorization server"); - } - - boolean isTokenActive = tokenInfo.getBoolean("active"); - if(isTokenActive) { - // If the token is user revoked it might be used for DELETE requests - return buildAuthentication(accessTokenValue, tokenInfo); - } else { - ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if(RequestMethod.DELETE.name().equals(attr.getRequest().getMethod())) { - if(tokenInfo.has("USER_REVOKED") && tokenInfo.getBoolean("USER_REVOKED") == true) { - return buildAuthentication(accessTokenValue, tokenInfo); - } else { - throw new InvalidTokenException("Invalid access token: " + accessTokenValue); - } - } else { - throw new InvalidTokenException("Invalid access token: " + accessTokenValue); - } - } - } catch(InvalidTokenException i) { - throw i; - } catch(Exception e) { - LOGGER.error("Exception validating token from authorization server", e); - throw new RuntimeException("Exception validating token from authorization server", e); - } - } - - private OrcidOAuth2Authentication buildAuthentication(String accessTokenValue, JSONObject tokenInfo) throws JSONException { - // What will we get when the token does not exists? - String clientId = tokenInfo.getString("client_id"); - Authentication authentication = null; - Set scopes = OAuth2Utils.parseParameterList(tokenInfo.getString("scope")); - AuthorizationRequest request = new AuthorizationRequest(clientId, scopes); - request.setApproved(true); - if(tokenInfo.has("username")) { - String orcid = tokenInfo.getString("username"); - ProfileEntity profile = new ProfileEntity(orcid); - authentication = new OrcidOauth2UserAuthentication(profile, true); - } - // `orcid` is the only resource id and it is applied to all clients - request.setResourceIds(Set.of("orcid")); - - // Set granted authorities - if(tokenInfo.has("clientGrantedAuthority")) { - GrantedAuthority ga = new SimpleGrantedAuthority(tokenInfo.getString("clientGrantedAuthority")); - request.setAuthorities(List.of(ga)); - } - - if(tokenInfo.has("OBO_CLIENT_ID")) { - String oboClientId = tokenInfo.getString("OBO_CLIENT_ID"); - return new OrcidOboOAuth2Authentication(oboClientId, request, authentication, accessTokenValue); - } - - return new OrcidOAuth2Authentication(request, authentication, accessTokenValue); - } - - @Override - public OAuth2Authentication loadAuthentication(String accessTokenValue) throws AuthenticationException { - if(Features.OAUTH_TOKEN_VALIDATION.isActive()) { - if(LOGGER.isTraceEnabled()) { - LOGGER.trace("Using the auth server to validate token"); - } - return loadAuthenticationFromAuthorizationServer(accessTokenValue); - } else { - ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - // Feature flag: If the request is to delete an element, allow - if (RequestMethod.DELETE.name().equals(attr.getRequest().getMethod())) { - OrcidOauth2TokenDetail orcidAccessToken = orcidTokenStore.readOrcidOauth2TokenDetail(accessTokenValue); - if (orcidAccessToken == null) { - // Access token not found - throw new InvalidTokenException("Invalid access token: " + accessTokenValue); - } - String revokeReason = orcidAccessToken.getRevokeReason(); - if (PojoUtil.isEmpty(revokeReason) || RevokeReason.USER_REVOKED.equals(RevokeReason.valueOf(revokeReason))) { - OAuth2AccessToken accessToken = orcidTokenStore.readEvenDisabledAccessToken(accessTokenValue); - validateTokenExpirationAndClientStatus(accessToken, accessTokenValue); - return orcidTokenStore.readAuthenticationEvenOnDisabledTokens(accessTokenValue); - } else { - throw new InvalidTokenException("Invalid access token: " + accessTokenValue + ", revoke reason: " + revokeReason); - } - } else { - // Get the token from the cache - Map cachedAccessToken = getTokenFromCache(accessTokenValue); - if (cachedAccessToken != null) { - return orcidTokenStore.readAuthenticationFromCachedToken(cachedAccessToken); - } else { - // Fallback to database if it is not in the cache - OAuth2AccessToken accessToken = orcidTokenStore.readAccessToken(accessTokenValue); - validateTokenExpirationAndClientStatus(accessToken, accessTokenValue); - return orcidTokenStore.readAuthentication(accessTokenValue); - } - } - } - } - - private Map getTokenFromCache(String accessTokenValue) { - if(isTokenCacheEnabled) { - String tokenJsonInfo = redisClient.get(accessTokenValue); - if(StringUtils.isNotBlank(tokenJsonInfo)) { - return JsonUtils.readObjectFromJsonString(tokenJsonInfo, HashMap.class); - } - } - return null; - } - - private void validateTokenExpirationAndClientStatus(OAuth2AccessToken accessToken, String tokenValue) { - // Throw an exception if access token is not found - if (accessToken != null) { - // Throw an exception if the token is expired - if (accessToken.isExpired()) { - orcidTokenStore.removeAccessToken(accessToken); - throw new InvalidTokenException("Access token expired: " + tokenValue); - } - Map additionalInfo = accessToken.getAdditionalInformation(); - if (additionalInfo != null) { - String clientId = (String) additionalInfo.get(OrcidOauth2Constants.CLIENT_ID); - orcidTokenStore.isClientEnabled(clientId); - } - } else { - // Access token not found - throw new InvalidTokenException("Invalid access token: " + tokenValue); - } - } - - public void setOrcidtokenStore(OrcidTokenStore orcidTokenStore) { - super.setTokenStore(orcidTokenStore); - this.orcidTokenStore = orcidTokenStore; - } - - public void setCustomTokenEnhancer(TokenEnhancer customTokenEnhancer) { - super.setTokenEnhancer(customTokenEnhancer); - this.customTokenEnhancer = customTokenEnhancer; - } - - public boolean longLifeTokenExist(String clientId, String userId, Collection scopes) { - Collection existingTokens = orcidTokenStore.findTokensByClientIdAndUserName(clientId, userId); - - if(existingTokens == null || existingTokens.isEmpty()) { - return false; - } - - for(OAuth2AccessToken token : existingTokens) { - if (token.getAdditionalInformation().get(OrcidOauth2Constants.PERSISTENT) != null && Boolean.valueOf((token.getAdditionalInformation().get("persistent").toString()))){ - if(token.getScope().containsAll(scopes) && scopes.containsAll(token.getScope())) { - return true; - } - } - } - - return false; - } - - //see https://github.com/spring-projects/spring-security-oauth/pull/957#issuecomment-304729865 - @Override - @Transactional - public OAuth2AccessToken refreshAccessToken(String refreshTokenValue, TokenRequest tokenRequest) throws AuthenticationException { - String parentTokenValue = tokenRequest.getRequestParameters().get(OrcidOauth2Constants.AUTHORIZATION); - String clientId = tokenRequest.getClientId(); - String scopes = tokenRequest.getRequestParameters().get(OAuth2Utils.SCOPE); - Long expiresIn = tokenRequest.getRequestParameters().containsKey(OrcidOauth2Constants.EXPIRES_IN) - ? Long.valueOf(tokenRequest.getRequestParameters().get(OrcidOauth2Constants.EXPIRES_IN)) : 0L; - Boolean revokeOld = tokenRequest.getRequestParameters().containsKey(OrcidOauth2Constants.REVOKE_OLD) ? Boolean.valueOf(tokenRequest.getRequestParameters().get(OrcidOauth2Constants.REVOKE_OLD)) : true; - - // Check if the refresh token is enabled - if (!customSupportRefreshToken) { - throw new InvalidGrantException("Invalid refresh token: " + refreshTokenValue); - } - // Check if the client support refresh token - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(clientId); - if (!clientDetails.getAuthorizedGrantTypes().contains(OrcidOauth2Constants.REFRESH_TOKEN)) { - throw new InvalidGrantException("Client " + clientId + " doesnt have refresh token enabled"); - } - - OrcidOauth2TokenDetail parentToken = orcidOauth2TokenDetailDao.findByRefreshTokenValue(refreshTokenValue); - - ProfileEntity profileEntity = new ProfileEntity(parentToken.getOrcid()); - OrcidOauth2TokenDetail newToken = new OrcidOauth2TokenDetail(); - - newToken.setApproved(true); - newToken.setClientDetailsId(clientId); - newToken.setPersistent(parentToken.isPersistent()); - newToken.setOrcid(parentToken.getOrcid()); - newToken.setRedirectUri(parentToken.getRedirectUri()); - newToken.setRefreshTokenValue(UUID.randomUUID().toString()); - newToken.setResourceId(parentToken.getResourceId()); - newToken.setResponseType(parentToken.getResponseType()); - newToken.setState(parentToken.getState()); - newToken.setTokenDisabled(false); - if(expiresIn <= 0) { - //If expiresIn is 0 or less, set the parent token - newToken.setTokenExpiration(parentToken.getTokenExpiration()); - } else { - //Assumes expireIn already contains the real expired time expressed in millis - newToken.setTokenExpiration(new Date(expiresIn)); - } - newToken.setTokenType(parentToken.getTokenType()); - newToken.setTokenValue(UUID.randomUUID().toString()); - newToken.setVersion(parentToken.getVersion()); - - if (PojoUtil.isEmpty(scopes)) { - newToken.setScope(parentToken.getScope()); - } else { - newToken.setScope(scopes); - } - - //Generate an authentication object to be able to generate the authentication key - Set scopesSet = OAuth2Utils.parseParameterList(newToken.getScope()); - AuthorizationRequest request = new AuthorizationRequest(clientId, scopesSet); - request.setApproved(true); - Authentication authentication = new OrcidOauth2UserAuthentication(profileEntity, true); - OrcidOAuth2Authentication orcidAuthentication = new OrcidOAuth2Authentication(request, authentication, newToken.getTokenValue()); - newToken.setAuthenticationKey(authenticationKeyGenerator.extractKey(orcidAuthentication)); - - // Store the new token and return it - orcidOauth2TokenDetailDao.persist(newToken); - - // Revoke the old token when required - if (revokeOld) { - orcidOauth2TokenDetailDao.disableAccessToken(parentTokenValue); - } - - // Save the changes - orcidOauth2TokenDetailDao.flush(); - - // Transform the OrcidOauth2TokenDetail into a OAuth2AccessToken - // and return it - return toOAuth2AccessToken(newToken); - } - - private OAuth2AccessToken toOAuth2AccessToken(OrcidOauth2TokenDetail token) { - DefaultOAuth2AccessToken result = new DefaultOAuth2AccessToken(token.getTokenValue()); - result.setExpiration(token.getTokenExpiration()); - result.setRefreshToken(new DefaultOAuth2RefreshToken(token.getRefreshTokenValue())); - result.setScope(OAuth2Utils.parseParameterList(token.getScope())); - result.setTokenType(token.getTokenType()); - result.setValue(token.getTokenValue()); - - Map additionalInfo = new HashMap(); - if(token.getOrcid() != null) { - additionalInfo.put(OrcidOauth2Constants.ORCID, token.getOrcid()); - additionalInfo.put(OrcidOauth2Constants.NAME, profileEntityManager.retrivePublicDisplayName(token.getOrcid())); - } - - result.setAdditionalInformation(additionalInfo); - return result; - } - - @Override - public OAuth2AccessToken createRevokedAccessToken(OAuth2Authentication authentication, RevokeReason revokeReason) throws AuthenticationException { - // create the regular token - DefaultOAuth2AccessToken accessToken = generateAccessToken(authentication); - try { - if(accessToken.getAdditionalInformation() == null) { - accessToken.setAdditionalInformation(Collections.emptyMap()); - } - accessToken.getAdditionalInformation().put(OrcidOauth2Constants.TOKEN_DISABLED, true); - orcidTokenStore.storeRevokedAccessToken(accessToken, authentication, revokeReason); - } catch (PersistenceException e) { - // In the unlikely case that there is a constraint violation, lets - // try to generate the token one more time - if (e.getCause() instanceof ConstraintViolationException) { - accessToken = generateAccessToken(authentication); - try { - orcidTokenStore.storeRevokedAccessToken(accessToken, authentication, revokeReason); - return accessToken; - } catch (Exception e2) { - // Just throw the first exception - } - - } - OrcidOauth2AuthInfo authInfo = new OrcidOauth2AuthInfo(authentication); - LOGGER.error("Exception creating revoked access token for client {}, scopes {} and user {}", - new Object[] { authInfo.getClientId(), authInfo.getScopes(), authInfo.getUserOrcid() }); - LOGGER.error("Error info", e); - throw e; - } - return accessToken; - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidTokenStore.java b/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidTokenStore.java deleted file mode 100644 index 1397e77f4e2..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidTokenStore.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.orcid.core.oauth.service; - -import java.util.Map; - -import org.orcid.core.constants.RevokeReason; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.token.TokenStore; - -public interface OrcidTokenStore extends TokenStore { - - OrcidOauth2TokenDetail readOrcidOauth2TokenDetail(String tokenValue); - - OAuth2AccessToken readEvenDisabledAccessToken(String tokenValue); - - OAuth2Authentication readAuthenticationEvenOnDisabledTokens(String tokenValue); - - void storeRevokedAccessToken(DefaultOAuth2AccessToken token, OAuth2Authentication authentication, RevokeReason revokeReason); - - void removeAccessToken(String accessTokenValue); - - OAuth2Authentication readAuthenticationFromCachedToken(Map cachedTokenData); - - void isClientEnabled(String clientId) throws InvalidTokenException; - - String readClientId(String tokenValue); -} diff --git a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidTokenStoreServiceImpl.java b/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidTokenStoreServiceImpl.java deleted file mode 100644 index 61eb00eec8d..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/oauth/service/OrcidTokenStoreServiceImpl.java +++ /dev/null @@ -1,560 +0,0 @@ -package org.orcid.core.oauth.service; - -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; - -import org.apache.commons.lang.StringUtils; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.constants.RevokeReason; -import org.orcid.core.exception.ClientDeactivatedException; -import org.orcid.core.exception.LockedException; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.ProfileEntityCacheManager; -import org.orcid.core.oauth.OrcidOAuth2Authentication; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.oauth.OrcidOauth2UserAuthentication; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.common.DefaultExpiringOAuth2RefreshToken; -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; -import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken; -import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.OAuth2RefreshToken; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.token.AuthenticationKeyGenerator; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import com.nimbusds.jwt.SignedJWT; - -/** - * @author Declan Newman (declan) Date: 15/04/2012 - */ - -@Service("orcidTokenStore") -public class OrcidTokenStoreServiceImpl implements OrcidTokenStore { - - @Resource - private OrcidOauth2TokenDetailService orcidOauthTokenDetailService; - - @Resource(name = "profileEntityCacheManager") - ProfileEntityCacheManager profileEntityCacheManager; - - @Resource - ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - - @Resource - private AuthenticationKeyGenerator authenticationKeyGenerator; - - @Override - public OrcidOauth2TokenDetail readOrcidOauth2TokenDetail(String token) { - return orcidOauthTokenDetailService.findIgnoringDisabledByTokenValue(token); - } - - @Override - public String readClientId(String token) { - String clientId = null; - OrcidOauth2TokenDetail orcidTokenDetail = orcidOauthTokenDetailService.findIgnoringDisabledByTokenValue(token); - if(orcidTokenDetail != null) { - clientId = orcidTokenDetail.getClientDetailsId(); - } - return clientId; - } - - /** - * Read the authentication stored under the specified token value. - * - * @param token - * The token value under which the authentication is stored. - * @return The authentication, or null if none. - */ - @Override - @Transactional - public OAuth2Authentication readAuthentication(String token) { - OrcidOauth2TokenDetail detail = orcidOauthTokenDetailService.findNonDisabledByTokenValue(token); - return getOAuth2AuthenticationFromDetails(detail); - } - - @Override - @Transactional - public OAuth2Authentication readAuthenticationEvenOnDisabledTokens(String token) { - OrcidOauth2TokenDetail detail = orcidOauthTokenDetailService.findIgnoringDisabledByTokenValue(token); - return getOAuth2AuthenticationFromDetails(detail); - } - - @Override - @Transactional - public OAuth2Authentication readAuthentication(OAuth2AccessToken token) { - return readAuthentication(token.getValue()); - } - - @Override - public OAuth2Authentication readAuthenticationFromCachedToken(Map cachedTokenData) { - String accessTokenValue = (String) cachedTokenData.get(OrcidOauth2Constants.ACCESS_TOKEN); - long tokenExpirationTime = Long.valueOf((String) cachedTokenData.get(OrcidOauth2Constants.TOKEN_EXPIRATION_TIME)); - isTokenExpired(tokenExpirationTime, accessTokenValue); - - String clientId = (String) cachedTokenData.get(OrcidOauth2Constants.CLIENT_ID); - String scopeString = (String) cachedTokenData.get(OrcidOauth2Constants.SCOPE_PARAM); - String resourceId = (String) cachedTokenData.get(OrcidOauth2Constants.RESOURCE_IDS); - String orcid = (String) cachedTokenData.get(OrcidOauth2Constants.ORCID); - boolean approved = Boolean.valueOf((String) cachedTokenData.get(OrcidOauth2Constants.APPROVED)); - - OrcidOauth2TokenDetail tokenDetails = new OrcidOauth2TokenDetail(); - tokenDetails.setClientDetailsId(clientId); - tokenDetails.setScope(scopeString); - tokenDetails.setResourceId(resourceId); - tokenDetails.setTokenValue(accessTokenValue); - tokenDetails.setOrcid(orcid); - tokenDetails.setApproved(approved); - return getOAuth2AuthenticationFromDetails(tokenDetails); - } - - /** - * Store an access token. - * - * @param token - * The token to store. - * @param authentication - * The authentication associated with the token. - */ - @Deprecated(since = "Once the authorization server is deployed", forRemoval = true) - @Override - public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authentication) { - OrcidOauth2TokenDetail detail = populatePropertiesFromTokenAndAuthentication(token, authentication, null); - orcidOauthTokenDetailService.createNew(detail); - // Set the token id in the additional details - token.getAdditionalInformation().put(OrcidOauth2Constants.TOKEN_ID, detail.getId()); - if(detail.getOboClientDetailsId() != null) { - token.getAdditionalInformation().put(OrcidOauth2Constants.IS_OBO_TOKEN, "true"); - } - } - - /** - * Store a revoked access token with the intention of allowing the member to use it for deleting their own activities when required - * */ - @Override - public void storeRevokedAccessToken(DefaultOAuth2AccessToken token, OAuth2Authentication authentication, RevokeReason revokeReason) { - OrcidOauth2TokenDetail detail = populatePropertiesFromTokenAndAuthentication(token, authentication, null); - detail.setTokenDisabled(true); - detail.setRevocationDate(new Date()); - if(revokeReason != null) { - detail.setRevokeReason(revokeReason.name()); - } - orcidOauthTokenDetailService.createNew(detail); - // Set the token id in the additional details - token.getAdditionalInformation().put(OrcidOauth2Constants.TOKEN_ID, detail.getId()); - } - - /** - * Read an access token from the store. - * - * @param tokenValue - * The token value. - * @return The access token to read. - */ - @Override - public OAuth2AccessToken readAccessToken(String tokenValue) { - return readAccessToken(tokenValue, false); - } - - /** - * Read an access token from the store even if they are marked as disabled. - * - * @param tokenValue - * The token value. - * @return The access token to read. - */ - @Override - public OAuth2AccessToken readEvenDisabledAccessToken(String tokenValue) { - return readAccessToken(tokenValue, true); - } - - /** - * Read an access token from the store. If `includeDisabled` is false, the - * token will not be returned if it is disabled - * - * @param tokenValue - * The token value. - * @param includeDisabled - * @return The access token to read. - */ - private OAuth2AccessToken readAccessToken(String tokenValue, boolean includeDisabled) { - if (tokenValue == null) { - return null; - } - - OrcidOauth2TokenDetail detail; - if (includeDisabled) { - detail = orcidOauthTokenDetailService.findIgnoringDisabledByTokenValue(tokenValue); - } else { - detail = orcidOauthTokenDetailService.findNonDisabledByTokenValue(tokenValue); - } - return getOauth2AccessTokenFromDetails(detail); - } - - /** - * Disable an access token from the database. - * - * @param tokenValue - * The token to remove from the database. - */ - @Override - @Transactional(propagation = Propagation.REQUIRES_NEW) - public void removeAccessToken(OAuth2AccessToken accessToken) { - orcidOauthTokenDetailService.disableAccessToken(accessToken.getValue()); - } - - /** - * Disable an access token from the database. - * - * @param tokenValue - * The token to remove from the database. - */ - @Override - @Transactional(propagation = Propagation.REQUIRES_NEW) - public void removeAccessToken(String accessTokenValue) { - orcidOauthTokenDetailService.disableAccessToken(accessTokenValue); - } - - /** - * Store the specified refresh token in the database. - * - * @param refreshToken - * The refresh token to store. - * @param authentication - * The authentication associated with the refresh token. - */ - @Override - public void storeRefreshToken(OAuth2RefreshToken refreshToken, OAuth2Authentication authentication) { - // The refresh token will be stored during the token creation. We don't - // want to create it beforehand - } - - /** - * Read a refresh token from the store. - * - * @param refreshTokenValue - * The value of the token to read. - * @return The token. - */ - @Override - public ExpiringOAuth2RefreshToken readRefreshToken(String refreshTokenValue) { - OrcidOauth2TokenDetail detail = orcidOauthTokenDetailService.findByRefreshTokenValue(refreshTokenValue); - if (detail != null && StringUtils.isNotBlank(detail.getTokenValue())) { - return new DefaultExpiringOAuth2RefreshToken(detail.getRefreshTokenValue(), detail.getRefreshTokenExpiration()); - } - return null; - } - - /** - * @param refreshTokenValue - * a refresh token value - * @return the authentication originally used to grant the refresh token - */ - @Override - public OAuth2Authentication readAuthenticationForRefreshToken(OAuth2RefreshToken refreshToken) { - OrcidOauth2TokenDetail detail = orcidOauthTokenDetailService.findByRefreshTokenValue(refreshToken.getValue()); - return getOAuth2AuthenticationFromDetails(detail); - } - - /** - * Remove a refresh token from the database. - * - * @param refreshTokenValue - * The value of the token to remove from the database. - */ - @Override - @Transactional - public void removeRefreshToken(OAuth2RefreshToken refreshToken) { - orcidOauthTokenDetailService.removeByRefreshTokenValue(refreshToken.getValue()); - } - - /** - * Remove an access token using a refresh token. This functionality is - * necessary so refresh tokens can't be used to create an unlimited number - * of access tokens. - * - * @param refreshTokenValue - * The refresh token. - */ - @Override - @Transactional - public void removeAccessTokenUsingRefreshToken(OAuth2RefreshToken refreshToken) { - orcidOauthTokenDetailService.disableAccessTokenByRefreshToken(refreshToken.getValue()); - } - - /** - * Retrieve an access token stored against the provided authentication key, - * if it exists. - * - * @param authentication - * the authentication key for the access token - * @return the access token or null if there was none - */ - @Override - public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) { - String authKey = authenticationKeyGenerator.extractKey(authentication); - List details = orcidOauthTokenDetailService.findByAuthenticationKey(authKey); - // Since we are now able to have more than one token for the combo - // user-scopes, we will need to return the oldest token, the first token - // created with these scopes - if (details != null && !details.isEmpty()) { - OrcidOauth2TokenDetail oldestToken = null; - for (OrcidOauth2TokenDetail tokenDetails : details) { - if (oldestToken == null) { - oldestToken = tokenDetails; - } else { - if (tokenDetails.getDateCreated().before(oldestToken.getDateCreated())) { - oldestToken = tokenDetails; - } - } - } - return getOauth2AccessTokenFromDetails(oldestToken); - } - return null; - } - - /** - * @param userName - * the user name to search - * @return a collection of access tokens - */ - public Collection findTokensByUserName(String userName) { - List details = orcidOauthTokenDetailService.findByUserName(userName); - List accessTokens = new ArrayList(); - if (details != null && !details.isEmpty()) { - for (OrcidOauth2TokenDetail detail : details) { - accessTokens.add(getOauth2AccessTokenFromDetails(detail)); - } - } - return accessTokens; - } - - /** - * @param clientId - * the client id - * @return a collection of access tokens - */ - @Override - public Collection findTokensByClientId(String clientId) { - List details = orcidOauthTokenDetailService.findByClientId(clientId); - List accessTokens = new ArrayList(); - if (details != null && !details.isEmpty()) { - for (OrcidOauth2TokenDetail detail : details) { - accessTokens.add(getOauth2AccessTokenFromDetails(detail)); - } - } - return accessTokens; - } - - private OAuth2AccessToken getOauth2AccessTokenFromDetails(OrcidOauth2TokenDetail detail) { - DefaultOAuth2AccessToken token = null; - if (detail != null && StringUtils.isNotBlank(detail.getTokenValue())) { - token = new DefaultOAuth2AccessToken(detail.getTokenValue()); - token.setExpiration(detail.getTokenExpiration()); - token.setScope(OAuth2Utils.parseParameterList(detail.getScope())); - token.setTokenType(detail.getTokenType()); - String refreshToken = detail.getRefreshTokenValue(); - OAuth2RefreshToken rt; - if (StringUtils.isNotBlank(refreshToken)) { - if (detail.getRefreshTokenExpiration() != null) { - rt = new DefaultExpiringOAuth2RefreshToken(detail.getRefreshTokenValue(), detail.getRefreshTokenExpiration()); - } else { - rt = new DefaultOAuth2RefreshToken(detail.getRefreshTokenValue()); - } - token.setRefreshToken(rt); - } - String orcid = detail.getOrcid(); - if (orcid != null) { - Map additionalInfo = new HashMap(); - additionalInfo.put(OrcidOauth2Constants.ORCID, orcid); - additionalInfo.put(OrcidOauth2Constants.PERSISTENT, detail.isPersistent()); - additionalInfo.put(OrcidOauth2Constants.DATE_CREATED, detail.getDateCreated()); - additionalInfo.put(OrcidOauth2Constants.TOKEN_VERSION, detail.getVersion()); - token.setAdditionalInformation(additionalInfo); - } - - String clientId = detail.getClientDetailsId(); - if(!PojoUtil.isEmpty(clientId)) { - Map additionalInfo = new HashMap(); - Map additionalInfoInToken = token.getAdditionalInformation(); - if(additionalInfoInToken != null && !additionalInfoInToken.isEmpty()) { - additionalInfo.putAll(additionalInfoInToken); - } - // Copy to a new one to avoid unmodifiable - additionalInfo.put(OrcidOauth2Constants.CLIENT_ID, clientId); - token.setAdditionalInformation(additionalInfo); - } - } - - return token; - } - - private OAuth2Authentication getOAuth2AuthenticationFromDetails(OrcidOauth2TokenDetail details) { - if (details != null) { - // Check member is not locked - isClientEnabled(details.getClientDetailsId()); - ClientDetailsEntity clientDetailsEntity = clientDetailsEntityCacheManager.retrieve(details.getClientDetailsId()); - Authentication authentication = null; - AuthorizationRequest request = null; - if (clientDetailsEntity != null) { - Set scopes = OAuth2Utils.parseParameterList(details.getScope()); - request = new AuthorizationRequest(clientDetailsEntity.getClientId(), scopes); - request.setAuthorities(clientDetailsEntity.getAuthorities()); - Set resourceIds = new HashSet<>(); - resourceIds.add(details.getResourceId()); - request.setResourceIds(resourceIds); - request.setApproved(details.isApproved()); - String orcid = details.getOrcid(); - if (orcid != null) { - ProfileEntity profile = profileEntityCacheManager.retrieve(orcid); - authentication = new OrcidOauth2UserAuthentication(profile, details.isApproved()); - } - } - return new OrcidOAuth2Authentication(request, authentication, details.getTokenValue()); - } - throw new InvalidTokenException("Token not found"); - } - - private OrcidOauth2TokenDetail populatePropertiesFromTokenAndAuthentication(OAuth2AccessToken token, OAuth2Authentication authentication, - OrcidOauth2TokenDetail detail) { - OAuth2Request authorizationRequest = authentication.getOAuth2Request(); - if (detail == null) { - detail = new OrcidOauth2TokenDetail(); - } - - //Update to put auth code in token detail so it can be revoked based on code if needed. - if (authentication.getOAuth2Request().getRequestParameters().get("code") != null){ - detail.setAuthorizationCode(authentication.getOAuth2Request().getRequestParameters().get("code").toString()); - } - - String clientId = authorizationRequest.getClientId(); - String authKey = authenticationKeyGenerator.extractKey(authentication); - detail.setAuthenticationKey(authKey); - detail.setClientDetailsId(clientId); - - OAuth2RefreshToken refreshToken = token.getRefreshToken(); - if (refreshToken != null && StringUtils.isNotBlank(refreshToken.getValue())) { - if (refreshToken instanceof ExpiringOAuth2RefreshToken) { - // Override the refresh token expiration from the client - // details, and make it the same as the token itself - detail.setRefreshTokenExpiration(token.getExpiration()); - } - detail.setRefreshTokenValue(refreshToken.getValue()); - } - if (!authentication.isClientOnly()) { - Object principal = authentication.getPrincipal(); - if (principal instanceof ProfileEntity) { - ProfileEntity profileEntity = (ProfileEntity) authentication.getPrincipal(); - detail.setOrcid(profileEntity.getId()); - } - } - - detail.setTokenValue(token.getValue()); - detail.setTokenType(token.getTokenType()); - detail.setTokenExpiration(token.getExpiration()); - detail.setApproved(authorizationRequest.isApproved()); - detail.setRedirectUri(authorizationRequest.getRedirectUri()); - - Set resourceIds = authorizationRequest.getResourceIds(); - if(resourceIds == null || resourceIds.isEmpty()) { - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(clientId); - resourceIds = clientDetails.getResourceIds(); - } - - detail.setResourceId(OAuth2Utils.formatParameterList(resourceIds)); - detail.setResponseType(OAuth2Utils.formatParameterList(authorizationRequest.getResponseTypes())); - detail.setScope(OAuth2Utils.formatParameterList(authorizationRequest.getScope())); - - Map additionalInfo = token.getAdditionalInformation(); - if (additionalInfo != null) { - if (additionalInfo.containsKey(OrcidOauth2Constants.TOKEN_VERSION)) { - String sVersion = String.valueOf(additionalInfo.get(OrcidOauth2Constants.TOKEN_VERSION)); - detail.setVersion(Long.valueOf(sVersion)); - } else { - // TODO: As of Jan 2015 all tokens will be new tokens, so, we - // will have to remove the token version code and - // treat all tokens as new tokens - detail.setVersion(Long.valueOf(OrcidOauth2Constants.PERSISTENT_TOKEN)); - } - - if (additionalInfo.containsKey(OrcidOauth2Constants.PERSISTENT)) { - boolean isPersistentKey = (Boolean) additionalInfo.get(OrcidOauth2Constants.PERSISTENT); - detail.setPersistent(isPersistentKey); - } else { - detail.setPersistent(false); - } - } else { - detail.setPersistent(false); - } - - //Set OBO client if possible. - if(OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE.equals(authentication.getOAuth2Request().getGrantType()) - && authentication.getOAuth2Request().getRequestParameters().containsKey(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN) - && OrcidOauth2Constants.IETF_EXCHANGE_ID_TOKEN.equals(authentication.getOAuth2Request().getRequestParameters().get(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE))) { - try { - SignedJWT claims = SignedJWT.parse(authentication.getOAuth2Request().getRequestParameters().get(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN)); - detail.setOboClientDetailsId(claims.getJWTClaimsSet().getAudience().get(0)); - } catch (ParseException e) { - throw new IllegalArgumentException("Unexpected id token value, cannot parse the id_token"); - } - } - - return detail; - } - - @Override - public Collection findTokensByClientIdAndUserName(String clientId, String userName) { - List details = orcidOauthTokenDetailService.findByClientIdAndUserName(clientId, userName); - List accessTokens = new ArrayList(); - if (details != null && !details.isEmpty()) { - for (OrcidOauth2TokenDetail detail : details) { - if(detail.getTokenDisabled() == null || !detail.getTokenDisabled()) { - accessTokens.add(getOauth2AccessTokenFromDetails(detail)); - } - } - } - return accessTokens; - } - - private void isTokenExpired(long expirationTime, String tokenValue) { - Date expirationDate = new Date(expirationTime); - if(expirationDate.before(new Date())) { - removeAccessToken(tokenValue); - throw new InvalidTokenException("Access token expired: " + tokenValue); - } - } - - public void isClientEnabled(String clientId) throws InvalidTokenException { - ClientDetailsEntity clientEntity = clientDetailsEntityCacheManager.retrieve(clientId); - try { - orcidOAuth2RequestValidator.validateClientIsEnabled(clientEntity); - } catch (LockedException le) { - throw new InvalidTokenException(le.getMessage()); - } catch (ClientDeactivatedException e) { - throw new InvalidTokenException(e.getMessage()); - } - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/orgs/grouping/OrgGrouping.java b/orcid-core/src/main/java/org/orcid/core/orgs/grouping/OrgGrouping.java index 103cb43feb1..c2422aea7e0 100644 --- a/orcid-core/src/main/java/org/orcid/core/orgs/grouping/OrgGrouping.java +++ b/orcid-core/src/main/java/org/orcid/core/orgs/grouping/OrgGrouping.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.manager.OrgDisambiguatedManager; diff --git a/orcid-core/src/main/java/org/orcid/core/profileEvent/ProfileEventManager.java b/orcid-core/src/main/java/org/orcid/core/profileEvent/ProfileEventManager.java index 3ca894d6562..3498c19fee0 100644 --- a/orcid-core/src/main/java/org/orcid/core/profileEvent/ProfileEventManager.java +++ b/orcid-core/src/main/java/org/orcid/core/profileEvent/ProfileEventManager.java @@ -9,7 +9,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.time.DurationFormatUtils; import org.kohsuke.args4j.CmdLineException; diff --git a/orcid-core/src/main/java/org/orcid/core/security/DefaultPermissionChecker.java b/orcid-core/src/main/java/org/orcid/core/security/DefaultPermissionChecker.java deleted file mode 100644 index a338652ad67..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/security/DefaultPermissionChecker.java +++ /dev/null @@ -1,365 +0,0 @@ -package org.orcid.core.security; - -import java.security.AccessControlException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; -import javax.xml.datatype.XMLGregorianCalendar; - -import org.apache.commons.lang.StringUtils; -import org.orcid.core.exception.OrcidDeprecatedException; -import org.orcid.core.manager.ProfileEntityCacheManager; -import org.orcid.core.manager.ProfileEntityManager; -import org.orcid.core.oauth.OrcidOAuth2Authentication; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.utils.DateUtils; -import org.orcid.jaxb.model.message.OrcidIdentifier; -import org.orcid.jaxb.model.message.OrcidMessage; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.jaxb.model.message.Visibility; -import org.orcid.persistence.dao.ProfileDao; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.stereotype.Component; - -/** - * @author Declan Newman (declan) Date: 27/04/2012 - */ -@Component("defaultPermissionChecker") -public class DefaultPermissionChecker implements PermissionChecker { - - private static final Logger LOGGER = LoggerFactory.getLogger(DefaultPermissionChecker.class); - - @Value("${org.orcid.core.token.write_validity_seconds:3600}") - private int writeValiditySeconds; - - @Resource(name = "profileEntityManager") - private ProfileEntityManager profileEntityManager; - - @Resource - private ProfileDao profileDao; - - @Value("${org.orcid.core.baseUri}") - private String baseUrl; - - @Resource - private OrcidOauth2TokenDetailService orcidOauthTokenDetailService; - - @Resource(name = "profileEntityCacheManager") - ProfileEntityCacheManager profileEntityCacheManager; - - /** - * Check the permissions for the given - * {@link org.springframework.security.core.Authentication} object and the - * scopes defined in the required scopes - * - * @param authentication - * The authentication object associated with this session - * @param requiredScope - * the scopes required to perform the requested operation - * @param orcid - * the orcid passed into the request. This is for requests, such - * as a GET /1234-1234-1234-1234/orcid-bio - * @param orcidMessage - * the {@link org.orcid.jaxb.model.message.OrcidMessage} that has - * been sent as part of this request. This will only apply to - * PUTs and POSTs - */ - @Override - public void checkPermissions(Authentication authentication, ScopePathType requiredScope, String orcid, OrcidMessage orcidMessage) { - if (StringUtils.isNotBlank(orcid) && orcidMessage != null && orcidMessage.getOrcidProfile() != null - && (orcidMessage.getOrcidProfile().getOrcidIdentifier() == null || StringUtils.isBlank(orcidMessage.getOrcidProfile().getOrcidIdentifier().getPath()))) { - orcidMessage.getOrcidProfile().setOrcidIdentifier(orcid); - } - performPermissionChecks(authentication, requiredScope, orcid, orcidMessage); - } - - /** - * Check the permissions for the given - * {@link org.springframework.security.core.Authentication} object and the - * scopes defined in the required scopes - * - * @param authentication - * The authentication object associated with this session - * @param requiredScope - * the scopes required to perform the requested operation - * @param orcidMessage - * the {@link org.orcid.jaxb.model.message.OrcidMessage} that has - * been sent as part of this request. This will only apply to - * PUTs and POSTs - */ - @Override - public void checkPermissions(Authentication authentication, ScopePathType requiredScope, OrcidMessage orcidMessage) { - performPermissionChecks(authentication, requiredScope, null, orcidMessage); - } - - /** - * Check the permissions for the given - * {@link org.springframework.security.core.Authentication} object and the - * scopes defined in the required scopes - * - * @param authentication - * The authentication object associated with this session - * @param requiredScope - * the scopes required to perform the requested operation - * @param orcid - * the orcid passed into the request. This is for requests, such - * as a GET /1234-1234-1234-1234/orcid-bio - */ - @Override - public void checkPermissions(Authentication authentication, ScopePathType requiredScope, String orcid) { - LOGGER.debug("Checking permissions on token"); - performPermissionChecks(authentication, requiredScope, orcid, null); - } - - /** - * Obtain the current users' permission and return the - * {@link org.orcid.jaxb.model.message.Visibility} array containing those - * - * @param authentication - * the object containing the user's security information - * @return the {@alink Visibility} array of the current user - */ - @Override - public Set obtainVisibilitiesForAuthentication(Authentication authentication, ScopePathType requiredScope, OrcidMessage orcidMessage) { - Collection authorities = authentication.getAuthorities(); - if (authoritiesHasRole(authorities, "ROLE_SYSTEM")) { - return new HashSet(Arrays.asList(Visibility.SYSTEM)); - } else if (OrcidOAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OrcidOAuth2Authentication auth2Authentication = (OrcidOAuth2Authentication) authentication; - Set visibilities = getVisibilitiesForOauth2Authentication(auth2Authentication, orcidMessage, requiredScope); - return visibilities; - } else { - throw new IllegalArgumentException("Cannot obtain authentication details from " + authentication); - } - } - - private Set getVisibilitiesForOauth2Authentication(OAuth2Authentication oAuth2Authentication, OrcidMessage orcidMessage, ScopePathType requiredScope) { - - Set visibilities = new HashSet(); - visibilities.add(Visibility.PUBLIC); - - String orcid = orcidMessage.getOrcidProfile().getOrcidIdentifier().getPath(); - - // Check the scopes and it will throw an an AccessControlException if - // the correct scope is not found. This - // effectively means that the user can only see the public data - try { - checkScopes(oAuth2Authentication, requiredScope); - } catch (AccessControlException e) { - return visibilities; - } - // If the user has granted permission to the client and the orcid that - // has been requested is that of the user - // we can allow for access of protected data - if (!oAuth2Authentication.isClientOnly() && oAuth2Authentication.getPrincipal() != null - && ProfileEntity.class.isAssignableFrom(oAuth2Authentication.getPrincipal().getClass())) { - ProfileEntity principal = (ProfileEntity) oAuth2Authentication.getPrincipal(); - visibilities.add(Visibility.REGISTERED_ONLY); - if (principal != null && principal.getId().equals(orcid)) { - Set requestedScopes = oAuth2Authentication.getOAuth2Request().getScope(); - for (String scope : requestedScopes) { - if (ScopePathType.hasStringScope(scope, requiredScope)) { - visibilities.add(Visibility.LIMITED); - break; - } - } - } - // This is a client credential authenticated client. If the profile - // was created using this client and it - // hasn't been claimed, it's theirs to read - } else if (oAuth2Authentication.isClientOnly()) { - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - String clientId = authorizationRequest.getClientId(); - String sponsorOrcid = getSponsorOrcid(orcidMessage); - if (StringUtils.isNotBlank(sponsorOrcid) && clientId.equals(sponsorOrcid) && !orcidMessage.getOrcidProfile().getOrcidHistory().isClaimed()) { - visibilities.add(Visibility.LIMITED); - visibilities.add(Visibility.PRIVATE); - } - } - - return visibilities; - } - - private String getSponsorOrcid(OrcidMessage orcidMessage) { - if (orcidMessage != null && orcidMessage.getOrcidProfile() != null && orcidMessage.getOrcidProfile().getOrcidHistory() != null - && orcidMessage.getOrcidProfile().getOrcidHistory().getSource() != null) { - return orcidMessage.getOrcidProfile().getOrcidHistory().getSource().retrieveSourcePath(); - } else { - return null; - } - } - - private void performPermissionChecks(Authentication authentication, ScopePathType requiredScope, String orcid, OrcidMessage orcidMessage) { - // We can trust that this will return a not-null Authentication object - Collection authorities = authentication.getAuthorities(); - if (authoritiesHasRole(authorities, "ROLE_SYSTEM")) { - return; - } else if (OAuth2Authentication.class.isAssignableFrom(authentication.getClass())) { - OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) authentication; - checkScopes(oAuth2Authentication, requiredScope); - performSecurityChecks(oAuth2Authentication, requiredScope, orcidMessage, orcid); - } else { - throw new AccessControlException("Cannot access method with authentication type " + authentication != null ? authentication.toString() : ", as it's null!"); - } - } - - private void checkScopes(OAuth2Authentication oAuth2Authentication, ScopePathType requiredScope) { - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - Set requestedScopes = authorizationRequest.getScope(); - if (requiredScope.isUserGrantWriteScope()) { - OrcidOAuth2Authentication orcidOauth2Authentication = (OrcidOAuth2Authentication) oAuth2Authentication; - String activeToken = orcidOauth2Authentication.getActiveToken(); - if (activeToken != null) { - OrcidOauth2TokenDetail tokenDetail = orcidOauthTokenDetailService.findNonDisabledByTokenValue(activeToken); - if (removeUserGrantWriteScopePastValitity(tokenDetail)) { - throw new AccessControlException("Write scopes for this token have expired "); - } - } - } - if (!hasRequiredScope(requestedScopes, requiredScope)) { - throw new AccessControlException("Insufficient or wrong scope " + requestedScopes); - } - } - - /* - * Remove UserGrantWriteScope past the specified validity, returns true if - * modified false otherwise - */ - public boolean removeUserGrantWriteScopePastValitity(OrcidOauth2TokenDetail tokenDetail) { - boolean scopeRemoved = false; - if (tokenDetail != null && tokenDetail.getScope() != null) { - // Clean the scope if it is not a persistent token - if (!tokenDetail.isPersistent()) { - Set scopes = OAuth2Utils.parseParameterList(tokenDetail.getScope()); - List removeScopes = new ArrayList(); - for (String scope : scopes) { - if (scope != null && !scope.isEmpty()) { - ScopePathType scopePathType = ScopePathType.fromValue(scope); - if (scopePathType.isUserGrantWriteScope()) { - Date now = new Date(); - if (now.getTime() > tokenDetail.getDateCreated().getTime() + (writeValiditySeconds * 1000)) { - removeScopes.add(scope); - scopeRemoved = true; - } - } - } - } - if (scopeRemoved) { - for (String scope : removeScopes) - scopes.remove(scope); - orcidOauthTokenDetailService.updateScopes(tokenDetail.getTokenValue(), scopes); - return true; - } - } - } - return false; - } - - private void performSecurityChecks(OAuth2Authentication oAuth2Authentication, ScopePathType requiredScope, OrcidMessage orcidMessage, String orcid) { - if (oAuth2Authentication.isClientOnly()) { - performClientChecks(oAuth2Authentication, requiredScope, orcidMessage, orcid); - } else { - performUserChecks(oAuth2Authentication, requiredScope, orcidMessage, orcid); - } - } - - private void performUserChecks(OAuth2Authentication oAuth2Authentication, ScopePathType requiredScope, OrcidMessage orcidMessage, String orcid) { - ProfileEntity principal = (ProfileEntity) oAuth2Authentication.getPrincipal(); - String userOrcid = principal.getId(); - if (orcidMessage != null && orcidMessage.getOrcidProfile() != null && orcidMessage.getOrcidProfile().getOrcidIdentifier() != null - && StringUtils.isNotBlank(orcid)) { - String messageOrcid = orcidMessage.getOrcidProfile().getOrcidIdentifier().getPath(); - // First check that this is a valid call. If these don't match then - // the request is invalid - if (!messageOrcid.equals(orcid)) { - throw new IllegalArgumentException("The ORCID in the body and the URI do not match. Body ORCID: " + messageOrcid + " URI ORCID: " + orcid - + " do NOT match."); - } - } - // Is this the owner making the call? If it is, then let 'em on - // through - if (userOrcid.equals(orcid)) { - return; - } else { - if(profileDao.isProfileDeprecated(orcid)) { - ProfileEntity entity = profileEntityCacheManager.retrieve(orcid); - Map params = new HashMap(); - StringBuffer primary = new StringBuffer(baseUrl).append("/").append(entity.getPrimaryRecord().getId()); - params.put(OrcidDeprecatedException.ORCID, primary.toString()); - if(entity.getDeprecatedDate() != null) { - XMLGregorianCalendar calendar = DateUtils.convertToXMLGregorianCalendar(entity.getDeprecatedDate()); - params.put(OrcidDeprecatedException.DEPRECATED_DATE, calendar.toString()); - } - throw new OrcidDeprecatedException(params); - } - } - throw new AccessControlException("You do not have the required permissions."); - } - - private void performClientChecks(OAuth2Authentication oAuth2Authentication, ScopePathType requiredScope, OrcidMessage orcidMessage, String orcid) { - OAuth2Request authorizationRequest = oAuth2Authentication.getOAuth2Request(); - // If we have an ORCID in the request, we assume that this is intended - // as an update - if (orcidMessage != null && orcidMessage.getOrcidProfile() != null && StringUtils.isNotBlank(orcid)) { - - OrcidIdentifier orcidOb = orcidMessage.getOrcidProfile().getOrcidIdentifier(); - String messageOrcid = orcidOb != null ? orcidOb.getPath() : orcid; - if (StringUtils.isNotBlank(messageOrcid) && !orcid.equals(messageOrcid)) { - throw new IllegalArgumentException("The ORCID in the body and the URI do NOT match. Body ORCID: " + messageOrcid + " URI ORCID: " + orcid - + " do NOT match."); - } - - profileEntityCacheManager.retrieve(messageOrcid); - if (!profileEntityManager.existsAndNotClaimedAndBelongsTo(messageOrcid, authorizationRequest.getClientId())) { - throw new AccessControlException("You cannot update this profile as it has been claimed, or you are not the owner."); - } - } - } - - private boolean authoritiesHasRole(Collection authorities, String role) { - for (GrantedAuthority authority : authorities) { - if (authority.getAuthority().equalsIgnoreCase(role)) { - return true; - } - } - return false; - } - - private boolean hasRequiredScope(Set requestedScopes, ScopePathType requiredScope) { - for (String requestedScope : requestedScopes) { - if (ScopePathType.hasStringScope(requestedScope, requiredScope)) { - return true; - } - if (requiredScope.isReadOnlyScope()) { - // If read only (limited or otherwise) then let it through it - // the user has /read-public, and let the visibility filter take - // care of it. - if (ScopePathType.hasStringScope(requestedScope, ScopePathType.READ_PUBLIC)) { - return true; - } - } - } - return false; - } - - public void setOrcidOauthTokenDetailService(OrcidOauth2TokenDetailService orcidOauthTokenDetailService) { - this.orcidOauthTokenDetailService = orcidOauthTokenDetailService; - } -} diff --git a/orcid-core/src/main/java/org/orcid/core/security/OrcidUserDetailsServiceImpl.java b/orcid-core/src/main/java/org/orcid/core/security/OrcidUserDetailsServiceImpl.java index 1467e40d0a9..2553203a41c 100644 --- a/orcid-core/src/main/java/org/orcid/core/security/OrcidUserDetailsServiceImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/security/OrcidUserDetailsServiceImpl.java @@ -20,7 +20,7 @@ import java.util.Collection; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.RandomStringUtils; @@ -151,7 +151,7 @@ private ProfileEntity obtainEntity(String username) { if (!PojoUtil.isEmpty(orcid)) { profile = profileDao.find(orcid.toUpperCase()); } - } catch (javax.persistence.NoResultException nre) { + } catch (jakarta.persistence.NoResultException nre) { LOGGER.error("User " + username + " was not found"); } catch (Exception e) { LOGGER.error("Error finding user " + username, e); @@ -234,13 +234,13 @@ public boolean isAdmin() { private String setPrimaryEmailIfMissing(String orcid) { try { return emailDao.findPrimaryEmail(orcid).getEmail(); - } catch (javax.persistence.NoResultException nre) { + } catch (jakarta.persistence.NoResultException nre) { String alternativePrimaryEmail = emailDao.findNewestVerifiedOrNewestEmail(orcid); emailDao.updatePrimary(orcid, alternativePrimaryEmail); String message = String.format("User with orcid %s have no primary email, so, we are setting the newest verified email, or, the newest email in case non is verified as the primary one", orcid); LOGGER.error(message); return alternativePrimaryEmail; - } catch (javax.persistence.NonUniqueResultException nure) { + } catch (jakarta.persistence.NonUniqueResultException nure) { String alternativePrimaryEmail = emailDao.findNewestPrimaryEmail(orcid); emailDao.updatePrimary(orcid, alternativePrimaryEmail); String message = String.format("User with orcid %s have more than one primary email, so, we are setting the latest modified primary as the primary one", orcid); diff --git a/orcid-core/src/main/java/org/orcid/core/security/PermissionChecker.java b/orcid-core/src/main/java/org/orcid/core/security/PermissionChecker.java deleted file mode 100644 index ec9a9763d4d..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/security/PermissionChecker.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.orcid.core.security; - -import org.orcid.jaxb.model.message.OrcidMessage; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.jaxb.model.message.Visibility; -import org.springframework.security.core.Authentication; - -import java.util.Set; - -/** - *

- * Checks permissions for the user current registered as the - * {@link java.security.Principal} in this session. - *

- * This was designed to be used in conjunction with AOP giving access to the - * {@link org.orcid.core.security .visibility.aop.AccessControl#requiredScopes()} - * properties. However, to make this more versitile it takes the array of - * {@link ScopePathType} available when using the annotation. - * - * @author Declan Newman (declan) Date: 27/04/2012 - */ -public interface PermissionChecker { - - /** - * Check the permissions for the given {@link Authentication} object and the - * scopes defined in the required scopes - * - * @param authentication - * The authentication object associated with this session - * @param requiredScope - * the scope required to perform the requested operation - * @param orcid - * the orcid passed into the request. This is for requests, such - * as a GET /1234-1234-1234-1234/orcid-bio - * @param orcidMessage - * the {@link OrcidMessage} that has been sent as part of this - * request. This will only apply to PUTs and POSTs - */ - void checkPermissions(Authentication authentication, ScopePathType requiredScope, String orcid, OrcidMessage orcidMessage); - - /** - * Check the permissions for the given {@link Authentication} object and the - * scopes defined in the required scopes - * - * @param authentication - * The authentication object associated with this session - * @param requiredScope - * the scope required to perform the requested operation - * @param orcidMessage - * the {@link OrcidMessage} that has been sent as part of this - * request. This will only apply to PUTs and POSTs - */ - void checkPermissions(Authentication authentication, ScopePathType requiredScope, OrcidMessage orcidMessage); - - /** - * Check the permissions for the given {@link Authentication} object and the - * scopes defined in the required scopes - * - * @param authentication - * The authentication object associated with this session - * @param requiredScope - * the scope required to perform the requested operation - * @param orcid - * the orcid passed into the request. This is for requests, such - * as a GET /1234-1234-1234-1234/orcid-bio - */ - void checkPermissions(Authentication authentication, ScopePathType requiredScope, String orcid); - - /** - * Obtain the current users' permission and return the {@link Visibility} - * array containing those - * - * @param authentication - * the object containing the user's security information - * @return the {@alink Visibility} array of the current user - */ - Set obtainVisibilitiesForAuthentication(Authentication authentication, ScopePathType requiredScope, OrcidMessage orcidMessage); -} diff --git a/orcid-core/src/main/java/org/orcid/core/security/visibility/aop/OrcidApiAuthorizationSecurityAspect.java b/orcid-core/src/main/java/org/orcid/core/security/visibility/aop/OrcidApiAuthorizationSecurityAspect.java deleted file mode 100644 index c7f7f65d43f..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/security/visibility/aop/OrcidApiAuthorizationSecurityAspect.java +++ /dev/null @@ -1,385 +0,0 @@ -package org.orcid.core.security.visibility.aop; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.annotation.Resource; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - -import org.apache.commons.lang.StringUtils; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.orcid.core.oauth.OrcidOAuth2Authentication; -import org.orcid.core.security.PermissionChecker; -import org.orcid.core.security.visibility.filter.VisibilityFilter; -import org.orcid.jaxb.model.message.ExternalIdentifiers; -import org.orcid.jaxb.model.message.GivenNames; -import org.orcid.jaxb.model.message.Keywords; -import org.orcid.jaxb.model.message.OrcidBio; -import org.orcid.jaxb.model.message.OrcidMessage; -import org.orcid.jaxb.model.message.OrcidProfile; -import org.orcid.jaxb.model.message.OtherNames; -import org.orcid.jaxb.model.message.PersonalDetails; -import org.orcid.jaxb.model.message.ResearcherUrls; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.jaxb.model.message.Visibility; -import org.orcid.jaxb.model.message.VisibilityType; -import org.orcid.jaxb.model.notification_v2.Notification; -import org.orcid.jaxb.model.record_v2.Activity; -import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.springframework.core.annotation.Order; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.stereotype.Component; - -/** - * @author Declan Newman (declan) Date: 16/03/2012 - */ -@Deprecated -@Aspect -@Component -@Order(100) -public class OrcidApiAuthorizationSecurityAspect { - - public static final String CLIENT_ID = "client_id"; - - @Resource - private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao; - - @Resource(name = "visibilityFilter") - private VisibilityFilter visibilityFilter; - - @Resource(name = "defaultPermissionChecker") - private PermissionChecker permissionChecker; - - public void setOrcidOauth2TokenDetailDao(OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao) { - this.orcidOauth2TokenDetailDao = orcidOauth2TokenDetailDao; - } - - @Before("@annotation(accessControl) && (args(uriInfo ,orcid, orcidMessage))") - public void checkPermissionsWithAll(AccessControl accessControl, UriInfo uriInfo, String orcid, OrcidMessage orcidMessage) { - permissionChecker.checkPermissions(getAuthentication(), accessControl.requiredScope(), orcid, orcidMessage); - } - - @Before("@annotation(accessControl) && (args(uriInfo, orcidMessage))") - public void checkPermissionsWithOrcidMessage(AccessControl accessControl, UriInfo uriInfo, OrcidMessage orcidMessage) { - permissionChecker.checkPermissions(getAuthentication(), accessControl.requiredScope(), orcidMessage); - - } - - @Before("@annotation(accessControl) && args(orcid)") - public void checkPermissionsWithOrcid(AccessControl accessControl, String orcid) { - Authentication auth = getAuthentication(); - boolean allowAnonymousCall = allowAnonymousAccess(auth, accessControl); - if(!allowAnonymousCall) { - permissionChecker.checkPermissions(auth, accessControl.requiredScope(), orcid); - } - - } - - @Before("@annotation(accessControl) && args(orcid, id)") - public void checkPermissionsWithLongId(AccessControl accessControl, String orcid, Long id) { - Authentication auth = getAuthentication(); - boolean allowAnonymousCall = allowAnonymousAccess(auth, accessControl); - if(!allowAnonymousCall) { - permissionChecker.checkPermissions(auth, accessControl.requiredScope(), orcid); - } - } - - @Before("@annotation(accessControl) && args(orcid, id)") - public void checkPermissionsWithId(AccessControl accessControl, String orcid, String id) { - Authentication auth = getAuthentication(); - boolean allowAnonymousCall = allowAnonymousAccess(auth, accessControl); - if(!allowAnonymousCall) { - permissionChecker.checkPermissions(getAuthentication(), accessControl.requiredScope(), orcid); - } - } - - @Before("@annotation(accessControl) && args(uriInfo, orcid, notification)") - public void checkPermissionsWithNotification(AccessControl accessControl, UriInfo uriInfo, String orcid, Notification notification) { - permissionChecker.checkPermissions(getAuthentication(), accessControl.requiredScope(), orcid); - } - - @Before("@annotation(accessControl) && args(orcid, activity)") - public void checkPermissionsWithWork(AccessControl accessControl, String orcid, Activity activity) { - permissionChecker.checkPermissions(getAuthentication(), accessControl.requiredScope(), orcid); - } - - @Before("@annotation(accessControl) && args(orcid, putCode, activity)") - public void checkPermissionsWithWork(AccessControl accessControl, String orcid, String putCode, Activity activity) { - permissionChecker.checkPermissions(getAuthentication(), accessControl.requiredScope(), orcid); - } - - @Before("@annotation(accessControl) && args(uriInfo, orcid, webhookUri)") - public void checkPermissionsWithOrcidAndWebhookUri(AccessControl accessControl, UriInfo uriInfo, String orcid, String webhookUri) { - permissionChecker.checkPermissions(getAuthentication(), accessControl.requiredScope(), orcid); - } - - @AfterReturning(pointcut = "@annotation(accessControl)", returning = "response") - public void visibilityResponseFilter(Response response, AccessControl accessControl) { - if(accessControl.requestComesFromInternalApi()) { - return; - } - Object entity = response.getEntity(); - if (entity != null && OrcidMessage.class.isAssignableFrom(entity.getClass())) { - OrcidMessage orcidMessage = (OrcidMessage) entity; - - //If it is search results, don't filter them, just return them - if(orcidMessage.getOrcidSearchResults() != null) { - return; - } - - // get the client id - Object authentication = getAuthentication(); - - Set visibilities = new HashSet(); - - if(allowAnonymousAccess((Authentication)authentication, accessControl)) { - visibilities.add(Visibility.PUBLIC); - } else { - visibilities = permissionChecker.obtainVisibilitiesForAuthentication(getAuthentication(), accessControl.requiredScope(), orcidMessage); - } - //If the message contains a bio, and the given name is filtered, restore it as an empty space - boolean setEmptyGivenNameIfFiltered = false; - if(orcidMessage.getOrcidProfile() != null) { - if(orcidMessage.getOrcidProfile() != null && orcidMessage.getOrcidProfile().getOrcidBio() != null) { - setEmptyGivenNameIfFiltered = true; - } - } - - ScopePathType requiredScope = accessControl.requiredScope(); - // If the required scope is */read-limited or */update - if (isUpdateOrReadScope(requiredScope)) { - // If the authentication contains a client_id, use it to check - // if it should be able to - if (OrcidOAuth2Authentication.class.isAssignableFrom(authentication.getClass())){ - OrcidOAuth2Authentication orcidAuth = (OrcidOAuth2Authentication) getAuthentication(); - - OAuth2Request authorization = orcidAuth.getOAuth2Request(); - String clientId = authorization.getClientId(); - - // #1: Get the user orcid - String userOrcid = getUserOrcidFromOrcidMessage(orcidMessage); - // #2: Evaluate the scope to know which field to filter - boolean allowWorks = false; - boolean allowFunding = false; - boolean allowAffiliations = false; - - // Get the update equivalent scope, if it is reading, but, - // doesnt have the read permissions, check if it have the - // update permissions - ScopePathType equivalentUpdateScope = getEquivalentUpdateScope(requiredScope); - if (requiredScope.equals(ScopePathType.READ_LIMITED)) { - if (hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())) - allowWorks = true; - if (hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())) - allowFunding = true; - if (hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())) - allowAffiliations = true; - } else if (requiredScope.equals(ScopePathType.ORCID_WORKS_UPDATE) || requiredScope.equals(ScopePathType.ORCID_WORKS_READ_LIMITED)) { - // Check if the member have the update or read scope on - // works - if (hasScopeEnabled(clientId, userOrcid, requiredScope.getContent(), equivalentUpdateScope == null ? null : equivalentUpdateScope.getContent())) - // If so, allow him to see private works - allowWorks = true; - } else if (requiredScope.equals(ScopePathType.FUNDING_UPDATE) || requiredScope.equals(ScopePathType.FUNDING_READ_LIMITED)) { - // Check if the member have the update or read scope on - // funding - if (hasScopeEnabled(clientId, userOrcid, requiredScope.getContent(), equivalentUpdateScope == null ? null : equivalentUpdateScope.getContent())) - // If so, allow him to see private funding - allowFunding = true; - } else if (requiredScope.equals(ScopePathType.AFFILIATIONS_UPDATE) || requiredScope.equals(ScopePathType.AFFILIATIONS_READ_LIMITED)) { - // Check if the member have the update or read scope on - // affiliations - if (hasScopeEnabled(clientId, userOrcid, requiredScope.getContent(), equivalentUpdateScope == null ? null : equivalentUpdateScope.getContent())) - // If so, allow him to see private affiliations - allowAffiliations = true; - } - - visibilityFilter.filter(orcidMessage, clientId, allowWorks, allowFunding, allowAffiliations, - visibilities.toArray(new Visibility[visibilities.size()])); - } else { - visibilityFilter.filter(orcidMessage, null, false, false, false, visibilities.toArray(new Visibility[visibilities.size()])); - } - - } else { - visibilityFilter.filter(orcidMessage, null, false, false, false, visibilities.toArray(new Visibility[visibilities.size()])); - } - - //This applies for given names that were filtered because of the new visibility field applied on them - //If the given name was set at the beginning and now is filtered, it means we should restore it as an empty field - if(setEmptyGivenNameIfFiltered) { - if(orcidMessage.getOrcidProfile() != null) { - if(orcidMessage.getOrcidProfile().getOrcidBio() == null) { - orcidMessage.getOrcidProfile().setOrcidBio(new OrcidBio()); - } - - if(orcidMessage.getOrcidProfile().getOrcidBio().getPersonalDetails() == null) { - orcidMessage.getOrcidProfile().getOrcidBio().setPersonalDetails(new PersonalDetails()); - } - } - } - - //Filter given or family names visibility - if(orcidMessage.getOrcidProfile() != null) { - if(orcidMessage.getOrcidProfile().getOrcidBio() != null) { - if(orcidMessage.getOrcidProfile().getOrcidBio().getPersonalDetails() != null) { - if(orcidMessage.getOrcidProfile().getOrcidBio().getPersonalDetails().getGivenNames() != null) { - orcidMessage.getOrcidProfile().getOrcidBio().getPersonalDetails().getGivenNames().setVisibility(null); - } else { - //Null given names could break client integrations, so, lets return an empty string - GivenNames empty = new GivenNames(); - empty.setContent(StringUtils.EMPTY); - orcidMessage.getOrcidProfile().getOrcidBio().getPersonalDetails().setGivenNames(empty); - } - - if(orcidMessage.getOrcidProfile().getOrcidBio().getPersonalDetails().getFamilyName() != null) { - orcidMessage.getOrcidProfile().getOrcidBio().getPersonalDetails().getFamilyName().setVisibility(null); - } - } - } - } - - //replace section visibilities now we may have filtered items - if(orcidMessage.getOrcidProfile() != null) { - if(orcidMessage.getOrcidProfile().getOrcidBio() != null) { - if(orcidMessage.getOrcidProfile().getOrcidBio().getPersonalDetails() != null) { - OtherNames n = orcidMessage.getOrcidProfile().getOrcidBio().getPersonalDetails().getOtherNames(); - if(n != null) { - n.setVisibility(getMostFromCollection(n.getOtherName())); - } - } - ExternalIdentifiers ids = orcidMessage.getOrcidProfile().getOrcidBio().getExternalIdentifiers(); - if (ids != null){ - ids.setVisibility(getMostFromCollection(ids.getExternalIdentifier())); - } - Keywords kws = orcidMessage.getOrcidProfile().getOrcidBio().getKeywords(); - if (kws != null){ - kws.setVisibility(getMostFromCollection(kws.getKeyword())); - } - ResearcherUrls urls = orcidMessage.getOrcidProfile().getOrcidBio().getResearcherUrls(); - if (urls != null){ - urls.setVisibility(getMostFromCollection(urls.getResearcherUrl())); - } - } - } - } - } - - private Visibility getMostFromCollection(List c){ - Visibility most = Visibility.PUBLIC; - for (VisibilityType x : c){ - if (x.getVisibility().isMoreRestrictiveThan(most)) - most = x.getVisibility(); - } - return most; - } - private String getUserOrcidFromOrcidMessage(OrcidMessage message) { - OrcidProfile profile = message.getOrcidProfile(); - return profile.getOrcidIdentifier().getPath(); - } - - private boolean isUpdateOrReadScope(ScopePathType requiredScope) { - switch (requiredScope) { - case AFFILIATIONS_READ_LIMITED: - case AFFILIATIONS_UPDATE: - case FUNDING_READ_LIMITED: - case FUNDING_UPDATE: - case ORCID_BIO_READ_LIMITED: - case ORCID_BIO_UPDATE: - case ORCID_PATENTS_READ_LIMITED: - case ORCID_PATENTS_UPDATE: - case ORCID_PROFILE_READ_LIMITED: - case READ_LIMITED: - case ORCID_WORKS_READ_LIMITED: - case ORCID_WORKS_UPDATE: - return true; - default: - return false; - } - } - - @Deprecated - public boolean hasScopeEnabled(String clientId, String userName, String scope, String equivalentScope) { - List scopes = new ArrayList(); - scopes.add(scope); - if (equivalentScope != null) - scopes.add(equivalentScope); - return checkIfScopeIsAvailableForMember(clientId, userName, scopes); - } - - private Authentication getAuthentication() { - SecurityContext context = SecurityContextHolder.getContext(); - if (context != null && context.getAuthentication() != null) { - return context.getAuthentication(); - } else { - throw new IllegalStateException("No security context found. This is bad!"); - } - } - - private ScopePathType getEquivalentUpdateScope(ScopePathType readScope) { - if (readScope != null) - switch (readScope) { - case AFFILIATIONS_READ_LIMITED: - return ScopePathType.AFFILIATIONS_UPDATE; - case FUNDING_READ_LIMITED: - return ScopePathType.FUNDING_UPDATE; - case ORCID_WORKS_READ_LIMITED: - return ScopePathType.ORCID_WORKS_UPDATE; - default: - return null; - } - return null; - } - - private boolean allowAnonymousAccess(Authentication auth, AccessControl accessControl) { - boolean allowAnonymousAccess = false; - if(auth != null) { - for(GrantedAuthority grantedAuth : auth.getAuthorities()) { - if("ROLE_ANONYMOUS".equals(grantedAuth.getAuthority())) { - if(!accessControl.enableAnonymousAccess()) { - break; - } - allowAnonymousAccess = true; - break; - } - } - } - return allowAnonymousAccess; - } - - /** - * Check if a member have a specific scope over a client - * - * @param clientId - * @param userName - * @param scopes - * @return true if the member have access to any of the specified scope on the specified user - * */ - @Deprecated - private boolean checkIfScopeIsAvailableForMember(String clientId, String userName, List requiredScopes) { - List availableScopes = orcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userName); - for(String availableScope : availableScopes) { - String [] simpleScopes = availableScope.split(" "); - for(String simpleScope : simpleScopes) { - if(!PojoUtil.isEmpty(simpleScope)) { - ScopePathType scopePathType = ScopePathType.fromValue(simpleScope); - for(String requiredScope: requiredScopes) { - if(scopePathType.hasScope(requiredScope)) - return true; - } - } - } - } - return false; - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/security/visibility/aop/OrcidApiVisibilitySecurityAspect.java b/orcid-core/src/main/java/org/orcid/core/security/visibility/aop/OrcidApiVisibilitySecurityAspect.java deleted file mode 100644 index 60b306e2925..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/security/visibility/aop/OrcidApiVisibilitySecurityAspect.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.orcid.core.security.visibility.aop; - -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.Aspect; -import org.orcid.core.security.visibility.filter.VisibilityFilter; -import org.orcid.jaxb.model.message.OrcidMessage; -import org.orcid.jaxb.model.message.OrcidProfile; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.ws.rs.core.Response; - -/** - * @author Declan Newman (declan) Date: 16/03/2012 - */ -@Aspect -@Component -public class OrcidApiVisibilitySecurityAspect { - - @Resource(name = "visibilityFilter") - private VisibilityFilter visibilityFilter; - - @AfterReturning(pointcut = "@annotation(visibilityAnnotation)", returning = "response") - public void simpleVisibilityResponseFilter(Response response, VisibilityControl visibilityAnnotation) { - Object entity = response != null ? response.getEntity() : null; - if (entity != null && OrcidMessage.class.isAssignableFrom(entity.getClass())) { - visibilityFilter.filter((OrcidMessage) entity, visibilityAnnotation.visibilities()); - } - } - - @AfterReturning(pointcut = "@annotation(visibilityAnnotation)", returning = "profile") - public void simpleVisibilityProfileFilter(OrcidProfile profile, VisibilityControl visibilityAnnotation) { - if (profile != null) { - OrcidMessage message = new OrcidMessage(profile); - visibilityFilter.filter(message, visibilityAnnotation.visibilities()); - } - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/security/visibility/filter/VisibilityFilter.java b/orcid-core/src/main/java/org/orcid/core/security/visibility/filter/VisibilityFilter.java deleted file mode 100644 index b480ea778a1..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/security/visibility/filter/VisibilityFilter.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.orcid.core.security.visibility.filter; - -import org.orcid.jaxb.model.message.OrcidMessage; -import org.orcid.jaxb.model.message.Visibility; - -/** - * @author Declan Newman (declan) Date: 16/03/2012 - */ -public interface VisibilityFilter { - - OrcidMessage filter(OrcidMessage messageToBeFiltered, Visibility... visibilities); - - OrcidMessage filter(OrcidMessage messageToBeFiltered, String sourceId, boolean allowPrivateWorks, boolean allowPrivateFunding, boolean allowPrivateAffiliations, Visibility... visibilities); - -} diff --git a/orcid-core/src/main/java/org/orcid/core/security/visibility/filter/impl/VisibilityFilterImpl.java b/orcid-core/src/main/java/org/orcid/core/security/visibility/filter/impl/VisibilityFilterImpl.java deleted file mode 100644 index b242c52ccfb..00000000000 --- a/orcid-core/src/main/java/org/orcid/core/security/visibility/filter/impl/VisibilityFilterImpl.java +++ /dev/null @@ -1,272 +0,0 @@ -package org.orcid.core.security.visibility.filter.impl; - -import java.security.AccessControlException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import javax.annotation.Resource; - -import org.orcid.core.security.PermissionChecker; -import org.orcid.core.security.visibility.filter.VisibilityFilter; -import org.orcid.core.tree.TreeCleaner; -import org.orcid.core.tree.TreeCleaningDecision; -import org.orcid.core.tree.TreeCleaningStrategy; -import org.orcid.jaxb.model.message.Address; -import org.orcid.jaxb.model.message.Affiliation; -import org.orcid.jaxb.model.message.Country; -import org.orcid.jaxb.model.message.Email; -import org.orcid.jaxb.model.message.Funding; -import org.orcid.jaxb.model.message.Orcid; -import org.orcid.jaxb.model.message.OrcidIdentifier; -import org.orcid.jaxb.model.message.OrcidMessage; -import org.orcid.jaxb.model.message.OrcidProfile; -import org.orcid.jaxb.model.message.OrcidSearchResults; -import org.orcid.jaxb.model.message.OrcidWork; -import org.orcid.jaxb.model.message.PrivateVisibleToSource; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.jaxb.model.message.Source; -import org.orcid.jaxb.model.message.Visibility; -import org.orcid.jaxb.model.message.VisibilityType; -import org.orcid.jaxb.model.message.WorkContributors; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; - -/** - * I would imagine the first time you see this class, it may be a bit confusing. - *

- * The goal of this class is to insure that no elements that are marked with a - * {@link org.orcid.jaxb.model.message .Visibility} are displayed to the caller - * unless they have sufficient permissions. - *

- * In addition, we need to make sure that the actual visibility attributes are - * removed (if requested with the removeAttribute argument) are nulled in order - * for callers to be unaware of elements that have been requested to be made - * unavailable. - *

- * This is a very important step in the security model and thus, reflection was - * chosen to scan the JaxB objects and locate any classes implementing the - * {@link org.orcid.jaxb.model.message.VisibilityType} interface and check on - * the visibility level requested. - *

- * - * @author Declan Newman (declan) Date: 16/03/2012 - */ -@Component("visibilityFilter") -public class VisibilityFilterImpl implements VisibilityFilter { - - private final static Logger LOGGER = LoggerFactory.getLogger(VisibilityFilterImpl.class); - - @Resource - private PermissionChecker permissionChecker; - - /** - * Remove the elements that are not present in the list of set of - * {@link org.orcid.jaxb.model.message .Visibility}s present in the array - * passed in By default the remaining visibility elements will not be - * removed from the object. - * - * @param messageToBeFiltered - * the {@link org.orcid.jaxb.model.message.OrcidMessage} that - * will be traversed looking for - * {@link org .orcid.jaxb.model.message.VisibilityType} - * @param visibilities - * What {@link org.orcid.jaxb.model.message.Visibility} elements - * should be allowed. - * @return the cleansed {@link org.orcid.jaxb.model.message.OrcidMessage} - */ - @Override - public OrcidMessage filter(OrcidMessage messageToBeFiltered, Visibility... visibilities) { - return filter(messageToBeFiltered, null, false, false, false, visibilities); - } - - /** - * Remove the elements that are not present in the list of set of - * {@link org.orcid.jaxb.model.message .Visibility}s present in the array - * passed in. - * - * @param messageToBeFiltered - * the {@link org.orcid.jaxb.model.message.OrcidMessage} that - * will be traversed looking for - * {@link org .orcid.jaxb.model.message.VisibilityType} elements. - * @param source - * The orcid source that is executing the request - * @param removeAttribute - * should all {@link org.orcid.jaxb.model.message.Visibility} - * elements be removed from the object graph. This has the effect - * that they will not be present in the resulting JAXB - * serialisation. - * @param visibilities - * What {@link org.orcid.jaxb.model.message.Visibility} elements - * should be allowed. - * @return the cleansed {@link org.orcid.jaxb.model.message.OrcidMessage} - */ - @Override - public OrcidMessage filter(OrcidMessage messageToBeFiltered, final String sourceId, final boolean allowPrivateWorks, final boolean allowPrivateFunding, - final boolean allowPrivateAffiliations, Visibility... visibilities) { - if (messageToBeFiltered == null || visibilities == null || visibilities.length == 0) { - return null; - } - String messageIdForLog = getMessageIdForLog(messageToBeFiltered); - LOGGER.debug("About to filter message: " + messageIdForLog); - final Set visibilitySet = new HashSet(Arrays.asList(visibilities)); - if (visibilitySet.contains(Visibility.SYSTEM)) { - return messageToBeFiltered; - } else { - TreeCleaner treeCleaner = new TreeCleaner(); - treeCleaner.clean(messageToBeFiltered, new TreeCleaningStrategy() { - public TreeCleaningDecision needsStripping(Object obj) { - TreeCleaningDecision decision = TreeCleaningDecision.DEFAULT; - if (obj != null) { - Class clazz = obj.getClass(); - - if (!PojoUtil.isEmpty(sourceId)) { - if (allowPrivateAffiliations && Affiliation.class.isAssignableFrom(clazz)) { - Affiliation affiliation = (Affiliation) obj; - Source source = affiliation.getSource(); - if (source != null) { - String sourcePath = source.retrieveSourcePath(); - if (sourcePath != null) { - if (sourceId.equals(sourcePath)) { - decision = TreeCleaningDecision.IGNORE; - } - } - } - } else if (allowPrivateFunding && Funding.class.isAssignableFrom(clazz)) { - Funding funding = (Funding) obj; - Source source = funding.getSource(); - if (source != null) { - String sourcePath = source.retrieveSourcePath(); - if (sourcePath != null) { - if (sourceId.equals(sourcePath)) { - decision = TreeCleaningDecision.IGNORE; - } - } - } - } else if (allowPrivateWorks && OrcidWork.class.isAssignableFrom(clazz)) { - OrcidWork work = (OrcidWork) obj; - Source source = work.getSource(); - if (source != null) { - if (sourceId.equals(source.retrieveSourcePath())) { - decision = TreeCleaningDecision.IGNORE; - } - } - } - } - - // If it is the address field, the visibility and source - // fields are inside the country element - if (Address.class.isAssignableFrom(clazz)) { - Address address = (Address) obj; - // Remove empty addresses - if (address.getCountry() == null) { - decision = TreeCleaningDecision.CLEANING_REQUIRED; - } else { - Country country = address.getCountry(); - // Allow public addresses - if (Visibility.PUBLIC.equals(country.getVisibility())) { - decision = TreeCleaningDecision.IGNORE; - } else if (visibilitySet.contains(Visibility.LIMITED)) { - // Allow limited visibility when possible - if (Visibility.LIMITED.equals(country.getVisibility())) { - decision = TreeCleaningDecision.IGNORE; - } else { - // As last resource, check the source - Source source = country.getSource(); - if (source != null && sourceId != null && sourceId.equals(source.retrieveSourcePath())) { - decision = TreeCleaningDecision.IGNORE; - } else { - decision = TreeCleaningDecision.CLEANING_REQUIRED; - } - } - } - } - } - - if (Email.class.isAssignableFrom(clazz)) { - // check for /email/read-private permissions, - // include all emails if present - try { - Authentication authentication = getAuthentication(); - if (authentication != null && messageToBeFiltered.getOrcidProfile() != null) { - permissionChecker.checkPermissions(getAuthentication(), ScopePathType.EMAIL_READ_PRIVATE, messageToBeFiltered.getOrcidProfile() - .retrieveOrcidPath()); - decision = TreeCleaningDecision.IGNORE; - } - } catch (AccessControlException e) { - // private email can't be read, do nothing here - } - } - - // if we have a source, and that source can read - // limited, also return the private things they own - // Applies to ExternalIdentifier, Keyword, - // ResearcherUrl, OtherName and anything in the future - // that implements PrivateVisibleToSource - if (sourceId != null) - if (PrivateVisibleToSource.class.isAssignableFrom(clazz) && visibilitySet.contains(Visibility.LIMITED)) { - Source source = ((PrivateVisibleToSource) obj).getSource(); - if (source != null) { - if (sourceId.equals(source.retrieveSourcePath())) { - decision = TreeCleaningDecision.IGNORE; - } - } - } - - if (TreeCleaningDecision.DEFAULT.equals(decision)) { - if (WorkContributors.class.isAssignableFrom(clazz)) { - decision = TreeCleaningDecision.IGNORE; - } else if (VisibilityType.class.isAssignableFrom(clazz)) { - VisibilityType visibilityType = (VisibilityType) obj; - if ((visibilityType.getVisibility() == null || !visibilitySet.contains(visibilityType.getVisibility()))) { - decision = TreeCleaningDecision.CLEANING_REQUIRED; - } - } - } - - } - return decision; - } - }); - OrcidProfile orcidProfile = messageToBeFiltered.getOrcidProfile(); - if (orcidProfile != null) { - orcidProfile.setOrcidInternal(null); - } - LOGGER.debug("Finished filtering message: " + messageIdForLog); - return messageToBeFiltered; - } - } - - private Authentication getAuthentication() { - SecurityContext context = SecurityContextHolder.getContext(); - if (context != null && context.getAuthentication() != null) { - return context.getAuthentication(); - } - return null; - } - - private String getMessageIdForLog(OrcidMessage messageToBeFiltered) { - String messageIdForLog = "unknown"; - OrcidSearchResults orcidSearchResults = messageToBeFiltered.getOrcidSearchResults(); - OrcidProfile orcidProfile = messageToBeFiltered.getOrcidProfile(); - if (orcidSearchResults != null) { - messageIdForLog = "orcid-search-results"; - } else if (orcidProfile != null) { - OrcidIdentifier orcidIdentifier = orcidProfile.getOrcidIdentifier(); - if (orcidIdentifier != null) { - messageIdForLog = orcidIdentifier.getPath(); - } - Orcid orcid = orcidProfile.getOrcid(); - if (orcid != null) { - messageIdForLog = orcid.getValue(); - } - } - return messageIdForLog; - } - -} diff --git a/orcid-core/src/main/java/org/orcid/core/solr/CSVSolrClient.java b/orcid-core/src/main/java/org/orcid/core/solr/CSVSolrClient.java index 67ad8612b1f..04e8909da01 100644 --- a/orcid-core/src/main/java/org/orcid/core/solr/CSVSolrClient.java +++ b/orcid-core/src/main/java/org/orcid/core/solr/CSVSolrClient.java @@ -4,15 +4,15 @@ import java.net.URISyntaxException; import java.util.List; import java.util.Map; - -import org.apache.http.HttpEntity; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.util.EntityUtils; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.core5.http.io.entity.EntityUtils; +import org.apache.hc.core5.net.URIBuilder; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.client5.http.ClientProtocolException; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.ParseException; public class CSVSolrClient extends OrcidSolrClient { @@ -22,7 +22,7 @@ public CSVSolrClient(String url) { this.baseUrl = url; } - public String findCSVByDocumentCriteria(Map> queryMap) throws URISyntaxException, ClientProtocolException, IOException { + public String findCSVByDocumentCriteria(Map> queryMap) throws URISyntaxException, ClientProtocolException, IOException, ParseException { CloseableHttpClient httpClient = HttpClients.createDefault(); try { diff --git a/orcid-core/src/main/java/org/orcid/core/solr/OrcidSolrOrgsClient.java b/orcid-core/src/main/java/org/orcid/core/solr/OrcidSolrOrgsClient.java index 6f133fba908..3c23f64bdef 100644 --- a/orcid-core/src/main/java/org/orcid/core/solr/OrcidSolrOrgsClient.java +++ b/orcid-core/src/main/java/org/orcid/core/solr/OrcidSolrOrgsClient.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; diff --git a/orcid-core/src/main/java/org/orcid/core/solr/OrcidSolrProfileClient.java b/orcid-core/src/main/java/org/orcid/core/solr/OrcidSolrProfileClient.java index 5ce1740c173..d88eb6f4fbf 100644 --- a/orcid-core/src/main/java/org/orcid/core/solr/OrcidSolrProfileClient.java +++ b/orcid-core/src/main/java/org/orcid/core/solr/OrcidSolrProfileClient.java @@ -10,7 +10,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; diff --git a/orcid-core/src/main/java/org/orcid/core/solr/SolrBeanFactory.java b/orcid-core/src/main/java/org/orcid/core/solr/SolrBeanFactory.java index fd8152ccf19..c566bd285d0 100644 --- a/orcid-core/src/main/java/org/orcid/core/solr/SolrBeanFactory.java +++ b/orcid-core/src/main/java/org/orcid/core/solr/SolrBeanFactory.java @@ -1,8 +1,7 @@ package org.orcid.core.solr; -import javax.annotation.Resource; +import jakarta.annotation.Resource; -import org.apache.http.client.HttpClient; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.impl.XMLResponseParser; diff --git a/orcid-core/src/main/java/org/orcid/core/stats/impl/StatisticsManagerImpl.java b/orcid-core/src/main/java/org/orcid/core/stats/impl/StatisticsManagerImpl.java index c066589d0a2..b907a5957eb 100644 --- a/orcid-core/src/main/java/org/orcid/core/stats/impl/StatisticsManagerImpl.java +++ b/orcid-core/src/main/java/org/orcid/core/stats/impl/StatisticsManagerImpl.java @@ -3,7 +3,7 @@ import java.text.NumberFormat; import java.util.Locale; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.stats.StatisticsManager; import org.orcid.core.utils.statistics.StatisticsEnum; diff --git a/orcid-core/src/main/java/org/orcid/core/togglz/OrcidTogglzConfiguration.java b/orcid-core/src/main/java/org/orcid/core/togglz/OrcidTogglzConfiguration.java index 3bce408cfe3..da39190d538 100644 --- a/orcid-core/src/main/java/org/orcid/core/togglz/OrcidTogglzConfiguration.java +++ b/orcid-core/src/main/java/org/orcid/core/togglz/OrcidTogglzConfiguration.java @@ -1,6 +1,6 @@ package org.orcid.core.togglz; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.sql.DataSource; import org.orcid.core.security.OrcidRoles; diff --git a/orcid-core/src/main/java/org/orcid/core/userDetails/MultiSecretClient.java b/orcid-core/src/main/java/org/orcid/core/userDetails/MultiSecretClient.java new file mode 100644 index 00000000000..870c13f430e --- /dev/null +++ b/orcid-core/src/main/java/org/orcid/core/userDetails/MultiSecretClient.java @@ -0,0 +1,38 @@ +package org.orcid.core.userDetails; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; + +import java.util.Collection; +import java.util.List; + +public class MultiSecretClient extends User { + private List secrets; + + public MultiSecretClient(String username, String password, Collection authorities, List secrets) { + super(username, password, authorities); + this.secrets = secrets; + } + + public List getSecrets() { + return secrets; + } + + public static class Secret { + private final String encryptedSecret; + private final boolean primary; + + public Secret(String encryptedSecret, boolean primary) { + this.encryptedSecret = encryptedSecret; + this.primary = primary; + } + + public String getEncryptedSecret() { + return encryptedSecret; + } + + public boolean isPrimary() { + return primary; + } + } +} diff --git a/orcid-core/src/main/java/org/orcid/core/utils/FunderIdentifierType.java b/orcid-core/src/main/java/org/orcid/core/utils/FunderIdentifierType.java index 9a197e8bf75..dcfda2ce995 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/FunderIdentifierType.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/FunderIdentifierType.java @@ -8,9 +8,9 @@ package org.orcid.core.utils; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** * TODO: Once the jersey migration is over, this could be moved back to the orcid-utils package so it could be reused form the orcid-persistence package diff --git a/orcid-core/src/main/java/org/orcid/core/utils/OrcidEhCacheManagerFactoryBean.java b/orcid-core/src/main/java/org/orcid/core/utils/OrcidEhCacheManagerFactoryBean.java index 0124d4f33db..b554ba7aeb9 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/OrcidEhCacheManagerFactoryBean.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/OrcidEhCacheManagerFactoryBean.java @@ -2,7 +2,7 @@ import java.io.File; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.RandomStringUtils; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/OrcidMessageUtil.java b/orcid-core/src/main/java/org/orcid/core/utils/OrcidMessageUtil.java index 4472e764d3f..aa2029457c1 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/OrcidMessageUtil.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/OrcidMessageUtil.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.SourceNameCacheManager; import org.orcid.jaxb.model.message.Address; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/OrcidRequestUtil.java b/orcid-core/src/main/java/org/orcid/core/utils/OrcidRequestUtil.java index d7ed179f8cc..761627e9227 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/OrcidRequestUtil.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/OrcidRequestUtil.java @@ -1,6 +1,6 @@ package org.orcid.core.utils; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * @author Shobhit Tyagi diff --git a/orcid-core/src/main/java/org/orcid/core/utils/SecurityContextTestUtils.java b/orcid-core/src/main/java/org/orcid/core/utils/SecurityContextTestUtils.java index fc41cd175ea..c3a29955331 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/SecurityContextTestUtils.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/SecurityContextTestUtils.java @@ -3,28 +3,23 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import java.io.Serializable; import java.util.*; -import org.orcid.core.oauth.OrcidOAuth2Authentication; +import org.orcid.core.oauth.OrcidBearerTokenAuthentication; import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.jpa.entities.ProfileEntity; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextImpl; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; public class SecurityContextTestUtils { - public final static String DEFAULT_CLIENT_ID = "APP-5555555555555555"; - + public final static String DEFAULT_CLIENT_ID = "APP-5555555555555555"; + static public void setUpSecurityContext() { setUpSecurityContext(ScopePathType.ORCID_WORKS_CREATE); } @@ -32,49 +27,33 @@ static public void setUpSecurityContext() { static public void setUpSecurityContext(ScopePathType... scopePathTypes) { setUpSecurityContext("4444-4444-4444-4441", scopePathTypes); } - + static public void setUpSecurityContext(String userOrcid, ScopePathType... scopePathTypes) { setUpSecurityContext(userOrcid, DEFAULT_CLIENT_ID, scopePathTypes); } - + static public void setUpSecurityContext(String userOrcid, String clientId, ScopePathType... scopePathTypes) { SecurityContextImpl securityContext = new SecurityContextImpl(); - OrcidOAuth2Authentication mockedAuthentication = mock(OrcidOAuth2Authentication.class); + OrcidBearerTokenAuthentication mockedAuthentication = mock(OrcidBearerTokenAuthentication.class); securityContext.setAuthentication(mockedAuthentication); SecurityContextHolder.setContext(securityContext); - ProfileEntity userProfileEntity = new ProfileEntity(userOrcid); - when(mockedAuthentication.getPrincipal()).thenReturn(userProfileEntity); - Authentication userAuthentication = mock(Authentication.class); - when(userAuthentication.getPrincipal()).thenReturn(userProfileEntity); - when(mockedAuthentication.getUserAuthentication()).thenReturn(userAuthentication); + when(mockedAuthentication.getPrincipal()).thenReturn(clientId); + when(mockedAuthentication.getName()).thenReturn(clientId); + when(mockedAuthentication.getClientId()).thenReturn(clientId); + when(mockedAuthentication.getUserOrcid()).thenReturn(userOrcid); Set scopes = new HashSet(); if (scopePathTypes != null) { for (ScopePathType scopePathType : scopePathTypes) { scopes.add(scopePathType.value()); } } - OAuth2Request authorizationRequest = new OAuth2Request(Collections. emptyMap(), clientId, - Collections. emptyList(), true, scopes, Collections. emptySet(), null, Collections. emptySet(), - Collections. emptyMap()); - when(mockedAuthentication.getOAuth2Request()).thenReturn(authorizationRequest); - when(mockedAuthentication.isAuthenticated()).thenReturn(true); - //for obo - OAuth2AuthenticationDetails authDetails = mock(OAuth2AuthenticationDetails.class); - //to use, set token in detail to be a token with OBO. -> when(authDetails.getTokenValue()).thenReturn("xxx"); - when(mockedAuthentication.getDetails()).thenReturn(authDetails); + when(mockedAuthentication.getScopes()).thenReturn(scopes); } static public void setUpSecurityContextForClientOnly() { setUpSecurityContextForClientOnly("APP-5555555555555555"); } - static public void setUpSecurityContextForGroupIdClientOnly() { - Set scopes = new HashSet(); - scopes.add(ScopePathType.GROUP_ID_RECORD_READ.value()); - scopes.add(ScopePathType.GROUP_ID_RECORD_UPDATE.value()); - setUpSecurityContextForClientOnly("APP-5555555555555555", scopes); - } - static public void setUpSecurityContextForClientOnly(String clientId) { Set scopes = new HashSet(); scopes.add(ScopePathType.ORCID_PROFILE_CREATE.value()); @@ -91,18 +70,13 @@ static public void setUpSecurityContextForClientOnly(String clientId, ScopePathT static public void setUpSecurityContextForClientOnly(String clientId, Set scopes) { SecurityContextImpl securityContext = new SecurityContextImpl(); - OrcidOAuth2Authentication mockedAuthentication = mock(OrcidOAuth2Authentication.class); + OrcidBearerTokenAuthentication mockedAuthentication = mock(OrcidBearerTokenAuthentication.class); securityContext.setAuthentication(mockedAuthentication); SecurityContextHolder.setContext(securityContext); - when(mockedAuthentication.getPrincipal()).thenReturn(new ProfileEntity(clientId)); - when(mockedAuthentication.isClientOnly()).thenReturn(true); - OAuth2Request authorizationRequest = new OAuth2Request(Collections. emptyMap(), clientId, Collections. emptyList(), true, - scopes, Collections. emptySet(), null, Collections. emptySet(), Collections. emptyMap()); - when(mockedAuthentication.getOAuth2Request()).thenReturn(authorizationRequest); - when(mockedAuthentication.isAuthenticated()).thenReturn(true); + when(mockedAuthentication.getPrincipal()).thenReturn(clientId); when(mockedAuthentication.getName()).thenReturn(clientId); - OAuth2AuthenticationDetails authDetails = mock(OAuth2AuthenticationDetails.class); - when(mockedAuthentication.getDetails()).thenReturn(authDetails); + when(mockedAuthentication.getClientId()).thenReturn(clientId); + when(mockedAuthentication.getScopes()).thenReturn(scopes); } static public void setUpSecurityContextForAnonymous() { @@ -114,10 +88,6 @@ static public void setUpSecurityContextForAnonymous() { SecurityContextHolder.setContext(securityContext); } - static public void clearSecurityContext() { - SecurityContextHolder.setContext(new SecurityContextImpl()); - } - static public void setupSecurityContextForWebUser(String userId, String email) { UserDetails details = new User(userId, email, List.of()); UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(userId, "password"); @@ -127,4 +97,10 @@ static public void setupSecurityContextForWebUser(String userId, String email) { SecurityContextHolder.setContext(securityContext); } -} + static public void setUpSecurityContextForGroupIdClientOnly() { + Set scopes = new HashSet(); + scopes.add(ScopePathType.GROUP_ID_RECORD_READ.value()); + scopes.add(ScopePathType.GROUP_ID_RECORD_UPDATE.value()); + setUpSecurityContextForClientOnly("APP-5555555555555555", scopes); + } +} \ No newline at end of file diff --git a/orcid-core/src/main/java/org/orcid/core/utils/SourceEntityUtils.java b/orcid-core/src/main/java/org/orcid/core/utils/SourceEntityUtils.java index 747c178af4f..9f908db3001 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/SourceEntityUtils.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/SourceEntityUtils.java @@ -1,6 +1,6 @@ package org.orcid.core.utils; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.manager.ClientDetailsEntityCacheManager; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/VerifyEmailUtils.java b/orcid-core/src/main/java/org/orcid/core/utils/VerifyEmailUtils.java index 6ddfc0c6beb..c09f14234ca 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/VerifyEmailUtils.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/VerifyEmailUtils.java @@ -8,7 +8,7 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.datatype.XMLGregorianCalendar; import org.apache.commons.codec.binary.Base64; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/cache/redis/RedisClient.java b/orcid-core/src/main/java/org/orcid/core/utils/cache/redis/RedisClient.java index 7e27972aac8..bf4551b2c0a 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/cache/redis/RedisClient.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/cache/redis/RedisClient.java @@ -10,8 +10,8 @@ import java.util.Set; import java.util.List; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; @@ -26,9 +26,10 @@ import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisClientConfig; import redis.clients.jedis.JedisPool; -import redis.clients.jedis.ScanParams; import redis.clients.jedis.params.SetParams; -import redis.clients.jedis.ScanResult; +import redis.clients.jedis.params.ScanParams; +import redis.clients.jedis.resps.ScanResult; + public class RedisClient { diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/PIDNormalizationService.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/PIDNormalizationService.java index 35f6bc8f826..4a25018e113 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/PIDNormalizationService.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/PIDNormalizationService.java @@ -12,8 +12,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.apache.commons.validator.routines.UrlValidator; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/PIDResolverService.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/PIDResolverService.java index 2dd73c21389..72bb1600858 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/PIDResolverService.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/PIDResolverService.java @@ -8,8 +8,8 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import org.orcid.core.manager.IdentifierTypeManager; import org.orcid.core.utils.v3.identifiers.resolvers.LinkResolver; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/finders/CrossrefFinder.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/finders/CrossrefFinder.java index 9d6ede5a787..2ea9edfd6db 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/finders/CrossrefFinder.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/finders/CrossrefFinder.java @@ -6,7 +6,7 @@ import java.net.MalformedURLException; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.utils.v3.identifiers.PIDResolverCache; import org.orcid.core.utils.v3.identifiers.normalizers.DOINormalizer; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/finders/DataciteFinder.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/finders/DataciteFinder.java index 41dbd557069..ec89b33b340 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/finders/DataciteFinder.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/finders/DataciteFinder.java @@ -5,7 +5,7 @@ import java.net.MalformedURLException; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.utils.v3.identifiers.PIDResolverCache; import org.orcid.core.utils.v3.identifiers.normalizers.DOINormalizer; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/normalizers/CaseSensitiveNormalizer.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/normalizers/CaseSensitiveNormalizer.java index 5bdf5ebdd55..3586b82aa1f 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/normalizers/CaseSensitiveNormalizer.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/normalizers/CaseSensitiveNormalizer.java @@ -4,8 +4,8 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import org.orcid.core.adapter.v3.converter.ContributorsRolesAndSequencesConverter; import org.orcid.core.manager.IdentifierTypeManager; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/ArXivResolver.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/ArXivResolver.java index e54e4afc64b..7b5aa44e654 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/ArXivResolver.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/ArXivResolver.java @@ -11,8 +11,8 @@ import java.util.List; import java.util.Stack; -import javax.annotation.Resource; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.MediaType; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/DOIResolver.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/DOIResolver.java index a05868cd6e8..2e2f1fa77c1 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/DOIResolver.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/DOIResolver.java @@ -11,7 +11,7 @@ import java.util.List; import java.util.Locale; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.codehaus.jettison.json.JSONArray; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/Http200Resolver.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/Http200Resolver.java index 7613a5a64e9..3f3e8ef3802 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/Http200Resolver.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/Http200Resolver.java @@ -3,8 +3,8 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.utils.v3.identifiers.PIDNormalizationService; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/ISBNOCLCResolver.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/ISBNOCLCResolver.java index 04e9f6d64bc..1c44f308778 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/ISBNOCLCResolver.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/ISBNOCLCResolver.java @@ -4,7 +4,7 @@ import org.apache.commons.validator.routines.ISBNValidator; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.utils.v3.identifiers.PIDNormalizationService; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/PubMedResolver.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/PubMedResolver.java index eafbddb123d..91065c35464 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/PubMedResolver.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/PubMedResolver.java @@ -14,8 +14,8 @@ import java.util.List; import java.util.Locale; -import javax.annotation.Resource; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.MediaType; import org.apache.commons.lang3.StringUtils; import org.codehaus.jettison.json.JSONArray; diff --git a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/UnresolvableResolver.java b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/UnresolvableResolver.java index 3f47303ee78..355cb3458dd 100644 --- a/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/UnresolvableResolver.java +++ b/orcid-core/src/main/java/org/orcid/core/utils/v3/identifiers/resolvers/UnresolvableResolver.java @@ -5,8 +5,8 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.PostConstruct; -import javax.annotation.Resource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.manager.IdentifierTypeManager; diff --git a/orcid-core/src/main/java/org/orcid/core/version/impl/VersionConverterImplV2_0ToV2_1.java b/orcid-core/src/main/java/org/orcid/core/version/impl/VersionConverterImplV2_0ToV2_1.java index d9cc115d443..b7948bc7aba 100644 --- a/orcid-core/src/main/java/org/orcid/core/version/impl/VersionConverterImplV2_0ToV2_1.java +++ b/orcid-core/src/main/java/org/orcid/core/version/impl/VersionConverterImplV2_0ToV2_1.java @@ -1,6 +1,6 @@ package org.orcid.core.version.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.impl.OrcidUrlManager; import org.orcid.core.version.V2Convertible; diff --git a/orcid-core/src/main/java/org/orcid/core/web/filters/AcceptFilter.java b/orcid-core/src/main/java/org/orcid/core/web/filters/AcceptFilter.java index 9b63e74fe3c..c59ed3fc03d 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/AcceptFilter.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/AcceptFilter.java @@ -12,12 +12,12 @@ import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.MediaType; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.MediaType; import org.orcid.core.manager.impl.OrcidUrlManager; import org.springframework.web.filter.OncePerRequestFilter; diff --git a/orcid-core/src/main/java/org/orcid/core/web/filters/AcceptHeaderRequestWrapper.java b/orcid-core/src/main/java/org/orcid/core/web/filters/AcceptHeaderRequestWrapper.java index f0ebb55c6d8..8523a67a8a4 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/AcceptHeaderRequestWrapper.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/AcceptHeaderRequestWrapper.java @@ -5,8 +5,8 @@ import java.util.Enumeration; import java.util.List; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; /** * diff --git a/orcid-core/src/main/java/org/orcid/core/web/filters/CorsFilter.java b/orcid-core/src/main/java/org/orcid/core/web/filters/CorsFilter.java index 176b536481f..5f7bccf6770 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/CorsFilter.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/CorsFilter.java @@ -3,11 +3,11 @@ import java.io.IOException; import java.net.URISyntaxException; -import javax.annotation.Resource; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.FilterChain; +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/orcid-core/src/main/java/org/orcid/core/web/filters/CorsFilterWeb.java b/orcid-core/src/main/java/org/orcid/core/web/filters/CorsFilterWeb.java index 95b1fc7cb55..d093f0134a4 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/CorsFilterWeb.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/CorsFilterWeb.java @@ -5,11 +5,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.Resource; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.FilterChain; +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/orcid-core/src/main/java/org/orcid/core/web/filters/CrossDomainWebManger.java b/orcid-core/src/main/java/org/orcid/core/web/filters/CrossDomainWebManger.java index de4b7a2a739..8c14da08a93 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/CrossDomainWebManger.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/CrossDomainWebManger.java @@ -9,7 +9,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.orcid.core.manager.impl.OrcidUrlManager; import org.orcid.pojo.ajaxForm.PojoUtil; diff --git a/orcid-core/src/main/java/org/orcid/core/web/filters/FilterServletOutputStream.java b/orcid-core/src/main/java/org/orcid/core/web/filters/FilterServletOutputStream.java index 2fbd9643fef..a47ffc10715 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/FilterServletOutputStream.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/FilterServletOutputStream.java @@ -4,8 +4,8 @@ import java.io.IOException; import java.io.OutputStream; -import javax.servlet.ServletOutputStream; -import javax.servlet.WriteListener; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; /** * Extends ServletOutputStream for JsonpCallbackFilter diff --git a/orcid-core/src/main/java/org/orcid/core/web/filters/GenericResponseWrapper.java b/orcid-core/src/main/java/org/orcid/core/web/filters/GenericResponseWrapper.java index 4eac420d12e..d1ae9d1c69d 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/GenericResponseWrapper.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/GenericResponseWrapper.java @@ -3,9 +3,9 @@ import java.io.ByteArrayOutputStream; import java.io.PrintWriter; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpServletResponseWrapper; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; /** * Extends HttpServletResponseWrapper for JsonpCallbackFilter diff --git a/orcid-core/src/main/java/org/orcid/core/web/filters/JsonpCallbackFilter.java b/orcid-core/src/main/java/org/orcid/core/web/filters/JsonpCallbackFilter.java index 77a09288ff7..3eca0769158 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/JsonpCallbackFilter.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/JsonpCallbackFilter.java @@ -4,12 +4,12 @@ import java.io.OutputStream; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/orcid-core/src/main/java/org/orcid/core/web/filters/JsonpCallbackFilterWeb.java b/orcid-core/src/main/java/org/orcid/core/web/filters/JsonpCallbackFilterWeb.java index 3e11191a4cd..77edccbd63f 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/JsonpCallbackFilterWeb.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/JsonpCallbackFilterWeb.java @@ -5,12 +5,12 @@ import java.net.URISyntaxException; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/orcid-core/src/main/java/org/orcid/core/web/filters/SanitizeAuthenticationFilter.java b/orcid-core/src/main/java/org/orcid/core/web/filters/SanitizeAuthenticationFilter.java index 8de287c9b15..b02230c84b2 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/SanitizeAuthenticationFilter.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/SanitizeAuthenticationFilter.java @@ -6,11 +6,11 @@ import java.util.Enumeration; import java.util.List; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.pojo.ajaxForm.PojoUtil; import org.springframework.web.filter.OncePerRequestFilter; diff --git a/orcid-core/src/main/java/org/orcid/core/web/filters/StaticContentFilter.java b/orcid-core/src/main/java/org/orcid/core/web/filters/StaticContentFilter.java index 22fc17117f7..78579cdf557 100644 --- a/orcid-core/src/main/java/org/orcid/core/web/filters/StaticContentFilter.java +++ b/orcid-core/src/main/java/org/orcid/core/web/filters/StaticContentFilter.java @@ -4,10 +4,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -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.orcid.core.utils.ReleaseNameUtils; import org.springframework.web.filter.OncePerRequestFilter; diff --git a/orcid-core/src/main/java/org/orcid/pojo/IdentifierType.java b/orcid-core/src/main/java/org/orcid/pojo/IdentifierType.java index 60467c4079c..53b6cd33b77 100644 --- a/orcid-core/src/main/java/org/orcid/pojo/IdentifierType.java +++ b/orcid-core/src/main/java/org/orcid/pojo/IdentifierType.java @@ -3,8 +3,8 @@ import java.io.Serializable; import java.util.Date; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlTransient; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; diff --git a/orcid-core/src/main/java/org/orcid/pojo/WorkGroupExtended.java b/orcid-core/src/main/java/org/orcid/pojo/WorkGroupExtended.java index 6518acab7ac..736312a30dc 100644 --- a/orcid-core/src/main/java/org/orcid/pojo/WorkGroupExtended.java +++ b/orcid-core/src/main/java/org/orcid/pojo/WorkGroupExtended.java @@ -4,7 +4,7 @@ import org.orcid.jaxb.model.v3.release.record.GroupableActivity; import org.orcid.jaxb.model.v3.release.record.summary.ActivityGroup; -import javax.xml.bind.annotation.*; +import jakarta.xml.bind.annotation.*; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; diff --git a/orcid-core/src/main/java/org/orcid/pojo/WorkSummaryExtended.java b/orcid-core/src/main/java/org/orcid/pojo/WorkSummaryExtended.java index 5f6d56ef8d5..243b940df99 100644 --- a/orcid-core/src/main/java/org/orcid/pojo/WorkSummaryExtended.java +++ b/orcid-core/src/main/java/org/orcid/pojo/WorkSummaryExtended.java @@ -19,7 +19,7 @@ import org.orcid.jaxb.model.v3.release.record.WorkTitle; import org.orcid.jaxb.model.v3.release.record.summary.WorkSummary; -import javax.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElement; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; diff --git a/orcid-core/src/main/java/org/orcid/pojo/WorksExtended.java b/orcid-core/src/main/java/org/orcid/pojo/WorksExtended.java index 5d6e5c3f89a..2ecadcb342c 100644 --- a/orcid-core/src/main/java/org/orcid/pojo/WorksExtended.java +++ b/orcid-core/src/main/java/org/orcid/pojo/WorksExtended.java @@ -5,7 +5,7 @@ import org.orcid.jaxb.model.v3.release.record.Group; import org.orcid.jaxb.model.v3.release.record.GroupsContainer; -import javax.xml.bind.annotation.*; +import jakarta.xml.bind.annotation.*; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; diff --git a/orcid-core/src/main/java/org/orcid/pojo/grouping/WorkGroup.java b/orcid-core/src/main/java/org/orcid/pojo/grouping/WorkGroup.java index 2dbf34923d8..13f1eec6d6a 100644 --- a/orcid-core/src/main/java/org/orcid/pojo/grouping/WorkGroup.java +++ b/orcid-core/src/main/java/org/orcid/pojo/grouping/WorkGroup.java @@ -17,7 +17,7 @@ import org.orcid.pojo.ajaxForm.Text; import org.orcid.pojo.ajaxForm.WorkForm; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import static org.orcid.pojo.ajaxForm.PojoUtil.getWorkForm; diff --git a/orcid-core/src/main/java/org/orcid/pojo/summary/RecordSummaryPojo.java b/orcid-core/src/main/java/org/orcid/pojo/summary/RecordSummaryPojo.java index b889c1547b1..39d860f1941 100644 --- a/orcid-core/src/main/java/org/orcid/pojo/summary/RecordSummaryPojo.java +++ b/orcid-core/src/main/java/org/orcid/pojo/summary/RecordSummaryPojo.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; diff --git a/orcid-core/src/main/resources/orcid-core-cache-config.xml b/orcid-core/src/main/resources/orcid-core-cache-config.xml index 588d7e405aa..ef90551411a 100644 --- a/orcid-core/src/main/resources/orcid-core-cache-config.xml +++ b/orcid-core/src/main/resources/orcid-core-cache-config.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> diff --git a/orcid-core/src/main/resources/orcid-core-context.xml b/orcid-core/src/main/resources/orcid-core-context.xml index 87edc0962fd..b4e1574a3f5 100644 --- a/orcid-core/src/main/resources/orcid-core-context.xml +++ b/orcid-core/src/main/resources/orcid-core-context.xml @@ -4,11 +4,11 @@ xmlns:cache="http://www.springframework.org/schema/cache" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jms="http://www.springframework.org/schema/jms" xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd - http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd"> + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd"> @@ -28,10 +28,6 @@ - - - - @@ -41,34 +37,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -78,21 +46,6 @@ - - - - - - - - - - - - - - - @@ -425,7 +378,7 @@ - + @@ -726,7 +679,6 @@ - @@ -809,8 +761,6 @@ - - @@ -818,8 +768,7 @@ - - + @@ -892,6 +841,7 @@ + @@ -973,7 +923,9 @@ - + + + @@ -1155,12 +1107,7 @@ - - - - - - + @@ -1254,8 +1201,7 @@ - - + diff --git a/orcid-core/src/test/java/org/orcid/core/SourceInActivitiesTest.java b/orcid-core/src/test/java/org/orcid/core/SourceInActivitiesTest.java index 2d738e34d6f..e626c3ac29f 100644 --- a/orcid-core/src/test/java/org/orcid/core/SourceInActivitiesTest.java +++ b/orcid-core/src/test/java/org/orcid/core/SourceInActivitiesTest.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.Locale; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/JpaJaxbClientAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/JpaJaxbClientAdapterTest.java index d31a19d86eb..aca2731dc6d 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/JpaJaxbClientAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/JpaJaxbClientAdapterTest.java @@ -13,7 +13,7 @@ import java.util.SortedSet; import java.util.TreeSet; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/MockSourceNameCache.java b/orcid-core/src/test/java/org/orcid/core/adapter/MockSourceNameCache.java index cf2d2ac1c85..afc2484f871 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/MockSourceNameCache.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/MockSourceNameCache.java @@ -5,7 +5,7 @@ import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.BaseTest; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONExternalIdentifiersConverterV3Test.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONExternalIdentifiersConverterV3Test.java index 4f568eaee9e..3f92f7d9520 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONExternalIdentifiersConverterV3Test.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONExternalIdentifiersConverterV3Test.java @@ -5,9 +5,9 @@ import java.io.InputStream; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Before; import org.junit.Test; @@ -65,7 +65,7 @@ public void testConvertFrom() { private Education getEducation() throws JAXBException { - JAXBContext context = JAXBContext.newInstance(new Class[] { Education.class }); + JAXBContext context = JAXBContext.newInstance(Education.class); Unmarshaller unmarshaller = context.createUnmarshaller(); String name = "/record_3.0/samples/read_samples/education-full-3.0.xml"; InputStream inputStream = getClass().getResourceAsStream(name); diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV1Test.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV1Test.java index 4481ea834ae..ec7a19dc4c0 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV1Test.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV1Test.java @@ -3,7 +3,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBException; import org.junit.Test; import org.orcid.jaxb.model.message.FundingExternalIdentifier; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV2Test.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV2Test.java index 9e6df452456..112bda1084f 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV2Test.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV2Test.java @@ -6,9 +6,9 @@ import java.io.InputStream; import java.math.BigDecimal; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.orcid.jaxb.model.common_v2.Visibility; @@ -71,7 +71,7 @@ private ProfileFundingEntity getProfileFundingEntity() { } private Funding getFunding() throws JAXBException { - JAXBContext context = JAXBContext.newInstance(new Class[] { Funding.class }); + JAXBContext context = JAXBContext.newInstance(Funding.class); Unmarshaller unmarshaller = context.createUnmarshaller(); String name = "/record_2.0/samples/read_samples/funding-full-2.0.xml"; InputStream inputStream = getClass().getResourceAsStream(name); diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV3Test.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV3Test.java index 2e78c50fb26..4c8b72cdbaa 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV3Test.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONFundingExternalIdentifiersConverterV3Test.java @@ -6,9 +6,9 @@ import java.io.InputStream; import java.math.BigDecimal; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.orcid.jaxb.model.common_v2.Visibility; @@ -70,7 +70,7 @@ private ProfileFundingEntity getProfileFundingEntity() { } private Funding getFunding() throws JAXBException { - JAXBContext context = JAXBContext.newInstance(new Class[] { Funding.class }); + JAXBContext context = JAXBContext.newInstance(Funding.class); Unmarshaller unmarshaller = context.createUnmarshaller(); String name = "/record_3.0/samples/read_samples/funding-full-3.0.xml"; InputStream inputStream = getClass().getResourceAsStream(name); diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONPeerReviewWorkExternalIdentifierConverterV2Test.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONPeerReviewWorkExternalIdentifierConverterV2Test.java index ff08ece5eb6..c625c82669e 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONPeerReviewWorkExternalIdentifierConverterV2Test.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONPeerReviewWorkExternalIdentifierConverterV2Test.java @@ -5,9 +5,9 @@ import java.io.InputStream; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.orcid.jaxb.model.common_v2.Visibility; @@ -47,7 +47,7 @@ public void testConvertFrom() { } private PeerReview getPeerReview() throws JAXBException { - JAXBContext context = JAXBContext.newInstance(new Class[] { PeerReview.class }); + JAXBContext context = JAXBContext.newInstance(PeerReview.class); Unmarshaller unmarshaller = context.createUnmarshaller(); String name = "/record_2.0/samples/read_samples/peer-review-full-2.0.xml"; InputStream inputStream = getClass().getResourceAsStream(name); diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONPeerReviewWorkExternalIdentifierConverterV3Test.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONPeerReviewWorkExternalIdentifierConverterV3Test.java index f5bba3ea259..81e92595266 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONPeerReviewWorkExternalIdentifierConverterV3Test.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONPeerReviewWorkExternalIdentifierConverterV3Test.java @@ -5,9 +5,9 @@ import java.io.InputStream; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.orcid.jaxb.model.v3.release.record.ExternalID; @@ -43,7 +43,7 @@ public void testConvertFrom() { } private PeerReview getPeerReview() throws JAXBException { - JAXBContext context = JAXBContext.newInstance(new Class[] { PeerReview.class }); + JAXBContext context = JAXBContext.newInstance(PeerReview.class); Unmarshaller unmarshaller = context.createUnmarshaller(); String name = "/record_3.0/samples/read_samples/peer-review-full-3.0.xml"; InputStream inputStream = getClass().getResourceAsStream(name); diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV1Test.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV1Test.java index 0a4167d34b5..5b5c53ec186 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV1Test.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV1Test.java @@ -3,7 +3,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBException; import org.junit.Test; import org.orcid.jaxb.model.message.WorkExternalIdentifier; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV2Test.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV2Test.java index 472e6b53aab..19702a6e713 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV2Test.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV2Test.java @@ -7,9 +7,9 @@ import java.io.InputStream; import java.util.Date; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.orcid.jaxb.model.common_v2.Iso3166Country; @@ -78,7 +78,7 @@ public void testConvertToWithIdThatBreaksUrlValidation() { } private Work getWork() throws JAXBException { - JAXBContext context = JAXBContext.newInstance(new Class[] { Work.class }); + JAXBContext context = JAXBContext.newInstance(Work.class); Unmarshaller unmarshaller = context.createUnmarshaller(); String name = "/record_2.0/samples/read_samples/work-full-2.0.xml"; InputStream inputStream = getClass().getResourceAsStream(name); diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV3Test.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV3Test.java index b657ae52b14..a2eb1871626 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV3Test.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JSONWorkExternalIdentifiersConverterV3Test.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Before; import org.junit.Test; @@ -147,7 +147,7 @@ public void testConvertToWithIdThatBreaksUrlValidation() { } private Work getWork() throws JAXBException { - JAXBContext context = JAXBContext.newInstance(new Class[] { Work.class }); + JAXBContext context = JAXBContext.newInstance(Work.class); Unmarshaller unmarshaller = context.createUnmarshaller(); String name = "/record_2.0/samples/read_samples/work-full-2.0.xml"; InputStream inputStream = getClass().getResourceAsStream(name); diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JaxbContextUtil.java b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JaxbContextUtil.java new file mode 100644 index 00000000000..84b876eaf94 --- /dev/null +++ b/orcid-core/src/test/java/org/orcid/core/adapter/jsonidentifier/converter/JaxbContextUtil.java @@ -0,0 +1,59 @@ +package org.orcid.core.adapter.jsonidentifier.converter; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import java.util.HashMap; +import java.util.Map; +import org.orcid.jaxb.model.v3.release.groupid.GroupIdRecord; +import org.orcid.jaxb.model.v3.release.notification.permission.NotificationPermission; +import org.orcid.jaxb.model.v3.release.record.*; +import org.orcid.jaxb.model.v3.release.record.summary.*; + +/** + * Utility for creating JAXB contexts with v3.release model classes needed for unmarshaling. + * Uses the same approach as OrcidValidationJaxbContextResolver. + */ +public class JaxbContextUtil { + + private static final Map, String> V3_RELEASE_CLASSES_MAP = new HashMap<>(); + static { + V3_RELEASE_CLASSES_MAP.put(GroupIdRecord.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(NotificationPermission.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Address.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Addresses.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Education.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Email.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Employment.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.PersonExternalIdentifier.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.PersonExternalIdentifiers.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Funding.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Keyword.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Keywords.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Name.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.OtherName.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.OtherNames.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.PeerReview.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.ResearcherUrl.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.ResearcherUrls.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Work.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.WorkBulk.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Educations.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Employments.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Distinction.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.InvitedPosition.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Membership.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Qualification.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(org.orcid.jaxb.model.v3.release.record.Service.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(ExternalID.class, "v3"); + V3_RELEASE_CLASSES_MAP.put(ExternalIDs.class, "v3"); + } + + /** + * Create a JAXBContext with essential v3.release model classes for unmarshaling. + * Only includes Education, Funding, Work, PeerReview and their dependencies. + */ + public static JAXBContext createV3ReleaseContext() throws JAXBException { + Class[] classes = V3_RELEASE_CLASSES_MAP.keySet().toArray(new Class[0]); + return JAXBContext.newInstance(classes); + } +} diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbAddressAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbAddressAdapterTest.java index f1e31f52849..88b007ee86d 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbAddressAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbAddressAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEducationAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEducationAdapterTest.java index 439db06bab0..f0125080aea 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEducationAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEducationAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEmailAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEmailAdapterTest.java index 29df960ae9e..6a379c83a6e 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEmailAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEmailAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEmploymentAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEmploymentAdapterTest.java index 758af02ac88..f30ebf026fb 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEmploymentAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbEmploymentAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbExternalIdentifierAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbExternalIdentifierAdapterTest.java index 07d4177980c..d5f8e2c5c0d 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbExternalIdentifierAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbExternalIdentifierAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbFundingAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbFundingAdapterTest.java index 2054aab2f03..8dbab1fd998 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbFundingAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbFundingAdapterTest.java @@ -8,10 +8,10 @@ import java.math.BigDecimal; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbInvalidRecordDataChangeAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbInvalidRecordDataChangeAdapterTest.java index cc05ecb12d7..0ef0f124079 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbInvalidRecordDataChangeAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbInvalidRecordDataChangeAdapterTest.java @@ -5,7 +5,7 @@ import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbKeywordAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbKeywordAdapterTest.java index 874ad9c4f0a..2d24ab275bf 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbKeywordAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbKeywordAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbNameAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbNameAdapterTest.java index 18df3b7ea6e..efdf096eeb0 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbNameAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbNameAdapterTest.java @@ -6,8 +6,8 @@ import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbNotificationAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbNotificationAdapterTest.java index f33b67f6cc5..32add8fd1ca 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbNotificationAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbNotificationAdapterTest.java @@ -8,7 +8,7 @@ import java.util.Date; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbOtherNameAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbOtherNameAdapterTest.java index 073650c59e9..40f74cae4f1 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbOtherNameAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbOtherNameAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbPeerReviewAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbPeerReviewAdapterTest.java index 74408ebfeb2..5a851192dc7 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbPeerReviewAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbPeerReviewAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbResearcherUrlAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbResearcherUrlAdapterTest.java index bab56f6e8bf..4bdcc3ea7d2 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbResearcherUrlAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbResearcherUrlAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbWorkAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbWorkAdapterTest.java index 044797b73b4..96edea7636e 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbWorkAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v2/latest/JpaJaxbWorkAdapterTest.java @@ -10,10 +10,10 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbAddressAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbAddressAdapterTest.java index fddcd90466b..5822d5f38d2 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbAddressAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbAddressAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbClientAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbClientAdapterTest.java index 624031cfab8..4b9f9fdc4de 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbClientAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbClientAdapterTest.java @@ -13,7 +13,7 @@ import java.util.SortedSet; import java.util.TreeSet; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbDistinctionAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbDistinctionAdapterTest.java index 3492d642abb..ab0d3f3487f 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbDistinctionAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbDistinctionAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEducationAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEducationAdapterTest.java index 01e6e44044d..a5b844d4fc8 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEducationAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEducationAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEmailAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEmailAdapterTest.java index 65a70e2e6ac..41b529e21d1 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEmailAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEmailAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEmploymentAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEmploymentAdapterTest.java index c7e365bb90d..20654fae71d 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEmploymentAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbEmploymentAdapterTest.java @@ -8,11 +8,11 @@ import java.io.StringWriter; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbExternalIdentifierAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbExternalIdentifierAdapterTest.java index 2c8c8bacbe6..22fa00a2609 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbExternalIdentifierAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbExternalIdentifierAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbFundingAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbFundingAdapterTest.java index f2fd299c648..7dc5b6334f2 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbFundingAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbFundingAdapterTest.java @@ -8,10 +8,10 @@ import java.math.BigDecimal; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbInvitedPositionAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbInvitedPositionAdapterTest.java index ea2e1890243..a2a8e9b8271 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbInvitedPositionAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbInvitedPositionAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbKeywordAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbKeywordAdapterTest.java index abcb6e9288e..029fa5e51f4 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbKeywordAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbKeywordAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbMembershipAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbMembershipAdapterTest.java index 243c3f7bed1..dd9a36cfea1 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbMembershipAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbMembershipAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbNameAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbNameAdapterTest.java index 991845e61b8..26b41113555 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbNameAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbNameAdapterTest.java @@ -6,8 +6,8 @@ import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbNotificationAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbNotificationAdapterTest.java index 4a3806568ae..59a22951fca 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbNotificationAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbNotificationAdapterTest.java @@ -8,7 +8,7 @@ import java.util.Date; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbOtherNameAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbOtherNameAdapterTest.java index 0eb14db708f..356b1ca6d4e 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbOtherNameAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbOtherNameAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbPeerReviewAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbPeerReviewAdapterTest.java index 498cd9de9c0..8bc93d071b8 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbPeerReviewAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbPeerReviewAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbQualificationAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbQualificationAdapterTest.java index 110ba66a1f7..9c70094471b 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbQualificationAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbQualificationAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbResearchResourceAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbResearchResourceAdapterTest.java index 34b288fc03e..95f82cfe77a 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbResearchResourceAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbResearchResourceAdapterTest.java @@ -8,10 +8,10 @@ import java.util.ArrayList; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbResearcherUrlAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbResearcherUrlAdapterTest.java index 4d052d85369..4f7bfd4cb09 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbResearcherUrlAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbResearcherUrlAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbServiceAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbServiceAdapterTest.java index 6f4de964d43..ff9bbd6eebb 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbServiceAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbServiceAdapterTest.java @@ -7,10 +7,10 @@ import java.io.InputStream; import java.util.Date; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbWorkAdapterTest.java b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbWorkAdapterTest.java index 874b5322b1e..b761520db58 100644 --- a/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbWorkAdapterTest.java +++ b/orcid-core/src/test/java/org/orcid/core/adapter/v3/JpaJaxbWorkAdapterTest.java @@ -10,10 +10,10 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/cli/logs/ApiAccessLogsAnalyserTest.java b/orcid-core/src/test/java/org/orcid/core/cli/logs/ApiAccessLogsAnalyserTest.java index cc1ca7b0caa..d3abb6b3a12 100644 --- a/orcid-core/src/test/java/org/orcid/core/cli/logs/ApiAccessLogsAnalyserTest.java +++ b/orcid-core/src/test/java/org/orcid/core/cli/logs/ApiAccessLogsAnalyserTest.java @@ -9,7 +9,7 @@ import java.io.IOException; import java.util.Arrays; -import javax.persistence.NoResultException; +import jakarta.persistence.NoResultException; import org.junit.Before; import org.junit.Test; diff --git a/orcid-core/src/test/java/org/orcid/core/common/manager/SummaryManagerTest.java b/orcid-core/src/test/java/org/orcid/core/common/manager/SummaryManagerTest.java index 67b18ed0292..1d351e563fc 100644 --- a/orcid-core/src/test/java/org/orcid/core/common/manager/SummaryManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/common/manager/SummaryManagerTest.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.datatype.XMLGregorianCalendar; import com.oracle.truffle.api.profiles.Profile; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/ActivitiesSummaryManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/ActivitiesSummaryManagerTest.java index ffe59e92f58..cc1b2299852 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/ActivitiesSummaryManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/ActivitiesSummaryManagerTest.java @@ -7,7 +7,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/AddressManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/AddressManagerTest.java index 96d1540e5d5..a8d7bf956fd 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/AddressManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/AddressManagerTest.java @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/AffiliationsManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/AffiliationsManagerTest.java index 0a21a8e4e92..7b035f9df52 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/AffiliationsManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/AffiliationsManagerTest.java @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/AppIdGenerationManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/AppIdGenerationManagerTest.java index 98bb93646c9..454b205a346 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/AppIdGenerationManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/AppIdGenerationManagerTest.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.orcid.core.BaseTest; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/BiographyManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/BiographyManagerTest.java index ad93ba56061..d8dcab31234 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/BiographyManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/BiographyManagerTest.java @@ -9,7 +9,7 @@ import java.util.Arrays; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/ClientManagerReadOnlyTest.java b/orcid-core/src/test/java/org/orcid/core/manager/ClientManagerReadOnlyTest.java index ac2d2b9a778..1aa5e16a99d 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/ClientManagerReadOnlyTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/ClientManagerReadOnlyTest.java @@ -14,7 +14,7 @@ import java.util.SortedSet; import java.util.TreeSet; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.RandomStringUtils; import org.junit.After; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/ExternalIdentifierManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/ExternalIdentifierManagerTest.java index c26af27e00a..5920f108fc6 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/ExternalIdentifierManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/ExternalIdentifierManagerTest.java @@ -13,7 +13,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/GroupIdRecordManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/GroupIdRecordManagerTest.java index 19c79ce4e87..d4eaf59dd8b 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/GroupIdRecordManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/GroupIdRecordManagerTest.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Optional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/IdentifierTypeManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/IdentifierTypeManagerTest.java index 33ab95c6f4d..8965a8260a7 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/IdentifierTypeManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/IdentifierTypeManagerTest.java @@ -13,7 +13,7 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/InstitutionalSignInManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/InstitutionalSignInManagerTest.java index d38317dc33f..a4d6cf78ad7 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/InstitutionalSignInManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/InstitutionalSignInManagerTest.java @@ -16,7 +16,7 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.io.IOUtils; import org.junit.After; @@ -25,8 +25,8 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.utils.JsonUtils; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.persistence.dao.UserConnectionDao; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; import org.orcid.persistence.jpa.entities.UserconnectionEntity; @@ -53,7 +53,7 @@ public class InstitutionalSignInManagerTest { private NotificationManager mock_notificationManager; @Mock - private OrcidOauth2TokenDetailService mock_orcidOauth2TokenDetailService; + private ClientDetailsManagerReadOnly mock_clientDetailsManagerReadOnly; @Resource private UserConnectionDao userConnectionDao; @@ -64,8 +64,8 @@ public class InstitutionalSignInManagerTest { @Resource private NotificationManager notificationManager; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; + @Resource(name = "clientDetailsManagerReadOnlyV3") + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; @Resource private InstitutionalSignInManager institutionalSignInManager; @@ -76,7 +76,7 @@ public void before() { TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "userConnectionDao", mock_userConnectionDao); TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "clientDetailsEntityCacheManager", mock_clientDetailsEntityCacheManager); TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "notificationManager", mock_notificationManager); - TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "orcidOauth2TokenDetailService", mock_orcidOauth2TokenDetailService); + TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "clientDetailsManagerReadOnly", mock_clientDetailsManagerReadOnly); } @After @@ -85,7 +85,7 @@ public void after() { TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "userConnectionDao", userConnectionDao); TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "clientDetailsEntityCacheManager", clientDetailsEntityCacheManager); TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "notificationManager", notificationManager); - TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "orcidOauth2TokenDetailService", orcidOauth2TokenDetailService); + TargetProxyHelper.injectIntoProxy(institutionalSignInManager, "clientDetailsManagerReadOnly", clientDetailsManagerReadOnly); } @Test @@ -94,7 +94,6 @@ public void testCreateUserConnectionAndNotify() throws UnsupportedEncodingExcept when(mock_userConnectionDao.findByProviderIdAndProviderUserIdAndIdType(anyString(), anyString(), anyString())).thenReturn(null); when(mock_clientDetailsEntityCacheManager.retrieveByIdP(anyString())).thenReturn(testClient); - when(mock_orcidOauth2TokenDetailService.doesClientKnowUser(anyString(), anyString())).thenReturn(false); institutionalSignInManager.createUserConnectionAndNotify("idType", "remoteUserId", "displayName", "providerId", userOrcid, Collections. emptyMap()); @@ -109,7 +108,7 @@ public void testDontSendNotificationIfClientKnowUser() throws UnsupportedEncodin when(mock_userConnectionDao.findByProviderIdAndProviderUserIdAndIdType(anyString(), anyString(), anyString())).thenReturn(null); when(mock_clientDetailsEntityCacheManager.retrieveByIdP(anyString())).thenReturn(testClient); - when(mock_orcidOauth2TokenDetailService.doesClientKnowUser(anyString(), anyString())).thenReturn(true); + when(mock_clientDetailsManagerReadOnly.doesClientKnowUser(clientId, userOrcid)).thenReturn(true); institutionalSignInManager.createUserConnectionAndNotify("idType", "remoteUserId", "displayName", "providerId", userOrcid, Collections. emptyMap()); @@ -122,7 +121,6 @@ public void testDontSendNotificationIfClientKnowUser() throws UnsupportedEncodin public void testDontSendNotificationIfIdPNotLinkedToClient() throws UnsupportedEncodingException { when(mock_userConnectionDao.findByProviderIdAndProviderUserIdAndIdType(anyString(), anyString(), anyString())).thenReturn(null); when(mock_clientDetailsEntityCacheManager.retrieveByIdP(anyString())).thenThrow(new IllegalArgumentException()); - when(mock_orcidOauth2TokenDetailService.doesClientKnowUser(anyString(), anyString())).thenReturn(false); institutionalSignInManager.createUserConnectionAndNotify("idType", "remoteUserId", "displayName", "providerId", userOrcid, Collections. emptyMap()); @@ -136,7 +134,6 @@ public void testDontPersistIfUserConnectionAlreadyExists() throws UnsupportedEnc ClientDetailsEntity testClient = new ClientDetailsEntity(clientId); when(mock_userConnectionDao.findByProviderIdAndProviderUserIdAndIdType(anyString(), anyString(), anyString())).thenReturn(new UserconnectionEntity()); when(mock_clientDetailsEntityCacheManager.retrieveByIdP(anyString())).thenReturn(testClient); - when(mock_orcidOauth2TokenDetailService.doesClientKnowUser(anyString(), anyString())).thenReturn(false); institutionalSignInManager.createUserConnectionAndNotify("idType", "remoteUserId", "displayName", "providerId", userOrcid, Collections. emptyMap()); @@ -149,7 +146,6 @@ public void testDontPersistIfUserConnectionAlreadyExists() throws UnsupportedEnc public void testDontPersistAndDontNotify() throws UnsupportedEncodingException { when(mock_userConnectionDao.findByProviderIdAndProviderUserIdAndIdType(anyString(), anyString(), anyString())).thenReturn(new UserconnectionEntity()); when(mock_clientDetailsEntityCacheManager.retrieveByIdP(anyString())).thenThrow(new IllegalArgumentException()); - when(mock_orcidOauth2TokenDetailService.doesClientKnowUser(anyString(), anyString())).thenReturn(true); institutionalSignInManager.createUserConnectionAndNotify("idType", "remoteUserId", "displayName", "providerId", userOrcid, Collections. emptyMap()); @@ -211,5 +207,4 @@ public void testCheckHeaders() throws IOException { assertEquals("myself@testshib.org", mismatch.getOriginalValue()); assertEquals("myself@testshib.org;someoneelse@testshib.org", mismatch.getCurrentValue()); } - } diff --git a/orcid-core/src/test/java/org/orcid/core/manager/NotificationManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/NotificationManagerTest.java index 0271780d64d..5750ec8afec 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/NotificationManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/NotificationManagerTest.java @@ -24,8 +24,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import org.junit.After; import org.junit.AfterClass; @@ -41,7 +41,7 @@ import org.orcid.core.api.OrcidApiConstants; import org.orcid.core.manager.impl.NotificationManagerImpl; import org.orcid.core.manager.read_only.EmailManagerReadOnly; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.jaxb.model.common_v2.Locale; import org.orcid.jaxb.model.common_v2.Source; import org.orcid.jaxb.model.notification.amended_v2.AmendedSection; @@ -52,14 +52,12 @@ import org.orcid.jaxb.model.notification_v2.NotificationType; import org.orcid.model.notification.institutional_sign_in_v2.NotificationInstitutionalConnection; import org.orcid.persistence.dao.ClientDetailsDao; -import org.orcid.persistence.dao.GenericDao; import org.orcid.persistence.dao.NotificationDao; import org.orcid.persistence.dao.ProfileDao; import org.orcid.persistence.dao.ProfileEventDao; import org.orcid.persistence.dao.impl.NotificationDaoImpl; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; import org.orcid.persistence.jpa.entities.NotificationEntity; -import org.orcid.persistence.jpa.entities.ProfileEventEntity; import org.orcid.persistence.jpa.entities.SourceEntity; import org.orcid.test.DBUnitTest; import org.orcid.test.OrcidJUnit4ClassRunner; @@ -89,9 +87,6 @@ public class NotificationManagerTest extends DBUnitTest { @Mock private NotificationDao mockNotificationDao; - @Mock - private OrcidOauth2TokenDetailService mockOrcidOauth2TokenDetailService; - @Mock private ProfileEntityCacheManager mockProfileEntityCacheManager; @@ -103,6 +98,9 @@ public class NotificationManagerTest extends DBUnitTest { @Mock private JpaJaxbNotificationAdapter mockNotificationAdapter; + + @Mock + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; @Resource private ProfileDao profileDao; @@ -148,9 +146,8 @@ public void initMocks() throws Exception { TargetProxyHelper.injectIntoProxy(notificationManager, "encryptionManager", encryptionManager); TargetProxyHelper.injectIntoProxy(notificationManager, "profileEventDao", profileEventDao); TargetProxyHelper.injectIntoProxy(notificationManager, "sourceManager", sourceManager); - TargetProxyHelper.injectIntoProxy(notificationManager, "orcidOauth2TokenDetailService", mockOrcidOauth2TokenDetailService); - - when(mockOrcidOauth2TokenDetailService.doesClientKnowUser(Matchers.anyString(), Matchers.anyString())).thenReturn(true); + TargetProxyHelper.injectIntoProxy(notificationManager, "clientDetailsManagerReadOnly", clientDetailsManagerReadOnly); + when(clientDetailsManagerReadOnly.doesClientKnowUser(anyString(), anyString())).thenReturn(false); } @After @@ -216,6 +213,7 @@ public void testFindPermissionsByOrcidAndClient() { public void filterActionedNotificationAlertsTest() { TargetProxyHelper.injectIntoProxy(notificationManager, "notificationDao", mockNotificationDao); when(mockNotificationDao.findByOricdAndId(Matchers.anyString(), Matchers.anyLong())).thenReturn(null); + when(clientDetailsManagerReadOnly.doesClientKnowUser("0000-0000-0000-0000", "some-orcid")).thenReturn(true); List notifications = IntStream.range(0, 10).mapToObj(new IntFunction () { @Override public Notification apply(int value) { diff --git a/orcid-core/src/test/java/org/orcid/core/manager/OrcidGenerationManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/OrcidGenerationManagerTest.java index b8ece29b573..31efd3a83e0 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/OrcidGenerationManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/OrcidGenerationManagerTest.java @@ -7,7 +7,7 @@ import java.util.HashSet; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.log4j.Logger; import org.junit.Rule; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/OrcidSearchManagerImplTest.java b/orcid-core/src/test/java/org/orcid/core/manager/OrcidSearchManagerImplTest.java index c44bed6d41b..8db8ef9f4b2 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/OrcidSearchManagerImplTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/OrcidSearchManagerImplTest.java @@ -9,7 +9,7 @@ import java.util.HashMap; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.solr.common.SolrDocument; import org.junit.After; @@ -22,6 +22,7 @@ import org.orcid.jaxb.model.message.OrcidMessage; import org.orcid.jaxb.model.search_v2.Search; import org.orcid.test.TargetProxyHelper; +import org.apache.hc.core5.http.ParseException; import org.orcid.core.solr.OrcidSolrResult; import org.orcid.core.solr.OrcidSolrResults; @@ -68,7 +69,7 @@ public void after() { } @Test - public void testFindOrcidIds() { + public void testFindOrcidIds() throws ParseException { when(mockOrcidSolrProfileClient.findByDocumentCriteria(any())).thenReturn(multipleResultsForQuery()); Search search = orcidSearchManager.findOrcidIds(new HashMap<>()); assertNotNull(search); @@ -79,7 +80,7 @@ public void testFindOrcidIds() { } @Test - public void testFindOrcidIdsNoResults() { + public void testFindOrcidIdsNoResults() throws ParseException { when(mockOrcidSolrProfileClient.findByDocumentCriteria(any())).thenReturn(new OrcidSolrResults()); Search search = orcidSearchManager.findOrcidIds(new HashMap<>()); assertNotNull(search); diff --git a/orcid-core/src/test/java/org/orcid/core/manager/OrcidSecurityManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/OrcidSecurityManagerTest.java index 240163053b0..4a55837d264 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/OrcidSecurityManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/OrcidSecurityManagerTest.java @@ -5,8 +5,8 @@ import java.util.Calendar; import java.util.Date; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/OrcidSecurityManagerTestBase.java b/orcid-core/src/test/java/org/orcid/core/manager/OrcidSecurityManagerTestBase.java index a7c435e0b85..b025cdc3f91 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/OrcidSecurityManagerTestBase.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/OrcidSecurityManagerTestBase.java @@ -8,7 +8,7 @@ import java.util.GregorianCalendar; import java.util.Random; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/OrgDisambiguatedManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/OrgDisambiguatedManagerTest.java index 3949f2e1ca8..d5abc41bf28 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/OrgDisambiguatedManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/OrgDisambiguatedManagerTest.java @@ -10,7 +10,7 @@ import java.util.HashSet; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/OrgManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/OrgManagerTest.java index 1c544871973..bac9a86fb4f 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/OrgManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/OrgManagerTest.java @@ -10,7 +10,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.io.IOUtils; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/OtherNameManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/OtherNameManagerTest.java index 02506cae64c..41973359623 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/OtherNameManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/OtherNameManagerTest.java @@ -12,7 +12,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/PeerReviewManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/PeerReviewManagerTest.java index adb8b4c3592..b11c63c672b 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/PeerReviewManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/PeerReviewManagerTest.java @@ -14,7 +14,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/PersonDetailsManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/PersonDetailsManagerTest.java index 0026d89a7a1..ec6d8e00497 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/PersonDetailsManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/PersonDetailsManagerTest.java @@ -8,7 +8,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/PersonalDetailsManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/PersonalDetailsManagerTest.java index 9eeb1f43278..d1c02fa3d1d 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/PersonalDetailsManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/PersonalDetailsManagerTest.java @@ -10,7 +10,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/ProfileFundingManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/ProfileFundingManagerTest.java index 13650551506..c7de64167fa 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/ProfileFundingManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/ProfileFundingManagerTest.java @@ -14,7 +14,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/ProfileKeywordManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/ProfileKeywordManagerTest.java index 28dfdfeb027..30b0fe6e8c2 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/ProfileKeywordManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/ProfileKeywordManagerTest.java @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/RecordCorrectionsManagerReadOnlyTest.java b/orcid-core/src/test/java/org/orcid/core/manager/RecordCorrectionsManagerReadOnlyTest.java index 641830951bd..55f6a30c4db 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/RecordCorrectionsManagerReadOnlyTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/RecordCorrectionsManagerReadOnlyTest.java @@ -13,7 +13,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Before; import org.junit.Test; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/RecordManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/RecordManagerTest.java index 8feb18f9245..3dddce90886 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/RecordManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/RecordManagerTest.java @@ -7,7 +7,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/RecordNameManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/RecordNameManagerTest.java index 36aa6463af0..743a0f73a34 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/RecordNameManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/RecordNameManagerTest.java @@ -8,7 +8,7 @@ import java.util.Arrays; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/ResearcherUrlManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/ResearcherUrlManagerTest.java index 4b9d9bf0738..871653c8ee7 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/ResearcherUrlManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/ResearcherUrlManagerTest.java @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/SourceNameCacheManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/SourceNameCacheManagerTest.java index 74c6b50ee38..ae921e6932b 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/SourceNameCacheManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/SourceNameCacheManagerTest.java @@ -9,7 +9,7 @@ import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/TemplateManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/TemplateManagerTest.java index 2b21ae373b3..43698feafb1 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/TemplateManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/TemplateManagerTest.java @@ -10,7 +10,7 @@ import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.io.IOUtils; import org.junit.Test; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/WorkManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/WorkManagerTest.java index 99ab4226e39..7fd6609dcdc 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/WorkManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/WorkManagerTest.java @@ -19,7 +19,7 @@ import java.util.GregorianCalendar; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/impl/BibtexManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/impl/BibtexManagerTest.java index fdf786defef..d56ff1c752a 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/impl/BibtexManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/impl/BibtexManagerTest.java @@ -5,7 +5,7 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Assert; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/impl/OrcidUrlManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/impl/OrcidUrlManagerTest.java index 67c49744cb3..18e3eff1419 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/impl/OrcidUrlManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/impl/OrcidUrlManagerTest.java @@ -6,9 +6,9 @@ import java.net.URI; import java.net.URISyntaxException; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/impl/PasswordGenerationManagerImplTest.java b/orcid-core/src/test/java/org/orcid/core/manager/impl/PasswordGenerationManagerImplTest.java index c3aad075a76..549f09c0711 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/impl/PasswordGenerationManagerImplTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/impl/PasswordGenerationManagerImplTest.java @@ -6,7 +6,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/impl/ProfileEntityManagerImplTest.java b/orcid-core/src/test/java/org/orcid/core/manager/impl/ProfileEntityManagerImplTest.java index 90065a85469..29014e0e7f9 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/impl/ProfileEntityManagerImplTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/impl/ProfileEntityManagerImplTest.java @@ -6,7 +6,7 @@ import java.util.Arrays; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -17,7 +17,6 @@ import org.orcid.core.manager.ProfileEntityManager; import org.orcid.core.manager.RecordNameManager; import org.orcid.core.manager.read_only.EmailManagerReadOnly; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.persistence.dao.UserConnectionDao; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.orcid.test.DBUnitTest; @@ -33,9 +32,6 @@ public class ProfileEntityManagerImplTest extends DBUnitTest { private static final String CLIENT_ID_1 = "APP-5555555555555555"; private static final String USER_ORCID = "0000-0000-0000-0001"; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - @Resource private ProfileEntityManager profileEntityManager; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/impl/RegistrationManagerImplTest.java b/orcid-core/src/test/java/org/orcid/core/manager/impl/RegistrationManagerImplTest.java index 89b4b6768ed..ea971c18236 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/impl/RegistrationManagerImplTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/impl/RegistrationManagerImplTest.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; @@ -53,7 +53,6 @@ import org.orcid.test.OrcidJUnit4ClassRunner; import org.orcid.test.TargetProxyHelper; import org.orcid.utils.OrcidStringUtils; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; import org.springframework.test.context.ContextConfiguration; @RunWith(OrcidJUnit4ClassRunner.class) @@ -181,7 +180,7 @@ public void testCreateMinimalRegistrationWithExistingClaimedEmail() { try { registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); fail(); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { assertEquals("Unable to register user due: Email " + email + " already exists and is claimed, so, it can't be used again", e.getMessage()); } catch(Exception e) { fail(); @@ -192,7 +191,7 @@ public void testCreateMinimalRegistrationWithExistingClaimedEmail() { try { registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); fail(); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { assertEquals("Unable to register user due: Email " + email.toLowerCase() + " already exists and is claimed, so, it can't be used again", e.getMessage()); } catch(Exception e) { fail(); @@ -204,7 +203,7 @@ public void testCreateMinimalRegistrationWithExistingClaimedEmail() { try { registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); fail(); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { assertEquals("Unable to register user due: Email " + spacedEmail + " already exists and is claimed, so, it can't be used again", e.getMessage()); } catch(Exception e) { fail(); @@ -230,7 +229,7 @@ public void testCreateMinimalRegistrationWithExistingClaimedEmailAdditional() { try { registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); fail(); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { assertEquals("Unable to register user due: Email " + email + " already exists and is claimed, so, it can't be used again", e.getMessage()); } catch(Exception e) { fail(); @@ -248,7 +247,7 @@ public void testCreateMinimalRegistrationWithExistingUnclaimedEmailNotAutoDeprec entity.setClaimed(false); entity.setSource(new SourceEntity(new ClientDetailsEntity(CLIENT_ID_AUTODEPRECATE_DISABLED))); profileDao.merge(entity); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { fail(); } catch(Exception e) { fail(); @@ -258,7 +257,7 @@ public void testCreateMinimalRegistrationWithExistingUnclaimedEmailNotAutoDeprec Registration form = createRegistrationForm(email, true); registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); fail(); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { assertEquals("Unable to register user due: Autodeprecate is not enabled for " + email, e.getMessage()); } catch(Exception e) { fail(); @@ -278,7 +277,7 @@ public void testCreateMinimalRegistrationWithExistingUnclaimedEmailAdditionalNot entity.setClaimed(false); entity.setSource(new SourceEntity(new ClientDetailsEntity(CLIENT_ID_AUTODEPRECATE_DISABLED))); profileDao.merge(entity); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { fail(); } catch(Exception e) { fail(); @@ -293,7 +292,7 @@ public void testCreateMinimalRegistrationWithExistingUnclaimedEmailAdditionalNot Registration form = createRegistrationFormMultipleEmails(email2, emailsAdditionalList, true); registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); fail(); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { assertEquals("Unable to register user due: Autodeprecate is not enabled for " + email, e.getMessage()); } catch(Exception e) { fail(); @@ -313,7 +312,7 @@ public void testCreateMinimalRegistrationWithExistingEmailThatCanBeAutoDeprecate entity.setClaimed(false); entity.setSource(new SourceEntity(new ClientDetailsEntity(CLIENT_ID_AUTODEPRECATE_ENABLED))); profileDao.merge(entity); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { fail(); } catch(Exception e) { fail(); @@ -347,7 +346,7 @@ public void testCreateMinimalRegistrationWithExistingEmailAdditionalThatCanBeAut entity.setClaimed(false); entity.setSource(new SourceEntity(new ClientDetailsEntity(CLIENT_ID_AUTODEPRECATE_ENABLED))); profileDao.merge(entity); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { fail(); } catch(Exception e) { fail(); @@ -389,7 +388,7 @@ public void testCreateMinimalRegistrationWithExistingTwoEmailsAdditionalThatCanB entity.setClaimed(false); entity.setSource(new SourceEntity(new ClientDetailsEntity(CLIENT_ID_AUTODEPRECATE_ENABLED))); profileDao.merge(entity); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { fail(); } catch(Exception e) { fail(); @@ -411,7 +410,7 @@ public void testCreateMinimalRegistrationWithExistingTwoEmailsAdditionalThatCanB entity.setClaimed(false); entity.setSource(new SourceEntity(new ClientDetailsEntity(CLIENT_ID_AUTODEPRECATE_ENABLED))); profileDao.merge(entity); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { fail(); } catch(Exception e) { fail(); @@ -433,7 +432,7 @@ public void testCreateMinimalRegistrationWithExistingTwoEmailsAdditionalThatCanB Registration form = createRegistrationFormMultipleEmails(email3, emailsAdditionalList, true); registrationManager.createMinimalRegistration(form, true, java.util.Locale.ENGLISH, "0.0.0.0"); fail(); - } catch(InvalidRequestException e) { + } catch(IllegalArgumentException e) { assertEquals("Unable to register user due: More than 2 duplicate emails", e.getMessage()); } catch(Exception e) { fail(); diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/ActivitiesSummaryManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/ActivitiesSummaryManagerTest.java index 2391b89049c..d698e953c02 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/ActivitiesSummaryManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/ActivitiesSummaryManagerTest.java @@ -7,7 +7,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/AddressManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/AddressManagerTest.java index acaa5d6a0ad..d360a2cdfa6 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/AddressManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/AddressManagerTest.java @@ -12,7 +12,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/AffiliationsManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/AffiliationsManagerTest.java index 0b5bb9bbff6..20f96d43ad1 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/AffiliationsManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/AffiliationsManagerTest.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/BiographyManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/BiographyManagerTest.java index 4ad87b298a0..11da0656e1e 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/BiographyManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/BiographyManagerTest.java @@ -9,7 +9,7 @@ import java.util.Arrays; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/ClientManagerReadOnlyTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/ClientManagerReadOnlyTest.java index 85f52aed456..14a6272e646 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/ClientManagerReadOnlyTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/ClientManagerReadOnlyTest.java @@ -14,7 +14,7 @@ import java.util.SortedSet; import java.util.TreeSet; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang.RandomStringUtils; import org.junit.After; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/ClientManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/ClientManagerTest.java index df59c3c685b..b0bfd783f3f 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/ClientManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/ClientManagerTest.java @@ -17,8 +17,8 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.apache.commons.lang.RandomStringUtils; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/EmailManagerReadOnlyTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/EmailManagerReadOnlyTest.java index 37947008c9c..ad398334373 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/EmailManagerReadOnlyTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/EmailManagerReadOnlyTest.java @@ -12,8 +12,8 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/EmailManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/EmailManagerTest.java index dec3608db4b..fda198f884b 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/EmailManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/EmailManagerTest.java @@ -20,8 +20,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import javax.xml.datatype.XMLGregorianCalendar; import org.apache.commons.lang.RandomStringUtils; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/ExternalIdentifierManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/ExternalIdentifierManagerTest.java index c61cfb149a0..a8f5509e253 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/ExternalIdentifierManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/ExternalIdentifierManagerTest.java @@ -13,7 +13,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/FindMyStuffManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/FindMyStuffManagerTest.java index 1971f89f8c9..278a100b27a 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/FindMyStuffManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/FindMyStuffManagerTest.java @@ -9,7 +9,7 @@ import java.util.List; import java.util.SortedSet; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Before; import org.junit.Test; @@ -21,7 +21,7 @@ import org.orcid.core.manager.ClientDetailsEntityCacheManager; import org.orcid.core.manager.impl.OrcidUrlManager; import org.orcid.core.manager.v3.read_only.WorkManagerReadOnly; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.core.utils.v3.identifiers.finders.DataciteFinder; import org.orcid.core.utils.v3.identifiers.finders.Finder; import org.orcid.jaxb.model.clientgroup.RedirectUriType; @@ -62,9 +62,6 @@ public class FindMyStuffManagerTest extends DBUnitTest{ @Mock private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - @Mock - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - @Resource(name = "jpaJaxbNotificationAdapterV3") private JpaJaxbNotificationAdapter notificationAdapter; @@ -73,6 +70,9 @@ public class FindMyStuffManagerTest extends DBUnitTest{ @Mock private DataciteFinder dataciteFinder; + + @Mock + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; @Resource List finders = new ArrayList(); @@ -86,8 +86,9 @@ public void initMocks() throws Exception { TargetProxyHelper.injectIntoProxy(findMyStuffManager, "workManagerReadOnly", workManagerReadOnly); TargetProxyHelper.injectIntoProxy(findMyStuffManager, "notificationManager", notificationManager); TargetProxyHelper.injectIntoProxy(findMyStuffManager, "clientDetailsEntityCacheManager", clientDetailsEntityCacheManager); - TargetProxyHelper.injectIntoProxy(findMyStuffManager, "orcidOauth2TokenDetailService", orcidOauth2TokenDetailService); TargetProxyHelper.injectIntoProxy(findMyStuffManager, "findMyStuffHistoryDao", findMyStuffHistoryDao); + TargetProxyHelper.injectIntoProxy(findMyStuffManager, "clientDetailsManagerReadOnly", clientDetailsManagerReadOnly); + when(clientDetailsManagerReadOnly.doesClientKnowUser(Matchers.anyString(), Matchers.anyString())).thenReturn(false); //Finder mock List f = Lists.newArrayList(); @@ -122,7 +123,6 @@ public void initMocks() throws Exception { @Test public void testFindIfAppropriate(){ //new user - when(orcidOauth2TokenDetailService.doesClientKnowUser(Matchers.anyString(), Matchers.anyString())).thenReturn(false); when(workManagerReadOnly.getAllExternalIDs(Matchers.contains(""))).thenReturn(new ExternalIDs()); when(findMyStuffHistoryDao.findAll(Matchers.contains(""))).thenReturn(new ArrayList()); @@ -136,12 +136,10 @@ public void testFindIfAppropriate(){ //check history persisted verify(findMyStuffHistoryDao, times(1)).persist(Matchers.any()); //check notification created - } @Test public void testFindIfAppropriateExistingHistory(){ - when(orcidOauth2TokenDetailService.doesClientKnowUser(Matchers.anyString(), Matchers.anyString())).thenReturn(false); when(workManagerReadOnly.getAllExternalIDs(Matchers.contains(""))).thenReturn(new ExternalIDs()); //optedOut FindMyStuffHistoryEntity e = new FindMyStuffHistoryEntity(); @@ -160,7 +158,6 @@ public void testFindIfAppropriateExistingHistory(){ @Test public void testFindIfAppropriateOptedOut(){ - when(orcidOauth2TokenDetailService.doesClientKnowUser(Matchers.anyString(), Matchers.anyString())).thenReturn(false); when(workManagerReadOnly.getAllExternalIDs(Matchers.contains(""))).thenReturn(new ExternalIDs()); //optedOut FindMyStuffHistoryEntity e = new FindMyStuffHistoryEntity(); @@ -181,7 +178,6 @@ public void testFindIfAppropriateOptedOut(){ @Test public void testFindIfAppropriateExistingWorks(){ - when(orcidOauth2TokenDetailService.doesClientKnowUser(Matchers.anyString(), Matchers.anyString())).thenReturn(false); //user with existing works ExternalID id = new ExternalID(); ExternalIDs ids = new ExternalIDs(); @@ -199,9 +195,9 @@ public void testFindIfAppropriateExistingWorks(){ @Test public void testFindIfAppropriateExistingPerms(){ //user with existing permissions - when(orcidOauth2TokenDetailService.doesClientKnowUser(Matchers.anyString(), Matchers.anyString())).thenReturn(true); when(workManagerReadOnly.getAllExternalIDs(Matchers.contains(""))).thenReturn(new ExternalIDs()); when(findMyStuffHistoryDao.findAll(Matchers.contains(""))).thenReturn(new ArrayList()); + when(clientDetailsManagerReadOnly.doesClientKnowUser("x", "0000-0000-0000-0000")).thenReturn(true); findMyStuffManager.findIfAppropriate("0000-0000-0000-0000"); //check finder not invoked @@ -217,7 +213,6 @@ public void testFindIfAppropriateExistingPerms(){ @Test public void testFindIfAppropriateExistingNotifications(){ //new user - when(orcidOauth2TokenDetailService.doesClientKnowUser(Matchers.anyString(), Matchers.anyString())).thenReturn(false); when(workManagerReadOnly.getAllExternalIDs(Matchers.contains(""))).thenReturn(new ExternalIDs()); when(findMyStuffHistoryDao.findAll(Matchers.contains(""))).thenReturn(new ArrayList()); NotificationFindMyStuff n = new NotificationFindMyStuff(); diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/GivenPermissionToManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/GivenPermissionToManagerTest.java index 6883ee89e8e..900dc6a1c4d 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/GivenPermissionToManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/GivenPermissionToManagerTest.java @@ -11,7 +11,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/GroupIdRecordManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/GroupIdRecordManagerTest.java index 837cefcb512..582ec6d00e9 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/GroupIdRecordManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/GroupIdRecordManagerTest.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Optional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/MembersManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/MembersManagerTest.java index 43db8f97854..e2312292bb0 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/MembersManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/MembersManagerTest.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManagerTest.java index 21e71b25680..355bab9ddb9 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManagerTest.java @@ -14,7 +14,7 @@ import org.orcid.core.manager.EncryptionManager; import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.core.manager.v3.impl.NotificationManagerImpl; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.jaxb.model.common.AvailableLocales; import org.orcid.jaxb.model.v3.release.common.Source; import org.orcid.jaxb.model.v3.release.notification.Notification; @@ -37,8 +37,8 @@ import org.springframework.test.util.ReflectionTestUtils; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import java.io.IOException; import java.net.URISyntaxException; import java.util.*; @@ -69,9 +69,6 @@ public class NotificationManagerTest extends DBUnitTest { @Mock private NotificationDao mockNotificationDao; - @Mock - private OrcidOauth2TokenDetailService mockOrcidOauth2TokenDetailService; - @Mock private ProfileEntityCacheManager mockProfileEntityCacheManager; @@ -84,6 +81,9 @@ public class NotificationManagerTest extends DBUnitTest { @Mock private JpaJaxbNotificationAdapter mockNotificationAdapter; + @Mock + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; + @Resource(name = "profileDao") private ProfileDao profileDao; @@ -128,13 +128,13 @@ public void initMocks() throws Exception { TargetProxyHelper.injectIntoProxy(notificationManager, "encryptionManager", encryptionManager); TargetProxyHelper.injectIntoProxy(notificationManager, "profileEventDao", profileEventDao); TargetProxyHelper.injectIntoProxy(notificationManager, "sourceManager", mockSourceManager); - TargetProxyHelper.injectIntoProxy(notificationManager, "orcidOauth2TokenDetailService", mockOrcidOauth2TokenDetailService); TargetProxyHelper.injectIntoProxy(notificationManager, "profileEntityCacheManager", mockProfileEntityCacheManager); TargetProxyHelper.injectIntoProxy(notificationManager, "emailManager", mockEmailManager); TargetProxyHelper.injectIntoProxy(notificationManager, "profileDao", mockProfileDao); TargetProxyHelper.injectIntoProxy(notificationManager, "notificationDao", mockNotificationDao); TargetProxyHelper.injectIntoProxy(notificationManager, "notificationAdapter", mockNotificationAdapter); - when(mockOrcidOauth2TokenDetailService.doesClientKnowUser(Matchers.anyString(), Matchers.anyString())).thenReturn(true); + TargetProxyHelper.injectIntoProxy(notificationManager, "clientDetailsManagerReadOnly", clientDetailsManagerReadOnly); + when(clientDetailsManagerReadOnly.doesClientKnowUser(anyString(), anyString())).thenReturn(false); } @After @@ -292,6 +292,7 @@ public void testFindPermissionsByOrcidAndClient() { public void filterActionedNotificationAlertsTest() { TargetProxyHelper.injectIntoProxy(notificationManager, "notificationDao", mockNotificationDao); when(mockNotificationDao.findByOricdAndId(Matchers.anyString(), Matchers.anyLong())).thenReturn(null); + when(clientDetailsManagerReadOnly.doesClientKnowUser("0000-0000-0000-0000", "some-orcid")).thenReturn(true); List notifications = IntStream.range(0, 10).mapToObj(new IntFunction() { @Override public Notification apply(int value) { diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManager_autoArchiveOffsetTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManager_autoArchiveOffsetTest.java index 1a28ed46e43..2b6572cffe3 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManager_autoArchiveOffsetTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManager_autoArchiveOffsetTest.java @@ -6,7 +6,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManager_autoDeleteOffsetTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManager_autoDeleteOffsetTest.java index f2cd71d2643..bb66435eac7 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManager_autoDeleteOffsetTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/NotificationManager_autoDeleteOffsetTest.java @@ -9,7 +9,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSearchManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSearchManagerTest.java index 86ebd74eed9..1f016c4e207 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSearchManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSearchManagerTest.java @@ -9,8 +9,9 @@ import java.util.HashMap; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; +import org.apache.hc.core5.http.ParseException; import org.apache.solr.common.SolrDocument; import org.junit.After; import org.junit.Before; @@ -73,7 +74,7 @@ public void after() { } @Test - public void testFindOrcidIds() { + public void testFindOrcidIds() throws ParseException { when(mockOrcidSolrProfileClient.findByDocumentCriteria(any())).thenReturn(multipleResultsForQuery()); Search search = orcidSearchManager.findOrcidIds(new HashMap<>()); assertNotNull(search); @@ -84,7 +85,7 @@ public void testFindOrcidIds() { } @Test - public void testFindOrcidIdsNoResults() { + public void testFindOrcidIdsNoResults() throws ParseException { when(mockOrcidSolrProfileClient.findByDocumentCriteria(any())).thenReturn(new OrcidSolrResults()); Search search = orcidSearchManager.findOrcidIds(new HashMap<>()); assertNotNull(search); @@ -93,7 +94,7 @@ public void testFindOrcidIdsNoResults() { } @Test - public void orcidMultipleOrcidsIndexed() { + public void orcidMultipleOrcidsIndexed() throws ParseException { when(mockOrcidSolrProfileClient.findByDocumentCriteria("rndQuery", 0, 0)).thenReturn(multipleResultsForQuery()); Search search = orcidSearchManager.findOrcidsByQuery("rndQuery", 0, 0); assertNotNull(search); @@ -108,7 +109,7 @@ public void orcidMultipleOrcidsIndexed() { } @Test - public void allFineTest() { + public void allFineTest() throws ParseException { when(mockOrcidSolrProfileClient.findByDocumentCriteria("rndQuery", 0, 0)).thenReturn(invalidRecordSearchResult()); Search search = orcidSearchManager.findOrcidsByQuery("rndQuery", 0, 0); @@ -118,7 +119,7 @@ public void allFineTest() { } @Test - public void numFoundTest() { + public void numFoundTest() throws ParseException { OrcidSolrResults osr = multipleResultsForQuery(); osr.setNumFound(500); when(mockOrcidSolrProfileClient.findByDocumentCriteria("rndQuery", 0, 0)).thenReturn(osr); diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSecurityManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSecurityManagerTest.java index 0ed846142a0..b0df50a4d8f 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSecurityManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSecurityManagerTest.java @@ -5,8 +5,8 @@ import java.util.Calendar; import java.util.Date; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.junit.After; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSecurityManagerTestBase.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSecurityManagerTestBase.java index 20b506ecf55..76c5ff57cb4 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSecurityManagerTestBase.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/OrcidSecurityManagerTestBase.java @@ -8,7 +8,7 @@ import java.util.GregorianCalendar; import java.util.Random; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/OrgManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/OrgManagerTest.java index b8e10a94862..6eb3b4d1a5a 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/OrgManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/OrgManagerTest.java @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.io.IOUtils; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/OtherNameManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/OtherNameManagerTest.java index 1ea7602439d..2af3d4bd1f6 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/OtherNameManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/OtherNameManagerTest.java @@ -12,7 +12,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/PeerReviewManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/PeerReviewManagerTest.java index 17bd0855caf..e1835d82788 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/PeerReviewManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/PeerReviewManagerTest.java @@ -15,7 +15,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/PersonDetailsManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/PersonDetailsManagerTest.java index 0a88608dcde..71cacd5df8f 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/PersonDetailsManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/PersonDetailsManagerTest.java @@ -8,7 +8,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/PersonalDetailsManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/PersonalDetailsManagerTest.java index 246f0d09a6e..4169a4d9459 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/PersonalDetailsManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/PersonalDetailsManagerTest.java @@ -10,7 +10,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/ProfileFundingManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/ProfileFundingManagerTest.java index 27da969c320..0de4e7af626 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/ProfileFundingManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/ProfileFundingManagerTest.java @@ -14,7 +14,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/ProfileKeywordManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/ProfileKeywordManagerTest.java index d540160eeb8..41798f2781f 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/ProfileKeywordManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/ProfileKeywordManagerTest.java @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/RecordManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/RecordManagerTest.java index c4d74779dee..386f9417e5a 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/RecordManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/RecordManagerTest.java @@ -7,7 +7,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/RecordNameManagerV3Test.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/RecordNameManagerV3Test.java index 7355081e28e..cafdf268a1e 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/RecordNameManagerV3Test.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/RecordNameManagerV3Test.java @@ -8,7 +8,7 @@ import java.util.Arrays; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/ResearchResourceManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/ResearchResourceManagerTest.java index d09529617c6..99f52c74c02 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/ResearchResourceManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/ResearchResourceManagerTest.java @@ -10,7 +10,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; @@ -251,7 +251,7 @@ public void testUpdate(){ assertEquals("changedResourceName",r4.getResourceItems().get(0).getResourceName()); } - @Test(expected = javax.persistence.NoResultException.class) + @Test(expected = jakarta.persistence.NoResultException.class) public void testDelete(){ when(mockSourceManager.retrieveActiveSource()).thenReturn(Source.forClient(CLIENT_1_ID)); ResearchResource rr1 = researchResourceManager.createResearchResource(USER_ORCID, generateResearchResource("title6","id6"), true); diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/ResearcherUrlManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/ResearcherUrlManagerTest.java index 63e9be3c9e9..4ec4ce6282d 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/ResearcherUrlManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/ResearcherUrlManagerTest.java @@ -12,7 +12,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/SpamManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/SpamManagerTest.java index fbc1c2ffbfd..75b85d34321 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/SpamManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/SpamManagerTest.java @@ -7,7 +7,7 @@ import java.util.Arrays; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/WorkManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/WorkManagerTest.java index 660a28f9bcb..dfeb400176c 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/WorkManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/WorkManagerTest.java @@ -23,7 +23,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/BibtexManagerTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/BibtexManagerTest.java index 5f573fba496..de2adc2b5c6 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/BibtexManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/BibtexManagerTest.java @@ -5,7 +5,7 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Assert; import org.junit.Before; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/OrcidSearchManagerImplTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/OrcidSearchManagerImplTest.java index 93e3199ddec..eb039dc41ce 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/OrcidSearchManagerImplTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/OrcidSearchManagerImplTest.java @@ -10,8 +10,9 @@ import java.util.HashMap; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; +import org.apache.hc.core5.http.ParseException; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -59,7 +60,7 @@ public void after() { } @Test - public void testFindOrcidIds() { + public void testFindOrcidIds() throws ParseException { when(mockOrcidSolrProfileClient.findByDocumentCriteria(any())).thenReturn(multipleResultsForQuery()); Search search = orcidSearchManager.findOrcidIds(new HashMap<>()); assertNotNull(search); @@ -128,7 +129,7 @@ public void testExpandedSearch() { } @Test - public void testFindOrcidIdsNoResults() { + public void testFindOrcidIdsNoResults() throws ParseException { when(mockOrcidSolrProfileClient.findByDocumentCriteria(any())).thenReturn(new OrcidSolrResults()); Search search = orcidSearchManager.findOrcidIds(new HashMap<>()); assertNotNull(search); diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/ProfileEntityManagerImplTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/ProfileEntityManagerImplTest.java index 0b07089fc66..e862dd1c46d 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/ProfileEntityManagerImplTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/impl/ProfileEntityManagerImplTest.java @@ -23,7 +23,6 @@ import org.orcid.core.manager.v3.ProfileKeywordManager; import org.orcid.core.manager.v3.RecordNameManager; import org.orcid.core.manager.v3.ResearcherUrlManager; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.profile.history.ProfileHistoryEventType; import org.orcid.jaxb.model.common.AvailableLocales; import org.orcid.jaxb.model.message.ScopePathType; @@ -57,7 +56,7 @@ import org.springframework.test.util.ReflectionTestUtils; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -78,9 +77,6 @@ public class ProfileEntityManagerImplTest extends DBUnitTest { private static final String CLIENT_ID_2 = "APP-5555555555555556"; private static final String USER_ORCID = "0000-0000-0000-0001"; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - @Resource(name = "profileEntityManagerV3") private ProfileEntityManager profileEntityManager; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/validator/ActivityValidatorTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/validator/ActivityValidatorTest.java index 5dc18f849b0..3641ed26402 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/validator/ActivityValidatorTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/validator/ActivityValidatorTest.java @@ -7,7 +7,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/v3/validator/ExternalIDValidatorTest.java b/orcid-core/src/test/java/org/orcid/core/manager/v3/validator/ExternalIDValidatorTest.java index b6ec4deb186..7423795fb04 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/v3/validator/ExternalIDValidatorTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/v3/validator/ExternalIDValidatorTest.java @@ -2,7 +2,7 @@ import static org.junit.Assert.fail; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/validator/ActivityValidatorTest.java b/orcid-core/src/test/java/org/orcid/core/manager/validator/ActivityValidatorTest.java index a8f961b90b4..4aa678ceef5 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/validator/ActivityValidatorTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/validator/ActivityValidatorTest.java @@ -7,7 +7,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/manager/validator/ExternalIDValidatorTest.java b/orcid-core/src/test/java/org/orcid/core/manager/validator/ExternalIDValidatorTest.java index c8f3937d988..4e71d7536f1 100644 --- a/orcid-core/src/test/java/org/orcid/core/manager/validator/ExternalIDValidatorTest.java +++ b/orcid-core/src/test/java/org/orcid/core/manager/validator/ExternalIDValidatorTest.java @@ -2,7 +2,7 @@ import static org.junit.Assert.fail; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Before; import org.junit.Test; diff --git a/orcid-core/src/test/java/org/orcid/core/model/RecordSummaryMarshallingTest.java b/orcid-core/src/test/java/org/orcid/core/model/RecordSummaryMarshallingTest.java index d55d341835b..5d3ce48938d 100644 --- a/orcid-core/src/test/java/org/orcid/core/model/RecordSummaryMarshallingTest.java +++ b/orcid-core/src/test/java/org/orcid/core/model/RecordSummaryMarshallingTest.java @@ -7,9 +7,9 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; import org.apache.commons.io.IOUtils; import org.junit.Test; diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/IETFExchangeTokenGranterTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/IETFExchangeTokenGranterTest.java deleted file mode 100644 index 11293d1b3b3..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/oauth/IETFExchangeTokenGranterTest.java +++ /dev/null @@ -1,440 +0,0 @@ -package org.orcid.core.oauth; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.security.NoSuchAlgorithmException; -import java.text.ParseException; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.constants.RevokeReason; -import org.orcid.core.exception.ClientDeactivatedException; -import org.orcid.core.exception.LockedException; -import org.orcid.core.exception.OrcidInvalidScopeException; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.ProfileEntityManager; -import org.orcid.core.oauth.openid.OpenIDConnectKeyService; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator; -import org.orcid.persistence.dao.MemberOBOWhitelistedClientDao; -import org.orcid.persistence.dao.ProfileDao; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.MemberOBOWhitelistedClientEntity; -import org.orcid.persistence.jpa.entities.OrcidGrantedAuthority; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.test.TargetProxyHelper; -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; -import org.springframework.security.oauth2.provider.TokenRequest; - -import com.nimbusds.jose.JOSEException; -import com.nimbusds.jwt.JWTClaimsSet; -import com.nimbusds.jwt.JWTClaimsSet.Builder; - -public class IETFExchangeTokenGranterTest { - - private static final String GRANT_TYPE = OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE; - - private static final String ORCID = "0000-0000-0000-0000"; - - private static final String AUDIENCE_CLIENT_ID = "AUD_CLIENT"; - - private static final String ACTIVE_CLIENT_ID = "ACTIVE"; - - @Mock - private OrcidRandomValueTokenServices tokenServicesMock; - - @Mock - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManagerMock; - - @Mock - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidatorMock; - - @Mock - private OpenIDConnectKeyService openIDConnectKeyServiceMock; - - @Mock - private ClientDetailsEntity activeClientMock; - - @Mock - private MemberOBOWhitelistedClientDao memberOBOWhitelistedClientDaoMock; - - @Mock - private OrcidOauth2TokenDetailService orcidOauthTokenDetailServiceMock; - - @Mock - private ProfileEntityManager profileEntityManagerMock; - - @Mock - private ProfileDao profileDaoMock; - - private IETFExchangeTokenGranter tokenGranter; - - @Before - public void before() { - MockitoAnnotations.initMocks(this); - - ClientDetailsEntity lockedClient = new ClientDetailsEntity("LOCKED"); - ClientDetailsEntity deactivatedClient = new ClientDetailsEntity("DEACTIVATED"); - - when(activeClientMock.getId()).thenReturn(ACTIVE_CLIENT_ID); - when(activeClientMock.getClientId()).thenReturn(ACTIVE_CLIENT_ID); - when(activeClientMock.getAuthorizedGrantTypes()).thenReturn(Set.of(OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE)); - - // For sake of testing, ACTIVE and AUD_CLIENT could be the same mock - when(clientDetailsEntityCacheManagerMock.retrieve(ACTIVE_CLIENT_ID)).thenReturn(activeClientMock); - when(clientDetailsEntityCacheManagerMock.retrieve(AUDIENCE_CLIENT_ID)).thenReturn(activeClientMock); - - when(clientDetailsEntityCacheManagerMock.retrieve("LOCKED")).thenReturn(lockedClient); - when(clientDetailsEntityCacheManagerMock.retrieve("DEACTIVATED")).thenReturn(deactivatedClient); - - doThrow(LockedException.class).when(orcidOAuth2RequestValidatorMock).validateClientIsEnabled(eq(lockedClient)); - doThrow(ClientDeactivatedException.class).when(orcidOAuth2RequestValidatorMock).validateClientIsEnabled(eq(deactivatedClient)); - - when(openIDConnectKeyServiceMock.verify(any())).thenReturn(true); - - ClientDetailsEntity oboClient = new ClientDetailsEntity(AUDIENCE_CLIENT_ID); - MemberOBOWhitelistedClientEntity e = new MemberOBOWhitelistedClientEntity(); - e.setWhitelistedClientDetailsEntity(oboClient); - - List oboClients = List.of(e); - - when(memberOBOWhitelistedClientDaoMock.getWhitelistForClient(ACTIVE_CLIENT_ID)).thenReturn(oboClients); - - OrcidOauth2TokenDetail token1 = getOrcidOauth2TokenDetail(true, "/read-limited", System.currentTimeMillis() + 60000, false); - - when(orcidOauthTokenDetailServiceMock.findByClientIdAndUserName(any(), any())).thenReturn(List.of(token1)); - - ProfileEntity profile = new ProfileEntity(ORCID); - when(profileEntityManagerMock.findByOrcid(eq(ORCID))).thenReturn(profile); - - OrcidGrantedAuthority oga = new OrcidGrantedAuthority(); - oga.setAuthority("ROLE_USER"); - oga.setOrcid(ORCID); - when(profileDaoMock.getGrantedAuthoritiesForProfile(eq(ORCID))).thenReturn(List.of(oga)); - - // Active token - DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(""); - token.setAdditionalInformation(new HashMap()); - token.setExpiration(new Date(System.currentTimeMillis() + 60000)); - token.setScope(Set.of()); - token.setTokenType(""); - token.setValue(""); - - when(tokenServicesMock.createAccessToken(any())).thenReturn(token); - - // Disabled token - DefaultOAuth2AccessToken disabledToken = new DefaultOAuth2AccessToken(""); - disabledToken.setAdditionalInformation(new HashMap()); - disabledToken.setExpiration(new Date(System.currentTimeMillis() + 60000)); - disabledToken.setScope(Set.of()); - disabledToken.setTokenType(""); - disabledToken.setValue(""); - - when(tokenServicesMock.createRevokedAccessToken(any(), any())).thenReturn(disabledToken); - - tokenGranter = new IETFExchangeTokenGranter(tokenServicesMock); - - TargetProxyHelper.injectIntoProxy(tokenGranter, "clientDetailsEntityCacheManager", clientDetailsEntityCacheManagerMock); - TargetProxyHelper.injectIntoProxy(tokenGranter, "orcidOAuth2RequestValidator", orcidOAuth2RequestValidatorMock); - TargetProxyHelper.injectIntoProxy(tokenGranter, "openIDConnectKeyService", openIDConnectKeyServiceMock); - TargetProxyHelper.injectIntoProxy(tokenGranter, "memberOBOWhitelistedClientDao", memberOBOWhitelistedClientDaoMock); - TargetProxyHelper.injectIntoProxy(tokenGranter, "orcidOauthTokenDetailService", orcidOauthTokenDetailServiceMock); - TargetProxyHelper.injectIntoProxy(tokenGranter, "profileEntityManager", profileEntityManagerMock); - TargetProxyHelper.injectIntoProxy(tokenGranter, "profileDao", profileDaoMock); - } - - @Test(expected = ClientDeactivatedException.class) - public void grantDeactivatedClientTest() throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - tokenGranter.grant(GRANT_TYPE, getTokenRequest("DEACTIVATED", List.of("/read-limited"))); - } - - @Test(expected = LockedException.class) - public void grantLockedClientTest() throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - tokenGranter.grant(GRANT_TYPE, getTokenRequest("LOCKED", List.of("/read-limited"))); - } - - @Test - public void grantMissingRequestParamsTest() { - String clientId = ACTIVE_CLIENT_ID; - List scope = List.of("/read-limited"); - - try { - // Missing token - Map requestParameters = new HashMap(); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE, "urn:ietf:params:oauth:token-type:id_token"); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_REQUESTED_TOKEN_TYPE, "urn:ietf:params:oauth:token-type:access_token"); - TokenRequest t1 = new TokenRequest(requestParameters, clientId, scope, GRANT_TYPE); - tokenGranter.grant(GRANT_TYPE, t1); - fail(); - } catch (IllegalArgumentException iae) { - assertEquals("Missing IETF Token exchange request parameter(s). Required: subject_token subject_token_type requested_token_type", iae.getMessage()); - } catch (Exception e) { - fail(); - } - - try { - // Missing subject token type - Map requestParameters = new HashMap(); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN, buildJWTToken(false)); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_REQUESTED_TOKEN_TYPE, "urn:ietf:params:oauth:token-type:access_token"); - TokenRequest t2 = new TokenRequest(requestParameters, clientId, scope, GRANT_TYPE); - tokenGranter.grant(GRANT_TYPE, t2); - fail(); - } catch (IllegalArgumentException iae) { - assertEquals("Missing IETF Token exchange request parameter(s). Required: subject_token subject_token_type requested_token_type", iae.getMessage()); - } catch (Exception e) { - fail(); - } - - try { - // Missing requested token type - Map requestParameters = new HashMap(); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN, buildJWTToken(false)); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE, "urn:ietf:params:oauth:token-type:id_token"); - TokenRequest t3 = new TokenRequest(requestParameters, clientId, scope, GRANT_TYPE); - tokenGranter.grant(GRANT_TYPE, t3); - fail(); - } catch (IllegalArgumentException iae) { - assertEquals("Missing IETF Token exchange request parameter(s). Required: subject_token subject_token_type requested_token_type", iae.getMessage()); - } catch (Exception e) { - fail(); - } - } - - @Test - public void grantClientDoesntHaveRequiredGrantTest() { - // Remove the required grant type - when(activeClientMock.getAuthorizedGrantTypes()).thenReturn(Set.of(OrcidOauth2Constants.GRANT_TYPE_CLIENT_CREDENTIALS)); - try { - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/read-limited"))); - fail(); - } catch (IllegalArgumentException iae) { - assertEquals("Client does not have urn:ietf:params:oauth:grant-type:token-exchange enabled", iae.getMessage()); - } catch (Exception e) { - fail(); - } - } - - @Test - public void grantClientNotOboWhitelistedTest() { - try { - ClientDetailsEntity oboClient = new ClientDetailsEntity("OTHER_CLIENT"); - MemberOBOWhitelistedClientEntity e = new MemberOBOWhitelistedClientEntity(); - e.setWhitelistedClientDetailsEntity(oboClient); - when(memberOBOWhitelistedClientDaoMock.getWhitelistForClient(AUDIENCE_CLIENT_ID)).thenReturn(List.of(e)); - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/read-limited"))); - fail(); - } catch (IllegalArgumentException iae) { - assertEquals("Client ACTIVE cannot act on behalf of client AUD_CLIENT", iae.getMessage()); - } catch (Exception e) { - fail(); - } - } - - @Test - public void grantRequestingAndOBOClientMustNotBeTheSameClientTest() throws JOSEException, NoSuchAlgorithmException, IOException, ParseException, URISyntaxException { - Builder claims = new JWTClaimsSet.Builder(); - claims.claim("aud", AUDIENCE_CLIENT_ID); - claims.claim("sub", ORCID); - claims.expirationTime(new Date(System.currentTimeMillis() + 60000)); - - OpenIDConnectKeyService.OpenIDConnectKeyServiceConfig config = new OpenIDConnectKeyService.OpenIDConnectKeyServiceConfig(); - config.setKeyName("OpenIDTestKey1"); - config.setJsonKey( - "{\"keys\":[{\"kty\":\"RSA\",\"d\":\"i6C2Vdr7HDMj9wOBx28epQ7KPpzU_RDfGmQF8c81MoQU2KkpuNcFD49Rixzp3nQa58vtCOzAKeHwglpqm4elcai-uTW0bcdW1DOqYbwzQEk7pVQF-mMEUC-Rvd3Y5SIhCrHQYHGq9Q58uyuolG-Exq4h1AgyhUBX3CETCqzhPshOmB_Y4OuasdhyuVNySBbo-ZOYSd-HMrsrv1lt5WckWz22wmsREjO5AoRPpF17UVp3nMRCTy2v1acUrNtG64MdaFUpmLt9a-RqseFErE2Tm-kEUSBjYucswQ0_ZIs_VUdPWet4twqulB2bJi2ET6pP25DufOtR0x3ijvEPAfvhwQ\",\"e\":\"AQAB\",\"use\":\"sig\",\"kid\":\"OpenIDTestKey1\",\"alg\":\"RS256\",\"n\":\"qCtxWP2HppC8PBEXUh6b5RPECAzQS01khDwbxCSndO-YtS1MYpNlmtUgdtoAEoIP9TFMqXOsltKmGFioy0CeWLi53M-iX-Ygjd3zSQAbr0BU0-86somdbIlFxuvGA8v6AC7MNlICTwbGExCufL_hivrzF1XVqi5zIovM1LA8k2bP4BKMEjNwhGBGJ0E9KcQYv65foZr9K0C6YYJDFE6YqsHP_czvbI1ij7MfDvN5cwmHRGMGOyzDCmT_SmjoZAZ4vSXbl2wI5txIj70RLLSK4oahktb-09c0lDVYpCno7LqsLR8E3DuTUniYwYMHlXeBor_G7sJw2alF568m1iZ_zQ\"}]}"); - OpenIDConnectKeyService service = new OpenIDConnectKeyService(config); - - String token = service.sign(claims.build()).serialize(); - - Map requestParameters = new HashMap(); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN, token); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE, "urn:ietf:params:oauth:token-type:id_token"); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_REQUESTED_TOKEN_TYPE, "urn:ietf:params:oauth:token-type:access_token"); - TokenRequest tokenRequest = new TokenRequest(requestParameters, AUDIENCE_CLIENT_ID, List.of("/read-limited"), GRANT_TYPE); - try { - tokenGranter.grant(GRANT_TYPE, tokenRequest); - fail(); - } catch (IllegalArgumentException iae) { - assertEquals("Attempt to exchange own id_token, use refresh token instead", iae.getMessage()); - } catch (Exception e) { - fail(); - } - } - - @Test - public void grantDisabledTokenDoesntWorkTest() throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - try { - OrcidOauth2TokenDetail token1 = getOrcidOauth2TokenDetail(true, "/read-limited", System.currentTimeMillis() + 60000, true); - token1.setRevokeReason(RevokeReason.USER_REVOKED.name()); - - when(orcidOauthTokenDetailServiceMock.findByClientIdAndUserName(any(), any())).thenReturn(List.of(token1)); - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/read-limited"))); - fail(); - } catch (OrcidInvalidScopeException oise) { - assertEquals("The id_token is not associated with a valid scope", oise.getMessage()); - } catch (Exception e) { - fail(); - } - } - - @Test - public void grantUserDisabledTokenWithActivitiesReadLimitedGenerateDeactivatedTokenTest() - throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - OrcidOauth2TokenDetail token1 = getOrcidOauth2TokenDetail(true, "/activities/update", System.currentTimeMillis() + 60000, true); - token1.setRevokeReason(RevokeReason.USER_REVOKED.name()); - - when(orcidOauthTokenDetailServiceMock.findByClientIdAndUserName(any(), any())).thenReturn(List.of(token1)); - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/activities/update"))); - // Verify revoke token was created - verify(tokenServicesMock, times(1)).createRevokedAccessToken(any(), eq(RevokeReason.USER_REVOKED)); - // Verify regular token was never created - verify(tokenServicesMock, never()).createAccessToken(any()); - } - - @Test - public void grantClientDisabledTokenWithActivitiesReadLimitedThrowExceptionTest() - throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - OrcidOauth2TokenDetail token1 = getOrcidOauth2TokenDetail(true, "/activities/update", System.currentTimeMillis() + 60000, true); - token1.setRevokeReason(RevokeReason.CLIENT_REVOKED.name()); - - when(orcidOauthTokenDetailServiceMock.findByClientIdAndUserName(any(), any())).thenReturn(List.of(token1)); - try { - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/activities/update"))); - } catch(OrcidInvalidScopeException e) { - assertEquals("There are no active tokens with valid scopes for this account", e.getMessage()); - } catch(Exception e) { - fail("Unhandled exception:" + e.getMessage()); - } - } - - @Test - public void grantStaffDisabledTokenWithActivitiesReadLimitedThrowExceptionTest() - throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - OrcidOauth2TokenDetail token1 = getOrcidOauth2TokenDetail(true, "/activities/update", System.currentTimeMillis() + 60000, true); - token1.setRevokeReason(RevokeReason.STAFF_REVOKED.name()); - - when(orcidOauthTokenDetailServiceMock.findByClientIdAndUserName(any(), any())).thenReturn(List.of(token1)); - try { - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/activities/update"))); - } catch(OrcidInvalidScopeException e) { - assertEquals("There are no active tokens with valid scopes for this account", e.getMessage()); - } catch(Exception e) { - fail("Unhandled exception:" + e.getMessage()); - } - } - - @Test - public void grantTokenWhenAMemberRevokedTokenIsPresentTest() - throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - OrcidOauth2TokenDetail token1 = getOrcidOauth2TokenDetail(true, "/activities/update", System.currentTimeMillis() + 60000, true); - OrcidOauth2TokenDetail token2 = getOrcidOauth2TokenDetail(true, "/activities/update", System.currentTimeMillis() + 60000, false); - token1.setRevokeReason(RevokeReason.STAFF_REVOKED.name()); - - when(orcidOauthTokenDetailServiceMock.findByClientIdAndUserName(any(), any())).thenReturn(List.of(token1, token2)); - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/activities/update"))); - // Verify revoke token was never created - verify(tokenServicesMock, never()).createRevokedAccessToken(any(), any()); - // Verify regular token was created - verify(tokenServicesMock, times(1)).createAccessToken(any()); - } - - @Test - public void grantDisabledTokenWithActivitiesUpdateAndOtherActiveTokenWithOtherScopesGenerateDeactivatedTokenTest() - throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - // Deactivated token - OrcidOauth2TokenDetail token1 = getOrcidOauth2TokenDetail(true, "/activities/update", System.currentTimeMillis() + 60000, true); - token1.setRevokeReason(RevokeReason.USER_REVOKED.name()); - - // Active token with other scope - OrcidOauth2TokenDetail token2 = getOrcidOauth2TokenDetail(true, "/activities/read-limited /read-limited /read-public", System.currentTimeMillis() + 60000, false); - token2.setApproved(true); - token2.setScope("/activities/read-limited /read-limited /read-public"); - token2.setTokenExpiration(new Date(System.currentTimeMillis() + 60000)); - token2.setTokenDisabled(false); - - // Revoke token should be generated - when(orcidOauthTokenDetailServiceMock.findByClientIdAndUserName(any(), any())).thenReturn(List.of(token1, token2)); - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/activities/update"))); - // Verify revoke token was created - verify(tokenServicesMock, times(1)).createRevokedAccessToken(any(), eq(RevokeReason.USER_REVOKED)); - // Verify regular token was never created - verify(tokenServicesMock, never()).createAccessToken(any()); - } - - @Test - public void grantDisabledTokenWithActivitiesUpdateAndOtherActiveTokenWithActivitiesUpdateScopesGenerateActiveTokenTest() - throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - // Deactivated token - OrcidOauth2TokenDetail token1 = getOrcidOauth2TokenDetail(true, "/activities/update", System.currentTimeMillis() + 60000, true); - token1.setRevokeReason(RevokeReason.USER_REVOKED.name()); - - // Active token with other scope - OrcidOauth2TokenDetail token2 = getOrcidOauth2TokenDetail(true, "/activities/read-limited /read-limited /activities/update /read-public", System.currentTimeMillis() + 60000, true); - token2.setTokenDisabled(false); - - // Revoke token should be generated - when(orcidOauthTokenDetailServiceMock.findByClientIdAndUserName(any(), any())).thenReturn(List.of(token1, token2)); - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/activities/update"))); - // Verify revoke token was never created - verify(tokenServicesMock, never()).createRevokedAccessToken(any(), any()); - // Verify regular token was created - verify(tokenServicesMock, times(1)).createAccessToken(any()); - } - - @Test - public void grantTest() throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - tokenGranter.grant(GRANT_TYPE, getTokenRequest(ACTIVE_CLIENT_ID, List.of("/read-limited"))); - verify(tokenServicesMock, times(1)).createAccessToken(any()); - } - - private TokenRequest getTokenRequest(String clientId, List scope) - throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - Map requestParameters = new HashMap(); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN, buildJWTToken(false)); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_SUBJECT_TOKEN_TYPE, "urn:ietf:params:oauth:token-type:id_token"); - requestParameters.put(OrcidOauth2Constants.IETF_EXCHANGE_REQUESTED_TOKEN_TYPE, "urn:ietf:params:oauth:token-type:access_token"); - return new TokenRequest(requestParameters, clientId, scope, GRANT_TYPE); - } - - private String buildJWTToken(boolean expired) throws NoSuchAlgorithmException, IOException, ParseException, URISyntaxException, JOSEException { - Builder claims = new JWTClaimsSet.Builder(); - claims.claim("aud", AUDIENCE_CLIENT_ID); - claims.claim("sub", ORCID); - claims.expirationTime(expired ? new Date(0) : new Date(System.currentTimeMillis() + 60000)); - - OpenIDConnectKeyService.OpenIDConnectKeyServiceConfig config = new OpenIDConnectKeyService.OpenIDConnectKeyServiceConfig(); - config.setKeyName("OpenIDTestKey1"); - config.setJsonKey( - "{\"keys\":[{\"kty\":\"RSA\",\"d\":\"i6C2Vdr7HDMj9wOBx28epQ7KPpzU_RDfGmQF8c81MoQU2KkpuNcFD49Rixzp3nQa58vtCOzAKeHwglpqm4elcai-uTW0bcdW1DOqYbwzQEk7pVQF-mMEUC-Rvd3Y5SIhCrHQYHGq9Q58uyuolG-Exq4h1AgyhUBX3CETCqzhPshOmB_Y4OuasdhyuVNySBbo-ZOYSd-HMrsrv1lt5WckWz22wmsREjO5AoRPpF17UVp3nMRCTy2v1acUrNtG64MdaFUpmLt9a-RqseFErE2Tm-kEUSBjYucswQ0_ZIs_VUdPWet4twqulB2bJi2ET6pP25DufOtR0x3ijvEPAfvhwQ\",\"e\":\"AQAB\",\"use\":\"sig\",\"kid\":\"OpenIDTestKey1\",\"alg\":\"RS256\",\"n\":\"qCtxWP2HppC8PBEXUh6b5RPECAzQS01khDwbxCSndO-YtS1MYpNlmtUgdtoAEoIP9TFMqXOsltKmGFioy0CeWLi53M-iX-Ygjd3zSQAbr0BU0-86somdbIlFxuvGA8v6AC7MNlICTwbGExCufL_hivrzF1XVqi5zIovM1LA8k2bP4BKMEjNwhGBGJ0E9KcQYv65foZr9K0C6YYJDFE6YqsHP_czvbI1ij7MfDvN5cwmHRGMGOyzDCmT_SmjoZAZ4vSXbl2wI5txIj70RLLSK4oahktb-09c0lDVYpCno7LqsLR8E3DuTUniYwYMHlXeBor_G7sJw2alF568m1iZ_zQ\"}]}"); - OpenIDConnectKeyService service = new OpenIDConnectKeyService(config); - - return service.sign(claims.build()).serialize(); - } - - private OrcidOauth2TokenDetail getOrcidOauth2TokenDetail(Boolean approved, String scope, long expiration, Boolean disabled) { - OrcidOauth2TokenDetail token = new OrcidOauth2TokenDetail(); - token.setApproved(approved); - token.setScope(scope); - token.setTokenExpiration(new Date(expiration)); - token.setTokenDisabled(disabled); - return token; - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/OAuthErrorUtilsTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/OAuthErrorUtilsTest.java index 6b94ee9ef15..cab699ab915 100644 --- a/orcid-core/src/test/java/org/orcid/core/oauth/OAuthErrorUtilsTest.java +++ b/orcid-core/src/test/java/org/orcid/core/oauth/OAuthErrorUtilsTest.java @@ -17,17 +17,15 @@ * ============================================================================= */ import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -import javax.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.Response.Status; import org.junit.Test; +import org.orcid.core.exception.ClientDeactivatedException; import org.orcid.core.exception.DeactivatedException; import org.orcid.core.exception.LockedException; import org.orcid.core.exception.OrcidDeprecatedException; import org.orcid.core.exception.OrcidInvalidScopeException; import org.springframework.security.authentication.InsufficientAuthenticationException; -import org.springframework.security.oauth2.common.exceptions.UnsupportedGrantTypeException; public class OAuthErrorUtilsTest { @@ -40,11 +38,11 @@ public void testGetOAuthErrorForLockedException() { } @Test - public void testGetOAuthErrorForUnsupportedGrantTypeException() { - OAuthError error = OAuthErrorUtils.getOAuthError(new UnsupportedGrantTypeException("message here")); - assertEquals(OAuthError.UNSUPPORTED_GRANT_TYPE, error.getError()); + public void testGetOAuthErrorForClientDeactivatedException() { + OAuthError error = OAuthErrorUtils.getOAuthError(new ClientDeactivatedException("client-id")); + assertEquals(OAuthError.UNAUTHORIZED_CLIENT, error.getError()); assertEquals(Status.BAD_REQUEST, error.getResponseStatus()); - assertEquals("message here", error.getErrorDescription()); + assertEquals("Client client-id is deactivated", error.getErrorDescription()); } @Test diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/OrcidClientCredentialsCheckerTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/OrcidClientCredentialsCheckerTest.java deleted file mode 100644 index a3d5e89ad6b..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/oauth/OrcidClientCredentialsCheckerTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.orcid.core.oauth; - -import static org.mockito.Mockito.when; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.ClientScopeEntity; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.persistence.jpa.entities.keys.ClientScopePk; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.provider.ClientDetailsService; -import org.springframework.security.oauth2.provider.OAuth2RequestFactory; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestFactory; - -/** - * @author Declan Newman (declan) Date: 11/05/2012 - */ -public class OrcidClientCredentialsCheckerTest { - - @Mock - private ClientDetailsService clientDetailsService; - - @Mock - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Mock - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - - private OAuth2RequestFactory oAuth2RequestFactory; - - private OrcidClientCredentialsChecker checker; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - oAuth2RequestFactory = new DefaultOAuth2RequestFactory(clientDetailsService); - checker = new OrcidClientCredentialsChecker(oAuth2RequestFactory); - checker.setClientDetailsEntityCacheManager(clientDetailsEntityCacheManager); - checker.setOrcidOAuth2RequestValidator(orcidOAuth2RequestValidator); - } - - @Test(expected = InvalidScopeException.class) - public void testInvalidCredentialsScopes() throws Exception { - String memberId = "2875-8158-1475-6194"; - String clientId = "APP-1"; - setupMocks(clientId, memberId); - Set requestedScopes = new HashSet(Arrays.asList(ScopePathType.FUNDING_CREATE.value())); - Map requestParams = new HashMap (); - requestParams.put(OrcidOauth2Constants.SCOPE_PARAM, ScopePathType.FUNDING_CREATE.value()); - - checker.validateCredentials("client_credentials", new TokenRequest(requestParams, clientId, requestedScopes, "client_credentials")); - } - - @Test - public void testValidCredentialsScopes() throws Exception { - String memberId = "2875-8158-1475-6194"; - String clientId = "APP-1"; - setupMocks(clientId, memberId); - Set requestedScopes = new HashSet(Arrays.asList(ScopePathType.READ_PUBLIC.value())); - Map requestParams = new HashMap (); - requestParams.put(OrcidOauth2Constants.SCOPE_PARAM, ScopePathType.READ_PUBLIC.value()); - checker.validateCredentials("client_credentials", new TokenRequest(requestParams, clientId, requestedScopes, "client_credentials")); - } - - @Test - public void testValidCredentialsScopesForClientOnly() throws Exception { - String memberId = "2875-8158-1475-6194"; - String clientId = "APP-1"; - setupMocks(clientId, memberId); - Set requestedScopes = new HashSet(Arrays.asList(ScopePathType.READ_PUBLIC.value())); - Map requestParams = new HashMap (); - requestParams.put(OrcidOauth2Constants.SCOPE_PARAM, ScopePathType.READ_PUBLIC.value()); - checker.validateCredentials("client_credentials", new TokenRequest(requestParams, clientId, requestedScopes, "client_credentials")); - } - - private void setupMocks(String clientId, String memberId) { - ClientDetailsEntity clientDetailsEntity = new ClientDetailsEntity(); - Set scopes = new HashSet(3); - ClientScopeEntity c1 = new ClientScopeEntity(); - c1.setClientId(clientId); - c1.setScopeType(ScopePathType.ORCID_WORKS_UPDATE.value()); - scopes.add(c1); - - ClientScopeEntity c2 = new ClientScopeEntity(); - c2.setClientId(clientId); - c2.setScopeType(ScopePathType.ORCID_BIO_READ_LIMITED.value()); - scopes.add(c2); - - ClientScopeEntity c3 = new ClientScopeEntity(); - c3.setClientId(clientId); - c3.setScopeType(ScopePathType.ORCID_PROFILE_CREATE.value()); - scopes.add(c3); - - clientDetailsEntity.setClientScopes(scopes); - clientDetailsEntity.setGroupProfileId(memberId); - ProfileEntity profile = new ProfileEntity(memberId); - profile.setRecordLocked(false); - when(clientDetailsService.loadClientByClientId(clientId)).thenReturn(clientDetailsEntity); - when(clientDetailsEntityCacheManager.retrieve(clientId)).thenReturn(clientDetailsEntity); - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/OrcidRefreshTokenTokenGranterTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/OrcidRefreshTokenTokenGranterTest.java deleted file mode 100644 index e93edb05829..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/oauth/OrcidRefreshTokenTokenGranterTest.java +++ /dev/null @@ -1,441 +0,0 @@ -package org.orcid.core.oauth; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Random; -import java.util.Set; - -import javax.annotation.Resource; -import javax.transaction.Transactional; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.math3.random.RandomDataGenerator; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.test.DBUnitTest; -import org.orcid.test.OrcidJUnit4ClassRunner; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.TokenRequest; -import org.springframework.test.context.ContextConfiguration; - -@RunWith(OrcidJUnit4ClassRunner.class) -@ContextConfiguration(locations = { "classpath:test-orcid-core-context.xml" }) -public class OrcidRefreshTokenTokenGranterTest extends DBUnitTest { - - private static final String CLIENT_ID_1 = "APP-5555555555555555"; - private static final String CLIENT_ID_2 = "APP-5555555555555556"; - private static final String USER_ORCID = "0000-0000-0000-0001"; - - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - - @Resource - private OrcidRefreshTokenTokenGranter refreshTokenTokenGranter; - - @Resource(name="orcidOauth2TokenDetailDao") - private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao; - - @BeforeClass - public static void initDBUnitData() throws Exception { - initDBUnitData(Arrays.asList("/data/SubjectEntityData.xml", "/data/SourceClientDetailsEntityData.xml", - "/data/ProfileEntityData.xml", "/data/RecordNameEntityData.xml")); - } - - @AfterClass - public static void removeDBUnitData() throws Exception { - removeDBUnitData(Arrays.asList("/data/RecordNameEntityData.xml", "/data/ProfileEntityData.xml", "/data/SourceClientDetailsEntityData.xml", "/data/SubjectEntityData.xml")); - } - - @Transactional - private OrcidOauth2TokenDetail createToken(String clientId, String userOrcid, String tokenValue, String refreshTokenValue, Date expirationDate, String scopes) { - OrcidOauth2TokenDetail token = new OrcidOauth2TokenDetail(); - token.setApproved(true); - token.setClientDetailsId(clientId); - token.setOrcid(userOrcid); - token.setScope(scopes); - token.setTokenDisabled(false); - token.setTokenExpiration(expirationDate); - token.setTokenType("bearer"); - token.setTokenValue(tokenValue); - token.setRefreshTokenValue(refreshTokenValue); - orcidOauth2TokenDetailDao.persist(token); - assertNotNull(token.getDateCreated()); - assertNotNull(token.getLastModified()); - return token; - } - - private OAuth2AccessToken generateRefreshToken(OrcidOauth2TokenDetail tokenDetails, String customClientId, Boolean revokeOld, Long expiresIn, String... scopesParam) { - Set scopes = null; - if (scopesParam != null) { - scopes = new HashSet(Arrays.asList(scopesParam)); - } - - Map authorizationParameters = new HashMap(); - String scopesString = scopes == null ? null : StringUtils.join(scopes, ' '); - String clientId = PojoUtil.isEmpty(customClientId) ? tokenDetails.getClientDetailsId() : customClientId; - String refreshTokenValue = tokenDetails.getRefreshTokenValue(); - - authorizationParameters.put(OAuth2Utils.CLIENT_ID, clientId); - authorizationParameters.put(OrcidOauth2Constants.IS_PERSISTENT, "true"); - authorizationParameters.put(OrcidOauth2Constants.AUTHORIZATION, tokenDetails.getTokenValue()); - authorizationParameters.put(OrcidOauth2Constants.REFRESH_TOKEN, refreshTokenValue); - authorizationParameters.put(OAuth2Utils.REDIRECT_URI, tokenDetails.getRedirectUri()); - - if (!PojoUtil.isEmpty(scopesString)) { - authorizationParameters.put(OAuth2Utils.SCOPE, scopesString); - } - - if (revokeOld != null) { - authorizationParameters.put(OrcidOauth2Constants.REVOKE_OLD, String.valueOf(revokeOld)); - } - - if (expiresIn != null) { - authorizationParameters.put(OrcidOauth2Constants.EXPIRES_IN, String.valueOf(expiresIn)); - } - - TokenRequest tokenRequest = new TokenRequest(authorizationParameters, clientId, scopes, OrcidOauth2Constants.REFRESH_TOKEN); - return refreshTokenTokenGranter.grant(OrcidOauth2Constants.REFRESH_TOKEN, tokenRequest); - } - - @Test - public void createRefreshTokenTest() { - // Create token, create refresh, parent should be disabled, scopes - // should be equal - long time = System.currentTimeMillis(); - String scope = "/activities/update"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = null; - Date parentTokenExpiration = new Date(time + 10000); - Long expireIn = null; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, scope); - OAuth2AccessToken refresh = generateRefreshToken(parent, null, revokeOld, expireIn, scope); - assertNotNull(refresh); - - OrcidOauth2TokenDetail parentToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(parent.getTokenValue()); - assertNotNull(parentToken); - assertEquals(tokenValue, parentToken.getTokenValue()); - assertTrue(parentToken.getTokenDisabled()); - assertEquals(scope, parentToken.getScope()); - assertNotNull(parentToken.getTokenExpiration()); - - OrcidOauth2TokenDetail refreshToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(refresh.getValue()); - assertNotNull(refreshToken); - assertNotNull(refreshToken.getTokenValue()); - assertNotNull(refreshToken.getRefreshTokenValue()); - assertFalse(refreshToken.getTokenDisabled()); - assertEquals(scope, refreshToken.getScope()); - assertNotNull(refreshToken.getTokenExpiration()); - - assertEquals(parentToken.getTokenExpiration().getTime(), refreshToken.getTokenExpiration().getTime()); - } - - @Test - public void createRefreshTokenWithNarrowerScopesTest() { - // Create token, create refresh with narrower scopes, parent should be - // disabled, scopes should be narrower - long time = System.currentTimeMillis(); - String parentScope = "/activities/update"; - String refreshScope = "/orcid-works/create"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = true; - Date parentTokenExpiration = new Date(time + 10000); - Long expireIn = null; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - OAuth2AccessToken refresh = generateRefreshToken(parent, null, revokeOld, expireIn, refreshScope); - assertNotNull(refresh); - - OrcidOauth2TokenDetail parentToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(parent.getTokenValue()); - assertNotNull(parentToken); - assertEquals(tokenValue, parentToken.getTokenValue()); - assertTrue(parentToken.getTokenDisabled()); - assertEquals(parentScope, parentToken.getScope()); - assertNotNull(parentToken.getTokenExpiration()); - - OrcidOauth2TokenDetail refreshToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(refresh.getValue()); - assertNotNull(refreshToken); - assertNotNull(refreshToken.getTokenValue()); - assertNotNull(refreshToken.getRefreshTokenValue()); - assertFalse(refreshToken.getTokenDisabled()); - assertEquals(refreshScope, refreshToken.getScope()); - assertNotNull(refreshToken.getTokenExpiration()); - - assertEquals(parentToken.getTokenExpiration().getTime(), refreshToken.getTokenExpiration().getTime()); - } - - @Test - public void createRefreshTokenWithoutRevokeParent() { - // Create token, create refresh without disabling parent token, parent - // should be enabled, refresh should be enabled - long time = System.currentTimeMillis(); - String parentScope = "/activities/update /read-limited"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = false; - Date parentTokenExpiration = new Date(time + 10000); - Long expireIn = null; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - OAuth2AccessToken refresh = generateRefreshToken(parent, null, revokeOld, expireIn); - assertNotNull(refresh); - - OrcidOauth2TokenDetail parentToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(parent.getTokenValue()); - assertNotNull(parentToken); - assertEquals(tokenValue, parentToken.getTokenValue()); - assertFalse(parentToken.getTokenDisabled()); - assertNotNull(parentToken.getTokenExpiration()); - - OrcidOauth2TokenDetail refreshToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(refresh.getValue()); - assertNotNull(refreshToken); - assertNotNull(refreshToken.getTokenValue()); - assertNotNull(refreshToken.getRefreshTokenValue()); - assertFalse(refreshToken.getTokenDisabled()); - assertNotNull(refreshToken.getTokenExpiration()); - - assertEquals(parentToken.getTokenExpiration().getTime(), refreshToken.getTokenExpiration().getTime()); - - assertEquals(parentToken.getScope(), refreshToken.getScope()); - - Set tokenScopes = OAuth2Utils.parseParameterList(parentToken.getScope()); - Set originalScopes = OAuth2Utils.parseParameterList(parentScope); - assertEquals(originalScopes, tokenScopes); - } - - @Test - public void createRefreshTokenWithoutRevokeParentAndWithNarrowerScopes() { - // Create token, create refresh with narrower scopes and without - // disabling parent token, parent should work, refresh should have - // narrower scopes - long time = System.currentTimeMillis(); - String parentScope = "/person/read-limited"; - String refreshScope = "/orcid-bio/read-limited"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = false; - Date parentTokenExpiration = new Date(time + 10000); - Long expireIn = null; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - OAuth2AccessToken refresh = generateRefreshToken(parent, null, revokeOld, expireIn, refreshScope); - assertNotNull(refresh); - - OrcidOauth2TokenDetail parentToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(parent.getTokenValue()); - assertNotNull(parentToken); - assertEquals(tokenValue, parentToken.getTokenValue()); - assertFalse(parentToken.getTokenDisabled()); - assertEquals(parentScope, parentToken.getScope()); - assertNotNull(parentToken.getTokenExpiration()); - - OrcidOauth2TokenDetail refreshToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(refresh.getValue()); - assertNotNull(refreshToken); - assertNotNull(refreshToken.getTokenValue()); - assertNotNull(refreshToken.getRefreshTokenValue()); - assertFalse(refreshToken.getTokenDisabled()); - assertEquals(refreshScope, refreshToken.getScope()); - assertNotNull(refreshToken.getTokenExpiration()); - - assertEquals(parentToken.getTokenExpiration().getTime(), refreshToken.getTokenExpiration().getTime()); - } - - @Test - public void createRefreshTokenWithExpirationOf10Secs() { - // Create token, dont revoke parent and set expiration to 10 secs - long time = System.currentTimeMillis(); - String parentScope = "/person/read-limited"; - String refreshScope = "/orcid-bio/read-limited"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = false; - Date parentTokenExpiration = new Date(time + 10000); - Long expireIn = 5L; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - OAuth2AccessToken refresh = generateRefreshToken(parent, null, revokeOld, expireIn, refreshScope); - assertNotNull(refresh); - - OrcidOauth2TokenDetail parentToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(parent.getTokenValue()); - assertNotNull(parentToken); - assertEquals(tokenValue, parentToken.getTokenValue()); - assertFalse(parentToken.getTokenDisabled()); - assertEquals(parentScope, parentToken.getScope()); - assertNotNull(parentToken.getTokenExpiration()); - - OrcidOauth2TokenDetail refreshToken = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(refresh.getValue()); - assertNotNull(refreshToken); - assertNotNull(refreshToken.getTokenValue()); - assertNotNull(refreshToken.getRefreshTokenValue()); - assertFalse(refreshToken.getTokenDisabled()); - assertEquals(refreshScope, refreshToken.getScope()); - assertNotNull(refreshToken.getTokenExpiration()); - - assertTrue(parentToken.getTokenExpiration().getTime() > refreshToken.getTokenExpiration().getTime()); - // Assert that current time plus 6 secs is greather than refresh token - // expiration - assertTrue((time + 6000) > refreshToken.getTokenExpiration().getTime()); - } - - @Test - public void tryToCreateRefreshTokenWithInvalidScopesTest() { - // Create token, try to create refresh token with invalid scopes, fail - long time = System.currentTimeMillis(); - String parentScope = "/person/update"; - String refreshScope = "/orcid-works/read-limited"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = true; - Date parentTokenExpiration = new Date(time + 10000); - Long expireIn = null; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - try { - generateRefreshToken(parent, null, revokeOld, expireIn, refreshScope); - fail(); - } catch(InvalidScopeException e) { - assertTrue(e.getMessage().contains("is not allowed for the parent token")); - } catch(Exception e) { - fail(); - } - } - - @Test - public void tryToCreateRefreshTokenWithThatExpireAfterParentTokenTest() { - // Create token, try to create refresh token that expires after parent - // token, fail - long time = System.currentTimeMillis(); - String parentScope = "/person/update"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = true; - Date parentTokenExpiration = new Date(time + 10000); - Long expireIn = time + (15000); - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - try { - generateRefreshToken(parent, null, revokeOld, expireIn, parentScope); - fail(); - } catch(IllegalArgumentException e) { - assertTrue(e.getMessage().contains("Token expiration can't be after")); - } catch(Exception e) { - fail(); - } - } - - @Test - public void tryToCreateRefreshTokenWithInvalidClientTest() { - // Create token for client # 1, try to create a refresh token using - // client # 2, fail - long time = System.currentTimeMillis(); - String parentScope = "/person/update"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = true; - Date parentTokenExpiration = new Date(time + 10000); - Long expireIn = null; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - try { - generateRefreshToken(parent, CLIENT_ID_2, revokeOld, expireIn, parentScope); - fail(); - } catch(IllegalArgumentException e) { - assertTrue(e.getMessage().contains("This token does not belong to the given client")); - } catch(Exception e) { - fail(); - } - - } - - @Test - public void tryToRefreshAnExpiredTokenTest() { - long time = System.currentTimeMillis(); - String parentScope = "/person/update"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = true; - Date parentTokenExpiration = new Date(time - 10000); - Long expireIn = null; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - try { - generateRefreshToken(parent, null, revokeOld, expireIn, parentScope); - fail(); - } catch(InvalidTokenException e) { - assertTrue(e.getMessage().contains("Access token expired:")); - } catch(Exception e) { - fail(); - } - } - - @Test - public void tryToCreateRefreshTokenWithInvalidRefreshTokenTest() { - // Create token, try to create refresh token with invalid refresh value, - // fail - long time = System.currentTimeMillis(); - String parentScope = "/person/update"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = true; - Date parentTokenExpiration = new Date(time + 10000); - Long expireIn = null; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - try { - //Change the value we are going to use for the refresh token - parent.setRefreshTokenValue("invalid-value"); - generateRefreshToken(parent, null, revokeOld, expireIn, parentScope); - fail(); - } catch(InvalidTokenException e) { - assertTrue(e.getMessage().contains("Unable to find refresh token")); - } catch(Exception e) { - fail(); - } - } - - @Test - public void tryToCreateRefreshTokenWithInvalidParentTokenValueTest() { - // Create token, try to create refresh token with invalid parent token - // value, fail - long time = System.currentTimeMillis(); - String parentScope = "/person/update"; - String tokenValue = "parent-token-" + getRandom(); - String refreshTokenValue = "refresh-token-" + getRandom(); - Boolean revokeOld = true; - Date parentTokenExpiration = new Date(time + 15000); - Long expireIn = null; - - OrcidOauth2TokenDetail parent = createToken(CLIENT_ID_1, USER_ORCID, tokenValue, refreshTokenValue, parentTokenExpiration, parentScope); - // Change the value we are going to use for the refresh token - parent.setTokenValue("invalid-value"); - OAuth2AccessToken refreshedToken = generateRefreshToken(parent, null, revokeOld, expireIn, parentScope); - // We shouldn't care about the access token, it's not required and - // shouldn't really be there. If the refresh token and client - // credentials are good, we can generate the refresh token. - assertNotNull(refreshedToken); - } - - private long getRandom() { - long leftLimit = 10L; - long rightLimit = 10000000L; - return new RandomDataGenerator().nextLong(leftLimit, rightLimit); - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/security/OrcidOauthRedirectResolverTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/security/OrcidOauthRedirectResolverTest.java deleted file mode 100644 index 8014354f080..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/oauth/security/OrcidOauthRedirectResolverTest.java +++ /dev/null @@ -1,245 +0,0 @@ -package org.orcid.core.oauth.security; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Set; -import java.util.TreeSet; - -import org.junit.Rule; -import org.junit.Test; -import org.orcid.core.togglz.Features; -import org.orcid.persistence.jpa.entities.ClientAuthorisedGrantTypeEntity; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.ClientRedirectUriEntity; -import org.orcid.persistence.jpa.entities.keys.ClientAuthorisedGrantTypePk; -import org.orcid.persistence.jpa.entities.keys.ClientRedirectUriPk; -import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; -import org.springframework.security.oauth2.common.exceptions.RedirectMismatchException; -import org.togglz.junit.TogglzRule; - -public class OrcidOauthRedirectResolverTest { - - private Collection allRedirectGrantTypes = Arrays.asList("implicit", "refresh_token", "client_credentials", "authorization_code", - "urn:ietf:params:oauth:grant-type:token-exchange"); - - @Rule - public TogglzRule togglzRule = TogglzRule.allDisabled(Features.class); - - private OrcidOauthRedirectResolver resolver = new OrcidOauthRedirectResolver(); - - { - resolver.setRedirectGrantTypes(allRedirectGrantTypes); - } - - @Test - public void resolveRedirect_emptyGrantTypesTest() { - ClientDetailsEntity clientDetails = new ClientDetailsEntity(); - // Empty authorized grant types should fail - clientDetails.setClientAuthorizedGrantTypes(Set.of()); - try { - resolver.resolveRedirect("", clientDetails); - } catch (InvalidGrantException e) { - assertEquals("A client must have at least one authorized grant type.", e.getMessage()); - } - } - - @Test - public void resolveRedirect_invalidGrantTypesTest() { - ClientDetailsEntity clientDetails = new ClientDetailsEntity(); - // Empty authorized grant types should fail - ClientAuthorisedGrantTypeEntity gte1 = new ClientAuthorisedGrantTypeEntity(); - gte1.setClientId("id"); - gte1.setGrantType("other"); - clientDetails.setClientAuthorizedGrantTypes(Set.of(gte1)); - try { - resolver.resolveRedirect("", clientDetails); - } catch (InvalidGrantException e) { - assertEquals("A redirect_uri can only be used by implicit or authorization_code grant types.", e.getMessage()); - } - } - - @Test - public void resolveRedirect_noRegisteredRedirectUriTest() { - ClientDetailsEntity clientDetails = new ClientDetailsEntity(); - // Empty authorized grant types should fail - ClientAuthorisedGrantTypeEntity gte1 = new ClientAuthorisedGrantTypeEntity(); - gte1.setClientId("id"); - gte1.setGrantType("authorization_code"); - clientDetails.setClientAuthorizedGrantTypes(Set.of(gte1)); - // Null redirect uris - try { - resolver.resolveRedirect("", clientDetails); - } catch (InvalidRequestException e) { - assertEquals("At least one redirect_uri must be registered with the client.", e.getMessage()); - } - // Empty redirect uris - try { - clientDetails.setClientRegisteredRedirectUris(new TreeSet()); - resolver.resolveRedirect("", clientDetails); - } catch (InvalidRequestException e) { - assertEquals("At least one redirect_uri must be registered with the client.", e.getMessage()); - } - } - - @Test - public void resolveRedirect_NoMatchingRedirectTest() { - ClientDetailsEntity clientDetails = new ClientDetailsEntity(); - // Empty authorized grant types should fail - ClientAuthorisedGrantTypeEntity gte1 = new ClientAuthorisedGrantTypeEntity(); - gte1.setClientId("id"); - gte1.setGrantType("authorization_code"); - clientDetails.setClientAuthorizedGrantTypes(Set.of(gte1)); - - TreeSet redirectUris = new TreeSet(); - setRedirectUris("id", redirectUris); - clientDetails.setClientRegisteredRedirectUris(redirectUris); - - // Root url should not match if it is not registered - try { - resolver.resolveRedirect("https://qa.orcid.org", clientDetails); - } catch (RedirectMismatchException e) { - assertEquals("Unable to find a matching redirect_uri for the client.", e.getMessage()); - } - - // Different protocol should not match - try { - resolver.resolveRedirect("http://qa.orcid.org/1", clientDetails); - } catch (RedirectMismatchException e) { - assertEquals("Unable to find a matching redirect_uri for the client.", e.getMessage()); - } - - // Different domain should not match - try { - resolver.resolveRedirect("https://orcid.org/1", clientDetails); - } catch (RedirectMismatchException e) { - assertEquals("Unable to find a matching redirect_uri for the client.", e.getMessage()); - } - - // Different domain should not match - try { - resolver.resolveRedirect("https://example.com/1", clientDetails); - } catch (RedirectMismatchException e) { - assertEquals("Unable to find a matching redirect_uri for the client.", e.getMessage()); - } - - // Same domain but different patch should not match - try { - resolver.resolveRedirect("https://qa.orcid.org/4", clientDetails); - } catch (RedirectMismatchException e) { - assertEquals("Unable to find a matching redirect_uri for the client.", e.getMessage()); - } - } - - @Test - public void resolveRedirectTest() { - ClientDetailsEntity clientDetails = new ClientDetailsEntity(); - // Empty authorized grant types should fail - ClientAuthorisedGrantTypeEntity gte1 = new ClientAuthorisedGrantTypeEntity(); - gte1.setGrantType("authorization_code"); - clientDetails.setClientAuthorizedGrantTypes(Set.of(gte1)); - - TreeSet redirectUris = new TreeSet(); - setRedirectUris("id", redirectUris); - clientDetails.setClientRegisteredRedirectUris(redirectUris); - - assertEquals("https://qa.orcid.org/1", resolver.resolveRedirect("https://qa.orcid.org/1", clientDetails)); - assertEquals("https://qa.orcid.org/2", resolver.resolveRedirect("https://qa.orcid.org/2", clientDetails)); - assertEquals("https://qa.orcid.org/3", resolver.resolveRedirect("https://qa.orcid.org/3", clientDetails)); - assertEquals("https://qa.orcid.org/1/subdirectory", resolver.resolveRedirect("https://qa.orcid.org/1/subdirectory", clientDetails)); - assertEquals("https://qa.orcid.org/1/2/3", resolver.resolveRedirect("https://qa.orcid.org/1/2/3", clientDetails)); - } - - @Test - public void redirectUriGeneralTests() { - redirectUriGeneralTest(); - } - - private void redirectUriGeneralTest() { - // No matches at all - assertFalse(resolver.redirectMatches("https://example.com", "https://qa.orcid.org")); - assertFalse(resolver.redirectMatches("https://qa.orcid.org", "https://example.com")); - - // Different scheme should not match - assertFalse(resolver.redirectMatches("https://qa.orcid.org", "http://qa.orcid.org")); - assertFalse(resolver.redirectMatches("http://qa.orcid.org", "https://qa.orcid.org")); - assertFalse(resolver.redirectMatches("https://example.com", "http://example.com")); - assertFalse(resolver.redirectMatches("http://example.com", "https://example.com")); - - // Different port should not match - assertFalse(resolver.redirectMatches("http://qa.orcid.org", "http://qa.orcid.org:8080")); - assertFalse(resolver.redirectMatches("http://qa.orcid.org:8080", "http://qa.orcid.org")); - assertFalse(resolver.redirectMatches("http://qa.orcid.org:8080", "http://qa.orcid.org:8081")); - assertFalse(resolver.redirectMatches("http://127.0.0.1", "http://127.0.0.1:8080")); - assertFalse(resolver.redirectMatches("http://127.0.0.1:8080", "http://127.0.0.1")); - assertFalse(resolver.redirectMatches("http://127.0.0.1:8080", "http://127.0.0.1:8081")); - - // Different host should not match - assertFalse(resolver.redirectMatches("https://orcid.org", "http://example.com")); - - // Root should not match if it is not registered - assertFalse(resolver.redirectMatches("https://qa.orcid.org", "http://qa.orcid.org/subdirectory")); - - // Subdirectory should not match if it is not registered - assertFalse(resolver.redirectMatches("https://qa.orcid.org/subdirectory/2", "https://qa.orcid.org/subdirectory/1")); - assertFalse(resolver.redirectMatches("https://qa.orcid.org/s2", "https://qa.orcid.org/s1")); - - // Exact match - assertTrue(resolver.redirectMatches("https://orcid.org", "https://orcid.org")); - assertTrue(resolver.redirectMatches("http://example.com:9001", "http://example.com:9001")); - assertTrue(resolver.redirectMatches("http://127.0.0.1", "http://127.0.0.1")); - assertTrue(resolver.redirectMatches("http://127.0.0.1:8080", "http://127.0.0.1:8080")); - - // Subdirectory should match - assertTrue(resolver.redirectMatches("https://orcid.org/subdirectory", "https://orcid.org")); - assertTrue(resolver.redirectMatches("https://orcid.org/subdirectory/1", "https://orcid.org")); - assertTrue(resolver.redirectMatches("https://orcid.org/subdirectory/1/2", "https://orcid.org")); - assertTrue(resolver.redirectMatches("https://orcid.org/subdirectory/1/2", "https://orcid.org/subdirectory")); - assertTrue(resolver.redirectMatches("https://orcid.org/subdirectory/1/2", "https://orcid.org/subdirectory/1")); - assertTrue(resolver.redirectMatches("https://orcid.org/subdirectory/1/2", "https://orcid.org/subdirectory/1/2")); - - // If a subdomain is registered but not the domain, it should fail - assertFalse(resolver.redirectMatches("https://orcid.org", "https://qa.orcid.org")); - // Different subdomains should not match - assertFalse(resolver.redirectMatches("https://qa.orcid.org", "https://sandbox.orcid.org")); - - // Acceptance criteria checks: subdirectory should be allowed - assertTrue(resolver.redirectMatches("https://example.com/subdirectory", "https://example.com")); - } - - @Test - public void redirectMatches_AllowMatchingSubdomainsTest() { - // Subdomain should not match - assertFalse(resolver.redirectMatches("https://www.orcid.org", "https://orcid.org")); - assertFalse(resolver.redirectMatches("https://qa.orcid.org", "https://orcid.org")); - - // Acceptance criteria checks: subdomains should be rejected - assertFalse(resolver.redirectMatches("https://subdomain.example.com/", "https://example.com")); - assertFalse(resolver.redirectMatches("https://subdomain.example.com/subdirectory", "https://example.com")); - assertFalse(resolver.redirectMatches("https://www.example.com", "https://example.com")); - } - - private void setRedirectUris(String clientId, TreeSet redirectUris) { - ClientRedirectUriEntity r1 = new ClientRedirectUriEntity(); - r1.setClientId(clientId); - r1.setRedirectUri("https://qa.orcid.org/1"); - r1.setRedirectUriType("type-1"); - - ClientRedirectUriEntity r2 = new ClientRedirectUriEntity(); - r2.setClientId(clientId); - r2.setRedirectUri("https://qa.orcid.org/2"); - r2.setRedirectUriType("type-1"); - - ClientRedirectUriEntity r3 = new ClientRedirectUriEntity(); - r3.setClientId(clientId); - r3.setRedirectUri("https://qa.orcid.org/3"); - r3.setRedirectUriType("type-1"); - redirectUris.add(r1); - redirectUris.add(r2); - redirectUris.add(r3); - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/service/ClientDetailsManagerTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/service/ClientDetailsManagerTest.java index a31dc0cc51d..fbe358c77b3 100644 --- a/orcid-core/src/test/java/org/orcid/core/oauth/service/ClientDetailsManagerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/oauth/service/ClientDetailsManagerTest.java @@ -11,7 +11,7 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -25,7 +25,6 @@ import org.orcid.test.DBUnitTest; import org.orcid.test.OrcidJUnit4ClassRunner; import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.transaction.annotation.Transactional; @@ -58,24 +57,6 @@ public static void removeDBUnitData() throws Exception { removeDBUnitData(Arrays.asList("/data/ClientDetailsEntityData.xml", "/data/ProfileEntityData.xml")); } - @Test - @Rollback - @Transactional - public void testLoadClientByClientId() throws Exception { - List all = clientDetailsManager.getAll(); - String[] clientExceptionList = new String[] { "APP-5555555555555555", "APP-5555555555555556", "APP-5555555555555557", "APP-5555555555555558", - "APP-6666666666666666" }; - assertEquals(12, all.size()); - for (ClientDetailsEntity clientDetailsEntity : all) { - ClientDetails clientDetails = clientDetailsManager.loadClientByClientId(clientDetailsEntity.getId()); - assertNotNull(clientDetails); - boolean exceptionClients = Arrays.stream(clientExceptionList).anyMatch(x -> x.equals(clientDetailsEntity.getId())); - if (!exceptionClients) { - checkClientDetails(clientDetails); - } - } - } - @Test @Rollback @Transactional @@ -152,20 +133,15 @@ private void checkClientDetails(ClientDetailsEntity clientDetails) { assertNotNull(clientDetails); assertEquals(clientDetails.getClientDescription(), CLIENT_DESCRIPTION); assertEquals(clientDetails.getClientName(), CLIENT_NAME); - checkClientDetails((ClientDetails) clientDetails); - } - - private void checkClientDetails(ClientDetails clientDetails) { String clientId = clientDetails.getClientId(); assertNotNull(clientId); Set registeredRedirectUris = clientDetails.getRegisteredRedirectUri(); assertNotNull(registeredRedirectUris); - if (clientDetails.getClientId().equals("4444-4444-4444-4445") || clientDetails.getClientId().equals("4444-4444-4444-4498")) { + if (clientId.equals("4444-4444-4444-4445") || clientId.equals("4444-4444-4444-4498")) { assertEquals(2, registeredRedirectUris.size()); } else { assertEquals(1, registeredRedirectUris.size()); } - Collection authorities = clientDetails.getAuthorities(); assertNotNull(authorities); assertEquals(1, authorities.size()); @@ -176,7 +152,7 @@ private void checkClientDetails(ClientDetails clientDetails) { } else if (!clientDetails.getClientId().equals("APP-1234567898765432")) { assertEquals(3, authorizedGrantTypes.size()); } - + String clientSecret = clientDetails.getClientSecret(); assertNotNull(clientSecret); Set resourceIds = clientDetails.getResourceIds(); diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/service/NamespacedRandomCodeGeneratorTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/service/NamespacedRandomCodeGeneratorTest.java deleted file mode 100644 index 7ed6c44d3a6..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/oauth/service/NamespacedRandomCodeGeneratorTest.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.orcid.core.oauth.service; - -import static org.junit.Assert.*; - -import java.util.HashSet; -import java.util.Set; - -import org.junit.Test; - -import junit.framework.Assert; - -public class NamespacedRandomCodeGeneratorTest { - - private static final String base62 = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - - @Test - public void test(){ - //check 1 node uses all chars - NamespacedRandomCodeGenerator g = new NamespacedRandomCodeGenerator(1,1); - Set unique = new HashSet(); - for(char c : base62.toCharArray()) { - unique.add(c); - } - for (int i=0;i<100000;i++){ - String code = g.nextRandomCode(); - if (!base62.contains(""+code.charAt(0))){ - fail("Char outside base 62"); - } - unique.remove(code.charAt(0)); - } - System.out.println(unique); - Assert.assertEquals(0,unique.size()); - - //check two nodes are 0-30 and 31-61 - NamespacedRandomCodeGenerator g1_2 = new NamespacedRandomCodeGenerator(1,2); - NamespacedRandomCodeGenerator g2_2 = new NamespacedRandomCodeGenerator(2,2); - Set unique1_2 = new HashSet(); - Set unique2_2 = new HashSet(); - int j = 0; - for(char c : base62.toCharArray()) { - if (j<31) - unique1_2.add(c); - else - unique2_2.add(c); - j++; - } - for (int i=0;i<100000;i++){ - String code = g1_2.nextRandomCode(); - if (!base62.contains(""+code.charAt(0))){ - fail("Char outside base 62"); - } - unique1_2.remove(code.charAt(0)); - unique2_2.remove(code.charAt(0)); - } - Assert.assertEquals(0,unique1_2.size()); //only removed from first half - Assert.assertEquals(31,unique2_2.size());//all still there - - //do it again for the second generator - j = 0; - for(char c : base62.toCharArray()) { - if (j<31) - unique1_2.add(c); - else - unique2_2.add(c); - j++; - } - for (int i=0;i<100000;i++){ - String code = g2_2.nextRandomCode(); - if (!base62.contains(""+code.charAt(0))){ - fail("Char outside base 62"); - } - unique1_2.remove(code.charAt(0)); - unique2_2.remove(code.charAt(0)); - } - Assert.assertEquals(31,unique1_2.size()); //all still there - Assert.assertEquals(0,unique2_2.size());//only removed from second half - - //--- now three nodes - //check two nodes are 0-30 and 31-61 - NamespacedRandomCodeGenerator g1_3 = new NamespacedRandomCodeGenerator(1,3); - NamespacedRandomCodeGenerator g2_3 = new NamespacedRandomCodeGenerator(2,3); - NamespacedRandomCodeGenerator g3_3 = new NamespacedRandomCodeGenerator(3,3); - Set unique1_3 = new HashSet(); - Set unique2_3 = new HashSet(); - Set unique3_3= new HashSet(); - j = 0; - for(char c : base62.toCharArray()) { - if (j<20) - unique1_3.add(c); - else if (j<40) - unique2_3.add(c); - else - unique3_3.add(c); // has the extra two chars! - j++; - } - for (int i=0;i<100000;i++){ - String code = g1_3.nextRandomCode(); - if (!base62.contains(""+code.charAt(0))){ - fail("Char outside base 62"); - } - unique1_3.remove(code.charAt(0)); - unique2_3.remove(code.charAt(0)); - unique3_3.remove(code.charAt(0)); - } - Assert.assertEquals(0,unique1_3.size()); //only removed from first third - Assert.assertEquals(20,unique2_3.size());//all still there - Assert.assertEquals(22,unique3_3.size());//all still there - - //node 2 of 3 - j = 0; - for(char c : base62.toCharArray()) { - if (j<20) - unique1_3.add(c); - else if (j<40) - unique2_3.add(c); - else - unique3_3.add(c); // has the extra two chars! - j++; - } - for (int i=0;i<100000;i++){ - String code = g2_3.nextRandomCode(); - if (!base62.contains(""+code.charAt(0))){ - fail("Char outside base 62"); - } - unique1_3.remove(code.charAt(0)); - unique2_3.remove(code.charAt(0)); - unique3_3.remove(code.charAt(0)); - } - Assert.assertEquals(20,unique1_3.size()); - Assert.assertEquals(0,unique2_3.size()); - Assert.assertEquals(22,unique3_3.size()); - - //node 3 of 3 - j = 0; - for(char c : base62.toCharArray()) { - if (j<20) - unique1_3.add(c); - else if (j<40) - unique2_3.add(c); - else - unique3_3.add(c); // has the extra two chars! - j++; - } - for (int i=0;i<100000;i++){ - String code = g3_3.nextRandomCode(); - if (!base62.contains(""+code.charAt(0))){ - fail("Char outside base 62"); - } - unique1_3.remove(code.charAt(0)); - unique2_3.remove(code.charAt(0)); - unique3_3.remove(code.charAt(0)); - } - Assert.assertEquals(20,unique1_3.size()); - Assert.assertEquals(20,unique2_3.size()); - Assert.assertEquals(0,unique3_3.size()); - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidAuthorizationCodeServiceTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidAuthorizationCodeServiceTest.java deleted file mode 100644 index cc7ebada5fc..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidAuthorizationCodeServiceTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.orcid.core.oauth.service; - -import static org.junit.Assert.assertNotNull; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; - -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.orcid.core.manager.ProfileEntityManager; -import org.orcid.core.security.OrcidUserDetailsService; -import org.orcid.test.DBUnitTest; -import org.orcid.test.OrcidJUnit4ClassRunner; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; -import org.springframework.security.oauth2.common.exceptions.InvalidGrantException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.ClientDetailsService; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2RequestFactory; -import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices; -import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestFactory; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.transaction.annotation.Transactional; - -/** - * @author Declan Newman (declan) Date: 24/04/2012 - */ -@RunWith(OrcidJUnit4ClassRunner.class) -@ContextConfiguration(locations = { "classpath:test-orcid-core-context.xml" }) -public class OrcidAuthorizationCodeServiceTest extends DBUnitTest { - - @Resource(name = "orcidAuthorizationCodeService") - private AuthorizationCodeServices authorizationCodeServices; - - @Resource(name = "profileEntityManager") - private ProfileEntityManager profileEntityManager; - - @Resource(name = "clientDetailsManager") - private ClientDetailsService clientDetailsService; - - @Resource - private OrcidUserDetailsService orcidUserDetailsService; - - private OAuth2RequestFactory oAuth2RequestFactory; - - @BeforeClass - public static void initDBUnitData() throws Exception { - initDBUnitData(Arrays.asList("/data/SourceClientDetailsEntityData.xml", "/data/ProfileEntityData.xml", - "/data/ClientDetailsEntityData.xml")); - } - - @AfterClass - public static void removeDBUnitData() throws Exception { - removeDBUnitData(Arrays.asList("/data/ClientDetailsEntityData.xml", "/data/ProfileEntityData.xml")); - } - - @Before - public void before() { - oAuth2RequestFactory = new DefaultOAuth2RequestFactory(clientDetailsService); - } - - @Test - @Rollback - @Transactional - public void testCreateAuthorizationCodeWithValidClient() { - AuthorizationRequest request = getAuthorizationRequest("4444-4444-4444-4441"); - OAuth2Authentication oauth2Authentication = new OAuth2Authentication(oAuth2RequestFactory.createOAuth2Request(request), getUserAuthentication("0000-0000-0000-0002")); - String authorizationCode = authorizationCodeServices.createAuthorizationCode(oauth2Authentication); - assertNotNull(authorizationCode); - oauth2Authentication = authorizationCodeServices.consumeAuthorizationCode(authorizationCode); - assertNotNull(oauth2Authentication); - } - - @Test(expected = InvalidGrantException.class) - @Rollback - @Transactional - public void testConsumeNonExistentCode() { - authorizationCodeServices.consumeAuthorizationCode("bodus-code!"); - } - - @Test(expected = InvalidClientException.class) - @Rollback - @Transactional - public void testCreateAuthorizationCodeWithInvalidClient() { - AuthorizationRequest request = getAuthorizationRequest("6444-4444-4444-4441"); - OAuth2Authentication auth = new OAuth2Authentication(oAuth2RequestFactory.createOAuth2Request(request), getUserAuthentication("0000-0000-0000-0002")); - authorizationCodeServices.createAuthorizationCode(auth); - } - - public AuthorizationRequest getAuthorizationRequest(String clientId) { - Set grantedAuthorities = new HashSet(Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"))); - Set resourceIds = new HashSet<>(); - resourceIds.add("orcid"); - - Map params = new HashMap(); - params.put(OAuth2Utils.CLIENT_ID, clientId); - params.put(OAuth2Utils.SCOPE, "a-scope"); - - AuthorizationRequest authorizationRequest = oAuth2RequestFactory.createAuthorizationRequest(params); - authorizationRequest.setAuthorities(grantedAuthorities); - authorizationRequest.setResourceIds(resourceIds); - - return authorizationRequest; - } - - private Authentication getUserAuthentication(String orcid) { - UserDetails details = (UserDetails) orcidUserDetailsService.loadUserByUsername(orcid); - UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(details.getUsername(), "password"); - auth.setDetails(details); - return auth; - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidOauth2TokenDetailServiceTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidOauth2TokenDetailServiceTest.java deleted file mode 100644 index 6982f76b55a..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidOauth2TokenDetailServiceTest.java +++ /dev/null @@ -1,353 +0,0 @@ -package org.orcid.core.oauth.service; - -import static org.hamcrest.core.AllOf.allOf; -import static org.hamcrest.core.AnyOf.anyOf; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsNot.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import java.util.Arrays; -import java.util.Date; -import java.util.List; - -import javax.annotation.Resource; -import javax.persistence.NoResultException; - -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.orcid.core.common.manager.EmailFrequencyManager; -import org.orcid.core.constants.RevokeReason; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.utils.cache.redis.RedisClient; -import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.test.DBUnitTest; -import org.orcid.test.OrcidJUnit4ClassRunner; -import org.orcid.test.TargetProxyHelper; -import org.springframework.test.context.ContextConfiguration; - -/** - * - * @author Angel Montenegro - */ -@RunWith(OrcidJUnit4ClassRunner.class) -@ContextConfiguration(locations = { "classpath:test-orcid-core-context.xml" }) -public class OrcidOauth2TokenDetailServiceTest extends DBUnitTest { - private static final String CLIENT_ID_1 = "APP-5555555555555555"; - private static final String CLIENT_ID_2 = "APP-5555555555555556"; - private static final String USER_ORCID = "0000-0000-0000-0001"; - private static final String USER_ORCID_2 = "0000-0000-0000-0002"; - private static final String USER_ORCID_3 = "0000-0000-0000-0003"; - - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - - @Resource(name="orcidOauth2TokenDetailDao") - private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao; - - @Mock - private RedisClient redisClientMock; - - @BeforeClass - public static void initDBUnitData() throws Exception { - initDBUnitData(Arrays.asList("/data/SubjectEntityData.xml", "/data/SourceClientDetailsEntityData.xml", - "/data/ProfileEntityData.xml")); - } - - @Before - public void before() { - MockitoAnnotations.initMocks(this); - // Enable the cache - TargetProxyHelper.injectIntoProxy(orcidOauth2TokenDetailService, "isTokenCacheEnabled", true); - TargetProxyHelper.injectIntoProxy(orcidOauth2TokenDetailService, "redisClient", redisClientMock); - } - - @AfterClass - public static void removeDBUnitData() throws Exception { - removeDBUnitData(Arrays.asList("/data/ProfileEntityData.xml", "/data/SourceClientDetailsEntityData.xml", - "/data/SubjectEntityData.xml")); - } - - @Test - public void dontGetExpiredTokensTest() { - //Token # 1: expired - Long token1Id = createToken(CLIENT_ID_1, "expired-1", USER_ORCID, new Date(System.currentTimeMillis() - 100000), "/read-limited", false).getId(); - //Token # 2: /activities/update - Long token2Id = createToken(CLIENT_ID_1, "active-1", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/activities/update", false).getId(); - //Token # 3: disabled - Long token3Id = createToken(CLIENT_ID_1, "disabled-1", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/activities/update", true).getId(); - //Token # 4: /read-limited - Long token4Id = createToken(CLIENT_ID_1, "active-2", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/read-limited", false).getId(); - //Fetch all active tokens - List activeTokens = orcidOauth2TokenDetailService.findByUserName(USER_ORCID); - assertNotNull(activeTokens); - assertEquals(2, activeTokens.size()); - assertThat(activeTokens.get(0).getScope(), anyOf(is("/activities/update"), is("/read-limited"))); - assertThat(activeTokens.get(1).getScope(), anyOf(is("/activities/update"), is("/read-limited"))); - - //Find the id of the token with scope '/activities/update' and disable that token - Long tokenToDisableId = null; - for(OrcidOauth2TokenDetail token : activeTokens) { - if("/activities/update".equals(token.getScope())) { - tokenToDisableId = token.getId(); - break; - } - } - - assertNotNull(tokenToDisableId); - //Disable that access token - orcidOauth2TokenDetailService.disableAccessToken(tokenToDisableId, USER_ORCID); - //Fetch the active tokens again, it should contain just one - activeTokens = orcidOauth2TokenDetailService.findByUserName(USER_ORCID); - assertNotNull(activeTokens); - assertEquals(1, activeTokens.size()); - assertEquals("/read-limited", activeTokens.get(0).getScope()); - assertEquals("active-2", activeTokens.get(0).getTokenValue()); - - orcidOauth2TokenDetailDao.remove(token1Id); - orcidOauth2TokenDetailDao.remove(token2Id); - orcidOauth2TokenDetailDao.remove(token3Id); - orcidOauth2TokenDetailDao.remove(token4Id); - } - - @Test - public void removeAllTokensWithSameScopesTest() { - //We will test deleting this token - Long token1Id = createToken(CLIENT_ID_1, "token-1", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/activities/update /read-limited", false).getId(); //Delete - //Should not delete this - Long token2Id = createToken(CLIENT_ID_1, "token-2", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/activities/update", false).getId(); - //Should not delete this - Long token3Id = createToken(CLIENT_ID_1, "token-3", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/read-limited", false).getId(); - //Should delete this one since it have the same scopes but in different order - Long token4Id = createToken(CLIENT_ID_1, "token-4", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/read-limited /activities/update", false).getId(); //Delete - //Should not delete this since it have one scope more /orcid-profile/read-limited - Long token5Id = createToken(CLIENT_ID_1, "token-5", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/orcid-profile/read-limited /activities/update /read-limited", false).getId(); - //Should not delete this since it have one scope more /activities/read-limited - Long token6Id = createToken(CLIENT_ID_1, "token-6", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/read-limited /activities/update /activities/read-limited", false).getId(); - //Should not delete this - Long token7Id = createToken(CLIENT_ID_1, "token-7", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/person/read-limited", false).getId(); - //Should not delete this since it have several more scopes - Long token8Id = createToken(CLIENT_ID_1, "token-8", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/funding/read-limited /read-limited /activities/read-limited /orcid-works/create /affiliations/update /activities/update", false).getId(); - //Should remove this since it contains the same scopes - Long token9Id = createToken(CLIENT_ID_1, "token-9", USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/activities/update /read-limited", false).getId(); //Delete - - - List activeTokens = orcidOauth2TokenDetailService.findByUserName(USER_ORCID); - assertNotNull(activeTokens); - assertEquals(9, activeTokens.size()); - - orcidOauth2TokenDetailService.disableAccessToken(token1Id, USER_ORCID); - activeTokens = orcidOauth2TokenDetailService.findByUserName(USER_ORCID); - assertEquals(6, activeTokens.size()); - - for(OrcidOauth2TokenDetail token : activeTokens) { - assertThat(token.getId(), allOf(not(token1Id), not(token4Id), not(token9Id))); - assertThat(token.getId(), anyOf(is(token2Id), is(token3Id), is(token5Id), is(token6Id), is(token7Id), is(token8Id))); - } - - orcidOauth2TokenDetailDao.remove(token1Id); - orcidOauth2TokenDetailDao.remove(token2Id); - orcidOauth2TokenDetailDao.remove(token3Id); - orcidOauth2TokenDetailDao.remove(token4Id); - orcidOauth2TokenDetailDao.remove(token5Id); - orcidOauth2TokenDetailDao.remove(token6Id); - orcidOauth2TokenDetailDao.remove(token7Id); - orcidOauth2TokenDetailDao.remove(token8Id); - orcidOauth2TokenDetailDao.remove(token9Id); - } - - @Test - public void dontRemoveOtherClientScopesTest() { - Long seed = System.currentTimeMillis(); - Long token1Id = createToken(CLIENT_ID_1, "token-1-" + seed, USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/read-limited", false).getId(); //Delete - Long token2Id = createToken(CLIENT_ID_1, "token-2-" + seed, USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/activities/update", false).getId(); - Long token3Id = createToken(CLIENT_ID_1, "token-3-" + seed, USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/activities/update /read-limited", false).getId(); - Long token4Id = createToken(CLIENT_ID_1, "token-4-" + seed, USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/read-limited", false).getId(); //Delete - - Long token5Id = createToken(CLIENT_ID_2, "token-5-" + seed, USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/read-limited", false).getId(); - Long token6Id = createToken(CLIENT_ID_2, "token-6-" + seed, USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/activities/update", false).getId(); - Long token7Id = createToken(CLIENT_ID_2, "token-7-" + seed, USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/activities/update /read-limited", false).getId(); - Long token8Id = createToken(CLIENT_ID_2, "token-8-" + seed, USER_ORCID, new Date(System.currentTimeMillis() + 100000), "/read-limited", false).getId(); - - List activeTokens = orcidOauth2TokenDetailService.findByUserName(USER_ORCID); - assertNotNull(activeTokens); - assertEquals(8, activeTokens.size()); - - orcidOauth2TokenDetailService.disableAccessToken(token1Id, USER_ORCID); - - activeTokens = orcidOauth2TokenDetailService.findByUserName(USER_ORCID); - assertEquals(6, activeTokens.size()); - - for(OrcidOauth2TokenDetail token : activeTokens) { - assertThat(token.getId(), allOf(not(token1Id), not(token4Id))); - assertThat(token.getId(), anyOf(is(token2Id), is(token3Id), is(token5Id), is(token6Id), is(token7Id), is(token8Id))); - } - } - - @Test - public void disableAccessTokenByUserOrcidTest() { - Date date = new Date(System.currentTimeMillis() + 100000); - createToken(CLIENT_ID_1, "active-1-user-1", USER_ORCID_2, date, "/activities/update", false); - createToken(CLIENT_ID_1, "active-2-user-1", USER_ORCID_2, date, "/activities/update", false); - createToken(CLIENT_ID_1, "active-3-user-1", USER_ORCID_2, date, "/activities/update", false); - createToken(CLIENT_ID_1, "active-1-user-2", USER_ORCID_3, date, "/activities/update", false); - createToken(CLIENT_ID_1, "active-2-user-2", USER_ORCID_3, date, "/activities/update", false); - createToken(CLIENT_ID_1, "active-3-user-2", USER_ORCID_3, date, "/activities/update", false); - - List tokensUser1 = orcidOauth2TokenDetailService.findByClientIdAndUserName(CLIENT_ID_1, USER_ORCID_2); - assertEquals(3, tokensUser1.size()); - for(OrcidOauth2TokenDetail token : tokensUser1) { - assertFalse(token.getTokenDisabled()); - } - - List tokensUser2 = orcidOauth2TokenDetailService.findByClientIdAndUserName(CLIENT_ID_1, USER_ORCID_3); - assertEquals(3, tokensUser2.size()); - for(OrcidOauth2TokenDetail token : tokensUser2) { - assertFalse(token.getTokenDisabled()); - } - - orcidOauth2TokenDetailService.disableAccessTokenByUserOrcid(USER_ORCID_2, RevokeReason.RECORD_DEACTIVATED); - - tokensUser1 = orcidOauth2TokenDetailService.findByClientIdAndUserName(CLIENT_ID_1, USER_ORCID_2); - assertEquals(3, tokensUser1.size()); - for(OrcidOauth2TokenDetail token : tokensUser1) { - // Tokens for this user MUST be disabled at this point - assertTrue(token.getTokenDisabled()); - } - - tokensUser2 = orcidOauth2TokenDetailService.findByClientIdAndUserName(CLIENT_ID_1, USER_ORCID_3); - assertEquals(3, tokensUser2.size()); - for(OrcidOauth2TokenDetail token : tokensUser2) { - assertFalse(token.getTokenDisabled()); - } - } - - @Test - public void disableAccessTokenByCodeAndClientTest() { - Date date = new Date(System.currentTimeMillis() + 100000); - String authCode = "auth-code-1"; - OrcidOauth2TokenDetail dbt1 = createToken(CLIENT_ID_1, "token-1", USER_ORCID, date, "/activities/update", false, authCode); - OrcidOauth2TokenDetail dbt2 = createToken(CLIENT_ID_1, "token-2", USER_ORCID, date, "/activities/update", false, authCode); - OrcidOauth2TokenDetail dbt3 = createToken(CLIENT_ID_1, "token-3", USER_ORCID, date, "/activities/update", false, authCode); - OrcidOauth2TokenDetail dbt4 = createToken(CLIENT_ID_1, "token-4", USER_ORCID_2, date, "/activities/update", false, authCode); - OrcidOauth2TokenDetail dbt5 = createToken(CLIENT_ID_2, "token-5", USER_ORCID_3, date, "/activities/update", false, authCode); - OrcidOauth2TokenDetail dbt6 = createToken(CLIENT_ID_2, "token-6", USER_ORCID, date, "/activities/update", false, authCode); - - // Disable tokens with authCode and CLIENT_ID_1 - orcidOauth2TokenDetailService.disableAccessTokenByCodeAndClient(authCode, CLIENT_ID_1, RevokeReason.AUTH_CODE_REUSED); - - verify(redisClientMock, times(1)).remove("token-1"); - verify(redisClientMock, times(1)).remove("token-2"); - verify(redisClientMock, times(1)).remove("token-3"); - verify(redisClientMock, times(1)).remove("token-4"); - - // Tokens 1, 2, 3 and 4 should be revoked - OrcidOauth2TokenDetail t1 = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue("token-1"); - assertNotNull(t1.getRevocationDate()); - assertEquals(RevokeReason.AUTH_CODE_REUSED.toString(), t1.getRevokeReason()); - OrcidOauth2TokenDetail t2 = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue("token-2"); - assertNotNull(t2.getRevocationDate()); - assertEquals(RevokeReason.AUTH_CODE_REUSED.toString(), t2.getRevokeReason()); - OrcidOauth2TokenDetail t3 = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue("token-3"); - assertNotNull(t3.getRevocationDate()); - assertEquals(RevokeReason.AUTH_CODE_REUSED.toString(), t3.getRevokeReason()); - // This case is never possible, the client used the same auth code to create a token on other user - OrcidOauth2TokenDetail t4 = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue("token-4"); - assertNotNull(t4.getRevocationDate()); - assertEquals(RevokeReason.AUTH_CODE_REUSED.toString(), t4.getRevokeReason()); - - // Tokens 5 and 6 should be active - OrcidOauth2TokenDetail t5 = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue("token-5"); - assertNull(t5.getRevocationDate()); - assertNull(t5.getRevokeReason()); - OrcidOauth2TokenDetail t6 = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue("token-6"); - assertNull(t6.getRevocationDate()); - assertNull(t6.getRevokeReason()); - - // Cleanup - orcidOauth2TokenDetailDao.remove(dbt1.getId()); - orcidOauth2TokenDetailDao.remove(dbt2.getId()); - orcidOauth2TokenDetailDao.remove(dbt3.getId()); - orcidOauth2TokenDetailDao.remove(dbt4.getId()); - orcidOauth2TokenDetailDao.remove(dbt5.getId()); - orcidOauth2TokenDetailDao.remove(dbt6.getId()); - } - - @Test - public void updateScopesTest() { - String tokenValue = "TOKEN123"; - String scopes1 = "/person/read-limited /activities/update /read-limited"; - String scopes2 = "/person/read-limited /read-limited"; - String scopes3 = "/read-limited"; - //We will test deleting this token - Long token1Id = createToken(CLIENT_ID_1, tokenValue, USER_ORCID, new Date(System.currentTimeMillis() + 100000), scopes1, false).getId(); //Delete - OrcidOauth2TokenDetail token1 = orcidOauth2TokenDetailDao.find(token1Id); - assertNotNull(token1); - assertEquals(CLIENT_ID_1, token1.getClientDetailsId()); - assertEquals(tokenValue, token1.getTokenValue()); - assertEquals(USER_ORCID, token1.getOrcid()); - assertEquals(scopes1, token1.getScope()); - assertEquals("bearer", token1.getTokenType()); - - orcidOauth2TokenDetailDao.updateScopes(tokenValue, scopes2); - OrcidOauth2TokenDetail token2 = orcidOauth2TokenDetailDao.findByTokenValue(tokenValue); - assertNotNull(token2); - assertEquals(CLIENT_ID_1, token2.getClientDetailsId()); - assertEquals(tokenValue, token2.getTokenValue()); - assertEquals(USER_ORCID, token2.getOrcid()); - assertEquals(scopes2, token2.getScope()); - assertEquals("bearer", token2.getTokenType()); - - orcidOauth2TokenDetailDao.updateScopes(tokenValue, scopes3); - OrcidOauth2TokenDetail token3 = orcidOauth2TokenDetailDao.findByTokenValue(tokenValue); - assertNotNull(token3); - assertEquals(CLIENT_ID_1, token3.getClientDetailsId()); - assertEquals(tokenValue, token3.getTokenValue()); - assertEquals(USER_ORCID, token3.getOrcid()); - assertEquals(scopes3, token3.getScope()); - assertEquals("bearer", token3.getTokenType()); - - orcidOauth2TokenDetailDao.remove(token1Id); - - try { - orcidOauth2TokenDetailDao.findByTokenValue(tokenValue); - fail(); - } catch(NoResultException nre) { - //Expected behavior - } - } - - private OrcidOauth2TokenDetail createToken(String clientId, String tokenValue, String userOrcid, Date expirationDate, String scopes, boolean disabled) { - return createToken(clientId, tokenValue, userOrcid, expirationDate, scopes, disabled, null); - } - - private OrcidOauth2TokenDetail createToken(String clientId, String tokenValue, String userOrcid, Date expirationDate, String scopes, boolean disabled, String authCode) { - OrcidOauth2TokenDetail token = new OrcidOauth2TokenDetail(); - token.setApproved(true); - token.setClientDetailsId(clientId); - token.setOrcid(userOrcid); - token.setScope(scopes); - token.setTokenDisabled(disabled); - token.setTokenExpiration(expirationDate); - token.setTokenType("bearer"); - token.setTokenValue(tokenValue); - token.setAuthorizationCode(authCode); - orcidOauth2TokenDetailDao.persist(token); - return token; - } - -} diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidRandomValueTokenServicesTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidRandomValueTokenServicesTest.java deleted file mode 100644 index e88c5709da3..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidRandomValueTokenServicesTest.java +++ /dev/null @@ -1,464 +0,0 @@ -package org.orcid.core.oauth.service; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; - -import javax.annotation.Resource; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.constants.RevokeReason; -import org.orcid.core.manager.ClientDetailsManager; -import org.orcid.core.oauth.OrcidOauth2ClientAuthentication; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.oauth.OrcidRandomValueTokenServices; -import org.orcid.core.togglz.Features; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.test.DBUnitTest; -import org.orcid.test.OrcidJUnit4ClassRunner; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; -import org.togglz.junit.TogglzRule; - -/** - * - * @author Will Simpson - */ -@RunWith(OrcidJUnit4ClassRunner.class) -@ContextConfiguration(locations = { "classpath:test-orcid-core-context.xml" }) -public class OrcidRandomValueTokenServicesTest extends DBUnitTest { - - @Resource - private OrcidRandomValueTokenServices tokenServices; - - @Resource - private OrcidOauth2TokenDetailService orcidOauthTokenDetailService; - - @Resource - private ClientDetailsManager clientDetailsManager; - - @Rule - public TogglzRule togglzRule = TogglzRule.allDisabled(Features.class); - - @BeforeClass - public static void initDBUnitData() throws Exception { - initDBUnitData(Arrays.asList("/data/SubjectEntityData.xml", "/data/SourceClientDetailsEntityData.xml", - "/data/ProfileEntityData.xml", "/data/ClientDetailsEntityData.xml", "/data/OrcidOauth2AuthorisationDetailsData.xml")); - } - - @AfterClass - public static void removeDBUnitData() throws Exception { - removeDBUnitData(Arrays.asList("/data/OrcidOauth2AuthorisationDetailsData.xml", "/data/ClientDetailsEntityData.xml", "/data/ProfileEntityData.xml", - "/data/SubjectEntityData.xml")); - } - - @Test - public void testCreateReadLimitedAccessToken() { - Date earliestExpiry = oneHoursTime(); - Map authorizationParameters = new HashMap<>(); - String clientId = "4444-4444-4444-4441"; - authorizationParameters.put(OAuth2Utils.CLIENT_ID, clientId); - authorizationParameters.put(OAuth2Utils.SCOPE, "/orcid-profile/read-limited"); - OAuth2Request request = new OAuth2Request(Collections. emptyMap(), clientId, Collections. emptyList(), true, new HashSet(Arrays.asList("/orcid-profile/read-limited")), Collections. emptySet(), null, Collections. emptySet(), Collections. emptyMap()); - - ClientDetailsEntity clientDetails = clientDetailsManager.findByClientId(clientId); - Authentication userAuthentication = new OrcidOauth2ClientAuthentication(clientDetails); - OAuth2Authentication authentication = new OAuth2Authentication(request, userAuthentication); - OAuth2AccessToken oauth2AccessToken = tokenServices.createAccessToken(authentication); - - Date latestExpiry = oneHoursTime(); - - assertNotNull(oauth2AccessToken); - assertFalse(oauth2AccessToken.getExpiration().before(earliestExpiry)); - assertFalse(oauth2AccessToken.getExpiration().after(latestExpiry)); - } - - @Test - public void testCreateAddWorkAccessToken() { - Date earliestExpiry = oneHoursTime(); - - Map authorizationParameters = new HashMap<>(); - String clientId = "4444-4444-4444-4441"; - authorizationParameters.put(OAuth2Utils.CLIENT_ID, clientId); - authorizationParameters.put(OAuth2Utils.SCOPE, "/orcid-works/create"); - OAuth2Request request = new OAuth2Request(Collections. emptyMap(), clientId, Collections. emptyList(), true, new HashSet(Arrays.asList("/orcid-profile/read-limited")), Collections. emptySet(), null, Collections. emptySet(), Collections. emptyMap()); - ClientDetailsEntity clientDetails = clientDetailsManager.findByClientId(clientId); - Authentication userAuthentication = new OrcidOauth2ClientAuthentication(clientDetails); - OAuth2Authentication authentication = new OAuth2Authentication(request, userAuthentication); - OAuth2AccessToken oauth2AccessToken = tokenServices.createAccessToken(authentication); - - Date latestExpiry = oneHoursTime(); - - assertNotNull(oauth2AccessToken); - assertFalse(oauth2AccessToken.getExpiration().before(earliestExpiry)); - assertFalse(oauth2AccessToken.getExpiration().after(latestExpiry)); - } - - @Test - public void testReissuedAccessTokenHasUpdatedExpiration() throws InterruptedException { - Date earliestExpiry = oneHoursTime(); - - Map authorizationParameters = new HashMap<>(); - String clientId = "4444-4444-4444-4441"; - authorizationParameters.put(OAuth2Utils.CLIENT_ID, clientId); - authorizationParameters.put(OAuth2Utils.SCOPE, "/orcid-works/create"); - OAuth2Request request = new OAuth2Request(Collections. emptyMap(), clientId, Collections. emptyList(), true, new HashSet(Arrays.asList("/orcid-profile/read-limited")), Collections. emptySet(), null, Collections. emptySet(), Collections. emptyMap()); - ClientDetailsEntity clientDetails = clientDetailsManager.findByClientId(clientId); - Authentication userAuthentication = new OrcidOauth2ClientAuthentication(clientDetails); - OAuth2Authentication authentication = new OAuth2Authentication(request, userAuthentication); - OAuth2AccessToken oauth2AccessToken = tokenServices.createAccessToken(authentication); - - Date latestExpiry = oneHoursTime(); - - assertNotNull(oauth2AccessToken); - assertFalse(oauth2AccessToken.getExpiration().before(earliestExpiry)); - assertFalse(oauth2AccessToken.getExpiration().after(latestExpiry)); - - Thread.sleep(1000); - earliestExpiry = oneHoursTime(); - - OAuth2AccessToken reissuedOauth2AccessToken = tokenServices.createAccessToken(authentication); - - latestExpiry = oneHoursTime(); - - assertNotNull(reissuedOauth2AccessToken); - - assertFalse(reissuedOauth2AccessToken.getExpiration().before(earliestExpiry)); - assertFalse(reissuedOauth2AccessToken.getExpiration().after(latestExpiry)); - } - - private Date twentyYearsTime() { - Calendar earliestExpiry = new GregorianCalendar(); - // This is roughly 2 years in seconds - used in the implementation, but - // not sure how was calculated now. - earliestExpiry.add(Calendar.SECOND, 631138519); - return earliestExpiry.getTime(); - } - - private Date oneHoursTime() { - Calendar earliestExpiry = new GregorianCalendar(); - earliestExpiry.add(Calendar.HOUR, 1); - return earliestExpiry.getTime(); - } - - @Test - public void invalidTokenThrowsInvalidTokenExceptionTest() { - // Mock request attributes - MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); - RequestAttributes attrs = new ServletRequestAttributes(mockHttpServletRequest); - RequestContextHolder.setRequestAttributes(attrs); - String invalidTokenValue = "invalid"; - - mockHttpServletRequest.setMethod(RequestMethod.GET.name()); - catchInvalidTokenExceptionOnLoadAuthentication(invalidTokenValue, "Invalid access token: invalid"); - - mockHttpServletRequest.setMethod(RequestMethod.POST.name()); - catchInvalidTokenExceptionOnLoadAuthentication(invalidTokenValue, "Invalid access token: invalid"); - - mockHttpServletRequest.setMethod(RequestMethod.PUT.name()); - catchInvalidTokenExceptionOnLoadAuthentication(invalidTokenValue, "Invalid access token: invalid"); - - mockHttpServletRequest.setMethod(RequestMethod.DELETE.name()); - catchInvalidTokenExceptionOnLoadAuthentication(invalidTokenValue, "Invalid access token: invalid"); - } - - /** - * Check that the token created with a non persistent code will expire within an hour - * */ - @Test - public void tokenExpireInAnHourTest() throws InterruptedException { - Map authorizationParameters = new HashMap<>(); - String clientId = "4444-4444-4444-4441"; - authorizationParameters.put(OAuth2Utils.CLIENT_ID, clientId); - authorizationParameters.put(OAuth2Utils.SCOPE, "/orcid-works/create"); - authorizationParameters.put("code", "code2"); - - OAuth2Request request = new OAuth2Request(Collections. emptyMap(), clientId, Collections. emptyList(), true, new HashSet(Arrays.asList("/orcid-profile/read-limited")), Collections. emptySet(), null, Collections. emptySet(), Collections. emptyMap()); - ClientDetailsEntity clientDetails = clientDetailsManager.findByClientId(clientId); - Authentication userAuthentication = new OrcidOauth2ClientAuthentication(clientDetails); - OAuth2Authentication authentication = new OAuth2Authentication(request, userAuthentication); - OAuth2AccessToken oauth2AccessToken = tokenServices.createAccessToken(authentication); - - Date tokenExpiration = oauth2AccessToken.getExpiration(); - Thread.sleep(2000); - - //The token expires in less than one hour - assertFalse(tokenExpiration.after(oneHoursTime())); - } - - /** - * Check that the token created with a persistent code will expire within 20 years - * */ - @Test - public void tokenExpireIn20YearsTest() throws InterruptedException { - Date in20years = twentyYearsTime(); - - Thread.sleep(2000); - - Map requestParameters = new HashMap<>(); - String clientId = "4444-4444-4444-4441"; - requestParameters.put(OAuth2Utils.CLIENT_ID, clientId); - requestParameters.put(OAuth2Utils.SCOPE, "/orcid-works/create"); - requestParameters.put("code", "code1"); - requestParameters.put(OrcidOauth2Constants.IS_PERSISTENT, "true"); - - OAuth2Request request = new OAuth2Request(requestParameters, clientId, Collections. emptyList(), true, new HashSet(Arrays.asList("/orcid-profile/read-limited")), Collections. emptySet(), null, Collections. emptySet(), Collections. emptyMap()); - ClientDetailsEntity clientDetails = clientDetailsManager.findByClientId(clientId); - Authentication userAuthentication = new OrcidOauth2ClientAuthentication(clientDetails); - OAuth2Authentication authentication = new OAuth2Authentication(request, userAuthentication); - OAuth2AccessToken oauth2AccessToken = tokenServices.createAccessToken(authentication); - - - Date tokenExpiration = oauth2AccessToken.getExpiration(); - - //The token expires in 20 years - assertFalse(in20years.after(tokenExpiration)); - - in20years = twentyYearsTime(); - - //Confirm the token expires in 20 years - assertFalse(tokenExpiration.after(in20years)); - } - - @Test - public void expiredTokenDoesntWorkOnGetPostPutWithTogglzOnTest() { - // Mock request attributes - MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); - RequestAttributes attrs = new ServletRequestAttributes(mockHttpServletRequest); - RequestContextHolder.setRequestAttributes(attrs); - - // Check GET requests fail - checkAuthenticationFailsOnExpiredTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.GET); - // Check POST requests fail - checkAuthenticationFailsOnExpiredTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.POST); - // Check PUT requests fail - checkAuthenticationFailsOnExpiredTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.PUT); - } - - private void checkAuthenticationFailsOnExpiredTokenWithRequestMethod(MockHttpServletRequest mockHttpServletRequest, RequestMethod rm) { - mockHttpServletRequest.setMethod(rm.name()); - - OrcidOauth2TokenDetail expiredToken = buildExpiredToken("token-value-" + rm.name()); - expiredToken = buildExpiredToken("token-value-2-" + rm.name()); - orcidOauthTokenDetailService.createNew(expiredToken); - - // The first time we try to use it, we get a InvalidTokenException with message Access token expired: token-value - catchInvalidTokenExceptionOnLoadAuthentication("token-value-2-" + rm.name(), "Access token expired: token-value-2-" + rm.name()); - - // Second time we try to use it, we get a InvalidTokenException with message Invalid access token: token-value - catchInvalidTokenExceptionOnLoadAuthentication("token-value-2-" + rm.name(), "Invalid access token: token-value-2-" + rm.name()); - } - - @Test - public void disabedTokenDoesntWorkOnGetPostPutTest() { - // Mock request attributes - MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); - RequestAttributes attrs = new ServletRequestAttributes(mockHttpServletRequest); - RequestContextHolder.setRequestAttributes(attrs); - - // All GET requests should fail, regardless of the RevokeReason - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.GET, RevokeReason.AUTH_CODE_REUSED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.GET, RevokeReason.CLIENT_REVOKED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.GET, RevokeReason.RECORD_DEACTIVATED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.GET, RevokeReason.STAFF_REVOKED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.GET, RevokeReason.USER_REVOKED); - - // All POST requests should fail, regardless of the RevokeReason - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.POST, RevokeReason.AUTH_CODE_REUSED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.POST, RevokeReason.CLIENT_REVOKED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.POST, RevokeReason.RECORD_DEACTIVATED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.POST, RevokeReason.STAFF_REVOKED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.POST, RevokeReason.USER_REVOKED); - - // All PUT requests should fail, regardless of the RevokeReason - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.PUT, RevokeReason.AUTH_CODE_REUSED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.PUT, RevokeReason.CLIENT_REVOKED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.PUT, RevokeReason.RECORD_DEACTIVATED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.PUT, RevokeReason.STAFF_REVOKED); - checkAuthenticationFailsOnDisabledTokenWithRequestMethod(mockHttpServletRequest, RequestMethod.PUT, RevokeReason.USER_REVOKED); - } - - private void checkAuthenticationFailsOnDisabledTokenWithRequestMethod(MockHttpServletRequest mockHttpServletRequest, RequestMethod rm, RevokeReason revokeReason) { - mockHttpServletRequest.setMethod(rm.name()); - - OrcidOauth2TokenDetail disabledToken = buildDisabledToken("token-value-" + rm.name() + revokeReason.name(), revokeReason); - disabledToken = buildDisabledToken("token-value-2-" + rm.name() + revokeReason.name(), revokeReason); - orcidOauthTokenDetailService.createNew(disabledToken); - - catchInvalidTokenExceptionOnLoadAuthentication("token-value-2-" + rm.name(), "Invalid access token: token-value-2-" + rm.name()); - } - - @Test - public void disabledTokenOnDeleteWithTogglzOnTest() { - // Mock request attributes - MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); - RequestAttributes attrs = new ServletRequestAttributes(mockHttpServletRequest); - RequestContextHolder.setRequestAttributes(attrs); - mockHttpServletRequest.setMethod(RequestMethod.DELETE.name()); - - /////////////////////////////// - // Active tokens should work // - /////////////////////////////// - String activeTokenValue = "active-token-" + Math.random(); - OrcidOauth2TokenDetail activeToken = buildToken(activeTokenValue, "/activites-update"); - orcidOauthTokenDetailService.createNew(activeToken); - try { - tokenServices.loadAuthentication(activeTokenValue); - } catch(Exception e) { - fail(e.getMessage()); - } - - ////////////////////////////// - // USER_REVOKED should work // - ////////////////////////////// - String tokenValue = "token-value-" + RequestMethod.DELETE + RevokeReason.USER_REVOKED; - OrcidOauth2TokenDetail userRevokedDisabledToken = buildDisabledToken(tokenValue, RevokeReason.USER_REVOKED); - orcidOauthTokenDetailService.createNew(userRevokedDisabledToken); - - try { - tokenServices.loadAuthentication(tokenValue); - } catch(Exception e) { - fail(e.getMessage()); - } - - /////////////////////////// - // All other should fail // - /////////////////////////// - disabledTokensOnDeleteShouldAllwaysFailIfTheRevokeReasonIsNotUserRevoked(); - } - - private void disabledTokensOnDeleteShouldAllwaysFailIfTheRevokeReasonIsNotUserRevoked() { - // AUTH_CODE_REUSED should fail - String tokenValue = "token-value-" + Math.random() + "-" + RequestMethod.DELETE + RevokeReason.AUTH_CODE_REUSED; - OrcidOauth2TokenDetail disabledToken = buildDisabledToken(tokenValue, RevokeReason.AUTH_CODE_REUSED); - orcidOauthTokenDetailService.createNew(disabledToken); - - try { - tokenServices.loadAuthentication(tokenValue); - fail(); - } catch(InvalidTokenException e) { - assertEquals("Invalid access token: " + tokenValue + ", revoke reason: AUTH_CODE_REUSED", e.getMessage()); - } - - // CLIENT_REVOKED should fail - tokenValue = "token-value-" + Math.random() + "-" + RequestMethod.DELETE + RevokeReason.CLIENT_REVOKED; - disabledToken = buildDisabledToken(tokenValue, RevokeReason.CLIENT_REVOKED); - orcidOauthTokenDetailService.createNew(disabledToken); - - try { - tokenServices.loadAuthentication(tokenValue); - fail(); - } catch(InvalidTokenException e) { - assertEquals("Invalid access token: " + tokenValue + ", revoke reason: CLIENT_REVOKED", e.getMessage()); - } - - // RECORD_DEACTIVATED should fail - tokenValue = "token-value-" + Math.random() + "-" + RequestMethod.DELETE + RevokeReason.RECORD_DEACTIVATED; - disabledToken = buildDisabledToken(tokenValue, RevokeReason.RECORD_DEACTIVATED); - orcidOauthTokenDetailService.createNew(disabledToken); - - try { - tokenServices.loadAuthentication(tokenValue); - fail(); - } catch(InvalidTokenException e) { - assertEquals("Invalid access token: " + tokenValue + ", revoke reason: RECORD_DEACTIVATED", e.getMessage()); - } - - // STAFF_REVOKED should fail - tokenValue = "token-value-" + Math.random() + "-" + RequestMethod.DELETE + RevokeReason.STAFF_REVOKED; - disabledToken = buildDisabledToken(tokenValue, RevokeReason.STAFF_REVOKED); - orcidOauthTokenDetailService.createNew(disabledToken); - - try { - tokenServices.loadAuthentication(tokenValue); - fail(); - } catch(InvalidTokenException e) { - assertEquals("Invalid access token: " + tokenValue + ", revoke reason: STAFF_REVOKED", e.getMessage()); - } - } - - /** - * Load authentication using a persistent token - * */ - @Test - public void loadAuthenticationWithPersistentTokenTest() { - try { - OAuth2Authentication result = tokenServices.loadAuthentication("persistent-token-2"); - assertNotNull(result); - } catch(Exception e) { - fail(); - } - } - - private void catchInvalidTokenExceptionOnLoadAuthentication(String invalidTokenValue, String expectedMessage) { - try { - tokenServices.loadAuthentication(invalidTokenValue); - fail("Invalid access token must fail"); - } catch (InvalidTokenException i) { - assertEquals(expectedMessage, i.getMessage()); - } catch (Exception e) { - fail("Invalid exception found: " + e.getCause()); - } - } - - private OrcidOauth2TokenDetail buildExpiredToken(String tokenValue) { - return buildExpiredOrDisabledToken(tokenValue, true, null); - } - - private OrcidOauth2TokenDetail buildDisabledToken(String tokenValue, RevokeReason revokeReason) { - return buildExpiredOrDisabledToken(tokenValue, false, revokeReason); - } - - private OrcidOauth2TokenDetail buildExpiredOrDisabledToken(String tokenValue, Boolean buildExpired, RevokeReason revokeReason) { - OrcidOauth2TokenDetail token = buildToken(tokenValue, "/read-limited"); - if(buildExpired) { - token.setTokenExpiration(new Date(System.currentTimeMillis() - 60000)); - } else { - token.setTokenExpiration(new Date(System.currentTimeMillis() + 60000)); - token.setTokenDisabled(true); - token.setRevokeReason(revokeReason.name()); - token.setRevocationDate(new Date()); - } - return token; - } - - private OrcidOauth2TokenDetail buildToken(String tokenValue, String scope) { - OrcidOauth2TokenDetail token = new OrcidOauth2TokenDetail(); - token.setApproved(true); - token.setAuthenticationKey("authentication-key"); - token.setClientDetailsId("4444-4444-4444-4441"); - token.setOrcid("4444-4444-4444-4442"); - token.setResourceId("orcid"); - token.setScope(scope); - token.setTokenValue(tokenValue); - return token; - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidTokenStoreServiceTest.java b/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidTokenStoreServiceTest.java deleted file mode 100644 index 46a9bc9af7a..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/oauth/service/OrcidTokenStoreServiceTest.java +++ /dev/null @@ -1,279 +0,0 @@ -package org.orcid.core.oauth.service; - -import static org.hamcrest.core.AnyOf.anyOf; -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; - -import javax.annotation.Resource; - -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.ClientDetailsManager; -import org.orcid.core.manager.ProfileEntityManager; -import org.orcid.core.manager.SourceNameCacheManager; -import org.orcid.core.manager.v3.read_only.RecordNameManagerReadOnly; -import org.orcid.core.oauth.OrcidOauth2UserAuthentication; -import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; -import org.orcid.persistence.dao.RecordNameDao; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.test.DBUnitTest; -import org.orcid.test.OrcidJUnit4ClassRunner; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.oauth2.common.DefaultExpiringOAuth2RefreshToken; -import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; -import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken; -import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.OAuth2RefreshToken; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.OAuth2Request; -import org.springframework.security.oauth2.provider.token.TokenStore; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.transaction.annotation.Transactional; - -/** - * @author Declan Newman (declan) Date: 20/04/2012 - */ -@RunWith(OrcidJUnit4ClassRunner.class) -@ContextConfiguration(locations = { "classpath:test-orcid-core-context.xml" }) -public class OrcidTokenStoreServiceTest extends DBUnitTest { - - @Resource(name = "orcidTokenStore") - private TokenStore orcidTokenStoreService; - - @Resource - private ProfileEntityManager profileEntityManager; - - @Resource(name="orcidOauth2TokenDetailDao") - private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDao; - - @Resource - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource - private SourceNameCacheManager sourceNameCacheManager; - - @Mock - private ClientDetailsManager mockClientDetailsManager; - - @Mock - private RecordNameDao mockRecordNameDao; - - @Mock - private RecordNameManagerReadOnly mockRecordNameManager; - - @BeforeClass - public static void initDBUnitData() throws Exception { - initDBUnitData(Arrays.asList("/data/SubjectEntityData.xml", "/data/SourceClientDetailsEntityData.xml", - "/data/ProfileEntityData.xml", "/data/ClientDetailsEntityData.xml", "/data/OrcidOauth2AuthorisationDetailsData.xml")); - } - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - } - - @AfterClass - public static void removeDBUnitData() throws Exception { - removeDBUnitData(Arrays.asList("/data/OrcidOauth2AuthorisationDetailsData.xml", "/data/ClientDetailsEntityData.xml", "/data/ProfileEntityData.xml", - "/data/SubjectEntityData.xml")); - } - - @Test - public void testReadAuthentication() throws Exception { - OAuth2Authentication oAuth2Authentication = orcidTokenStoreService.readAuthentication("persistent-token-2"); - assertNotNull(oAuth2Authentication); - OAuth2Request oAuth2Request = oAuth2Authentication.getOAuth2Request(); - assertNotNull(oAuth2Request); - Object principal = oAuth2Authentication.getPrincipal(); - assertNotNull(principal); - assertTrue(!oAuth2Authentication.isClientOnly()); - } - - @Test - @Transactional - public void testStoreAccessToken() throws Exception { - String clientId = "4444-4444-4444-4441"; - DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken("some-long-oauth2-token-value-9"); - - ExpiringOAuth2RefreshToken refreshToken = new DefaultExpiringOAuth2RefreshToken("some-long-oauth2-refresh-value-9", new Date()); - token.setRefreshToken(refreshToken); - token.setScope(new HashSet(Arrays.asList("/orcid-bio/read", "/orcid-works/read"))); - token.setTokenType("bearer"); - token.setExpiration(new Date()); - token.setAdditionalInformation(new HashMap()); - - Map parameters = new HashMap(); - parameters.put("client_id", clientId); - parameters.put("state", "read"); - parameters.put("scope", "/orcid-profile/write"); - parameters.put("redirect_uri", "http://www.google.com/"); - parameters.put("response_type", "bearer"); - OAuth2Request request = new OAuth2Request(Collections. emptyMap(), clientId, Collections. emptyList(), true, new HashSet(Arrays.asList("/orcid-profile/read-limited")), Collections. emptySet(), null, Collections. emptySet(), Collections. emptyMap()); - - ProfileEntity profileEntity = profileEntityManager.findByOrcid("4444-4444-4444-4444"); - OrcidOauth2UserAuthentication userAuthentication = new OrcidOauth2UserAuthentication(profileEntity, true); - - OAuth2Authentication authentication = new OAuth2Authentication(request, userAuthentication); - - assertFalse(token.getAdditionalInformation().containsKey(OrcidOauth2Constants.TOKEN_ID)); - orcidTokenStoreService.storeAccessToken(token, authentication); - assertTrue(token.getAdditionalInformation().containsKey(OrcidOauth2Constants.TOKEN_ID)); - } - - @Test - public void testReadAccessToken() throws Exception { - OAuth2AccessToken oAuth2AccessToken = orcidTokenStoreService.readAccessToken("some-long-oauth2-token-value-1"); - assertNotNull(oAuth2AccessToken); - } - - @Test - public void testRemoveAccessToken() throws Exception { - OAuth2AccessToken accessToken = new DefaultOAuth2AccessToken("code3"); - orcidTokenStoreService.removeAccessToken(accessToken); - OAuth2AccessToken oAuth2AccessToken = orcidTokenStoreService.readAccessToken("code3"); - assertNull(oAuth2AccessToken); - } - - @Test - @Transactional - public void testReadAuthenticationForRefreshToken() throws Exception { - OAuth2RefreshToken refreshToken = new DefaultOAuth2RefreshToken("some-long-oauth2-refresh-value-1"); - OAuth2Authentication oAuth2Authentication = orcidTokenStoreService.readAuthenticationForRefreshToken(refreshToken); - assertNotNull(oAuth2Authentication); - } - - @Test - public void testRemoveByRefreshToken() throws Exception { - OAuth2AccessToken token = orcidTokenStoreService.readAccessToken("some-long-oauth2-token-value-3"); - assertNotNull(token); - orcidTokenStoreService.removeRefreshToken(token.getRefreshToken()); - token = orcidTokenStoreService.readAccessToken("some-long-oauth2-token-value-3"); - assertNull(token); - } - - @Test - public void testRemoveAccessTokenUsingRefreshToken() throws Exception { - OAuth2AccessToken token = orcidTokenStoreService.readAccessToken("persistent-token-1"); - orcidTokenStoreService.removeAccessTokenUsingRefreshToken(token.getRefreshToken()); - token = orcidTokenStoreService.readAccessToken("persistent-token-1"); - assertNull(token); - } - - @Test - @Transactional - public void testGetAccessToken() throws Exception { - String clientId = "APP-5555555555555555"; - String orcid = "0000-0000-0000-0001"; - String scope = "/read-limited"; - String accessTokenValue = "00000000-0000-0000-0000-00000000000"; - Map parameters = new HashMap(); - parameters.put("client_id", clientId); - parameters.put("state", "a-state"); - parameters.put("scope", "/read-limited"); - parameters.put("redirect_uri", "http://www.google.com/"); - parameters.put("response_type", "bearer"); - OAuth2Request request = - new OAuth2Request(Collections. emptyMap(), clientId, Collections. emptyList(), true, new HashSet(Arrays.asList(scope)), Collections. emptySet(), null, Collections. emptySet(), Collections. emptyMap()); - - ProfileEntity profileEntity = profileEntityManager.findByOrcid(orcid); - OrcidOauth2UserAuthentication userAuthentication = new OrcidOauth2UserAuthentication(profileEntity, true); - - OAuth2Authentication authentication = new OAuth2Authentication(request, userAuthentication); - - OAuth2AccessToken accessToken = orcidTokenStoreService.getAccessToken(authentication); - assertNotNull(accessToken); - assertEquals(accessTokenValue, accessToken.getValue()); - assertEquals(1, accessToken.getScope().size()); - assertTrue(accessToken.getScope().contains(scope)); - } - - @Test - public void testFindTokensByUserName() throws Exception { - Collection tokensByUserName = orcidTokenStoreService.findTokensByClientIdAndUserName("4444-4444-4444-4441", "4444-4444-4444-4441"); - assertNotNull(tokensByUserName); - assertEquals(1, tokensByUserName.size()); - } - - @Test - public void testFindTokensByClientId() throws Exception { - Collection tokensByClientId = orcidTokenStoreService.findTokensByClientId("4444-4444-4444-4441"); - assertNotNull(tokensByClientId); - assertEquals(1, tokensByClientId.size()); - } - - @Test - public void testDisabledTokensAreNotReturnedWhenLookingByClientAndUserName() { - String clientId = "4444-4444-4444-4441"; - String userId = "0000-0000-0000-0001"; - OrcidOauth2TokenDetail token1 = createAccessToken("enabled-1", "/read-limited", clientId, userId, false); - assertNotNull(token1); - assertNotNull(token1.getId()); - - OrcidOauth2TokenDetail token2 = createAccessToken("enabled-2", "/read-limited", clientId, userId, false); - assertNotNull(token2); - assertNotNull(token2.getId()); - - OrcidOauth2TokenDetail token3 = createAccessToken("enabled-3", "/read-limited", clientId, userId, false); - assertNotNull(token3); - assertNotNull(token3.getId()); - - OrcidOauth2TokenDetail disabledToken1 = createAccessToken("disabled-1", "/read-limited", clientId, userId, true); - assertNotNull(disabledToken1); - assertNotNull(disabledToken1.getId()); - - OrcidOauth2TokenDetail disabledToken2 = createAccessToken("disabled-2", "/read-limited", clientId, userId, true); - assertNotNull(disabledToken2); - assertNotNull(disabledToken2.getId()); - - OrcidOauth2TokenDetail disabledToken3 = createAccessToken("disabled-3", "/read-limited", clientId, userId, true); - assertNotNull(disabledToken3); - assertNotNull(disabledToken3.getId()); - - Collection tokens = orcidTokenStoreService.findTokensByClientIdAndUserName(clientId, userId); - assertNotNull(tokens); - assertEquals(3, tokens.size()); - - for(OAuth2AccessToken token : tokens) { - assertThat(token.getValue(), anyOf(is("enabled-1"), is("enabled-2"), is("enabled-3"))); - } - } - - @Transactional - private OrcidOauth2TokenDetail createAccessToken(String tokenValue, String scope, String clientId, String userOrcid, boolean disabled) { - OrcidOauth2TokenDetail token = new OrcidOauth2TokenDetail(); - token.setApproved(true); - token.setClientDetailsId(clientId); - token.setOrcid(userOrcid); - token.setScope(scope); - token.setTokenDisabled(disabled); - token.setTokenValue(tokenValue); - orcidOauth2TokenDetailDao.persist(token); - assertNotNull(token.getDateCreated()); - assertNotNull(token.getLastModified()); - return token; - } - -} diff --git a/orcid-core/src/test/java/org/orcid/core/security/DefaultOAuthClientVisibilityTest.java b/orcid-core/src/test/java/org/orcid/core/security/DefaultOAuthClientVisibilityTest.java deleted file mode 100644 index 950d416295d..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/security/DefaultOAuthClientVisibilityTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.orcid.core.security; - -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -import java.util.Date; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.orcid.core.BaseTest; -import org.orcid.core.oauth.OrcidOAuth2Authentication; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.oauth.OrcidOauth2UserAuthentication; -import org.orcid.jaxb.model.message.OrcidMessage; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.jaxb.model.message.Visibility; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.core.utils.DateFieldsOnBaseEntityUtils; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.test.annotation.Rollback; -import org.springframework.transaction.annotation.Transactional; - -public class DefaultOAuthClientVisibilityTest extends BaseTest { - - @Resource(name = "defaultPermissionChecker") - private PermissionChecker permissionChecker; - - @Mock - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - - @Before - public void mockDependencies() throws Exception { - DefaultPermissionChecker defaultPermissionChecker = (DefaultPermissionChecker) permissionChecker; - defaultPermissionChecker.setOrcidOauthTokenDetailService(orcidOauth2TokenDetailService); - } - - @Test - @Transactional - @Rollback - public void testCheckClientPermissionsAllowOnlyPublicAndLimitedVisibility() throws Exception { - Set resourceIds = new HashSet(Arrays.asList("orcid")); - HashSet grantedAuthorities = new HashSet(Arrays.asList(new SimpleGrantedAuthority("ROLE_CLIENT"))); - AuthorizationRequest request = new AuthorizationRequest("4444-4444-4444-4446", Arrays.asList("/orcid-bio/external-identifiers/create")); - request.setAuthorities(grantedAuthorities); - request.setResourceIds(resourceIds); - ProfileEntity entity = new ProfileEntity("4444-4444-4444-4446"); - OrcidOauth2UserAuthentication oauth2UserAuthentication = new OrcidOauth2UserAuthentication(entity, true); - // we care only that an OAuth client request results in the correct - // visibilities - OrcidOAuth2Authentication oAuth2Authentication = new OrcidOAuth2Authentication(request, oauth2UserAuthentication, "made-up-token"); - - OrcidOauth2TokenDetail tokenDetail = new OrcidOauth2TokenDetail(); - tokenDetail.setScope("/orcid-bio/external-identifiers/create"); - DateFieldsOnBaseEntityUtils.setDateFields(tokenDetail, new Date()); - when(orcidOauth2TokenDetailService.findNonDisabledByTokenValue(any(String.class))).thenReturn(tokenDetail); - ScopePathType scopePathType = ScopePathType.ORCID_BIO_EXTERNAL_IDENTIFIERS_CREATE; - Set visibilitiesForClient = permissionChecker.obtainVisibilitiesForAuthentication(oAuth2Authentication, scopePathType, getOrcidMessage()); - assertTrue(visibilitiesForClient.size() == 3); - assertTrue(visibilitiesForClient.contains(Visibility.LIMITED)); - assertTrue(visibilitiesForClient.contains(Visibility.REGISTERED_ONLY)); - assertTrue(visibilitiesForClient.contains(Visibility.PUBLIC)); - } - - private OrcidMessage getOrcidMessage() throws JAXBException { - JAXBContext context = JAXBContext.newInstance(OrcidMessage.class); - Unmarshaller unmarshaller = context.createUnmarshaller(); - return (OrcidMessage) unmarshaller.unmarshal(DefaultPermissionCheckerTest.class.getResourceAsStream("/orcid-full-message-no-visibility-latest.xml")); - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/security/DefaultPermissionCheckerTest.java b/orcid-core/src/test/java/org/orcid/core/security/DefaultPermissionCheckerTest.java deleted file mode 100644 index fd3c4f47c1f..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/security/DefaultPermissionCheckerTest.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.orcid.core.security; - -import static org.junit.Assert.fail; - -import java.security.AccessControlException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.orcid.core.manager.ProfileEntityCacheManager; -import org.orcid.core.manager.ProfileEntityManager; -import org.orcid.core.oauth.OrcidOAuth2Authentication; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.oauth.OrcidOauth2UserAuthentication; -import org.orcid.jaxb.model.message.OrcidMessage; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.test.DBUnitTest; -import org.orcid.test.OrcidJUnit4ClassRunner; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.transaction.annotation.Transactional; - -/** - * @author Declan Newman (declan) Date: 27/04/2012 - */ -@RunWith(OrcidJUnit4ClassRunner.class) -@ContextConfiguration(locations = { "classpath:test-orcid-core-context.xml" }) -public class DefaultPermissionCheckerTest extends DBUnitTest { - - @Resource(name = "defaultPermissionChecker") - private PermissionChecker defaultPermissionChecker; - - @Resource(name = "profileEntityManager") - private ProfileEntityManager profileEntityManager; - - @Resource - private OrcidOauth2TokenDetailService tokenDetailService; - - @Resource(name = "profileEntityCacheManager") - ProfileEntityCacheManager profileEntityCacheManager; - - @BeforeClass - public static void initDBUnitData() throws Exception { - initDBUnitData(Arrays.asList("/data/SourceClientDetailsEntityData.xml","/data/ProfileEntityData.xml", "/data/ClientDetailsEntityData.xml", "/data/Oauth2TokenDetailsData.xml")); - } - - @AfterClass - public static void removeDBUnitData() throws Exception { - removeDBUnitData(Arrays.asList("/data/Oauth2TokenDetailsData.xml", "/data/ClientDetailsEntityData.xml", "/data/ProfileEntityData.xml")); - } - - @Test - @Rollback - @Transactional - public void testCheckUserPermissionsAuthenticationScopesOrcidAndOrcidMessage() throws Exception { - Set resourceIds = new HashSet(Arrays.asList("orcid")); - HashSet grantedAuthorities = new HashSet(Arrays.asList(new SimpleGrantedAuthority("ROLE_CLIENT"))); - AuthorizationRequest request = new AuthorizationRequest("4444-4444-4444-4441", Arrays.asList("/orcid-bio/external-identifiers/create")); - request.setAuthorities(grantedAuthorities); - request.setResourceIds(resourceIds); - ProfileEntity entity = profileEntityManager.findByOrcid("4444-4444-4444-4446"); - OrcidOauth2UserAuthentication oauth2UserAuthentication = new OrcidOauth2UserAuthentication(entity, true); - OAuth2Authentication oAuth2Authentication = new OrcidOAuth2Authentication(request, oauth2UserAuthentication, "made-up-token"); - ScopePathType requiredScope = ScopePathType.ORCID_BIO_EXTERNAL_IDENTIFIERS_CREATE; - OrcidMessage orcidMessage = getOrcidMessage(); - String messageOrcid = orcidMessage.getOrcidProfile().getOrcidIdentifier().getPath(); - defaultPermissionChecker.checkPermissions(oAuth2Authentication, requiredScope, messageOrcid, orcidMessage); - } - - @Test(expected = AccessControlException.class) - @Transactional - @Rollback - public void testCheckUserPermissionsAuthenticationScopesOrcidAndOrcidMessageWhenWrongUser() throws Exception { - Set resourceIds = new HashSet(Arrays.asList("orcid")); - HashSet grantedAuthorities = new HashSet(Arrays.asList(new SimpleGrantedAuthority("ROLE_CLIENT"))); - AuthorizationRequest request = new AuthorizationRequest("4444-4444-4444-4441", Arrays.asList("/orcid-bio/external-identifiers/create")); - request.setAuthorities(grantedAuthorities); - request.setResourceIds(resourceIds); - ProfileEntity entity = profileEntityManager.findByOrcid("4444-4444-4444-4445"); - OrcidOauth2UserAuthentication oauth2UserAuthentication = new OrcidOauth2UserAuthentication(entity, true); - OAuth2Authentication oAuth2Authentication = new OrcidOAuth2Authentication(request, oauth2UserAuthentication, "made-up-token"); - ScopePathType requiredScope = ScopePathType.ORCID_BIO_EXTERNAL_IDENTIFIERS_CREATE; - OrcidMessage orcidMessage = getOrcidMessage(); - String messageOrcid = orcidMessage.getOrcidProfile().getOrcidIdentifier().getPath(); - defaultPermissionChecker.checkPermissions(oAuth2Authentication, requiredScope, messageOrcid, orcidMessage); - } - - @Test - @Transactional - @Rollback - public void testCheckClientPermissionsAuthenticationScopesOrcidAndOrcidMessage() throws Exception { - Set resourceIds = new HashSet(Arrays.asList("orcid")); - HashSet grantedAuthorities = new HashSet(Arrays.asList(new SimpleGrantedAuthority("ROLE_CLIENT"))); - AuthorizationRequest request = new AuthorizationRequest("APP-5555555555555555", Arrays.asList("/orcid-bio/external-identifiers/create")); - request.setAuthorities(grantedAuthorities); - request.setResourceIds(resourceIds); - OAuth2Authentication oAuth2Authentication = new OrcidOAuth2Authentication(request, null, "made-up-token"); - ScopePathType requiredScope = ScopePathType.ORCID_BIO_EXTERNAL_IDENTIFIERS_CREATE; - OrcidMessage orcidMessage = getOrcidMessage(); - orcidMessage.getOrcidProfile().getOrcidIdentifier().setPath("4444-4444-4444-4447"); - String messageOrcid = orcidMessage.getOrcidProfile().getOrcidIdentifier().getPath(); - defaultPermissionChecker.checkPermissions(oAuth2Authentication, requiredScope, messageOrcid, orcidMessage); - } - - @Test - public void testCheckPermissionsAuthenticationScopesAndOrcidMessage() throws Exception { - Set resourceIds = new HashSet(Arrays.asList("orcid")); - HashSet grantedAuthorities = new HashSet(Arrays.asList(new SimpleGrantedAuthority("ROLE_CLIENT"))); - AuthorizationRequest request = new AuthorizationRequest("4444-4444-4444-4441", Arrays.asList(ScopePathType.ORCID_WORKS_CREATE.value())); - request.setAuthorities(grantedAuthorities); - request.setResourceIds(resourceIds); - OAuth2Authentication oAuth2Authentication = new OrcidOAuth2Authentication(request, null, "made-up-token"); - ScopePathType requiredScope = ScopePathType.ORCID_WORKS_CREATE; - OrcidMessage orcidMessage = getOrcidMessage(); - defaultPermissionChecker.checkPermissions(oAuth2Authentication, requiredScope, orcidMessage); - } - - @Test - public void testCheckPermissionsAuthenticationScopePathTypesAndOrcid() throws Exception { - Set resourceIds = new HashSet(Arrays.asList("orcid")); - HashSet grantedAuthorities = new HashSet(Arrays.asList(new SimpleGrantedAuthority("ROLE_CLIENT"))); - AuthorizationRequest request = new AuthorizationRequest("4444-4444-4444-4441", Arrays.asList(ScopePathType.ORCID_BIO_READ_LIMITED.value())); - request.setAuthorities(grantedAuthorities); - request.setResourceIds(resourceIds); - OAuth2Authentication oAuth2Authentication = new OrcidOAuth2Authentication(request, null, "made-up-token"); - ScopePathType requiredScope = ScopePathType.ORCID_BIO_READ_LIMITED; - defaultPermissionChecker.checkPermissions(oAuth2Authentication, requiredScope, "4444-4444-4444-4447"); - } - - @Test - @Transactional - @Rollback - public void checkRemoveUserGrantWriteScopePastValitityForNonPersistentTokens() { - OrcidOauth2TokenDetail token = tokenDetailService.findIgnoringDisabledByTokenValue("00000001-d80f-4afc-8f95-9b48d28aaadb"); - DefaultPermissionChecker customPermissionChecker = (DefaultPermissionChecker) defaultPermissionChecker; - if(!customPermissionChecker.removeUserGrantWriteScopePastValitity(token)) - fail(); - } - - @Test - @Transactional - @Rollback - public void checkRemoveUserGrantWriteScopePastValitityForPersistentTokens() { - OrcidOauth2TokenDetail token = tokenDetailService.findIgnoringDisabledByTokenValue("00000002-d80f-4afc-8f95-9b48d28aaadb"); - DefaultPermissionChecker customPermissionChecker = (DefaultPermissionChecker) defaultPermissionChecker; - if(customPermissionChecker.removeUserGrantWriteScopePastValitity(token)) - fail(); - } - - private OrcidMessage getOrcidMessage() throws JAXBException { - JAXBContext context = JAXBContext.newInstance(OrcidMessage.class); - Unmarshaller unmarshaller = context.createUnmarshaller(); - return (OrcidMessage) unmarshaller.unmarshal(DefaultPermissionCheckerTest.class.getResourceAsStream("/orcid-full-message-no-visibility-latest.xml")); - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/security/OrcidUserDetailsServiceTest.java b/orcid-core/src/test/java/org/orcid/core/security/OrcidUserDetailsServiceTest.java index c7b958e03db..652710ae51a 100644 --- a/orcid-core/src/test/java/org/orcid/core/security/OrcidUserDetailsServiceTest.java +++ b/orcid-core/src/test/java/org/orcid/core/security/OrcidUserDetailsServiceTest.java @@ -9,8 +9,8 @@ import java.util.Date; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; import org.junit.Before; import org.junit.Test; diff --git a/orcid-core/src/test/java/org/orcid/core/security/visibility/aop/OrcidApiAuthorizationSecurityAspectTest.java b/orcid-core/src/test/java/org/orcid/core/security/visibility/aop/OrcidApiAuthorizationSecurityAspectTest.java deleted file mode 100644 index 4707f6dc474..00000000000 --- a/orcid-core/src/test/java/org/orcid/core/security/visibility/aop/OrcidApiAuthorizationSecurityAspectTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.orcid.core.security.visibility.aop; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; -import static org.mockito.Mockito.when; - -import java.util.Arrays; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.orcid.core.BaseTest; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; - -public class OrcidApiAuthorizationSecurityAspectTest extends BaseTest { - private final String clientId = "APP-0001"; - private final String userOrcid = "0000-0000-0000-0001"; - - OrcidApiAuthorizationSecurityAspect orcidApiAuthorizationSecurityAspect; - - @Mock - private OrcidOauth2TokenDetailDao mockedOrcidOauth2TokenDetailDao; - - @Before - public void setup() { - if(orcidApiAuthorizationSecurityAspect == null) { - orcidApiAuthorizationSecurityAspect = new OrcidApiAuthorizationSecurityAspect(); - } - MockitoAnnotations.initMocks(this); - orcidApiAuthorizationSecurityAspect.setOrcidOauth2TokenDetailDao(mockedOrcidOauth2TokenDetailDao); - } - - @Test - public void testActivitiesReadLimitedScopes() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/activities/read-limited")); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - } - - @Test - public void testActivitiesUpdateScopes() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/activities/update")); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - } - - @Test - public void testWorksReadLimitedScopes() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/orcid-works/read-limited")); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - } - - @Test - public void testFundingReadLimitedScopes() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/funding/read-limited")); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - } - - @Test - public void testAffiliationsReadLimitedScopes() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/affiliations/read-limited")); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - } - - @Test - public void testOrcidBioScopes() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/orcid-bio/read-limited")); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/orcid-bio/external-identifiers/create")); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - } - - @Test - public void testOrcidProfileReadLimitedScope() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/orcid-profile/read-limited")); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - } - - @Test - public void testPersonReadLimitedScope() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/person/read-limited")); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - } - - @Test - public void testPersonUpdateScope() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/person/update")); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - } - - @Test - public void testCombineSomeScopes() { - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/person/update", "/orcid-works/update")); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/person/update", "/orcid-works/update", "/funding/read-limited")); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertFalse(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - - when(mockedOrcidOauth2TokenDetailDao.findAvailableScopesByUserAndClientId(clientId, userOrcid)).thenReturn(Arrays.asList("/person/update", "/orcid-works/update", "/funding/read-limited", "/activities/read-limited")); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.ORCID_WORKS_READ_LIMITED.getContent(), ScopePathType.ORCID_WORKS_UPDATE.getContent())); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.FUNDING_READ_LIMITED.getContent(), ScopePathType.FUNDING_UPDATE.getContent())); - assertTrue(orcidApiAuthorizationSecurityAspect.hasScopeEnabled(clientId, userOrcid, ScopePathType.AFFILIATIONS_READ_LIMITED.getContent(), ScopePathType.AFFILIATIONS_UPDATE.getContent())); - } -} diff --git a/orcid-core/src/test/java/org/orcid/core/solr/OrcidSolrOrgsClientTest.java b/orcid-core/src/test/java/org/orcid/core/solr/OrcidSolrOrgsClientTest.java index f269c1dfa9c..e4567f29a5d 100644 --- a/orcid-core/src/test/java/org/orcid/core/solr/OrcidSolrOrgsClientTest.java +++ b/orcid-core/src/test/java/org/orcid/core/solr/OrcidSolrOrgsClientTest.java @@ -7,7 +7,7 @@ import java.io.IOException; import java.util.Arrays; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; diff --git a/orcid-core/src/test/java/org/orcid/core/solr/OrcidSolrProfileClientTest.java b/orcid-core/src/test/java/org/orcid/core/solr/OrcidSolrProfileClientTest.java index a447b769429..a1c55f1d917 100644 --- a/orcid-core/src/test/java/org/orcid/core/solr/OrcidSolrProfileClientTest.java +++ b/orcid-core/src/test/java/org/orcid/core/solr/OrcidSolrProfileClientTest.java @@ -6,7 +6,7 @@ import java.io.IOException; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrServerException; diff --git a/orcid-core/src/test/java/org/orcid/core/utils/ArXivResolverTest.java b/orcid-core/src/test/java/org/orcid/core/utils/ArXivResolverTest.java index da7fd986e4f..c450a56cb14 100644 --- a/orcid-core/src/test/java/org/orcid/core/utils/ArXivResolverTest.java +++ b/orcid-core/src/test/java/org/orcid/core/utils/ArXivResolverTest.java @@ -9,7 +9,7 @@ import java.io.IOException; import java.io.InputStream; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; import org.junit.Before; import org.junit.Test; diff --git a/orcid-core/src/test/java/org/orcid/core/utils/PubMedResolverTest.java b/orcid-core/src/test/java/org/orcid/core/utils/PubMedResolverTest.java index b26c961a2d3..6c4e4ff8806 100644 --- a/orcid-core/src/test/java/org/orcid/core/utils/PubMedResolverTest.java +++ b/orcid-core/src/test/java/org/orcid/core/utils/PubMedResolverTest.java @@ -11,7 +11,7 @@ import java.util.List; import java.util.Locale; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; import org.junit.Before; import org.junit.Rule; diff --git a/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/PIDNormalizationServiceTest.java b/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/PIDNormalizationServiceTest.java index e6c83276635..2ae6d337f08 100644 --- a/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/PIDNormalizationServiceTest.java +++ b/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/PIDNormalizationServiceTest.java @@ -2,7 +2,7 @@ import static org.junit.Assert.assertEquals; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/PIDResolverServiceTest.java b/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/PIDResolverServiceTest.java index c67b794b855..992309f0cad 100644 --- a/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/PIDResolverServiceTest.java +++ b/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/PIDResolverServiceTest.java @@ -9,7 +9,7 @@ import java.util.LinkedList; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.mockito.Mockito; diff --git a/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/finders/CrossrefFinderTest.java b/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/finders/CrossrefFinderTest.java index 36c7778c21e..acae3004d7e 100644 --- a/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/finders/CrossrefFinderTest.java +++ b/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/finders/CrossrefFinderTest.java @@ -7,7 +7,7 @@ import java.io.IOException; import java.io.InputStream; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Before; import org.junit.Test; diff --git a/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/finders/DataciteFinderTest.java b/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/finders/DataciteFinderTest.java index 165fa60e8b9..bdd8072f399 100644 --- a/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/finders/DataciteFinderTest.java +++ b/orcid-core/src/test/java/org/orcid/core/utils/v3/identifiers/finders/DataciteFinderTest.java @@ -8,7 +8,7 @@ import java.io.IOException; import java.io.InputStream; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Before; import org.junit.Test; diff --git a/orcid-core/src/test/java/org/orcid/core/web/filters/CrossDomainWebMangerTest.java b/orcid-core/src/test/java/org/orcid/core/web/filters/CrossDomainWebMangerTest.java index caa180cbad7..63641acdefc 100644 --- a/orcid-core/src/test/java/org/orcid/core/web/filters/CrossDomainWebMangerTest.java +++ b/orcid-core/src/test/java/org/orcid/core/web/filters/CrossDomainWebMangerTest.java @@ -6,7 +6,7 @@ import java.net.URISyntaxException; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-core/src/test/java/org/orcid/record_2_0/ConvertV2ToV2_1Test.java b/orcid-core/src/test/java/org/orcid/record_2_0/ConvertV2ToV2_1Test.java index 79405309b4f..2faebfa6d8f 100644 --- a/orcid-core/src/test/java/org/orcid/record_2_0/ConvertV2ToV2_1Test.java +++ b/orcid-core/src/test/java/org/orcid/record_2_0/ConvertV2ToV2_1Test.java @@ -4,10 +4,10 @@ import java.io.InputStream; -import javax.annotation.Resource; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.orcid.core.BaseTest; diff --git a/orcid-core/src/test/resources/test-core-context.xml b/orcid-core/src/test/resources/test-core-context.xml index 2c1cb08e585..f53e64ed165 100644 --- a/orcid-core/src/test/resources/test-core-context.xml +++ b/orcid-core/src/test/resources/test-core-context.xml @@ -2,9 +2,9 @@ + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd"> - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api diff --git a/orcid-internal-api/src/main/java/org/orcid/internal/server/InternalApiServiceImplBase.java b/orcid-internal-api/src/main/java/org/orcid/internal/server/InternalApiServiceImplBase.java index ce79d8cedee..91a4542fc98 100644 --- a/orcid-internal-api/src/main/java/org/orcid/internal/server/InternalApiServiceImplBase.java +++ b/orcid-internal-api/src/main/java/org/orcid/internal/server/InternalApiServiceImplBase.java @@ -6,13 +6,13 @@ import static org.orcid.core.api.OrcidApiConstants.MEMBER_INFO; import static org.orcid.core.api.OrcidApiConstants.STATUS_PATH; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.commons.net.util.Base64; import org.orcid.internal.server.delegator.InternalApiServiceDelegator; diff --git a/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/InternalApiServiceDelegator.java b/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/InternalApiServiceDelegator.java index 13e71a333c6..5f645a3c8f4 100644 --- a/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/InternalApiServiceDelegator.java +++ b/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/InternalApiServiceDelegator.java @@ -1,6 +1,6 @@ package org.orcid.internal.server.delegator; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; /** * diff --git a/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/impl/InternalApiServiceDelegatorImpl.java b/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/impl/InternalApiServiceDelegatorImpl.java index 46450c1a9eb..69415c012b3 100644 --- a/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/impl/InternalApiServiceDelegatorImpl.java +++ b/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/impl/InternalApiServiceDelegatorImpl.java @@ -6,9 +6,9 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.orcid.core.exception.DeactivatedException; import org.orcid.core.exception.LockedException; @@ -57,8 +57,8 @@ public Response viewStatusText() { } @Override - @AccessControl(requiredScope = ScopePathType.INTERNAL_PERSON_LAST_MODIFIED, requestComesFromInternalApi = true) public Response viewPersonLastModified(String orcid) { + orcidSecurityManager.checkScopes(ScopePathType.INTERNAL_PERSON_LAST_MODIFIED); Date lastModified = profileEntityManagerReadOnly.getLastModifiedDate(orcid); LastModifiedResponse obj = new LastModifiedResponse(orcid, lastModified.toString()); Response response = Response.ok(obj).build(); @@ -91,8 +91,8 @@ public Response viewTogglz() { } @Override - @AccessControl(requiredScope = ScopePathType.INTERNAL, requestComesFromInternalApi = true) public Response findOrcidByEmail(String email) { + orcidSecurityManager.checkScopes(ScopePathType.INTERNAL); if (email != null && !email.isEmpty()) { if (emailManagerReadOnly.emailExists(email)) { String orcid = null; diff --git a/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/impl/InternalClientCredentialEndPointDelegatorImpl.java b/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/impl/InternalClientCredentialEndPointDelegatorImpl.java deleted file mode 100644 index aecc2cc001d..00000000000 --- a/orcid-internal-api/src/main/java/org/orcid/internal/server/delegator/impl/InternalClientCredentialEndPointDelegatorImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.orcid.internal.server.delegator.impl; - -import java.util.HashSet; -import java.util.Set; - -import javax.annotation.Resource; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; - -import org.apache.commons.lang.StringUtils; -import org.orcid.api.common.oauth.OrcidClientCredentialEndPointDelegatorImpl; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.exception.OrcidInvalidScopeException; -import org.orcid.core.locale.LocaleManager; -import org.orcid.jaxb.model.message.ScopePathType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.authentication.InsufficientAuthenticationException; -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.exceptions.UnsupportedGrantTypeException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; - -/** - * - * @author Angel Montenegro - * - */ -public class InternalClientCredentialEndPointDelegatorImpl extends OrcidClientCredentialEndPointDelegatorImpl { - - private static final Logger LOGGER = LoggerFactory.getLogger(OrcidClientCredentialEndPointDelegatorImpl.class); - - @Resource - protected LocaleManager localeManager; - - @Override - public Response obtainOauth2Token(String authorization, MultivaluedMap formParams) { - String grantType = formParams.getFirst(OrcidOauth2Constants.GRANT_TYPE); - String scopeList = formParams.getFirst(OrcidOauth2Constants.SCOPE_PARAM); - String clientId = formParams.getFirst(OrcidOauth2Constants.CLIENT_ID_PARAM); - // Verify it is a client_credentials grant type request - if(!OrcidOauth2Constants.GRANT_TYPE_CLIENT_CREDENTIALS.equals(grantType)) { - Object params[] = {grantType}; - throw new UnsupportedGrantTypeException(localeManager.resolveMessage("apiError.unsupported_client_type.exception", params)); - } - - Authentication client = getClientAuthentication(); - if (!client.isAuthenticated()) { - LOGGER.info("Not authenticated for OAuth2: clientId={}, grantType={}, scope={}", new Object[] { - clientId, grantType, scopeList }); - throw new InsufficientAuthenticationException(localeManager.resolveMessage("apiError.client_not_authenticated.exception")); - } - - Set scopes = new HashSet(); - if (StringUtils.isNotEmpty(scopeList)) { - scopes = OAuth2Utils.parseParameterList(scopeList); - } - - // Verify it is requesting an internal scope - HashSet filteredScopes = new HashSet(); - for(String scope : scopes) { - ScopePathType scopeType = ScopePathType.fromValue(scope); - if(scopeType.isInternalScope()) { - filteredScopes.add(scope); - } - } - - if(filteredScopes.isEmpty()) { - String message = localeManager.resolveMessage("apiError.9015.developerMessage", new Object[]{}); - throw new OrcidInvalidScopeException(message); - } - - OAuth2AccessToken token = generateToken(client, scopes, grantType); - removeMetadataFromToken(token); - setToCache(client.getName(), token); - return getResponse(token); - } -} diff --git a/orcid-internal-api/src/main/java/org/orcid/internal/util/ClientInfo.java b/orcid-internal-api/src/main/java/org/orcid/internal/util/ClientInfo.java index 1464057347f..a62196c3a9d 100644 --- a/orcid-internal-api/src/main/java/org/orcid/internal/util/ClientInfo.java +++ b/orcid-internal-api/src/main/java/org/orcid/internal/util/ClientInfo.java @@ -1,6 +1,6 @@ package org.orcid.internal.util; -import javax.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElement; import org.orcid.pojo.ajaxForm.Client; import org.orcid.pojo.ajaxForm.PojoUtil; diff --git a/orcid-internal-api/src/main/java/org/orcid/internal/util/EmailResponse.java b/orcid-internal-api/src/main/java/org/orcid/internal/util/EmailResponse.java index 98b980c7965..47dcbeb4353 100644 --- a/orcid-internal-api/src/main/java/org/orcid/internal/util/EmailResponse.java +++ b/orcid-internal-api/src/main/java/org/orcid/internal/util/EmailResponse.java @@ -2,7 +2,7 @@ import org.springframework.http.HttpStatus; -import javax.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElement; public class EmailResponse { diff --git a/orcid-internal-api/src/main/java/org/orcid/internal/util/LastModifiedResponse.java b/orcid-internal-api/src/main/java/org/orcid/internal/util/LastModifiedResponse.java index 1ae585bd93b..d023b22ff3c 100644 --- a/orcid-internal-api/src/main/java/org/orcid/internal/util/LastModifiedResponse.java +++ b/orcid-internal-api/src/main/java/org/orcid/internal/util/LastModifiedResponse.java @@ -1,6 +1,6 @@ package org.orcid.internal.util; -import javax.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElement; /** * diff --git a/orcid-internal-api/src/main/java/org/orcid/internal/util/MemberInfo.java b/orcid-internal-api/src/main/java/org/orcid/internal/util/MemberInfo.java index a5466f2fa6f..994bbe1733b 100644 --- a/orcid-internal-api/src/main/java/org/orcid/internal/util/MemberInfo.java +++ b/orcid-internal-api/src/main/java/org/orcid/internal/util/MemberInfo.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElement; import org.orcid.pojo.ajaxForm.Client; import org.orcid.pojo.ajaxForm.Member; diff --git a/orcid-internal-api/src/main/resources/orcid-internal-api-context.xml b/orcid-internal-api/src/main/resources/orcid-internal-api-context.xml index 25cff42414b..cfce58c59f0 100644 --- a/orcid-internal-api/src/main/resources/orcid-internal-api-context.xml +++ b/orcid-internal-api/src/main/resources/orcid-internal-api-context.xml @@ -4,14 +4,16 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> + + - + diff --git a/orcid-internal-api/src/main/resources/orcid-internal-api-security-context.xml b/orcid-internal-api/src/main/resources/orcid-internal-api-security-context.xml index d27c470afec..0e798f1a43a 100644 --- a/orcid-internal-api/src/main/resources/orcid-internal-api-security-context.xml +++ b/orcid-internal-api/src/main/resources/orcid-internal-api-security-context.xml @@ -2,105 +2,28 @@ + http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-6.0.xsd"> - + - - - - - - - - - - + + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/orcid-internal-api/src/main/webapp/WEB-INF/web.xml b/orcid-internal-api/src/main/webapp/WEB-INF/web.xml index 77461f9016c..c880a1f7026 100644 --- a/orcid-internal-api/src/main/webapp/WEB-INF/web.xml +++ b/orcid-internal-api/src/main/webapp/WEB-INF/web.xml @@ -74,16 +74,6 @@ /* - - clientCredentialsTokenEndpointFilter - org.springframework.web.filter.DelegatingFilterProxy - - - - clientCredentialsTokenEndpointFilter - /oauth/token - - springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy diff --git a/orcid-internal-api/src/test/java/org/orcid/internal/server/InternalApiServiceDelegatorTest.java b/orcid-internal-api/src/test/java/org/orcid/internal/server/InternalApiServiceDelegatorTest.java index 5425208e4dd..21c448b2324 100644 --- a/orcid-internal-api/src/test/java/org/orcid/internal/server/InternalApiServiceDelegatorTest.java +++ b/orcid-internal-api/src/test/java/org/orcid/internal/server/InternalApiServiceDelegatorTest.java @@ -5,16 +5,16 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import java.security.AccessControlException; import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.Response; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.orcid.core.exception.OrcidAccessControlException; import org.orcid.core.manager.v3.read_only.ProfileEntityManagerReadOnly; import org.orcid.core.utils.SecurityContextTestUtils; import org.orcid.internal.server.delegator.InternalApiServiceDelegator; @@ -115,7 +115,7 @@ public void findOrcidByEmailTest() { assertEquals("", info.getOrcid()); } - @Test(expected = AccessControlException.class) + @Test(expected = OrcidAccessControlException.class) public void findOrcidByEmailWrongScopeTest() { SecurityContextTestUtils.setUpSecurityContextForClientOnly("APP-5555555555555555", ScopePathType.INTERNAL_PERSON_LAST_MODIFIED); internalApiServiceDelegator.findOrcidByEmail("5555-5555-5555-5558@user.com"); diff --git a/orcid-internal-api/src/test/resources/test-core-context.xml b/orcid-internal-api/src/test/resources/test-core-context.xml index 2c1cb08e585..f53e64ed165 100644 --- a/orcid-internal-api/src/test/resources/test-core-context.xml +++ b/orcid-internal-api/src/test/resources/test-core-context.xml @@ -2,9 +2,9 @@ + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> org.apache.activemq activemq-broker - 5.13.3 + ${activemq.version} org.apache.activemq activemq-spring - 5.13.3 - + ${activemq.version} + + + + jakarta.persistence + jakarta.persistence-api + - javax.ws.rs - javax.ws.rs-api - 2.1 + jakarta.ws.rs + jakarta.ws.rs-api + 3.1.0 @@ -90,14 +95,22 @@ org.postgresql postgresql - - org.hibernate - hibernate-agroal - - - org.hibernate - hibernate-c3p0 - + + org.hibernate.orm + hibernate-core + + + org.hibernate.orm + hibernate-agroal + + + org.hibernate.orm + hibernate-c3p0 + + + org.hibernate.validator + hibernate-validator + org.liquibase liquibase-core @@ -128,17 +141,17 @@ jakarta.xml.bind jakarta.xml.bind-api - 2.3.3 + 3.0.1 com.sun.xml.bind jaxb-impl -2.3.3 +3.0.2 - javax.annotation - javax.annotation-api - 1.3.2 + jakarta.annotation + jakarta.annotation-api + 2.1.1 diff --git a/orcid-message-listener/src/main/java/org/orcid/cron/ResendSolrFailedMessages.java b/orcid-message-listener/src/main/java/org/orcid/cron/ResendSolrFailedMessages.java index 50833506962..aa727849ed9 100644 --- a/orcid-message-listener/src/main/java/org/orcid/cron/ResendSolrFailedMessages.java +++ b/orcid-message-listener/src/main/java/org/orcid/cron/ResendSolrFailedMessages.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.listener.persistence.entities.SearchEngineRecordStatusEntity; @@ -23,7 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; @Configuration @EnableScheduling diff --git a/orcid-message-listener/src/main/java/org/orcid/cron/ResendV2FailedMessages.java b/orcid-message-listener/src/main/java/org/orcid/cron/ResendV2FailedMessages.java index 677c9ffb748..8a5be6f0154 100644 --- a/orcid-message-listener/src/main/java/org/orcid/cron/ResendV2FailedMessages.java +++ b/orcid-message-listener/src/main/java/org/orcid/cron/ResendV2FailedMessages.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.listener.persistence.entities.Api20RecordStatusEntity; @@ -24,7 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; @Configuration @EnableScheduling diff --git a/orcid-message-listener/src/main/java/org/orcid/cron/ResendV3FailedMessages.java b/orcid-message-listener/src/main/java/org/orcid/cron/ResendV3FailedMessages.java index 87ae7d1efe4..2397f329961 100644 --- a/orcid-message-listener/src/main/java/org/orcid/cron/ResendV3FailedMessages.java +++ b/orcid-message-listener/src/main/java/org/orcid/cron/ResendV3FailedMessages.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.listener.persistence.entities.Api30RecordStatusEntity; @@ -24,7 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; @Configuration @EnableScheduling diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/BaseListener.java b/orcid-message-listener/src/main/java/org/orcid/listener/BaseListener.java index ccb928b104c..373fe6cecaa 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/BaseListener.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/BaseListener.java @@ -20,9 +20,9 @@ import java.util.Map; import java.util.function.Consumer; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; +import jakarta.jms.JMSException; +import jakarta.jms.Message; +import jakarta.jms.MessageListener; import org.apache.activemq.command.ActiveMQMapMessage; import org.fusesource.hawtbuf.UTF8Buffer; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/OrgIndexerListener.java b/orcid-message-listener/src/main/java/org/orcid/listener/OrgIndexerListener.java index 1a72988ca6b..91dee8dc7e8 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/OrgIndexerListener.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/OrgIndexerListener.java @@ -1,8 +1,8 @@ package org.orcid.listener; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; +import jakarta.jms.JMSException; +import jakarta.jms.Message; +import jakarta.jms.MessageListener; import org.apache.activemq.command.ActiveMQObjectMessage; import org.orcid.listener.solr.SolrOrgsMessageProcessor; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/http/OrcidAPIClient.java b/orcid-message-listener/src/main/java/org/orcid/listener/http/OrcidAPIClient.java index 0839e5d8b73..9d1e449a92d 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/http/OrcidAPIClient.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/http/OrcidAPIClient.java @@ -11,7 +11,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; @Component public class OrcidAPIClient { diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/orcid/Orcid20ManagerImpl.java b/orcid-message-listener/src/main/java/org/orcid/listener/orcid/Orcid20ManagerImpl.java index 729da2afc1b..df309371285 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/orcid/Orcid20ManagerImpl.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/orcid/Orcid20ManagerImpl.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.concurrent.ExecutionException; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.jaxb.model.error_v2.OrcidError; import org.orcid.jaxb.model.record_v2.Record; @@ -21,7 +21,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; @Component public class Orcid20ManagerImpl implements Orcid20Manager { diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/orcid/Orcid30ManagerImpl.java b/orcid-message-listener/src/main/java/org/orcid/listener/orcid/Orcid30ManagerImpl.java index 3e1797aa1a7..9cc27aaa80a 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/orcid/Orcid30ManagerImpl.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/orcid/Orcid30ManagerImpl.java @@ -7,7 +7,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.jaxb.model.v3.release.error.OrcidError; import org.orcid.jaxb.model.v3.release.record.Record; @@ -28,7 +28,7 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; @Component public class Orcid30ManagerImpl implements Orcid30Manager { diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/Api20RecordStatusDao.java b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/Api20RecordStatusDao.java index 5a7e2a68ba9..2bad64c5b75 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/Api20RecordStatusDao.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/Api20RecordStatusDao.java @@ -1,14 +1,13 @@ package org.orcid.listener.persistence.dao; -import java.math.BigInteger; import java.util.Date; import java.util.List; -import javax.persistence.EntityExistsException; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.EntityExistsException; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.listener.persistence.entities.Api20RecordStatusEntity; import org.orcid.listener.persistence.util.ActivityType; @@ -29,8 +28,8 @@ public Api20RecordStatusEntity get(String orcid) { public boolean exists(String orcid) { Query query = entityManager.createNativeQuery("SELECT count(*) FROM api_2_0_record_status WHERE orcid=:orcid"); query.setParameter("orcid", orcid); - Long result = ((BigInteger) query.getSingleResult()).longValue(); - return (result != null && result > 0); + Number result = (Number) query.getSingleResult(); + return (result != null && result.longValue() > 0L); } @Transactional diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/Api30RecordStatusDao.java b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/Api30RecordStatusDao.java index 8bd22c3be32..7a9a028e43b 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/Api30RecordStatusDao.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/Api30RecordStatusDao.java @@ -1,14 +1,13 @@ package org.orcid.listener.persistence.dao; -import java.math.BigInteger; import java.util.Date; import java.util.List; -import javax.persistence.EntityExistsException; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.EntityExistsException; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.listener.persistence.entities.Api30RecordStatusEntity; import org.orcid.listener.persistence.util.ActivityType; @@ -29,8 +28,8 @@ public Api30RecordStatusEntity get(String orcid) { public boolean exists(String orcid) { Query query = entityManager.createNativeQuery("SELECT count(*) FROM api_3_0_record_status WHERE orcid=:orcid"); query.setParameter("orcid", orcid); - Long result = ((BigInteger) query.getSingleResult()).longValue(); - return (result != null && result > 0); + Number result = (Number) query.getSingleResult(); + return (result != null && result.longValue() > 0L); } @Transactional diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/SearchEngineRecordStatusDao.java b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/SearchEngineRecordStatusDao.java index 0ceb0cc9915..6c32a7d3faa 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/SearchEngineRecordStatusDao.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/dao/SearchEngineRecordStatusDao.java @@ -4,11 +4,11 @@ import java.util.Date; import java.util.List; -import javax.persistence.EntityExistsException; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.EntityExistsException; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.listener.persistence.entities.Api30RecordStatusEntity; import org.orcid.listener.persistence.entities.SearchEngineRecordStatusEntity; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/Api20RecordStatusEntity.java b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/Api20RecordStatusEntity.java index a1c11454131..a3d0e3f9b71 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/Api20RecordStatusEntity.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/Api20RecordStatusEntity.java @@ -2,10 +2,10 @@ import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "api_2_0_record_status") diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/Api30RecordStatusEntity.java b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/Api30RecordStatusEntity.java index c40f34a5c01..3ab1efe3252 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/Api30RecordStatusEntity.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/Api30RecordStatusEntity.java @@ -2,10 +2,10 @@ import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "api_3_0_record_status") diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/SearchEngineRecordStatusEntity.java b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/SearchEngineRecordStatusEntity.java index d128ad35a52..8f20986bc87 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/SearchEngineRecordStatusEntity.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/entities/SearchEngineRecordStatusEntity.java @@ -3,10 +3,10 @@ import java.util.Date; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "search_engine_record_status") diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/managers/Api20RecordStatusManager.java b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/managers/Api20RecordStatusManager.java index 00eefc97049..7983a8539b9 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/managers/Api20RecordStatusManager.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/managers/Api20RecordStatusManager.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.List; -import javax.persistence.EntityExistsException; +import jakarta.persistence.EntityExistsException; import org.orcid.listener.persistence.dao.Api20RecordStatusDao; import org.orcid.listener.persistence.entities.Api20RecordStatusEntity; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/managers/Api30RecordStatusManager.java b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/managers/Api30RecordStatusManager.java index 47d6c3d8ac5..bbafc6ad184 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/managers/Api30RecordStatusManager.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/managers/Api30RecordStatusManager.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.List; -import javax.persistence.EntityExistsException; +import jakarta.persistence.EntityExistsException; import org.orcid.listener.persistence.dao.Api30RecordStatusDao; import org.orcid.listener.persistence.entities.Api30RecordStatusEntity; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/spring/OrcidEntityManagerFactory.java b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/spring/OrcidEntityManagerFactory.java index 88e0eeceaa2..948a6c7a294 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/persistence/spring/OrcidEntityManagerFactory.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/persistence/spring/OrcidEntityManagerFactory.java @@ -1,7 +1,7 @@ package org.orcid.listener.persistence.spring; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.FactoryBean; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3Manager.java b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3Manager.java index a18e8c96627..0f7d45c00b6 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3Manager.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3Manager.java @@ -20,9 +20,9 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; -import javax.ws.rs.core.MediaType; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.MediaType; +import jakarta.xml.bind.JAXBException; import org.orcid.listener.persistence.util.APIVersion; import org.orcid.listener.persistence.util.ActivityType; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessageProcessorAPIV2.java b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessageProcessorAPIV2.java index 288c8aa5691..69052498d31 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessageProcessorAPIV2.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessageProcessorAPIV2.java @@ -6,8 +6,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import org.orcid.jaxb.model.error_v2.OrcidError; import org.orcid.jaxb.model.record.summary_v2.ActivitiesSummary; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessageProcessorAPIV3.java b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessageProcessorAPIV3.java index 116d2e5b16a..d00717c0b9f 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessageProcessorAPIV3.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessageProcessorAPIV3.java @@ -6,8 +6,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import org.orcid.jaxb.model.v3.release.error.OrcidError; import org.orcid.jaxb.model.v3.release.record.Activity; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessagingService.java b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessagingService.java index 3f93325d238..3ef3ac71738 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessagingService.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3MessagingService.java @@ -5,7 +5,7 @@ import java.util.Date; import java.util.concurrent.TimeUnit; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3ClientBuilder; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3V2RecordConsumer.java b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3V2RecordConsumer.java index 3acabc095a0..6a2a5fce11b 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3V2RecordConsumer.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3V2RecordConsumer.java @@ -2,7 +2,7 @@ import java.util.function.Consumer; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.utils.listener.LastModifiedMessage; import org.orcid.utils.listener.RetryMessage; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3V3RecordConsumer.java b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3V3RecordConsumer.java index 3ca0eb54a45..b6e76d61baa 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3V3RecordConsumer.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/s3/S3V3RecordConsumer.java @@ -2,7 +2,7 @@ import java.util.function.Consumer; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.utils.listener.LastModifiedMessage; import org.orcid.utils.listener.RetryMessage; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/solr/OrcidRecordToSolrDocument.java b/orcid-message-listener/src/main/java/org/orcid/listener/solr/OrcidRecordToSolrDocument.java index b9e3cf27f7b..4dd88e79c93 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/solr/OrcidRecordToSolrDocument.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/solr/OrcidRecordToSolrDocument.java @@ -11,8 +11,8 @@ import java.util.Map.Entry; import java.util.Set; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; import org.apache.commons.lang.StringUtils; import org.orcid.jaxb.model.common.Relationship; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrBeanFactory.java b/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrBeanFactory.java index 2ec649ec04d..a93adebd67b 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrBeanFactory.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrBeanFactory.java @@ -1,6 +1,6 @@ package org.orcid.listener.solr; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.impl.HttpSolrClient; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrIndexUpdater.java b/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrIndexUpdater.java index 46c0e417cd1..7a3b9e9e7a5 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrIndexUpdater.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrIndexUpdater.java @@ -7,7 +7,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrMessageProcessor.java b/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrMessageProcessor.java index c984105b967..f5803c746c1 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrMessageProcessor.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrMessageProcessor.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.function.Consumer; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import org.orcid.jaxb.model.v3.release.record.Record; import org.orcid.jaxb.model.v3.release.record.ResearchResource; diff --git a/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrOrgsMessageProcessor.java b/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrOrgsMessageProcessor.java index 8e08fd09917..f598f64c893 100644 --- a/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrOrgsMessageProcessor.java +++ b/orcid-message-listener/src/main/java/org/orcid/listener/solr/SolrOrgsMessageProcessor.java @@ -5,8 +5,8 @@ import java.util.Map; import java.util.function.Consumer; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import org.apache.commons.lang3.StringUtils; import org.orcid.utils.jersey.JerseyClientHelper; @@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; @Component public class SolrOrgsMessageProcessor implements Consumer { diff --git a/orcid-message-listener/src/main/resources/orcid-message-listener-web-context.xml b/orcid-message-listener/src/main/resources/orcid-message-listener-web-context.xml index 36a8bbddebb..035e64aa311 100644 --- a/orcid-message-listener/src/main/resources/orcid-message-listener-web-context.xml +++ b/orcid-message-listener/src/main/resources/orcid-message-listener-web-context.xml @@ -8,13 +8,13 @@ xmlns:util="http://www.springframework.org/schema/util" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd - http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd - http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd - http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> diff --git a/orcid-message-listener/src/test/java/org/orcid/listener/clients/S3ManagerTest.java b/orcid-message-listener/src/test/java/org/orcid/listener/clients/S3ManagerTest.java index c5fdcf54651..3f6d57df343 100644 --- a/orcid-message-listener/src/test/java/org/orcid/listener/clients/S3ManagerTest.java +++ b/orcid-message-listener/src/test/java/org/orcid/listener/clients/S3ManagerTest.java @@ -10,8 +10,8 @@ import java.io.IOException; import java.util.Date; -import javax.ws.rs.core.MediaType; -import javax.xml.bind.JAXBException; +import jakarta.ws.rs.core.MediaType; +import jakarta.xml.bind.JAXBException; import org.junit.Before; import org.junit.Test; diff --git a/orcid-message-listener/src/test/java/org/orcid/listener/common/S3MessageProcessorAPIV2Test.java b/orcid-message-listener/src/test/java/org/orcid/listener/common/S3MessageProcessorAPIV2Test.java index 7e97e0fb621..633416e06a3 100644 --- a/orcid-message-listener/src/test/java/org/orcid/listener/common/S3MessageProcessorAPIV2Test.java +++ b/orcid-message-listener/src/test/java/org/orcid/listener/common/S3MessageProcessorAPIV2Test.java @@ -21,8 +21,8 @@ import java.util.Map; import java.util.concurrent.ExecutionException; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import javax.xml.datatype.XMLGregorianCalendar; import org.junit.Before; diff --git a/orcid-message-listener/src/test/java/org/orcid/listener/common/S3MessageProcessorAPIV3Test.java b/orcid-message-listener/src/test/java/org/orcid/listener/common/S3MessageProcessorAPIV3Test.java index d48fdce1aae..3adf8f5c677 100644 --- a/orcid-message-listener/src/test/java/org/orcid/listener/common/S3MessageProcessorAPIV3Test.java +++ b/orcid-message-listener/src/test/java/org/orcid/listener/common/S3MessageProcessorAPIV3Test.java @@ -21,8 +21,8 @@ import java.util.Map; import java.util.concurrent.ExecutionException; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import javax.xml.datatype.XMLGregorianCalendar; import org.junit.Before; diff --git a/orcid-message-listener/src/test/java/org/orcid/listener/converter/OrcidRecordToSolrDocumentTest.java b/orcid-message-listener/src/test/java/org/orcid/listener/converter/OrcidRecordToSolrDocumentTest.java index f05b8c61f8e..bf25a2b9e10 100644 --- a/orcid-message-listener/src/test/java/org/orcid/listener/converter/OrcidRecordToSolrDocumentTest.java +++ b/orcid-message-listener/src/test/java/org/orcid/listener/converter/OrcidRecordToSolrDocumentTest.java @@ -7,9 +7,9 @@ import java.io.InputStream; import java.util.Arrays; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Test; import org.orcid.jaxb.model.common.PeerReviewType; diff --git a/orcid-message-listener/src/test/java/org/orcid/listener/persistence/dao/Api20RecordStatusDaoTest.java b/orcid-message-listener/src/test/java/org/orcid/listener/persistence/dao/Api20RecordStatusDaoTest.java index 72a6438edf1..5864aa3a90d 100644 --- a/orcid-message-listener/src/test/java/org/orcid/listener/persistence/dao/Api20RecordStatusDaoTest.java +++ b/orcid-message-listener/src/test/java/org/orcid/listener/persistence/dao/Api20RecordStatusDaoTest.java @@ -10,9 +10,9 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-message-listener/src/test/java/org/orcid/listener/persistence/dao/Api30RecordStatusDaoTest.java b/orcid-message-listener/src/test/java/org/orcid/listener/persistence/dao/Api30RecordStatusDaoTest.java index cb051133e98..f429dc9c476 100644 --- a/orcid-message-listener/src/test/java/org/orcid/listener/persistence/dao/Api30RecordStatusDaoTest.java +++ b/orcid-message-listener/src/test/java/org/orcid/listener/persistence/dao/Api30RecordStatusDaoTest.java @@ -10,9 +10,9 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-message-listener/src/test/java/org/orcid/listener/s3/S3MessagingServiceTest.java b/orcid-message-listener/src/test/java/org/orcid/listener/s3/S3MessagingServiceTest.java index e1ac7366164..6a0d20dcac0 100644 --- a/orcid-message-listener/src/test/java/org/orcid/listener/s3/S3MessagingServiceTest.java +++ b/orcid-message-listener/src/test/java/org/orcid/listener/s3/S3MessagingServiceTest.java @@ -2,7 +2,7 @@ import static org.junit.Assert.assertEquals; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBException; import org.junit.Before; import org.junit.Test; diff --git a/orcid-message-listener/src/test/resources/orcid-message-listener-test-context.xml b/orcid-message-listener/src/test/resources/orcid-message-listener-test-context.xml index a4023e110b9..cd8924805cd 100644 --- a/orcid-message-listener/src/test/resources/orcid-message-listener-test-context.xml +++ b/orcid-message-listener/src/test/resources/orcid-message-listener-test-context.xml @@ -9,13 +9,13 @@ xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd - http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd - http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd - http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd"> diff --git a/orcid-persistence/pom.xml b/orcid-persistence/pom.xml index b071541a8d2..f854b0870ca 100644 --- a/orcid-persistence/pom.xml +++ b/orcid-persistence/pom.xml @@ -33,6 +33,7 @@ **/*.xml **/*.xsd **/*.txt + META-INF/services/** **/orcid-persistence-context.xml @@ -45,8 +46,8 @@ maven-compiler-plugin false - 11 - 11 + 17 + 17 @@ -103,16 +104,6 @@ org.springframework.security spring-security-core - - org.springframework.security.oauth - spring-security-oauth2 - - - - - org.aspectj - aspectjrt - org.aspectj aspectjweaver @@ -123,17 +114,30 @@ org.postgresql postgresql + + org.hibernate.orm + hibernate-core + + + org.hibernate.orm + hibernate-agroal + + + org.hibernate.orm + hibernate-c3p0 + + + org.hibernate.validator + hibernate-validator + - org.hibernate - hibernate-agroal - - - org.hibernate - hibernate-c3p0 + jakarta.persistence + jakarta.persistence-api - org.hibernate - hibernate-validator + jakarta.transaction + jakarta.transaction-api + 2.0.1 org.liquibase @@ -142,6 +146,7 @@ org.ehcache ehcache + jakarta javax.cache @@ -198,30 +203,30 @@ org.apache.activemq activemq-broker - 5.13.3 + ${activemq.version} jakarta.xml.bind jakarta.xml.bind-api - 2.3.3 + 3.0.1 com.sun.xml.bind jaxb-impl - 2.3.3 + 3.0.2 - javax.annotation - javax.annotation-api - 1.3.2 + jakarta.annotation + jakarta.annotation-api + 2.1.1 - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api test diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/AddressDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/AddressDaoImpl.java index 0308d5a8ebf..029f539c19f 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/AddressDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/AddressDaoImpl.java @@ -3,7 +3,7 @@ import java.math.BigInteger; import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.jaxb.model.v3.release.common.Visibility; import org.orcid.persistence.aop.UpdateProfileLastModified; @@ -70,7 +70,7 @@ public List getAddresses(String orcid, String visibility) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean deleteAddress(String orcid, Long putCode) { - Query query = entityManager.createQuery("DELETE FROM AddressEntity WHERE id=:id and orcid = :orcid"); + Query query = entityManager.createQuery("DELETE FROM AddressEntity a WHERE a.id=:id and a.orcid = :orcid"); query.setParameter("id", putCode); query.setParameter("orcid", orcid); return query.executeUpdate() > 0 ? true : false; @@ -80,7 +80,7 @@ public boolean deleteAddress(String orcid, Long putCode) { @Transactional @UpdateProfileLastModified public void removeAllAddress(String orcid) { - Query query = entityManager.createQuery("delete from AddressEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from AddressEntity a where a.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/BackupCodeDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/BackupCodeDaoImpl.java index 40c752217e1..5798817941f 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/BackupCodeDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/BackupCodeDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.dao.BackupCodeDao; import org.orcid.persistence.jpa.entities.BackupCodeEntity; @@ -25,7 +25,7 @@ public List getUnusedBackupCodes(String orcid) { @Override @Transactional public void markUsed(String orcid, String hashedCode) { - Query query = entityManager.createQuery("UPDATE BackupCodeEntity SET usedDate = now() WHERE orcid = :orcid AND hashedCode = :hashedCode"); + Query query = entityManager.createQuery("UPDATE BackupCodeEntity b SET b.usedDate = now() WHERE b.orcid = :orcid AND b.hashedCode = :hashedCode"); query.setParameter("orcid", orcid); query.setParameter("hashedCode", hashedCode); query.executeUpdate(); @@ -34,7 +34,7 @@ public void markUsed(String orcid, String hashedCode) { @Override @Transactional public void removedUsedBackupCodes(String orcid) { - Query query = entityManager.createQuery("DELETE FROM BackupCodeEntity WHERE orcid = :orcid AND usedDate IS NULL"); + Query query = entityManager.createQuery("DELETE FROM BackupCodeEntity b WHERE b.orcid = :orcid AND b.usedDate IS NULL"); query.setParameter("orcid", orcid); query.executeUpdate(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/BiographyDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/BiographyDaoImpl.java index d5ca09b932f..7975355a7aa 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/BiographyDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/BiographyDaoImpl.java @@ -1,8 +1,6 @@ package org.orcid.persistence.dao.impl; -import java.math.BigInteger; - -import javax.persistence.Query; +import jakarta.persistence.Query; import org.apache.commons.lang.StringUtils; import org.orcid.persistence.aop.UpdateProfileLastModifiedAndIndexingStatus; @@ -56,7 +54,7 @@ public void persistBiography(String orcid, String biography, String visibility) public boolean exists(String orcid) { Query query = entityManager.createNativeQuery("select count(*) from biography where orcid=:orcid"); query.setParameter("orcid", orcid); - Long result = ((BigInteger)query.getSingleResult()).longValue(); + Long result = ((Number) query.getSingleResult()).longValue(); return (result != null && result > 0); } @@ -64,7 +62,7 @@ public boolean exists(String orcid) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean removeForId(String orcid) { - Query query = entityManager.createQuery("DELETE FROM BiographyEntity WHERE orcid = :orcid"); + Query query = entityManager.createQuery("DELETE FROM BiographyEntity b WHERE b.orcid = :orcid"); query.setParameter("orcid", orcid); return query.executeUpdate() > 0 ? true : false; } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientAuthorizedGrantTypeDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientAuthorizedGrantTypeDaoImpl.java index dea2522512c..ba532be692f 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientAuthorizedGrantTypeDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientAuthorizedGrantTypeDaoImpl.java @@ -1,6 +1,6 @@ package org.orcid.persistence.dao.impl; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.dao.ClientAuthorizedGrantTypeDao; import org.orcid.persistence.jpa.entities.ClientAuthorisedGrantTypeEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientDetailsDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientDetailsDaoImpl.java index a1db541f4d8..72775c41da9 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientDetailsDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientDetailsDaoImpl.java @@ -3,10 +3,10 @@ import java.util.Date; import java.util.List; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.jaxb.model.clientgroup.ClientType; import org.orcid.persistence.dao.ClientDetailsDao; @@ -61,7 +61,7 @@ public Date getLastModifiedByIdP(String idp) { @Override @Transactional public void updateLastModified(String clientId) { - Query updateQuery = entityManager.createQuery("update ClientDetailsEntity set lastModified = now() where id = :clientId"); + Query updateQuery = entityManager.createQuery("update ClientDetailsEntity c set c.lastModified = now() where c.id = :clientId"); updateQuery.setParameter("clientId", clientId); updateQuery.executeUpdate(); } @@ -77,7 +77,7 @@ public void updateLastModified(String clientId) { @Override @Transactional public int updateLastModifiedBulk(List clientIds) { - Query updateQuery = entityManager.createQuery("update ClientDetailsEntity set lastModified = now() where id in :clientIds"); + Query updateQuery = entityManager.createQuery("update ClientDetailsEntity c set c.lastModified = now() where c.id in :clientIds"); updateQuery.setParameter("clientIds", clientIds); return updateQuery.executeUpdate(); } @@ -103,14 +103,14 @@ public boolean createClientSecret(String clientId, String clientSecret) { @Override public List getClientSecretsByClientId(String clientId) { - TypedQuery query = entityManager.createQuery("From ClientSecretEntity WHERE client_details_id=:clientId", ClientSecretEntity.class); + TypedQuery query = entityManager.createQuery("From ClientSecretEntity WHERE clientId=:clientId", ClientSecretEntity.class); query.setParameter("clientId", clientId); return query.getResultList(); } @Override public boolean exists(String clientId) { - TypedQuery query = entityManager.createQuery("select count(*) from ClientDetailsEntity where client_details_id=:clientId", Long.class); + TypedQuery query = entityManager.createQuery("select count(*) from ClientDetailsEntity where id=:clientId", Long.class); query.setParameter("clientId", clientId); Long result = query.getSingleResult(); return (result != null && result > 0); @@ -133,7 +133,7 @@ public boolean belongsTo(String clientId, String groupId) { @Override @Transactional public void updateClientType(String clientType, String clientId) { - Query updateQuery = entityManager.createQuery("update ClientDetailsEntity set clientType = :clientType, lastModified = now() where id = :clientId"); + Query updateQuery = entityManager.createQuery("update ClientDetailsEntity c set c.clientType = :clientType, c.lastModified = now() where c.id = :clientId"); updateQuery.setParameter("clientType", clientType); updateQuery.setParameter("clientId", clientId); updateQuery.executeUpdate(); @@ -192,7 +192,7 @@ public String getMemberName(String clientId) { @Override public boolean existsAndIsNotPublicClient(String clientId) { TypedQuery query = entityManager - .createQuery("select count(*) from ClientDetailsEntity where client_details_id=:clientId and client_type != 'PUBLIC_CLIENT'", Long.class); + .createQuery("select count(*) from ClientDetailsEntity where id=:clientId and clientType != 'PUBLIC_CLIENT'", Long.class); query.setParameter("clientId", clientId); Long result = query.getSingleResult(); return (result != null && result > 0); @@ -224,7 +224,7 @@ public List findLegacyClientIds() { @Transactional public void changePersistenceTokensProperty(String clientId, boolean isPersistenTokensEnabled) { Query updateQuery = entityManager - .createQuery("update ClientDetailsEntity set lastModified = now(), persistentTokensEnabled = :isPersistenTokensEnabled where id = :clientId"); + .createQuery("update ClientDetailsEntity c set c.lastModified = now(), c.persistentTokensEnabled = :isPersistenTokensEnabled where c.id = :clientId"); updateQuery.setParameter("clientId", clientId); updateQuery.setParameter("isPersistenTokensEnabled", isPersistenTokensEnabled); updateQuery.executeUpdate(); @@ -234,7 +234,7 @@ public void changePersistenceTokensProperty(String clientId, boolean isPersisten @Transactional public void activateClient(String clientDetailsId) { Query updateQuery = entityManager - .createQuery("update ClientDetailsEntity set lastModified = now(), deactivatedDate = null, deactivatedBy = null where id = :clientId"); + .createQuery("update ClientDetailsEntity c set c.lastModified = now(), c.deactivatedDate = null, c.deactivatedBy = null where c.id = :clientId"); updateQuery.setParameter("clientId", clientDetailsId); updateQuery.executeUpdate(); } @@ -243,7 +243,7 @@ public void activateClient(String clientDetailsId) { @Transactional public void deactivateClient(String clientDetailsId, String deactivatedBy) { Query updateQuery = entityManager - .createQuery("update ClientDetailsEntity set lastModified = now(), deactivatedDate = now(), deactivatedBy = :deactivatedBy where id = :clientId"); + .createQuery("update ClientDetailsEntity c set c.lastModified = now(), c.deactivatedDate = now(), c.deactivatedBy = :deactivatedBy where c.id = :clientId"); updateQuery.setParameter("clientId", clientDetailsId); updateQuery.setParameter("deactivatedBy", deactivatedBy); updateQuery.executeUpdate(); diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientRedirectDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientRedirectDaoImpl.java index 1ee009daa4c..53b6d33eee5 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientRedirectDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientRedirectDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.dao.ClientRedirectDao; import org.orcid.persistence.jpa.entities.ClientRedirectUriEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientScopeDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientScopeDaoImpl.java index 49bbc1adfa6..d4e3a5b879c 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientScopeDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientScopeDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.dao.ClientScopeDao; import org.orcid.persistence.jpa.entities.ClientScopeEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientSecretDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientSecretDaoImpl.java index 507162d8324..035f3967609 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientSecretDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ClientSecretDaoImpl.java @@ -2,8 +2,8 @@ import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.joda.time.DateTime; import org.orcid.persistence.dao.ClientSecretDao; @@ -58,7 +58,7 @@ public boolean createClientSecret(String clientId, String clientSecret) { * */ @Override public List getClientSecretsByClientId(String clientId) { - TypedQuery query = entityManager.createQuery("From ClientSecretEntity WHERE client_details_id=:clientId", ClientSecretEntity.class); + TypedQuery query = entityManager.createQuery("From ClientSecretEntity WHERE clientId=:clientId", ClientSecretEntity.class); query.setParameter("clientId", clientId); return query.getResultList(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/CustomEmailDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/CustomEmailDaoImpl.java index af8d2ea511b..7ca6fe566ae 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/CustomEmailDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/CustomEmailDaoImpl.java @@ -3,9 +3,9 @@ import java.util.Date; import java.util.List; -import javax.persistence.NoResultException; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.NoResultException; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.hibernate.NonUniqueResultException; import org.orcid.persistence.dao.CustomEmailDao; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailDaoImpl.java index 3df5afeb243..6445d8c6caf 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailDaoImpl.java @@ -2,8 +2,8 @@ import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.aop.UpdateProfileLastModifiedAndIndexingStatus; @@ -182,7 +182,7 @@ public List findByOrcid(String orcid, String visibility) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean updateVerifySetCurrentAndPrimary(String orcid, String email) { - Query query = entityManager.createQuery("update EmailEntity set current = true, primary = true, verified = true, lastModified=now() where orcid = :orcid and email = :email"); + Query query = entityManager.createQuery("update EmailEntity e set e.current = true, e.primary = true, e.verified = true, e.lastModified=now() where e.orcid = :orcid and e.email = :email"); query.setParameter("orcid", orcid); query.setParameter("email", email); return query.executeUpdate() > 0; @@ -249,7 +249,7 @@ public EmailEntity findPrimaryEmail(String orcid) { @Override @Transactional public boolean hideAllEmails(String orcid) { - Query query = entityManager.createQuery("update EmailEntity set visibility = :visibility, email = null, lastModified=now() where orcid = :orcid"); + Query query = entityManager.createQuery("update EmailEntity e set e.visibility = :visibility, e.email = null, e.lastModified=now() where e.orcid = :orcid"); query.setParameter("orcid", orcid); query.setParameter("visibility", PRIVATE_VISIBILITY); return query.executeUpdate() > 0; @@ -259,7 +259,7 @@ public boolean hideAllEmails(String orcid) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean updateVisibility(String orcid, String email, String visibility) { - Query query = entityManager.createQuery("update EmailEntity set visibility = :visibility, lastModified=now() where email = :email and orcid = :orcid"); + Query query = entityManager.createQuery("update EmailEntity e set e.visibility = :visibility, e.lastModified=now() where e.email = :email and e.orcid = :orcid"); query.setParameter("orcid", orcid); query.setParameter("email", email); query.setParameter("visibility", visibility); @@ -276,7 +276,7 @@ public List getEmailsToHash(Integer batchSize) { @Override public boolean populateEmailHash(String email, String emailHash) { - Query query = entityManager.createQuery("update EmailEntity set id=:hash where email = :email"); + Query query = entityManager.createQuery("update EmailEntity e set e.id=:hash where e.email = :email"); query.setParameter("email", email); query.setParameter("hash", emailHash); return query.executeUpdate() > 0; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailDomainDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailDomainDaoImpl.java index 3ef07af83cc..47f983162fc 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailDomainDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailDomainDaoImpl.java @@ -2,9 +2,9 @@ import java.util.List; -import javax.persistence.NoResultException; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.NoResultException; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.EmailDomainDao; import org.orcid.persistence.jpa.entities.EmailDomainEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailFrequencyDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailFrequencyDaoImpl.java index 7bd542b843c..42a4724741a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailFrequencyDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailFrequencyDaoImpl.java @@ -1,6 +1,6 @@ package org.orcid.persistence.dao.impl; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.constants.SendEmailFrequency; @@ -32,7 +32,7 @@ public EmailFrequencyEntity findByOrcid(String orcid) { @Transactional @UpdateProfileLastModified public boolean updateSendChangeNotifications(String orcid, SendEmailFrequency frequency) { - Query query = entityManager.createQuery("UPDATE EmailFrequencyEntity SET sendChangeNotifications = :frequency, lastModified=now() WHERE orcid = :orcid"); + Query query = entityManager.createQuery("UPDATE EmailFrequencyEntity ef SET ef.sendChangeNotifications = :frequency, ef.lastModified=now() WHERE ef.orcid = :orcid"); query.setParameter("frequency", Float.valueOf(frequency.value())); query.setParameter("orcid", orcid); return query.executeUpdate() > 0; @@ -42,7 +42,7 @@ public boolean updateSendChangeNotifications(String orcid, SendEmailFrequency fr @Transactional @UpdateProfileLastModified public boolean updateSendAdministrativeChangeNotifications(String orcid, SendEmailFrequency frequency) { - Query query = entityManager.createQuery("UPDATE EmailFrequencyEntity SET sendAdministrativeChangeNotifications = :frequency, lastModified=now() WHERE orcid = :orcid"); + Query query = entityManager.createQuery("UPDATE EmailFrequencyEntity ef SET ef.sendAdministrativeChangeNotifications = :frequency, ef.lastModified=now() WHERE ef.orcid = :orcid"); query.setParameter("frequency", Float.valueOf(frequency.value())); query.setParameter("orcid", orcid); return query.executeUpdate() > 0; @@ -52,7 +52,7 @@ public boolean updateSendAdministrativeChangeNotifications(String orcid, SendEma @Transactional @UpdateProfileLastModified public boolean updateSendMemberUpdateRequests(String orcid, SendEmailFrequency frequency) { - Query query = entityManager.createQuery("UPDATE EmailFrequencyEntity SET sendMemberUpdateRequests = :frequency, lastModified=now() WHERE orcid = :orcid"); + Query query = entityManager.createQuery("UPDATE EmailFrequencyEntity ef SET ef.sendMemberUpdateRequests = :frequency, ef.lastModified=now() WHERE ef.orcid = :orcid"); query.setParameter("frequency", Float.valueOf(frequency.value())); query.setParameter("orcid", orcid); return query.executeUpdate() > 0; @@ -62,7 +62,7 @@ public boolean updateSendMemberUpdateRequests(String orcid, SendEmailFrequency f @Transactional @UpdateProfileLastModified public boolean updateSendQuarterlyTips(String orcid, boolean enabled) { - Query query = entityManager.createQuery("UPDATE EmailFrequencyEntity SET sendQuarterlyTips = :enabled, lastModified=now() WHERE orcid = :orcid"); + Query query = entityManager.createQuery("UPDATE EmailFrequencyEntity ef SET ef.sendQuarterlyTips = :enabled, ef.lastModified=now() WHERE ef.orcid = :orcid"); query.setParameter("enabled", enabled); query.setParameter("orcid", orcid); return query.executeUpdate() > 0; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailScheduleDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailScheduleDaoImpl.java index 3f6d170b9bb..8da6be7a45a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailScheduleDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EmailScheduleDaoImpl.java @@ -4,8 +4,8 @@ import java.util.Date; import java.util.List; -import javax.persistence.Query; -import javax.transaction.Transactional; +import jakarta.persistence.Query; +import jakarta.transaction.Transactional; import org.orcid.persistence.dao.EmailScheduleDao; import org.orcid.persistence.jpa.entities.EmailScheduleEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EventDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EventDaoImpl.java index ef2b15ce69e..a2ad19ed1ff 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EventDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EventDaoImpl.java @@ -1,9 +1,9 @@ package org.orcid.persistence.dao.impl; -import javax.annotation.Resource; -import javax.persistence.EntityManager; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.EventDao; import org.orcid.persistence.jpa.entities.EventEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EventStatsDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EventStatsDaoImpl.java index a81c3687535..8c74e17f2c0 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EventStatsDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/EventStatsDaoImpl.java @@ -5,12 +5,11 @@ import org.orcid.persistence.jpa.entities.EventStatsEntity; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; -import javax.persistence.EntityManager; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; -import java.math.BigInteger; import java.util.ArrayList; import java.util.List; @@ -60,8 +59,11 @@ public void createPapiEventStats() { List eventsListToRemove = new ArrayList<>(); if (eventsList.size() > 0) { eventsList.forEach(item -> { - if ("anonymous".equals(item[3]) && item[4] != null && ((BigInteger) item[4]).intValue() < 1000) { - eventsListToRemove.add(item); + if ("anonymous".equals(item[3]) && item[4] != null) { + int count = ((Number) item[4]).intValue(); + if (count < 1000) { + eventsListToRemove.add(item); + } } }); eventsList.removeAll(eventsListToRemove); diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ExternalIdentifierDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ExternalIdentifierDaoImpl.java index 6ddc9e0f520..c38a42910d2 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ExternalIdentifierDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ExternalIdentifierDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.jaxb.model.v3.release.common.Visibility; import org.orcid.persistence.aop.UpdateProfileLastModifiedAndIndexingStatus; @@ -33,7 +33,7 @@ public ExternalIdentifierDaoImpl() { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean removeExternalIdentifier(String orcid, String externalIdReference) { - Query query = entityManager.createQuery("delete from ExternalIdentifierEntity where orcid=:orcid and externalIdReference=:externalIdReference"); + Query query = entityManager.createQuery("delete from ExternalIdentifierEntity ei where ei.orcid=:orcid and ei.externalIdReference=:externalIdReference"); query.setParameter("orcid", orcid); query.setParameter("externalIdReference", externalIdReference); return query.executeUpdate() > 0 ? true : false; @@ -84,7 +84,7 @@ public ExternalIdentifierEntity getExternalIdentifierEntity(String orcid, Long i @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean removeExternalIdentifier(String orcid, Long id) { - Query query = entityManager.createQuery("delete from ExternalIdentifierEntity where orcid=:orcid and id=:id"); + Query query = entityManager.createQuery("delete from ExternalIdentifierEntity ei where ei.orcid=:orcid and ei.id=:id"); query.setParameter("orcid", orcid); query.setParameter("id", id); return query.executeUpdate() > 0 ? true : false; @@ -94,7 +94,7 @@ public boolean removeExternalIdentifier(String orcid, Long id) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public void removeAllExternalIdentifiers(String orcid) { - Query query = entityManager.createQuery("delete from ExternalIdentifierEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from ExternalIdentifierEntity ei where ei.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/FindMyStuffHistoryDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/FindMyStuffHistoryDaoImpl.java index 181429b9c85..f6471b0ae9a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/FindMyStuffHistoryDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/FindMyStuffHistoryDaoImpl.java @@ -2,9 +2,9 @@ import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; -import javax.transaction.Transactional; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; +import jakarta.transaction.Transactional; import org.orcid.persistence.dao.FindMyStuffHistoryDao; import org.orcid.persistence.jpa.entities.FindMyStuffHistoryEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GenericDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GenericDaoImpl.java index 992cc2a21ad..8f91ea9f6ec 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GenericDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GenericDaoImpl.java @@ -4,9 +4,9 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.EntityManager; -import javax.persistence.Query; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; import org.orcid.persistence.dao.GenericDao; import org.orcid.persistence.jpa.entities.OrcidEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GivenPermissionToDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GivenPermissionToDaoImpl.java index bc20af89735..ee4809a61b7 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GivenPermissionToDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GivenPermissionToDaoImpl.java @@ -2,9 +2,9 @@ import java.util.List; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.dao.GivenPermissionToDao; @@ -26,7 +26,7 @@ public GivenPermissionToDaoImpl() { @Override public GivenPermissionToEntity findByGiverAndReceiverOrcid(String giverOrcid, String receiverOrcid) { - TypedQuery query = entityManager.createQuery("from GivenPermissionToEntity where giver_orcid = :giverOrcid and receiver_orcid = :receiverOrcid", + TypedQuery query = entityManager.createQuery("from GivenPermissionToEntity where giver = :giverOrcid and receiver = :receiverOrcid", GivenPermissionToEntity.class); query.setParameter("giverOrcid", giverOrcid); query.setParameter("receiverOrcid", receiverOrcid); @@ -46,7 +46,7 @@ public void remove(String giverOrcid, String receiverOrcid) { @Override public List findByGiver(String giverOrcid) { - TypedQuery query = entityManager.createQuery("from GivenPermissionToEntity where giver_orcid = :giverOrcid", + TypedQuery query = entityManager.createQuery("from GivenPermissionToEntity where giver = :giverOrcid", GivenPermissionToEntity.class); query.setParameter("giverOrcid", giverOrcid); return query.getResultList(); @@ -54,7 +54,7 @@ public List findByGiver(String giverOrcid) { @Override public List findByReceiver(String receiverOrcid) { - TypedQuery query = entityManager.createQuery("from GivenPermissionByEntity where receiver_orcid = :receiverOrcid", + TypedQuery query = entityManager.createQuery("from GivenPermissionByEntity where receiver = :receiverOrcid", GivenPermissionByEntity.class); query.setParameter("receiverOrcid", receiverOrcid); return query.getResultList(); diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GroupIdRecordDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GroupIdRecordDaoImpl.java index 332011883f9..fde234531f1 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GroupIdRecordDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/GroupIdRecordDaoImpl.java @@ -3,8 +3,8 @@ import java.util.Date; import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.GroupIdRecordDao; import org.orcid.persistence.jpa.entities.GroupIdRecordEntity; @@ -46,9 +46,9 @@ public GroupIdRecordEntity findByGroupId(String groupId) { @Override public GroupIdRecordEntity findByName(String name) { - TypedQuery query = entityManager.createQuery("from GroupIdRecordEntity where trim(lower(group_name)) = trim(lower(:group_name))", + TypedQuery query = entityManager.createQuery("from GroupIdRecordEntity where trim(lower(groupName)) = trim(lower(:groupName))", GroupIdRecordEntity.class); - query.setParameter("group_name", name); + query.setParameter("groupName", name); GroupIdRecordEntity result = query.getSingleResult(); return result; } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/IdentifierTypeDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/IdentifierTypeDaoImpl.java index 0eacbee8a78..d32628ec412 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/IdentifierTypeDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/IdentifierTypeDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.TypedQuery; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.IdentifierTypeDao; import org.orcid.persistence.jpa.entities.IdentifierTypeEntity; @@ -45,14 +45,14 @@ public IdentifierTypeEntity updateIdentifierType(IdentifierTypeEntity identifier @Override public IdentifierTypeEntity getEntityByName(String idName) { - TypedQuery query = entityManager.createQuery("FROM IdentifierTypeEntity WHERE id_name = :idName", IdentifierTypeEntity.class); + TypedQuery query = entityManager.createQuery("FROM IdentifierTypeEntity WHERE name = :idName", IdentifierTypeEntity.class); query.setParameter("idName", idName); return query.getSingleResult(); } @Override public List getEntities() { - TypedQuery query = entityManager.createQuery("FROM IdentifierTypeEntity order by id_name", IdentifierTypeEntity.class); + TypedQuery query = entityManager.createQuery("FROM IdentifierTypeEntity order by name", IdentifierTypeEntity.class); return query.getResultList(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/IdentityProviderDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/IdentityProviderDaoImpl.java index 0c8d23a4ceb..39ae2f7c3d8 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/IdentityProviderDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/IdentityProviderDaoImpl.java @@ -2,9 +2,9 @@ import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; -import javax.transaction.Transactional; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; +import jakarta.transaction.Transactional; import org.orcid.persistence.dao.IdentityProviderDao; import org.orcid.persistence.jpa.entities.IdentityProviderEntity; @@ -22,7 +22,7 @@ public IdentityProviderDaoImpl() { @Override public IdentityProviderEntity findByProviderid(String providerid) { - TypedQuery query = entityManager.createQuery("from IdentityProviderEntity where providerid = :providerid", IdentityProviderEntity.class); + TypedQuery query = entityManager.createQuery("from IdentityProviderEntity i where i.providerid = :providerid", IdentityProviderEntity.class); query.setParameter("providerid", providerid); List results = query.getResultList(); return results.isEmpty() ? null : results.get(0); @@ -31,7 +31,7 @@ public IdentityProviderEntity findByProviderid(String providerid) { @Override @Transactional public void incrementFailedCount(String providerid) { - Query query = entityManager.createQuery("update IdentityProviderEntity set lastFailed = now(), failedCount = failedCount + 1 where providerid = :providerid"); + Query query = entityManager.createQuery("update IdentityProviderEntity i set i.lastFailed = now(), i.failedCount = i.failedCount + 1 where i.providerid = :providerid"); query.setParameter("providerid", providerid); query.executeUpdate(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/InvalidRecordDataChangeDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/InvalidRecordDataChangeDaoImpl.java index fa5aeef9999..6513008cb9b 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/InvalidRecordDataChangeDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/InvalidRecordDataChangeDaoImpl.java @@ -2,10 +2,10 @@ import java.util.List; -import javax.annotation.Resource; -import javax.persistence.EntityManager; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.InvalidRecordDataChangeDao; import org.orcid.persistence.jpa.entities.InvalidRecordDataChangeEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MemberChosenOrgDisambiguatedDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MemberChosenOrgDisambiguatedDaoImpl.java index 395f1a0f943..68378f0487a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MemberChosenOrgDisambiguatedDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MemberChosenOrgDisambiguatedDaoImpl.java @@ -2,9 +2,9 @@ import java.util.List; -import javax.annotation.Resource; -import javax.persistence.EntityManager; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; import org.orcid.persistence.dao.MemberChosenOrgDisambiguatedDao; import org.orcid.persistence.jpa.entities.MemberChosenOrgDisambiguatedEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MemberOBOWhitelistedClientDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MemberOBOWhitelistedClientDaoImpl.java index 03229b8c4b1..0fce90816e1 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MemberOBOWhitelistedClientDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MemberOBOWhitelistedClientDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.TypedQuery; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.MemberOBOWhitelistedClientDao; import org.orcid.persistence.jpa.entities.MemberOBOWhitelistedClientEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MiscDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MiscDaoImpl.java index f37a1a5f5be..b5648b6c959 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MiscDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/MiscDaoImpl.java @@ -2,9 +2,9 @@ import java.util.Date; -import javax.annotation.Resource; -import javax.persistence.EntityManager; -import javax.persistence.Query; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; import org.orcid.persistence.dao.MiscDao; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/NotificationDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/NotificationDaoImpl.java index e9b913d0a8d..d7343317749 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/NotificationDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/NotificationDaoImpl.java @@ -8,8 +8,8 @@ import java.util.List; import java.util.Properties; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.dao.NotificationDao; @@ -63,7 +63,7 @@ public NotificationEntity findLatestByOrcid(String orcid) { public List findUnsentByOrcid(String orcid) { TypedQuery query = entityManager.createQuery("from NotificationEntity where sentDate is null and orcid = :orcid", NotificationEntity.class); query.setParameter("orcid", orcid); - query.setHint("javax.persistence.query.timeout", queryTimeout); + query.setHint("jakarta.persistence.query.timeout", queryTimeout); return query.getResultList(); } @@ -111,7 +111,7 @@ public NotificationEntity findByOricdAndId(String orcid, Long id) { @Override @Transactional public void flagAsSent(Long id) { - Query query = entityManager.createQuery("update NotificationEntity set sentDate = now() where id in :id"); + Query query = entityManager.createQuery("update NotificationEntity n set n.sentDate = now() where n.id in :id"); query.setParameter("id", id); query.executeUpdate(); } @@ -119,7 +119,7 @@ public void flagAsSent(Long id) { @Override @Transactional public void flagAsSent(Collection ids) { - Query query = entityManager.createQuery("update NotificationEntity set sentDate = now() where id in :ids"); + Query query = entityManager.createQuery("update NotificationEntity n set n.sentDate = now() where n.id in :ids"); query.setParameter("ids", ids); query.executeUpdate(); } @@ -127,7 +127,7 @@ public void flagAsSent(Collection ids) { @Override @Transactional public void flagAsRead(String orcid, Long id) { - Query query = entityManager.createQuery("update NotificationEntity set readDate = now() where orcid = :orcid and id = :id and readDate is null"); + Query query = entityManager.createQuery("update NotificationEntity n set n.readDate = now() where n.orcid = :orcid and n.id = :id and n.readDate is null"); query.setParameter("orcid", orcid); query.setParameter("id", id); query.executeUpdate(); @@ -136,7 +136,7 @@ public void flagAsRead(String orcid, Long id) { @Override @Transactional public void flagAsArchived(String orcid, Long id) { - Query query = entityManager.createQuery("update NotificationEntity set archivedDate = now() where orcid = :orcid and id = :id and archivedDate is null"); + Query query = entityManager.createQuery("update NotificationEntity n set n.archivedDate = now() where n.orcid = :orcid and n.id = :id and n.archivedDate is null"); query.setParameter("orcid", orcid); query.setParameter("id", id); query.executeUpdate(); @@ -208,7 +208,7 @@ public List findPermissionsByOrcidAndClient(String orcid, St public List findRecordsWithUnsentNotifications() { Query query = entityManager.createNamedQuery(NotificationEntity.FIND_ORCIDS_WITH_UNSENT_NOTIFICATIONS_ON_EMAIL_FREQUENCIES_TABLE); query.setParameter("never", Float.MAX_VALUE); - query.setHint("javax.persistence.query.timeout", queryTimeout); + query.setHint("jakarta.persistence.query.timeout", queryTimeout); List results = query.getResultList(); @@ -294,7 +294,7 @@ public List findUnsentTips(int batchSize) { @Override public void flagAsSendable(String orcid, Long id) { - Query query = entityManager.createQuery("update NotificationEntity set sendable=true where orcid = :orcid and id = :id"); + Query query = entityManager.createQuery("update NotificationEntity n set n.sendable=true where n.orcid = :orcid and n.id = :id"); query.setParameter("orcid", orcid); query.setParameter("id", id); query.executeUpdate(); @@ -302,7 +302,7 @@ public void flagAsSendable(String orcid, Long id) { @Override public void flagAsNonSendable(String orcid, Long id) { - Query query = entityManager.createQuery("update NotificationEntity set sendable=false where orcid = :orcid and id = :id"); + Query query = entityManager.createQuery("update NotificationEntity n set n.sendable=false where n.orcid = :orcid and n.id = :id"); query.setParameter("orcid", orcid); query.setParameter("id", id); query.executeUpdate(); @@ -310,7 +310,7 @@ public void flagAsNonSendable(String orcid, Long id) { @Override public void updateRetryCount(String orcid, Long id, Long retryCount) { - Query query = entityManager.createQuery("update NotificationEntity set retryCount = :count where orcid = :orcid and id = :id"); + Query query = entityManager.createQuery("update NotificationEntity n set n.retryCount = :count where n.orcid = :orcid and n.id = :id"); query.setParameter("count", retryCount); query.setParameter("orcid", orcid); query.setParameter("id", id); diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidOauth2AuthoriziationCodeDetailDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidOauth2AuthoriziationCodeDetailDaoImpl.java index e011f3cf711..b590c69cdcc 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidOauth2AuthoriziationCodeDetailDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidOauth2AuthoriziationCodeDetailDaoImpl.java @@ -1,8 +1,8 @@ package org.orcid.persistence.dao.impl; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.dao.OrcidOauth2AuthoriziationCodeDetailDao; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidOauth2TokenDetailDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidOauth2TokenDetailDaoImpl.java index 239a167488d..0b546040a56 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidOauth2TokenDetailDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidOauth2TokenDetailDaoImpl.java @@ -3,9 +3,9 @@ import java.util.Date; import java.util.List; -import javax.persistence.NoResultException; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.NoResultException; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; @@ -45,7 +45,7 @@ public OrcidOauth2TokenDetail findNonDisabledByTokenValue(String tokenValue) { @Override public void removeByRefreshTokenValue(String refreshTokenValue) { - Query query = entityManager.createQuery("update OrcidOauth2TokenDetail set tokenDisabled = TRUE, revocationDate=now(), revokeReason = 'CLIENT_REVOKED' where refreshTokenValue = :refreshToken"); + Query query = entityManager.createQuery("update OrcidOauth2TokenDetail t set t.tokenDisabled = TRUE, t.revocationDate=now(), t.revokeReason = 'CLIENT_REVOKED' where t.refreshTokenValue = :refreshToken"); query.setParameter("refreshToken", refreshTokenValue); int i = query.executeUpdate(); if (i == 0) { @@ -98,7 +98,7 @@ public List findByClientIdAndUserName(String clientId, S @Override @Transactional public void disableAccessToken(String accessTokenValue) { - Query query = entityManager.createQuery("update OrcidOauth2TokenDetail set tokenDisabled = TRUE, revocationDate=now(), revokeReason = 'CLIENT_REVOKED' where tokenValue = :accessTokenValue"); + Query query = entityManager.createQuery("update OrcidOauth2TokenDetail t set t.tokenDisabled = TRUE, t.revocationDate=now(), t.revokeReason = 'CLIENT_REVOKED' where t.tokenValue = :accessTokenValue"); query.setParameter("accessTokenValue", accessTokenValue); int count = query.executeUpdate(); if (count == 0) { @@ -109,7 +109,7 @@ public void disableAccessToken(String accessTokenValue) { @Override @Transactional public void disableAccessTokenById(Long tokenId, String userOrcid) { - Query query = entityManager.createQuery("update OrcidOauth2TokenDetail set tokenDisabled = TRUE, revocationDate=now(), revokeReason = 'USER_REVOKED' where id = :tokenId and orcid = :userOrcid"); + Query query = entityManager.createQuery("update OrcidOauth2TokenDetail t set t.tokenDisabled = TRUE, t.revocationDate=now(), t.revokeReason = 'USER_REVOKED' where t.id = :tokenId and t.orcid = :userOrcid"); query.setParameter("tokenId", tokenId); query.setParameter("userOrcid", userOrcid); int count = query.executeUpdate(); @@ -121,7 +121,7 @@ public void disableAccessTokenById(Long tokenId, String userOrcid) { @Override @Transactional public void disableAccessTokenByRefreshToken(String refreshTokenValue) { - Query query = entityManager.createQuery("update OrcidOauth2TokenDetail set tokenDisabled = TRUE, revocationDate=now(), revokeReason = 'CLIENT_REVOKED' where refreshTokenValue = :refreshTokenValue"); + Query query = entityManager.createQuery("update OrcidOauth2TokenDetail t set t.tokenDisabled = TRUE, t.revocationDate=now(), t.revokeReason = 'CLIENT_REVOKED' where t.refreshTokenValue = :refreshTokenValue"); query.setParameter("refreshTokenValue", refreshTokenValue); int count = query.executeUpdate(); if (count == 0) { @@ -179,7 +179,7 @@ public boolean hasTokenForClient(String userName, String clientId) { @Override @Transactional public int disableAccessTokenByCodeAndClient(String authorizationCode, String clientId, String reason) { - Query query = entityManager.createQuery("update OrcidOauth2TokenDetail set tokenDisabled = TRUE, revocationDate=now(), revokeReason = :reason, lastModified=now() where clientDetailsId = :clientId and authorizationCode = :authorizationCode"); + Query query = entityManager.createQuery("update OrcidOauth2TokenDetail t set t.tokenDisabled = TRUE, t.revocationDate=now(), t.revokeReason = :reason, t.lastModified=now() where t.clientDetailsId = :clientId and t.authorizationCode = :authorizationCode"); query.setParameter("authorizationCode", authorizationCode); query.setParameter("clientId", clientId); query.setParameter("reason", reason); @@ -198,7 +198,7 @@ public List findAccessTokenByCodeAndClient(String authorizationCode, Str @Override @Transactional public void disableAccessTokenByUserOrcid(String userOrcid, String reason) { - Query query = entityManager.createQuery("update OrcidOauth2TokenDetail set tokenDisabled = TRUE, revocationDate=now(), revokeReason = :reason, lastModified=now() where orcid = :userOrcid AND (tokenDisabled IS NULL OR tokenDisabled = FALSE)"); + Query query = entityManager.createQuery("update OrcidOauth2TokenDetail t set t.tokenDisabled = TRUE, t.revocationDate=now(), t.revokeReason = :reason, t.lastModified=now() where t.orcid = :userOrcid AND (t.tokenDisabled IS NULL OR t.tokenDisabled = FALSE)"); query.setParameter("userOrcid", userOrcid); query.setParameter("reason", reason); query.executeUpdate(); @@ -207,7 +207,7 @@ public void disableAccessTokenByUserOrcid(String userOrcid, String reason) { @Override @Transactional public void revokeAccessToken(String accessToken) { - Query query = entityManager.createQuery("update OrcidOauth2TokenDetail set tokenDisabled = TRUE, revocationDate=now(), revokeReason = 'CLIENT_REVOKED', lastModified=now() where tokenValue = :accessTokenValue"); + Query query = entityManager.createQuery("update OrcidOauth2TokenDetail t set t.tokenDisabled = TRUE, t.revocationDate=now(), t.revokeReason = 'CLIENT_REVOKED', t.lastModified=now() where t.tokenValue = :accessTokenValue"); query.setParameter("accessTokenValue", accessToken); int count = query.executeUpdate(); if (count == 0) { @@ -218,7 +218,7 @@ public void revokeAccessToken(String accessToken) { @Override @Transactional public void disableClientAccessTokensByUserOrcid(String orcid, String clientDetailsId) { - Query query = entityManager.createQuery("update OrcidOauth2TokenDetail set tokenDisabled = TRUE, revocationDate=now(), revokeReason = 'USER_REVOKED', lastModified=now() where clientDetailsId = :clientDetailsId and orcid = :orcid and revokeReason is null"); + Query query = entityManager.createQuery("update OrcidOauth2TokenDetail t set t.tokenDisabled = TRUE, t.revocationDate=now(), t.revokeReason = 'USER_REVOKED', t.lastModified=now() where t.clientDetailsId = :clientDetailsId and t.orcid = :orcid and t.revokeReason is null"); query.setParameter("clientDetailsId", clientDetailsId); query.setParameter("orcid", orcid); int count = query.executeUpdate(); @@ -244,7 +244,7 @@ public OrcidOauth2TokenDetail merge(OrcidOauth2TokenDetail token) { @Override @Transactional public boolean updateScopes(String accessTokenValue, String newScopes) { - Query query = entityManager.createQuery("update OrcidOauth2TokenDetail set scope = :scopes where tokenValue = :accessTokenValue"); + Query query = entityManager.createQuery("update OrcidOauth2TokenDetail t set t.scope = :scopes where t.tokenValue = :accessTokenValue"); query.setParameter("accessTokenValue", accessTokenValue); query.setParameter("scopes", newScopes); return query.executeUpdate() > 0; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidPropsDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidPropsDaoImpl.java index 7238018b372..7106b035524 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidPropsDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrcidPropsDaoImpl.java @@ -1,8 +1,8 @@ package org.orcid.persistence.dao.impl; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.Query; +import jakarta.persistence.NoResultException; +import jakarta.persistence.NonUniqueResultException; +import jakarta.persistence.Query; import org.orcid.persistence.dao.OrcidPropsDao; import org.orcid.persistence.jpa.entities.OrcidPropsEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgAffiliationRelationDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgAffiliationRelationDaoImpl.java index 64d1578c1bb..3df0a22554c 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgAffiliationRelationDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgAffiliationRelationDaoImpl.java @@ -5,9 +5,9 @@ import java.util.List; import java.util.concurrent.CompletableFuture; -import javax.annotation.Resource; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.annotation.Resource; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.utils.panoply.PanoplyDeletedItem; import org.orcid.utils.panoply.PanoplyRedshiftClient; @@ -65,7 +65,7 @@ public OrgAffiliationRelationDaoImpl() { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean removeOrgAffiliationRelation(String userOrcid, Long orgAffiliationRelationId) { - Query query = entityManager.createQuery("delete from OrgAffiliationRelationEntity where orcid=:userOrcid and id=:orgAffiliationRelationId"); + Query query = entityManager.createQuery("delete from OrgAffiliationRelationEntity o where o.orcid=:userOrcid and o.id=:orgAffiliationRelationId"); query.setParameter("userOrcid", userOrcid); query.setParameter("orgAffiliationRelationId", orgAffiliationRelationId); if (query.executeUpdate() > 0) { @@ -119,7 +119,7 @@ private void storeDeletedItemInPanoply(PanoplyDeletedItem item) { @UpdateProfileLastModifiedAndIndexingStatus public boolean updateVisibilityOnOrgAffiliationRelation(String userOrcid, Long orgAffiliationRelationId, String visibility) { Query query = entityManager.createQuery( - "update OrgAffiliationRelationEntity set visibility=:visibility, lastModified=now() where orcid=:userOrcid and id=:orgAffiliationRelationId"); + "update OrgAffiliationRelationEntity o set o.visibility=:visibility, o.lastModified=now() where o.orcid=:userOrcid and o.id=:orgAffiliationRelationId"); query.setParameter("userOrcid", userOrcid); query.setParameter("orgAffiliationRelationId", orgAffiliationRelationId); query.setParameter("visibility", visibility); @@ -156,7 +156,7 @@ public boolean updateVisibilityOnOrgAffiliationRelation(String userOrcid, Long o @Transactional public boolean updateVisibilitiesOnOrgAffiliationRelation(String userOrcid, ArrayList orgAffiliationRelationIds, String visibility) { Query query = entityManager.createQuery( - "update OrgAffiliationRelationEntity set visibility=:visibility, lastModified=now() where orcid=:userOrcid and id in (:orgAffiliationRelationIds)"); + "update OrgAffiliationRelationEntity o set o.visibility=:visibility, o.lastModified=now() where o.orcid=:userOrcid and o.id in (:orgAffiliationRelationIds)"); query.setParameter("userOrcid", userOrcid); query.setParameter("orgAffiliationRelationIds", orgAffiliationRelationIds); query.setParameter("visibility", visibility); @@ -348,7 +348,7 @@ public List getByUser(String orcid) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public void removeAllAffiliations(String orcid) { - Query query = entityManager.createQuery("delete from OrgAffiliationRelationEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from OrgAffiliationRelationEntity o where o.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); if (query.executeUpdate() > 0) { @@ -377,7 +377,7 @@ public Boolean updateToMaxDisplay(String orcid, Long putCode) { public Boolean hasPublicAffiliations(String orcid) { Query query = entityManager.createNativeQuery("SELECT count(*) FROM org_affiliation_relation WHERE orcid=:orcid AND visibility='PUBLIC'"); query.setParameter("orcid", orcid); - Long result = ((BigInteger) query.getSingleResult()).longValue(); + Long result = ((Number) query.getSingleResult()).longValue(); return (result != null && result > 0); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDaoImpl.java index 898a1d39f05..ed597a0acdb 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDaoImpl.java @@ -3,8 +3,8 @@ import java.math.BigInteger; import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.OrgDao; import org.orcid.persistence.jpa.entities.AmbiguousOrgEntity; @@ -231,7 +231,7 @@ public List findByOrgDisambiguatedId(Long orgDisambiguatedId) { @Transactional(propagation = Propagation.REQUIRED) public void updateOrgDisambiguatedId(long deletedOrgDisambiguatedId, long replacementOrgDisambiguatedId) { Query query = entityManager - .createQuery("update OrgEntity set orgDisambiguated.id = :replacementOrgDisambiguatedId where orgDisambiguated.id = :deletedOrgDisambiguatedId"); + .createQuery("update OrgEntity o set o.orgDisambiguated.id = :replacementOrgDisambiguatedId where o.orgDisambiguated.id = :deletedOrgDisambiguatedId"); query.setParameter("deletedOrgDisambiguatedId", deletedOrgDisambiguatedId); query.setParameter("replacementOrgDisambiguatedId", replacementOrgDisambiguatedId); query.executeUpdate(); diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDisambiguatedDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDisambiguatedDaoImpl.java index f4713c35836..3d10cbe2392 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDisambiguatedDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDisambiguatedDaoImpl.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -140,8 +140,8 @@ public List> findDisambuguatedOrgsWithIncorrectPopularity(in List results = query.getResultList(); List> pairs = new ArrayList<>(); for (Object[] row : results) { - Long id = ((BigInteger) row[0]).longValue(); - Integer popularity = ((BigInteger) row[1]).intValue(); + Long id = ((Number) row[0]).longValue(); + Integer popularity = ((Number) row[1]).intValue(); Pair pair = new ImmutablePair(id, popularity); pairs.add(pair); } @@ -151,7 +151,7 @@ public List> findDisambuguatedOrgsWithIncorrectPopularity(in @Override @Transactional public void updatePopularity(Long orgDisambiguatedId, Integer popularity) { - Query query = entityManager.createQuery("update OrgDisambiguatedEntity set indexingStatus = 'PENDING', popularity = :popularity where id = :orgDisambiguatedId"); + Query query = entityManager.createQuery("update OrgDisambiguatedEntity od set od.indexingStatus = 'PENDING', od.popularity = :popularity where od.id = :orgDisambiguatedId"); query.setParameter("orgDisambiguatedId", orgDisambiguatedId); query.setParameter("popularity", popularity); query.executeUpdate(); diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDisambiguatedExternalIdentifierDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDisambiguatedExternalIdentifierDaoImpl.java index 2c8c2e509d9..7eef4d302de 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDisambiguatedExternalIdentifierDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgDisambiguatedExternalIdentifierDaoImpl.java @@ -2,9 +2,9 @@ import java.util.List; -import javax.persistence.NoResultException; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.NoResultException; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.OrgDisambiguatedExternalIdentifierDao; import org.orcid.persistence.jpa.entities.OrgDisambiguatedExternalIdentifierEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgImportLogDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgImportLogDaoImpl.java index 05edf531082..5c4f052e5ae 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgImportLogDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OrgImportLogDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.dao.OrgImportLogDao; import org.orcid.persistence.jpa.entities.OrgImportLogEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OtherNameDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OtherNameDaoImpl.java index 02feec5da5c..ac00ed653e0 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OtherNameDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/OtherNameDaoImpl.java @@ -3,7 +3,7 @@ import java.math.BigInteger; import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.jaxb.model.v3.release.common.Visibility; import org.orcid.persistence.aop.UpdateProfileLastModifiedAndIndexingStatus; @@ -91,8 +91,8 @@ public boolean addOtherName(String orcid, String displayName) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean deleteOtherName(OtherNameEntity otherName) { - Assert.notNull(otherName); - Query query = entityManager.createQuery("DELETE FROM OtherNameEntity WHERE id=:id"); + Assert.notNull(otherName, "must not be null"); + Query query = entityManager.createQuery("DELETE FROM OtherNameEntity n WHERE n.id=:id"); query.setParameter("id", otherName.getId()); return query.executeUpdate() > 0 ? true : false; } @@ -109,7 +109,7 @@ public OtherNameEntity getOtherName(String orcid, Long putCode) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public void removeAllOtherNames(String orcid) { - Query query = entityManager.createQuery("delete from OtherNameEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from OtherNameEntity n where n.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/PeerReviewDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/PeerReviewDaoImpl.java index c183df3d254..d3b4c1583f2 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/PeerReviewDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/PeerReviewDaoImpl.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.aop.UpdateProfileLastModifiedAndIndexingStatus; @@ -32,7 +32,7 @@ public PeerReviewEntity getPeerReview(String userOrcid, Long peerReviewId) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean removePeerReview(String userOrcid, Long peerReviewId) { - Query query = entityManager.createQuery("delete from PeerReviewEntity where orcid=:userOrcid and id=:peerReviewId"); + Query query = entityManager.createQuery("delete from PeerReviewEntity pr where pr.orcid=:userOrcid and pr.id=:peerReviewId"); query.setParameter("userOrcid", userOrcid); query.setParameter("peerReviewId", peerReviewId); return query.executeUpdate() > 0 ? true : false; @@ -89,7 +89,7 @@ public boolean updateToMaxDisplay(String orcid, Long peerReviewId) { @UpdateProfileLastModifiedAndIndexingStatus public boolean updateVisibilities(String orcid, ArrayList peerReviewIds, String visibility) { Query query = entityManager - .createQuery("update PeerReviewEntity set visibility=:visibility, lastModified=now() where id in (:peerReviewIds) and orcid=:orcid"); + .createQuery("update PeerReviewEntity pr set pr.visibility=:visibility, pr.lastModified=now() where pr.id in (:peerReviewIds) and pr.orcid=:orcid"); query.setParameter("peerReviewIds", peerReviewIds); query.setParameter("visibility", visibility); query.setParameter("orcid", orcid); @@ -101,7 +101,7 @@ public boolean updateVisibilities(String orcid, ArrayList peerReviewIds, S @UpdateProfileLastModifiedAndIndexingStatus public boolean updateVisibilityByGroupId(String orcid, String groupId, String visibility) { Query query = entityManager - .createQuery("update PeerReviewEntity set visibility=:visibility, lastModified=now() where groupId=:groupId and orcid=:orcid"); + .createQuery("update PeerReviewEntity pr set pr.visibility=:visibility, pr.lastModified=now() where pr.groupId=:groupId and pr.orcid=:orcid"); query.setParameter("groupId", groupId); query.setParameter("visibility", visibility); query.setParameter("orcid", orcid); @@ -133,7 +133,7 @@ public boolean increaseDisplayIndexOnAllElements(String orcid) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public void removeAllPeerReviews(String orcid){ - Query query = entityManager.createQuery("delete from PeerReviewEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from PeerReviewEntity pr where pr.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } @@ -142,7 +142,7 @@ public void removeAllPeerReviews(String orcid){ public Boolean hasPublicPeerReviews(String orcid) { Query query = entityManager.createNativeQuery("select count(*) from peer_review where orcid=:orcid and visibility='PUBLIC'"); query.setParameter("orcid", orcid); - Long result = ((BigInteger)query.getSingleResult()).longValue(); + Long result = ((Number)query.getSingleResult()).longValue(); return (result != null && result > 0); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileDaoImpl.java index 71c7fbbb3ba..8e90f4364d2 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileDaoImpl.java @@ -11,9 +11,9 @@ import java.util.Map; import java.util.stream.Collectors; -import javax.persistence.NoResultException; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.NoResultException; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; @@ -125,7 +125,7 @@ public Map findOrcidsByIndexingStatus(IndexingStatus indexingStatu } query.setMaxResults(maxResults); - query.setHint("javax.persistence.query.timeout", queryTimeout); + query.setHint("jakarta.persistence.query.timeout", queryTimeout); List results = query.getResultList(); @@ -347,7 +347,7 @@ public boolean existsAndNotClaimedAndBelongsTo(String messageOrcid, String clien @Override public IndexingStatus retrieveIndexingStatus(String orcid) { - TypedQuery query = entityManager.createQuery("select indexingStatus from ProfileEntity where orcid = :orcid", IndexingStatus.class); + TypedQuery query = entityManager.createQuery("select indexingStatus from ProfileEntity where id = :orcid", IndexingStatus.class); query.setParameter("orcid", orcid); return query.getSingleResult(); } @@ -357,16 +357,16 @@ public IndexingStatus retrieveIndexingStatus(String orcid) { public void updateIndexingStatus(String orcid, IndexingStatus indexingStatus) { String queryString = null; if (IndexingStatus.DONE.equals(indexingStatus)) { - queryString = "update ProfileEntity set indexingStatus = :indexingStatus, lastIndexedDate = now() where orcid = :orcid"; + queryString = "update ProfileEntity set indexingStatus = :indexingStatus, lastIndexedDate = now() where id = :orcid"; updateWebhookProfileLastUpdate(orcid); } else { - queryString = "update ProfileEntity set indexingStatus = :indexingStatus where orcid = :orcid"; + queryString = "update ProfileEntity set indexingStatus = :indexingStatus where id = :orcid"; } Query query = entityManager.createQuery(queryString); query.setParameter("orcid", orcid); query.setParameter("indexingStatus", indexingStatus); // Sets a timeout for this query - query.setHint("javax.persistence.query.timeout", queryTimeout); + query.setHint("jakarta.persistence.query.timeout", queryTimeout); query.executeUpdate(); } @@ -395,7 +395,7 @@ private void updateWebhookProfileLastUpdate(String orcid) { @Override public String retrieveOrcidType(String orcid) { - TypedQuery query = entityManager.createQuery("select orcidType from ProfileEntity where orcid = :orcid", String.class); + TypedQuery query = entityManager.createQuery("select orcidType from ProfileEntity where id = :orcid", String.class); query.setParameter("orcid", orcid); List results = query.getResultList(); return results.isEmpty() ? null : results.get(0); @@ -411,7 +411,7 @@ public List findInfoForDecryptionAnalysis() { @Override public String retrieveLocale(String orcid) { - TypedQuery query = entityManager.createQuery("select locale from ProfileEntity where orcid = :orcid", String.class); + TypedQuery query = entityManager.createQuery("select locale from ProfileEntity where id = :orcid", String.class); query.setParameter("orcid", orcid); return query.getSingleResult(); } @@ -420,7 +420,7 @@ public String retrieveLocale(String orcid) { @Transactional public void updateLocale(String orcid, String locale) { Query updateQuery = entityManager - .createQuery("update ProfileEntity set lastModified = now(), locale = :locale, indexingStatus = :indexing_status where orcid = :orcid"); + .createQuery("update ProfileEntity p set p.lastModified = now(), p.locale = :locale, p.indexingStatus = :indexing_status where p.id = :orcid"); updateQuery.setParameter("orcid", orcid); updateQuery.setParameter("locale", locale); updateQuery.setParameter("indexing_status", IndexingStatus.PENDING); @@ -431,11 +431,11 @@ public void updateLocale(String orcid, String locale) { @Transactional public boolean deprecateProfile(String toDeprecate, String primaryOrcid, String deprecatedMethod, String adminUser) { StringBuilder queryString = new StringBuilder( - "update ProfileEntity set lastModified = now(), deprecatedDate = now(), deactivationDate = now(), indexingStatus = :indexing_status, primaryRecord = :primary_record, activitiesVisibilityDefault = :defaultVisibility, deprecatedMethod = :deprecatedMethod"); + "update ProfileEntity p set p.lastModified = now(), p.deprecatedDate = now(), p.deactivationDate = now(), p.indexingStatus = :indexing_status, p.primaryRecord = :primary_record, p.activitiesVisibilityDefault = :defaultVisibility, p.deprecatedMethod = :deprecatedMethod"); if (ProfileEntity.ADMIN_DEPRECATION.equals(deprecatedMethod) && adminUser != null) { - queryString.append(", deprecatingAdmin = :deprecatingAdmin"); + queryString.append(", p.deprecatingAdmin = :deprecatingAdmin"); } - queryString.append(" where orcid = :orcid"); + queryString.append(" where p.id = :orcid"); Query query = entityManager.createQuery(queryString.toString()); query.setParameter("orcid", toDeprecate); @@ -465,7 +465,7 @@ public String retrievePrimaryAccountOrcid(String deprecatedOrcid) { @Override @Transactional public void changeEncryptedPassword(String orcid, String encryptedPassword) { - Query updateQuery = entityManager.createQuery("update ProfileEntity set encryptedPassword = :encryptedPassword where orcid = :orcid"); + Query updateQuery = entityManager.createQuery("update ProfileEntity p set p.encryptedPassword = :encryptedPassword where p.id = :orcid"); updateQuery.setParameter("orcid", orcid); updateQuery.setParameter("encryptedPassword", encryptedPassword); updateQuery.executeUpdate(); @@ -483,10 +483,10 @@ public void changeEncryptedPassword(String orcid, String encryptedPassword) { @Override @Transactional public boolean updateDeveloperTools(String orcid, boolean enabled) { - Query query = entityManager.createQuery("update ProfileEntity set enableDeveloperTools=:enabled, lastModified=now() where orcid=:orcid"); + Query query = entityManager.createQuery("update ProfileEntity p set p.enableDeveloperTools=:enabled, p.lastModified=now() where p.id=:orcid"); if (enabled) query = entityManager - .createQuery("update ProfileEntity set enableDeveloperTools=:enabled, developerToolsEnabledDate=now(), lastModified=now() where orcid=:orcid"); + .createQuery("update ProfileEntity p set p.enableDeveloperTools=:enabled, p.developerToolsEnabledDate=now(), p.lastModified=now() where p.id=:orcid"); query.setParameter("orcid", orcid); query.setParameter("enabled", enabled); return query.executeUpdate() > 0; @@ -523,7 +523,7 @@ public String getClientType(String orcid) { */ @Override public String getGroupType(String orcid) { - TypedQuery query = entityManager.createQuery("select groupType from ProfileEntity where orcid = :orcid", String.class); + TypedQuery query = entityManager.createQuery("select groupType from ProfileEntity where id = :orcid", String.class); query.setParameter("orcid", orcid); List results = query.getResultList(); return results.isEmpty() ? null : results.get(0); @@ -586,7 +586,7 @@ public boolean unlockProfile(String orcid) { @Override public boolean isLocked(String orcid) { - TypedQuery query = entityManager.createQuery("select recordLocked from ProfileEntity where orcid = :orcid", Boolean.class); + TypedQuery query = entityManager.createQuery("select recordLocked from ProfileEntity where id = :orcid", Boolean.class); query.setParameter("orcid", orcid); Boolean result; try { @@ -599,7 +599,7 @@ public boolean isLocked(String orcid) { @Override public boolean isDeactivated(String orcid) { - TypedQuery query = entityManager.createQuery("select deactivationDate from ProfileEntity where orcid = :orcid", Date.class); + TypedQuery query = entityManager.createQuery("select deactivationDate from ProfileEntity where id = :orcid", Date.class); query.setParameter("orcid", orcid); Date result = query.getSingleResult(); return (result == null) ? false : true; @@ -607,7 +607,7 @@ public boolean isDeactivated(String orcid) { @Override public boolean isReviewed(String orcid) { - TypedQuery query = entityManager.createQuery("select reviewed from ProfileEntity where orcid = :orcid", Boolean.class); + TypedQuery query = entityManager.createQuery("select reviewed from ProfileEntity where id = :orcid", Boolean.class); query.setParameter("orcid", orcid); return query.getSingleResult(); } @@ -652,7 +652,7 @@ public boolean getClaimedStatusByEmailHash(String emailHash) { @Transactional public boolean updateDefaultVisibility(String orcid, String visibility) { Query updateQuery = entityManager - .createQuery("update ProfileEntity set lastModified = now(), activitiesVisibilityDefault = :activitiesVisibilityDefault where orcid = :orcid"); + .createQuery("update ProfileEntity p set p.lastModified = now(), p.activitiesVisibilityDefault = :activitiesVisibilityDefault where p.id = :orcid"); updateQuery.setParameter("orcid", orcid); updateQuery.setParameter("activitiesVisibilityDefault", visibility); return updateQuery.executeUpdate() > 0; @@ -677,7 +677,7 @@ public void hashOrcidIds(String orcid, String hashedOrcid) { @Override public Date getLastLogin(String orcid) { - TypedQuery query = entityManager.createQuery("select lastLogin from ProfileEntity where orcid = :orcid", Date.class); + TypedQuery query = entityManager.createQuery("select lastLogin from ProfileEntity where id = :orcid", Date.class); query.setParameter("orcid", orcid); Date result = query.getSingleResult(); return result; @@ -686,7 +686,7 @@ public Date getLastLogin(String orcid) { @Override @Transactional public void disable2FA(String orcid) { - Query query = entityManager.createQuery("update ProfileEntity set lastModified = now(), using2FA = false, secretFor2FA = null where orcid = :orcid"); + Query query = entityManager.createQuery("update ProfileEntity p set p.lastModified = now(), p.using2FA = false, p.secretFor2FA = null where p.id = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } @@ -694,7 +694,7 @@ public void disable2FA(String orcid) { @Override @Transactional public void enable2FA(String orcid) { - Query query = entityManager.createQuery("update ProfileEntity set lastModified = now(), using2FA = true where orcid = :orcid"); + Query query = entityManager.createQuery("update ProfileEntity p set p.lastModified = now(), p.using2FA = true where p.id = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } @@ -702,7 +702,7 @@ public void enable2FA(String orcid) { @Override @Transactional public void update2FASecret(String orcid, String secret) { - Query query = entityManager.createQuery("update ProfileEntity set lastModified = now(), secretFor2FA = :secret where orcid = :orcid"); + Query query = entityManager.createQuery("update ProfileEntity p set p.lastModified = now(), p.secretFor2FA = :secret where p.id = :orcid"); query.setParameter("orcid", orcid); query.setParameter("secret", secret); query.executeUpdate(); @@ -711,7 +711,7 @@ public void update2FASecret(String orcid, String secret) { @Override @Transactional public boolean deactivate(String orcid) { - Query query = entityManager.createQuery("update ProfileEntity set lastModified = now(), profile_deactivation_date = now() where orcid = :orcid"); + Query query = entityManager.createQuery("update ProfileEntity p set p.lastModified = now(), p.deactivationDate = now() where p.id = :orcid"); query.setParameter("orcid", orcid); return query.executeUpdate() > 0; } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileEmailDomainDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileEmailDomainDaoImpl.java index 8028d472063..e55d6ec67d8 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileEmailDomainDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileEmailDomainDaoImpl.java @@ -8,9 +8,9 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.transaction.annotation.Transactional; -import javax.persistence.NoResultException; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.NoResultException; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import java.util.List; public class ProfileEmailDomainDaoImpl extends GenericDaoImpl implements ProfileEmailDomainDao { diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileEventDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileEventDaoImpl.java index 45d528c3386..28050ee0640 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileEventDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileEventDaoImpl.java @@ -1,8 +1,6 @@ package org.orcid.persistence.dao.impl; -import java.math.BigInteger; - -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.dao.ProfileEventDao; import org.orcid.persistence.jpa.entities.ProfileEventEntity; @@ -22,7 +20,7 @@ public boolean isAttemptSend(String orcid, ProfileEventType eventType) { Query query = entityManager.createNativeQuery("select count(*) from profile_event where orcid=:orcid and profile_event_type=:eventType"); query.setParameter("orcid", orcid); query.setParameter("eventType", eventType.toString()); - Long result = ((BigInteger)query.getSingleResult()).longValue(); + Long result = ((Number)query.getSingleResult()).longValue(); return (result != null && result > 0); } } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileFundingDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileFundingDaoImpl.java index b87b403f20f..0a55b3a53f6 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileFundingDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileFundingDaoImpl.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.aop.UpdateProfileLastModifiedAndIndexingStatus; @@ -51,7 +51,7 @@ public ProfileFundingEntity getProfileFunding(String userOrcid, Long profileFund @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean removeProfileFunding(String userOrcid, Long profileFundingId) { - Query query = entityManager.createQuery("delete from ProfileFundingEntity where orcid=:userOrcid and id=:profileFundingId"); + Query query = entityManager.createQuery("delete from ProfileFundingEntity f where f.orcid=:userOrcid and f.id=:profileFundingId"); query.setParameter("userOrcid", userOrcid); query.setParameter("profileFundingId", profileFundingId); return query.executeUpdate() > 0 ? true : false; @@ -75,7 +75,7 @@ public boolean removeProfileFunding(String userOrcid, Long profileFundingId) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean updateProfileFundingVisibility(String clientOrcid, Long profileFundingId, String visibility) { - Query query = entityManager.createQuery("update ProfileFundingEntity set visibility=:visibility where orcid=:clientOrcid and id=:profileFundingId"); + Query query = entityManager.createQuery("update ProfileFundingEntity f set f.visibility=:visibility where f.orcid=:clientOrcid and f.id=:profileFundingId"); query.setParameter("clientOrcid", clientOrcid); query.setParameter("profileFundingId", profileFundingId); query.setParameter("visibility", visibility); @@ -100,7 +100,7 @@ public boolean updateProfileFundingVisibility(String clientOrcid, Long profileFu @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean updateProfileFundingVisibilities(String clientOrcid, ArrayList profileFundingIds, String visibility) { - Query query = entityManager.createQuery("update ProfileFundingEntity set visibility=:visibility where orcid=:clientOrcid and id in (:profileFundingIds)"); + Query query = entityManager.createQuery("update ProfileFundingEntity f set f.visibility=:visibility where f.orcid=:clientOrcid and f.id in (:profileFundingIds)"); query.setParameter("clientOrcid", clientOrcid); query.setParameter("profileFundingIds", profileFundingIds); query.setParameter("visibility", visibility); @@ -277,7 +277,7 @@ public boolean increaseDisplayIndexOnAllElements(String orcid) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public void removeAllFunding(String orcid) { - Query query = entityManager.createQuery("delete from ProfileFundingEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from ProfileFundingEntity f where f.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } @@ -286,7 +286,7 @@ public void removeAllFunding(String orcid) { public Boolean hasPublicFunding(String orcid) { Query query = entityManager.createNativeQuery("SELECT count(*) FROM profile_funding WHERE orcid=:orcid AND visibility='PUBLIC'"); query.setParameter("orcid", orcid); - Long result = ((BigInteger)query.getSingleResult()).longValue(); + Long result = ((Number)query.getSingleResult()).longValue(); return (result != null && result > 0); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileHistoryEventDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileHistoryEventDaoImpl.java index d652694fc86..51221fdbda3 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileHistoryEventDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileHistoryEventDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.dao.ProfileHistoryEventDao; import org.orcid.persistence.jpa.entities.ProfileHistoryEventEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileInterstitialFlagDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileInterstitialFlagDaoImpl.java index 2de00f7078d..e800c1942a7 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileInterstitialFlagDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileInterstitialFlagDaoImpl.java @@ -5,9 +5,8 @@ import org.orcid.persistence.jpa.entities.ProfileInterstitialFlagEntity; import org.springframework.transaction.annotation.Transactional; -import javax.persistence.Query; -import javax.persistence.TypedQuery; -import java.math.BigInteger; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import java.util.List; public class ProfileInterstitialFlagDaoImpl extends GenericDaoImpl implements ProfileInterstitialFlagDao { @@ -31,7 +30,7 @@ public boolean hasInterstitialFlag(String orcid, String interstitialName) { Query query = entityManager.createNativeQuery("select count(*) from profile_interstitial_flag where orcid = :orcid and interstitial_name = :interstitialName"); query.setParameter("orcid", orcid); query.setParameter("interstitialName", interstitialName); - long result = ((BigInteger)query.getSingleResult()).longValue(); + long result = ((Number)query.getSingleResult()).longValue(); return result > 0; } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileKeywordDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileKeywordDaoImpl.java index 8b8d11da630..aae9d77cf74 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileKeywordDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileKeywordDaoImpl.java @@ -3,7 +3,7 @@ import java.math.BigInteger; import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.apache.commons.lang.StringUtils; import org.orcid.jaxb.model.v3.release.common.Visibility; @@ -61,7 +61,7 @@ public List getProfileKeywords(String orcid, String visibi @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean deleteProfileKeyword(String orcid, String keyword) { - Query query = entityManager.createQuery("DELETE FROM ProfileKeywordEntity WHERE orcid = :orcid AND keywordName = :keyword"); + Query query = entityManager.createQuery("DELETE FROM ProfileKeywordEntity k WHERE k.orcid = :orcid AND k.keywordName = :keyword"); query.setParameter("orcid", orcid); query.setParameter("keyword", keyword); return query.executeUpdate() > 0 ? true : false; @@ -99,7 +99,7 @@ public ProfileKeywordEntity getProfileKeyword(String orcid, Long putCode) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean deleteProfileKeyword(ProfileKeywordEntity entity) { - Query query = entityManager.createQuery("DELETE FROM ProfileKeywordEntity WHERE id=:id"); + Query query = entityManager.createQuery("DELETE FROM ProfileKeywordEntity k WHERE k.id=:id"); query.setParameter("id", entity.getId()); return query.executeUpdate() > 0 ? true : false; } @@ -108,7 +108,7 @@ public boolean deleteProfileKeyword(ProfileKeywordEntity entity) { @Transactional @UpdateProfileLastModifiedAndIndexingStatus public void removeAllKeywords(String orcid) { - Query query = entityManager.createQuery("delete from ProfileKeywordEntity where profile_orcid = :orcid"); + Query query = entityManager.createQuery("delete from ProfileKeywordEntity k where k.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileLastModifiedDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileLastModifiedDaoImpl.java index 78acb59e77c..63e03b94e95 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileLastModifiedDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ProfileLastModifiedDaoImpl.java @@ -4,8 +4,8 @@ import java.util.Date; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.Query; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; import org.orcid.persistence.dao.ProfileLastModifiedDao; import org.orcid.persistence.jpa.entities.IndexingStatus; @@ -29,11 +29,11 @@ public class ProfileLastModifiedDaoImpl implements ProfileLastModifiedDao { @Override @Transactional public void updateLastModifiedDateAndIndexingStatus(String orcid, IndexingStatus indexingStatus) { - Query updateQuery = entityManager.createQuery("update ProfileEntity set lastModified = now(), indexingStatus = :indexingStatus where orcid = :orcid"); + Query updateQuery = entityManager.createQuery("update ProfileEntity p set p.lastModified = now(), p.indexingStatus = :indexingStatus where p.id = :orcid"); updateQuery.setParameter("orcid", orcid); updateQuery.setParameter("indexingStatus", indexingStatus); // Sets a timeout for this query - updateQuery.setHint("javax.persistence.query.timeout", queryTimeout); + updateQuery.setHint("jakarta.persistence.query.timeout", queryTimeout); updateQuery.executeUpdate(); } @@ -43,7 +43,7 @@ public void updateLastModifiedDateWithoutResult(String orcid) { Query query = entityManager.createNativeQuery("update profile set last_modified = now() where orcid = :orcid "); query.setParameter("orcid", orcid); // Sets a timeout for this query - query.setHint("javax.persistence.query.timeout", queryTimeout); + query.setHint("jakarta.persistence.query.timeout", queryTimeout); query.executeUpdate(); } @@ -57,7 +57,7 @@ public void updateLastModifiedDateWithoutResult(String orcid) { @Override @Transactional public boolean updateIndexingStatus(List orcidIds, IndexingStatus indexingStatus) { - Query updateQuery = entityManager.createQuery("update ProfileEntity set indexingStatus = :indexingStatus where orcid IN :orcid"); + Query updateQuery = entityManager.createQuery("update ProfileEntity p set p.indexingStatus = :indexingStatus where p.id IN :orcid"); updateQuery.setParameter("orcid", orcidIds); updateQuery.setParameter("indexingStatus", indexingStatus); return updateQuery.executeUpdate() > 0; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/PublicApiDailyRateLimitDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/PublicApiDailyRateLimitDaoImpl.java index 5bb647500b1..602d72bdee1 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/PublicApiDailyRateLimitDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/PublicApiDailyRateLimitDaoImpl.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.dao.PublicApiDailyRateLimitDao; import org.orcid.persistence.jpa.entities.PublicApiDailyRateLimitEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/RecordNameDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/RecordNameDaoImpl.java index 5762b377a09..3c3d9129ced 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/RecordNameDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/RecordNameDaoImpl.java @@ -4,8 +4,8 @@ import java.util.Date; import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.apache.commons.lang.StringUtils; import org.orcid.persistence.aop.UpdateProfileLastModifiedAndIndexingStatus; @@ -64,7 +64,7 @@ public boolean updateRecordName(RecordNameEntity recordName) { public boolean exists(String orcid) { Query query = entityManager.createNativeQuery("select count(*) from record_name where orcid=:orcid"); query.setParameter("orcid", orcid); - Long result = ((BigInteger)query.getSingleResult()).longValue(); + Long result = ((Number)query.getSingleResult()).longValue(); return (result != null && result > 0); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/RejectedGroupingSuggestionDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/RejectedGroupingSuggestionDaoImpl.java index 0fab05cc604..e65a4053b7f 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/RejectedGroupingSuggestionDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/RejectedGroupingSuggestionDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.dao.RejectedGroupingSuggestionDao; import org.orcid.persistence.jpa.entities.RejectedGroupingSuggestionEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ResearchResourceDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ResearchResourceDaoImpl.java index 49e209f4257..768251edd4b 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ResearchResourceDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ResearchResourceDaoImpl.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.aop.UpdateProfileLastModifiedAndIndexingStatus; @@ -30,10 +30,10 @@ public ResearchResourceEntity getResearchResource(String userOrcid, Long researc @Transactional @UpdateProfileLastModifiedAndIndexingStatus public boolean removeResearchResource(String userOrcid, Long researchResourceId) { - Query queryItem = entityManager.createQuery("delete from ResearchResourceItemEntity where research_resource_id=:researchResourceId"); + Query queryItem = entityManager.createQuery("delete from ResearchResourceItemEntity ri where ri.researchResourceEntity.id=:researchResourceId"); queryItem.setParameter("researchResourceId", researchResourceId); queryItem.executeUpdate(); - Query query = entityManager.createQuery("delete from ResearchResourceEntity where orcid=:userOrcid and id=:researchResourceId"); + Query query = entityManager.createQuery("delete from ResearchResourceEntity r where r.orcid=:userOrcid and r.id=:researchResourceId"); query.setParameter("userOrcid", userOrcid); query.setParameter("researchResourceId", researchResourceId); return query.executeUpdate() > 0 ? true : false; @@ -51,11 +51,11 @@ public List getByUser(String userOrcid, long lastModifie @Transactional @UpdateProfileLastModifiedAndIndexingStatus public void removeResearchResources(String userOrcid) { - Query queryItem = entityManager.createQuery("delete from ResearchResourceItemEntity where research_resource_id in (SELECT id from ResearchResourceEntity where orcid=:userOrcid)"); + Query queryItem = entityManager.createQuery("delete from ResearchResourceItemEntity ri where ri.researchResourceEntity.id in (SELECT r.id from ResearchResourceEntity r where r.orcid=:userOrcid)"); queryItem.setParameter("userOrcid", userOrcid); queryItem.executeUpdate(); - Query query = entityManager.createQuery("delete from ResearchResourceEntity where orcid = :userOrcid"); + Query query = entityManager.createQuery("delete from ResearchResourceEntity r where r.orcid = :userOrcid"); query.setParameter("userOrcid", userOrcid); query.executeUpdate(); } @@ -65,7 +65,7 @@ public void removeResearchResources(String userOrcid) { @Transactional public boolean updateVisibilities(String orcid, ArrayList researchResourceIds, String visibility) { Query query = entityManager - .createQuery("update ResearchResourceEntity set visibility=:visibility, lastModified=now() where id in (:researchResourceIds) and orcid=:orcid"); + .createQuery("update ResearchResourceEntity r set r.visibility=:visibility, r.lastModified=now() where r.id in (:researchResourceIds) and r.orcid=:orcid"); query.setParameter("researchResourceIds", researchResourceIds); query.setParameter("visibility", visibility); query.setParameter("orcid", orcid); @@ -94,7 +94,7 @@ public boolean updateToMaxDisplay(String orcid, Long researchResourceId) { public Boolean hasPublicResearchResources(String orcid) { Query query = entityManager.createNativeQuery("SELECT count(*) FROM research_resource WHERE orcid=:orcid AND visibility='PUBLIC'"); query.setParameter("orcid", orcid); - Long result = ((BigInteger)query.getSingleResult()).longValue(); + Long result = ((Number)query.getSingleResult()).longValue(); return (result != null && result > 0); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ResearcherUrlDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ResearcherUrlDaoImpl.java index d55ee45e198..ec5fd2ace3c 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ResearcherUrlDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ResearcherUrlDaoImpl.java @@ -3,8 +3,8 @@ import java.math.BigInteger; import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.jaxb.model.v3.release.common.Visibility; import org.orcid.persistence.aop.UpdateProfileLastModified; @@ -108,7 +108,7 @@ public boolean updateResearcherUrl(long id, String newUrl) { @Transactional @UpdateProfileLastModified public void removeAllResearcherUrls(String orcid) { - Query query = entityManager.createQuery("delete from ResearcherUrlEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from ResearcherUrlEntity r where r.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/SalesForceConnectionDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/SalesForceConnectionDaoImpl.java index 7883ff44e12..78ec2026dbc 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/SalesForceConnectionDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/SalesForceConnectionDaoImpl.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.persistence.TypedQuery; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.SalesForceConnectionDao; import org.orcid.persistence.jpa.entities.SalesForceConnectionEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ShibbolethAccountDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ShibbolethAccountDaoImpl.java index fed55bad32c..97f48cd35d7 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ShibbolethAccountDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ShibbolethAccountDaoImpl.java @@ -2,8 +2,8 @@ import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.ShibbolethAccountDao; import org.orcid.persistence.jpa.entities.ShibbolethAccountEntity; @@ -40,7 +40,7 @@ public List findByOrcid(String orcid) { @Override @Transactional public void removeByIdAndOrcid(Long id, String orcid) { - Query query = entityManager.createQuery("delete from ShibbolethAccountEntity where id = :id and orcid = :orcid"); + Query query = entityManager.createQuery("delete from ShibbolethAccountEntity s where s.id = :id and s.orcid = :orcid"); query.setParameter("id", id); query.setParameter("orcid", orcid); query.executeUpdate(); diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/SpamDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/SpamDaoImpl.java index b00d4d828e9..ea2db322ca0 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/SpamDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/SpamDaoImpl.java @@ -2,7 +2,7 @@ import java.math.BigInteger; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.dao.SpamDao; @@ -22,7 +22,7 @@ public SpamDaoImpl() { public boolean exists(String orcid) { Query query = entityManager.createNativeQuery("select count(*) from spam where orcid=:orcid"); query.setParameter("orcid", orcid); - Long result = ((BigInteger)query.getSingleResult()).longValue(); + Long result = ((Number)query.getSingleResult()).longValue(); return (result != null && result > 0); } @@ -52,7 +52,7 @@ public void createSpam(SpamEntity spam) { @Transactional @UpdateProfileLastModified public boolean removeSpam(String orcid) { - Query query = entityManager.createQuery("delete from SpamEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from SpamEntity s where s.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); return query.executeUpdate() > 0 ? true : false; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/StatisticsDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/StatisticsDaoImpl.java index aadd182d4c9..6871d276038 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/StatisticsDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/StatisticsDaoImpl.java @@ -3,8 +3,8 @@ import java.math.BigInteger; import java.util.Date; -import javax.persistence.EntityManager; -import javax.persistence.Query; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; import org.orcid.persistence.dao.StatisticsDao; import org.orcid.statistics.jpa.entities.StatisticKeyEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/UserConnectionDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/UserConnectionDaoImpl.java index 295b85137c7..8c8bd66342e 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/UserConnectionDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/UserConnectionDaoImpl.java @@ -4,8 +4,8 @@ import java.util.Date; import java.util.List; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.UserConnectionDao; import org.orcid.persistence.jpa.entities.UserconnectionEntity; @@ -32,7 +32,7 @@ public void updateLoginInformation(UserconnectionPK pk) { @Override public UserconnectionEntity findByProviderIdAndProviderUserId(String providerUserId, String providerId) { TypedQuery query = entityManager - .createQuery("from UserconnectionEntity where id.provideruserid = :providerUserId and providerid = :providerId", UserconnectionEntity.class); + .createQuery("from UserconnectionEntity where id.provideruserid = :providerUserId and id.providerid = :providerId", UserconnectionEntity.class); query.setParameter("providerUserId", providerUserId); query.setParameter("providerId", providerId); List results = query.getResultList(); @@ -42,7 +42,7 @@ public UserconnectionEntity findByProviderIdAndProviderUserId(String providerUse @Override public UserconnectionEntity findByProviderIdAndProviderUserIdAndIdType(String providerUserId, String providerId, String idType) { TypedQuery query = entityManager.createQuery( - "from UserconnectionEntity where id.provideruserid = :providerUserId and providerid = :providerId and idType = :idType", UserconnectionEntity.class); + "from UserconnectionEntity where id.provideruserid = :providerUserId and id.providerid = :providerId and idType = :idType", UserconnectionEntity.class); query.setParameter("providerUserId", providerUserId); query.setParameter("providerId", providerId); query.setParameter("idType", idType); @@ -60,7 +60,7 @@ public List findByOrcid(String orcid) { @Override @Transactional public void deleteByOrcid(String orcid) { - Query query = entityManager.createQuery("delete from UserconnectionEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from UserconnectionEntity u where u.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ValidatedPublicProfileDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ValidatedPublicProfileDaoImpl.java index 754d5a9d591..f7ff690df07 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ValidatedPublicProfileDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/ValidatedPublicProfileDaoImpl.java @@ -3,8 +3,8 @@ import java.util.Date; import java.util.List; -import javax.persistence.Query; -import javax.transaction.Transactional; +import jakarta.persistence.Query; +import jakarta.transaction.Transactional; import org.orcid.persistence.dao.ValidatedPublicProfileDao; import org.orcid.persistence.jpa.entities.ValidatedPublicProfileEntity; @@ -26,7 +26,7 @@ public List getNextRecordsToValidate(int batchSize) { @Override @Transactional public void removeOldRecords(Date maxAge) { - Query query = entityManager.createQuery("DELETE from ValidatedPublicProfileEntity where dateCreated < :maxAge"); + Query query = entityManager.createQuery("DELETE from ValidatedPublicProfileEntity v where v.dateCreated < :maxAge"); query.setParameter("maxAge", maxAge); query.executeUpdate(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/WebhookDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/WebhookDaoImpl.java index cbe95ea2cd6..585983a199a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/WebhookDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/WebhookDaoImpl.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.Set; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.orcid.persistence.dao.WebhookDao; import org.orcid.persistence.jpa.entities.WebhookEntity; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/WorkDaoImpl.java b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/WorkDaoImpl.java index 0bf5cc96df2..14947f72504 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/WorkDaoImpl.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/dao/impl/WorkDaoImpl.java @@ -5,13 +5,10 @@ import java.util.List; import java.util.stream.Collectors; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; -import org.hibernate.type.BigIntegerType; -import org.hibernate.type.IntegerType; -import org.hibernate.type.StringType; -import org.hibernate.type.TimestampType; +import org.hibernate.type.StandardBasicTypes; import org.orcid.persistence.aop.UpdateProfileLastModified; import org.orcid.persistence.aop.UpdateProfileLastModifiedAndIndexingStatus; import org.orcid.persistence.dao.WorkDao; @@ -147,7 +144,7 @@ public boolean removeWork(String orcid, Long workId) { @Override @Transactional public void removeWorks(String orcid) { - Query query = entityManager.createQuery("delete from WorkEntity where orcid = :orcid"); + Query query = entityManager.createQuery("delete from WorkEntity w where w.orcid = :orcid"); query.setParameter("orcid", orcid); query.executeUpdate(); } @@ -270,7 +267,7 @@ public List getWorksByOrcidId(String orcid) { public boolean hasPublicWorks(String orcid) { Query query = entityManager.createNativeQuery("SELECT count(*) FROM work WHERE orcid=:orcid AND visibility='PUBLIC'"); query.setParameter("orcid", orcid); - Long result = ((BigInteger)query.getSingleResult()).longValue(); + Long result = ((Number)query.getSingleResult()).longValue(); return (result != null && result > 0); } @@ -279,7 +276,7 @@ public boolean isPublic(String orcid, List ids) { Query query = entityManager.createNativeQuery("SELECT count(*) FROM work WHERE orcid=:orcid AND visibility='PUBLIC' AND work_id IN :ids"); query.setParameter("orcid", orcid); query.setParameter("ids", ids); - Long result = ((BigInteger)query.getSingleResult()).longValue(); + Long result = ((Number)query.getSingleResult()).longValue(); return result.equals((long) ids.size()); } @@ -391,24 +388,24 @@ public List getWorksByOrcid(String orcid, boolean featuredOnly) { Query query = entityManager.createNativeQuery(queryText); query.setParameter("orcid", orcid) .unwrap(org.hibernate.query.NativeQuery.class) - .addScalar("work_id", BigIntegerType.INSTANCE) - .addScalar("work_type", StringType.INSTANCE) - .addScalar("title", StringType.INSTANCE) - .addScalar("journal_title", StringType.INSTANCE) - .addScalar("external_ids_json", StringType.INSTANCE) - .addScalar("publication_year", IntegerType.INSTANCE) - .addScalar("publication_month", IntegerType.INSTANCE) - .addScalar("publication_day", IntegerType.INSTANCE) - .addScalar("visibility", StringType.INSTANCE) - .addScalar("display_index", BigIntegerType.INSTANCE) - .addScalar("source_id", StringType.INSTANCE) - .addScalar("client_source_id", StringType.INSTANCE) - .addScalar("assertion_origin_source_id", StringType.INSTANCE) - .addScalar("assertion_origin_client_source_id", StringType.INSTANCE) - .addScalar("date_created", TimestampType.INSTANCE) - .addScalar("last_modified", TimestampType.INSTANCE) - .addScalar("contributors", StringType.INSTANCE) - .addScalar("featured_display_index", IntegerType.INSTANCE); + .addScalar("work_id", StandardBasicTypes.BIG_INTEGER) + .addScalar("work_type", StandardBasicTypes.STRING) + .addScalar("title", StandardBasicTypes.STRING) + .addScalar("journal_title", StandardBasicTypes.STRING) + .addScalar("external_ids_json", StandardBasicTypes.STRING) + .addScalar("publication_year", StandardBasicTypes.INTEGER) + .addScalar("publication_month", StandardBasicTypes.INTEGER) + .addScalar("publication_day", StandardBasicTypes.INTEGER) + .addScalar("visibility", StandardBasicTypes.STRING) + .addScalar("display_index", StandardBasicTypes.BIG_INTEGER) + .addScalar("source_id", StandardBasicTypes.STRING) + .addScalar("client_source_id", StandardBasicTypes.STRING) + .addScalar("assertion_origin_source_id", StandardBasicTypes.STRING) + .addScalar("assertion_origin_client_source_id", StandardBasicTypes.STRING) + .addScalar("date_created", StandardBasicTypes.TIMESTAMP) + .addScalar("last_modified", StandardBasicTypes.TIMESTAMP) + .addScalar("contributors", StandardBasicTypes.STRING) + .addScalar("featured_display_index", StandardBasicTypes.INTEGER); return query.getResultList(); } @@ -423,8 +420,8 @@ public List getWorksStartingFromWorkId(Long workId, int numberOfWorks) query.setParameter("workId", workId); query.setParameter("numberOfWorks", numberOfWorks) .unwrap(org.hibernate.query.NativeQuery.class) - .addScalar("work_id", BigIntegerType.INSTANCE) - .addScalar("contributors_json", StringType.INSTANCE); + .addScalar("work_id", StandardBasicTypes.BIG_INTEGER) + .addScalar("contributors_json", StandardBasicTypes.STRING); return query.getResultList(); } diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/AddressEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/AddressEntity.java index ff82b5763a5..778d8ae06b1 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/AddressEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/AddressEntity.java @@ -1,16 +1,16 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/AmbiguousOrgEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/AmbiguousOrgEntity.java index a33942aeed1..ea82d5622fc 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/AmbiguousOrgEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/AmbiguousOrgEntity.java @@ -2,14 +2,14 @@ import java.io.Serializable; -import javax.persistence.Basic; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Basic; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BackupCodeEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BackupCodeEntity.java index c16999ae2e0..dfb05a56a0c 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BackupCodeEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BackupCodeEntity.java @@ -3,13 +3,13 @@ import java.io.Serializable; import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "backup_code") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BaseContributorEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BaseContributorEntity.java index 4edaf75d8cd..e6a212c9a2e 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BaseContributorEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BaseContributorEntity.java @@ -1,11 +1,11 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MappedSuperclass; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MappedSuperclass; import org.orcid.utils.NullUtils; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BaseEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BaseEntity.java index 9adf43cf6bb..0b38bca1c75 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BaseEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BaseEntity.java @@ -1,10 +1,10 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.EntityManager; -import javax.persistence.MappedSuperclass; -import javax.persistence.PrePersist; -import javax.persistence.PreUpdate; +import jakarta.persistence.Column; +import jakarta.persistence.EntityManager; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; import java.io.Serializable; import java.util.Collection; import java.util.Date; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BiographyEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BiographyEntity.java index b50d7c4548e..f7cb01530ff 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BiographyEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/BiographyEntity.java @@ -1,14 +1,14 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * The persistent class for the name database table. diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientAuthorisedGrantTypeEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientAuthorisedGrantTypeEntity.java index 52a787eb4ab..20d9a503b31 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientAuthorisedGrantTypeEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientAuthorisedGrantTypeEntity.java @@ -5,7 +5,7 @@ import java.util.Date; import java.util.Objects; -import javax.persistence.*; +import jakarta.persistence.*; /** * @author Declan Newman (declan) Date: 12/03/2012 diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientDetailsEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientDetailsEntity.java index 431893bf308..4b60eb5f042 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientDetailsEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientDetailsEntity.java @@ -12,28 +12,27 @@ import java.util.SortedSet; import java.util.TreeSet; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.Transient; - -import org.hibernate.annotations.Sort; -import org.hibernate.annotations.SortType; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; + import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.util.StringUtils; +import org.hibernate.annotations.SortNatural; + /** * @author Declan Newman */ @Entity @Table(name = "client_details") -public class ClientDetailsEntity extends BaseEntity implements ClientDetails, Serializable { +public class ClientDetailsEntity extends BaseEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -160,7 +159,7 @@ public void setClientAuthorizedGrantTypes(Set c } @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER, mappedBy = "clientId", orphanRemoval = true) - @Sort(type = SortType.NATURAL) + @SortNatural public SortedSet getClientRegisteredRedirectUris() { return clientRegisteredRedirectUris; } @@ -194,7 +193,6 @@ public void setGroupProfileId(String groupProfileId) { * * @return The client id. */ - @Override @Transient public String getClientId() { return clientId; @@ -205,7 +203,6 @@ public String getClientId() { * * @return The resources of this client. */ - @Override @Transient public Set getResourceIds() { Set rids = new HashSet(); @@ -222,7 +219,6 @@ public Set getResourceIds() { * * @return Whether a secret is required to authenticate this client. */ - @Override @Transient public boolean isSecretRequired() { return StringUtils.hasText(clientSecret); @@ -234,14 +230,13 @@ public boolean isSecretRequired() { * * @return The client secret. */ - @Override @Transient public String getClientSecret() { return getDecryptedClientSecret(); } @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER, mappedBy = "clientId", orphanRemoval = true) - @Sort(type = SortType.NATURAL) + @SortNatural public Set getClientSecrets() { return clientSecrets; } @@ -310,7 +305,6 @@ public void setDecryptedClientSecret(String decryptedClientSecret) { * * @return Whether this client is limited to a specific scope. */ - @Override @Transient public boolean isScoped() { return this.clientScopes != null && !this.clientScopes.isEmpty(); @@ -322,7 +316,6 @@ public boolean isScoped() { * * @return The scope of this client. */ - @Override @Transient public Set getScope() { Set sps = new HashSet(); @@ -339,7 +332,6 @@ public Set getScope() { * * @return The grant types for which this client is authorized. */ - @Override @Transient public Set getAuthorizedGrantTypes() { Set grants = new HashSet(); @@ -357,7 +349,6 @@ public Set getAuthorizedGrantTypes() { * * @return The pre-defined redirect URI for this client. */ - @Override @Transient public Set getRegisteredRedirectUri() { Set redirects = null; @@ -378,7 +369,6 @@ public Set getRegisteredRedirectUri() { * * @return The authorities. */ - @Override @Transient public Collection getAuthorities() { Collection gas = new ArrayList(); @@ -394,31 +384,11 @@ public Collection getAuthorities() { * * @return the access token validity period */ - @Override @Transient public Integer getAccessTokenValiditySeconds() { return accessTokenValiditySeconds; } - @Override - @Transient - public Integer getRefreshTokenValiditySeconds() { - // Not currently required - return null; - } - - @Override - @Transient - public Map getAdditionalInformation() { - // Not currently required - return null; - } - - @Override - @Transient - public boolean isAutoApprove(String scope) { - return false; - } @Column(name = "authentication_provider_id") public String getAuthenticationProviderId() { diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientGrantedAuthorityEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientGrantedAuthorityEntity.java index 1d34a930372..e2bb8db67c0 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientGrantedAuthorityEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientGrantedAuthorityEntity.java @@ -3,7 +3,7 @@ import org.orcid.persistence.jpa.entities.keys.ClientGrantedAuthorityPk; import org.springframework.security.core.GrantedAuthority; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Objects; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientRedirectUriEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientRedirectUriEntity.java index de35a5e7ae1..59c326a2319 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientRedirectUriEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientRedirectUriEntity.java @@ -5,7 +5,7 @@ import java.util.Objects; import java.util.Set; -import javax.persistence.*; +import jakarta.persistence.*; import org.orcid.persistence.jpa.entities.keys.ClientRedirectUriPk; import org.orcid.utils.NullUtils; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientResourceIdEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientResourceIdEntity.java index f2989acd11e..1deea2ccefc 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientResourceIdEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientResourceIdEntity.java @@ -2,7 +2,7 @@ import org.orcid.persistence.jpa.entities.keys.ClientResourceIdPk; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Objects; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientScopeEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientScopeEntity.java index 9289acbaed7..5f91c5c7108 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientScopeEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientScopeEntity.java @@ -1,6 +1,6 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.*; +import jakarta.persistence.*; import org.orcid.persistence.jpa.entities.keys.ClientScopePk; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientSecretEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientSecretEntity.java index 178811b01ec..3ff15bc3fc0 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientSecretEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ClientSecretEntity.java @@ -3,7 +3,7 @@ import java.util.Date; import java.util.Objects; -import javax.persistence.*; +import jakarta.persistence.*; import org.orcid.persistence.jpa.entities.keys.ClientSecretPk; import org.orcid.utils.NullUtils; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CompletionDateEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CompletionDateEntity.java index 8d2b11779ce..da9cbfec3db 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CompletionDateEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CompletionDateEntity.java @@ -2,8 +2,8 @@ import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; @Embeddable public class CompletionDateEntity extends FuzzyDateEntity implements Serializable { diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CountryIsoEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CountryIsoEntity.java index 122e393f86c..4a3950c7e9d 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CountryIsoEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CountryIsoEntity.java @@ -1,10 +1,10 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; @Entity @Table(name = "country_reference_data") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CustomEmailEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CustomEmailEntity.java index da152ad29e0..2af4ee8cbae 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CustomEmailEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/CustomEmailEntity.java @@ -1,16 +1,16 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.orcid.persistence.jpa.entities.keys.CustomEmailPk; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailDomainEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailDomainEntity.java index c676f19cea8..edece179766 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailDomainEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailDomainEntity.java @@ -2,15 +2,15 @@ import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailDomainToOrgIdEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailDomainToOrgIdEntity.java index 09596b84f6e..c012486f7d3 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailDomainToOrgIdEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailDomainToOrgIdEntity.java @@ -2,16 +2,16 @@ import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailEntity.java index 6977ec86502..5294d0fbedf 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailEntity.java @@ -5,10 +5,10 @@ import java.util.Map; import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; /** * @author Will Simpson diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailEventEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailEventEntity.java index 554bbe53e6e..a5af027e620 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailEventEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailEventEntity.java @@ -1,15 +1,15 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Basic; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Basic; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailFrequencyEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailFrequencyEntity.java index 76953dc65a7..3e34e9080e3 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailFrequencyEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailFrequencyEntity.java @@ -1,9 +1,9 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "email_frequency") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailScheduleEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailScheduleEntity.java index c28ffb94fdb..d556eeaa9bc 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailScheduleEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EmailScheduleEntity.java @@ -2,13 +2,13 @@ import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "email_schedule") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EndDateEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EndDateEntity.java index cf79923b627..55d5efd9ae1 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EndDateEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EndDateEntity.java @@ -1,7 +1,7 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; @Embeddable public class EndDateEntity extends FuzzyDateEntity { diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EventEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EventEntity.java index bce397fbd89..59d39e48b81 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EventEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EventEntity.java @@ -3,13 +3,13 @@ import java.util.Date; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EventStatsEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EventStatsEntity.java index 2e0dd7cdd11..96eb40e70cc 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EventStatsEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/EventStatsEntity.java @@ -3,13 +3,13 @@ import java.util.Date; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ExternalIdentifierEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ExternalIdentifierEntity.java index c340507c915..0a29321c1b3 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ExternalIdentifierEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ExternalIdentifierEntity.java @@ -1,16 +1,16 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; /** * orcid-entities - Dec 6, 2011 - ExternalIdentifierEntity diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/FindMyStuffHistoryEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/FindMyStuffHistoryEntity.java index 4680f9a0e62..2e85afdfb58 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/FindMyStuffHistoryEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/FindMyStuffHistoryEntity.java @@ -1,14 +1,14 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.orcid.persistence.jpa.entities.keys.FindMyStuffHistoryEntityPk; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/FuzzyDateEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/FuzzyDateEntity.java index 93fa907e51b..d7d25ead9a9 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/FuzzyDateEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/FuzzyDateEntity.java @@ -2,8 +2,8 @@ import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; @Embeddable public class FuzzyDateEntity implements Comparable, Serializable { diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GivenPermissionByEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GivenPermissionByEntity.java index 54d83bfb87a..faf83fcd6ef 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GivenPermissionByEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GivenPermissionByEntity.java @@ -2,13 +2,13 @@ import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GivenPermissionToEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GivenPermissionToEntity.java index 444677a21d7..90ec4acc9b1 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GivenPermissionToEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GivenPermissionToEntity.java @@ -2,14 +2,14 @@ import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GroupIdRecordEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GroupIdRecordEntity.java index 12720bd5fb8..623c22fb17c 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GroupIdRecordEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/GroupIdRecordEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import java.util.Date; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentifierTypeEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentifierTypeEntity.java index cd22fbd6ee5..39c3cc302d0 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentifierTypeEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentifierTypeEntity.java @@ -1,15 +1,15 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "identifier_type") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentityProviderEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentityProviderEntity.java index 7fa7c04f308..970a498ede8 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentityProviderEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentityProviderEntity.java @@ -3,16 +3,16 @@ import java.util.Date; import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * @author Will Simpson diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentityProviderNameEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentityProviderNameEntity.java index 11297527d74..f5270c3d527 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentityProviderNameEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/IdentityProviderNameEntity.java @@ -1,15 +1,15 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * @author Will Simpson diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/InvalidRecordDataChangeEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/InvalidRecordDataChangeEntity.java index fea2b78bc4a..83bb67dbc71 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/InvalidRecordDataChangeEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/InvalidRecordDataChangeEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "invalid_record_data_changes") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MemberChosenOrgDisambiguatedEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MemberChosenOrgDisambiguatedEntity.java index 7aaa370613a..f0f9eecb93f 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MemberChosenOrgDisambiguatedEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MemberChosenOrgDisambiguatedEntity.java @@ -2,10 +2,10 @@ import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "member_chosen_org_disambiguated") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MemberOBOWhitelistedClientEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MemberOBOWhitelistedClientEntity.java index 47ba8a133f7..9c18f830e84 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MemberOBOWhitelistedClientEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MemberOBOWhitelistedClientEntity.java @@ -1,11 +1,11 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; @Entity @Table(name = "member_obo_whitelisted_client") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MinimizedExtendedWorkEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MinimizedExtendedWorkEntity.java index b741fa3f8a3..b4657d8dc29 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MinimizedExtendedWorkEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MinimizedExtendedWorkEntity.java @@ -1,8 +1,8 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; @Entity @Table(name = "work") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MinimizedWorkEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MinimizedWorkEntity.java index 0e9cf54b92f..f511bccc8b4 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MinimizedWorkEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/MinimizedWorkEntity.java @@ -1,8 +1,8 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; /** * An object that will contain the minimum work information needed to display diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAddItemsEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAddItemsEntity.java index a5ff92ecd42..3249bb307a2 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAddItemsEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAddItemsEntity.java @@ -2,13 +2,13 @@ import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAdministrativeEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAdministrativeEntity.java index 1375ed2ae1e..a343c92ef56 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAdministrativeEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAdministrativeEntity.java @@ -1,8 +1,8 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; @Entity @DiscriminatorValue("ADMINISTRATIVE") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAmendedEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAmendedEntity.java index 39eda945d24..2de7a12938a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAmendedEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationAmendedEntity.java @@ -2,13 +2,13 @@ import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationCustomEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationCustomEntity.java index 78c8798c9aa..8160c41c66c 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationCustomEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationCustomEntity.java @@ -1,8 +1,8 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; @Entity @DiscriminatorValue("CUSTOM") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationEntity.java index 1de37cec320..340089945bc 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationEntity.java @@ -2,18 +2,18 @@ import java.util.Date; -import javax.persistence.Column; -import javax.persistence.DiscriminatorColumn; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; -import javax.persistence.NamedNativeQueries; -import javax.persistence.NamedNativeQuery; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorColumn; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; +import jakarta.persistence.NamedNativeQueries; +import jakarta.persistence.NamedNativeQuery; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * @author Will Simpson diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationFindMyStuffEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationFindMyStuffEntity.java index 0f8eb24521f..1a5475b9542 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationFindMyStuffEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationFindMyStuffEntity.java @@ -1,8 +1,8 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; @Entity @DiscriminatorValue("FIND_MY_STUFF") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationInstitutionalConnectionEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationInstitutionalConnectionEntity.java index 1d87bc75af9..3c6bfa5048b 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationInstitutionalConnectionEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationInstitutionalConnectionEntity.java @@ -1,8 +1,8 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; @Entity @DiscriminatorValue("INSTITUTIONAL_CONNECTION") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationItemEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationItemEntity.java index 94e9fc20c63..22291579eed 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationItemEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationItemEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationServiceAnnouncementEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationServiceAnnouncementEntity.java index 473308adaec..9dcfa2cb75e 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationServiceAnnouncementEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationServiceAnnouncementEntity.java @@ -1,8 +1,8 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; @Entity @DiscriminatorValue("SERVICE_ANNOUNCEMENT") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationTipEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationTipEntity.java index 958dce23ffa..a193523a1ab 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationTipEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationTipEntity.java @@ -1,8 +1,8 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; @Entity @DiscriminatorValue("TIP") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationWorkEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationWorkEntity.java index 658a3249386..f255798f04a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationWorkEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/NotificationWorkEntity.java @@ -3,15 +3,15 @@ import java.io.Serializable; import java.util.Comparator; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.orcid.persistence.jpa.entities.keys.NotificationWorkEntityPk; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidGrantedAuthority.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidGrantedAuthority.java index c0f6933510c..28c78ccbd27 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidGrantedAuthority.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidGrantedAuthority.java @@ -3,15 +3,15 @@ import org.orcid.persistence.jpa.entities.keys.OrcidGrantedAuthorityPk; import org.springframework.security.core.GrantedAuthority; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; /** * Simplistic implementation of {@link GrantedAuthority}. This will need to be diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidOauth2AuthoriziationCodeDetail.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidOauth2AuthoriziationCodeDetail.java index 58ec1822c7d..b2dd52acef1 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidOauth2AuthoriziationCodeDetail.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidOauth2AuthoriziationCodeDetail.java @@ -2,14 +2,14 @@ import java.util.Set; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidOauth2TokenDetail.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidOauth2TokenDetail.java index a3d008574f8..152f350a4cc 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidOauth2TokenDetail.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidOauth2TokenDetail.java @@ -2,13 +2,13 @@ import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import org.apache.commons.lang3.StringUtils; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidPropsEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidPropsEntity.java index d476942153d..9940586ab2b 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidPropsEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrcidPropsEntity.java @@ -1,9 +1,9 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; /** * @author Will Simpson diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgAffiliationRelationEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgAffiliationRelationEntity.java index 4029d2ef316..b5744997173 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgAffiliationRelationEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgAffiliationRelationEntity.java @@ -1,16 +1,16 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import org.orcid.utils.NullUtils; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgDisambiguatedEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgDisambiguatedEntity.java index b61b63b5666..98b29707a4d 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgDisambiguatedEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgDisambiguatedEntity.java @@ -3,22 +3,22 @@ import java.util.Date; import java.util.Set; -import javax.persistence.Basic; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.NamedNativeQuery; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Basic; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.NamedNativeQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgDisambiguatedExternalIdentifierEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgDisambiguatedExternalIdentifierEntity.java index 3723ae27373..3acac7be1c9 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgDisambiguatedExternalIdentifierEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgDisambiguatedExternalIdentifierEntity.java @@ -1,14 +1,14 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgEntity.java index e7d5c418e5b..ef555612b98 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgEntity.java @@ -2,15 +2,15 @@ import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgImportLogEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgImportLogEntity.java index 21fccf9fae1..bfbb495147a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgImportLogEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OrgImportLogEntity.java @@ -3,13 +3,13 @@ import java.io.Serializable; import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "org_import_log") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OtherNameEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OtherNameEntity.java index 035af17c75b..d1e86ca2f96 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OtherNameEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/OtherNameEntity.java @@ -1,15 +1,15 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** *

diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PeerReviewEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PeerReviewEntity.java index 6326a794194..1bbb69920f3 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PeerReviewEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PeerReviewEntity.java @@ -1,16 +1,16 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import org.apache.commons.lang3.StringUtils; import org.orcid.utils.OrcidStringUtils; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEmailDomainEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEmailDomainEntity.java index 56123e104be..b12cc363fe6 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEmailDomainEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEmailDomainEntity.java @@ -1,6 +1,6 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Objects; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEntity.java index 359f80b8c8e..31167279957 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEntity.java @@ -4,19 +4,19 @@ import java.util.Collection; import java.util.Date; -import javax.persistence.Basic; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Basic; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.springframework.security.core.userdetails.UserDetails; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEventEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEventEntity.java index fcf404d2cb8..79a5fc44df3 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEventEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileEventEntity.java @@ -1,15 +1,15 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Basic; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Basic; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileFundingEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileFundingEntity.java index 30c9eb46906..ee787583dcb 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileFundingEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileFundingEntity.java @@ -2,18 +2,18 @@ import java.math.BigDecimal; -import javax.persistence.Basic; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Basic; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import org.orcid.utils.OrcidStringUtils; import org.orcid.utils.NullUtils; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileHistoryEventEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileHistoryEventEntity.java index 3c33d942b65..1f425fc62cb 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileHistoryEventEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileHistoryEventEntity.java @@ -2,13 +2,13 @@ import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "profile_history_event") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileInterstitialFlagEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileInterstitialFlagEntity.java index 5c0ef0cc858..519e21f7d83 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileInterstitialFlagEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileInterstitialFlagEntity.java @@ -1,6 +1,6 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Objects; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileKeywordEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileKeywordEntity.java index 713e175f3d3..364ece29baa 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileKeywordEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ProfileKeywordEntity.java @@ -1,15 +1,15 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * orcid-entities - Dec 6, 2011 - ProfileInstitutionEntity diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PublicApiDailyRateLimitEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PublicApiDailyRateLimitEntity.java index 0a3758f5653..8737408f7e0 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PublicApiDailyRateLimitEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PublicApiDailyRateLimitEntity.java @@ -7,16 +7,16 @@ import java.util.HashMap; import java.util.Map; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EntityManager; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.PrePersist; -import javax.persistence.PreUpdate; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityManager; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PublicationDateEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PublicationDateEntity.java index 05a5c545117..17e32c8fa69 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PublicationDateEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/PublicationDateEntity.java @@ -1,7 +1,7 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; @Embeddable public class PublicationDateEntity extends FuzzyDateEntity { diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RecordNameEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RecordNameEntity.java index 6a3e463a384..940283dac42 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RecordNameEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RecordNameEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * The persistent class for the name database table. diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RefDataEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RefDataEntity.java index 989748d5617..ef4a4754cbb 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RefDataEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RefDataEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Table(name = "reference_data") @Entity diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RejectedGroupingSuggestionEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RejectedGroupingSuggestionEntity.java index 9fa48a3fd56..6c47a9e58c9 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RejectedGroupingSuggestionEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/RejectedGroupingSuggestionEntity.java @@ -2,10 +2,10 @@ import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "rejected_grouping_suggestion") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearchResourceEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearchResourceEntity.java index 25f59a21bdd..b76480177ff 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearchResourceEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearchResourceEntity.java @@ -2,19 +2,19 @@ import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.OneToMany; -import javax.persistence.OrderColumn; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OrderColumn; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** Represents a research resource. * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearchResourceItemEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearchResourceItemEntity.java index 0b8d41c60db..baa309cdc28 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearchResourceItemEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearchResourceItemEntity.java @@ -2,19 +2,19 @@ import java.util.List; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OrderColumn; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OrderColumn; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "research_resource_item") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearcherUrlEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearcherUrlEntity.java index f0162391314..0ab7c3596ec 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearcherUrlEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ResearcherUrlEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import org.orcid.persistence.constants.SiteConstants; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SalesForceConnectionEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SalesForceConnectionEntity.java index f73dc975d0a..00c950eef24 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SalesForceConnectionEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SalesForceConnectionEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * The persistent class for the salesforce database table. diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ShibbolethAccountEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ShibbolethAccountEntity.java index 934f67a2a77..a35a83b5a77 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ShibbolethAccountEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ShibbolethAccountEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SourceAwareEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SourceAwareEntity.java index b873d931c0c..4656cdaba8e 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SourceAwareEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SourceAwareEntity.java @@ -2,9 +2,9 @@ import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.Transient; import org.apache.commons.lang3.StringUtils; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SourceEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SourceEntity.java index 38d4c3058d7..b35d4d7d20a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SourceEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SourceEntity.java @@ -2,10 +2,10 @@ import java.io.Serializable; -import javax.persistence.Embeddable; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Transient; +import jakarta.persistence.Embeddable; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Transient; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SpamEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SpamEntity.java index a0450117c40..31626fd0240 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SpamEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SpamEntity.java @@ -2,16 +2,16 @@ import java.util.Date; -import javax.persistence.Basic; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Basic; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/StartDateEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/StartDateEntity.java index b3a24bf9f42..a1376ea0d44 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/StartDateEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/StartDateEntity.java @@ -2,8 +2,8 @@ import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; @Embeddable public class StartDateEntity extends FuzzyDateEntity implements Serializable { diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SubjectEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SubjectEntity.java index 6ddce6adcd8..9bd09955be3 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SubjectEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/SubjectEntity.java @@ -1,10 +1,10 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/UserconnectionEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/UserconnectionEntity.java index 4fb4d13312b..df4f611eae7 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/UserconnectionEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/UserconnectionEntity.java @@ -1,13 +1,13 @@ package org.orcid.persistence.jpa.entities; import java.util.Date; -import javax.persistence.Column; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; /** * The persistent class for the userconnection database table. diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/UserconnectionPK.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/UserconnectionPK.java index 46289f22034..ca194c968d6 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/UserconnectionPK.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/UserconnectionPK.java @@ -1,7 +1,7 @@ package org.orcid.persistence.jpa.entities; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** * The primary key class for the userconnection database table. diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ValidatedPublicProfileEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ValidatedPublicProfileEntity.java index 45bb1511dce..cd8c91ada40 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ValidatedPublicProfileEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/ValidatedPublicProfileEntity.java @@ -2,10 +2,10 @@ import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "validated_public_profile") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WebhookEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WebhookEntity.java index fb92f4dc4c5..92b3ab3daf2 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WebhookEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WebhookEntity.java @@ -2,16 +2,16 @@ import java.util.Date; -import javax.persistence.Column; -import javax.persistence.ColumnResult; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.NamedNativeQueries; -import javax.persistence.NamedNativeQuery; -import javax.persistence.SqlResultSetMapping; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.ColumnResult; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; +import jakarta.persistence.NamedNativeQueries; +import jakarta.persistence.NamedNativeQuery; +import jakarta.persistence.SqlResultSetMapping; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.orcid.persistence.jpa.entities.keys.WebhookEntityPk; diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkBaseEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkBaseEntity.java index 2be773a06e5..0e03081d972 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkBaseEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkBaseEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; -import javax.persistence.SequenceGenerator; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Transient; /** * An object that will contain the minimum work information needed to display diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkEntity.java index 474374c3308..3d7290fa9bd 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkEntity.java @@ -4,9 +4,9 @@ import java.util.Comparator; import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; @Entity @Table(name = "work") diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkLastModifiedEntity.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkLastModifiedEntity.java index f0fc8e62772..19118b36782 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkLastModifiedEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/WorkLastModifiedEntity.java @@ -1,12 +1,12 @@ package org.orcid.persistence.jpa.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; /** * diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/AuthorWorkEntityPk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/AuthorWorkEntityPk.java index 03686e9ddc1..eb841e489bb 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/AuthorWorkEntityPk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/AuthorWorkEntityPk.java @@ -1,6 +1,6 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientAuthorisedGrantTypePk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientAuthorisedGrantTypePk.java index 96328572ea6..1fb8c006d8d 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientAuthorisedGrantTypePk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientAuthorisedGrantTypePk.java @@ -1,7 +1,7 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientGrantedAuthorityPk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientGrantedAuthorityPk.java index c39e58d7c8b..ce6f8502ca3 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientGrantedAuthorityPk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientGrantedAuthorityPk.java @@ -1,7 +1,7 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientRedirectUriPk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientRedirectUriPk.java index 779caf30f00..31933124e9c 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientRedirectUriPk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientRedirectUriPk.java @@ -1,8 +1,8 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.JoinColumn; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.JoinColumn; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientResourceIdPk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientResourceIdPk.java index 1be5590cc5d..f8470f3905a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientResourceIdPk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientResourceIdPk.java @@ -1,7 +1,7 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientScopePk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientScopePk.java index 5d0ed2bdbcf..72125186a0a 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientScopePk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientScopePk.java @@ -1,7 +1,7 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientSecretPk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientSecretPk.java index d576be3665e..338a36c34f0 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientSecretPk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ClientSecretPk.java @@ -1,7 +1,7 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ElectronicResourceNumEntityPk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ElectronicResourceNumEntityPk.java index 27e1c0bb3a9..85b5e597d84 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ElectronicResourceNumEntityPk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/ElectronicResourceNumEntityPk.java @@ -1,6 +1,6 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/OrcidGrantedAuthorityPk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/OrcidGrantedAuthorityPk.java index c6f0fac0ff1..d685a350ce2 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/OrcidGrantedAuthorityPk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/OrcidGrantedAuthorityPk.java @@ -1,6 +1,6 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/SecondaryAuthorWorkEntityPk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/SecondaryAuthorWorkEntityPk.java index ec083afad88..8302680d695 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/SecondaryAuthorWorkEntityPk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/SecondaryAuthorWorkEntityPk.java @@ -1,6 +1,6 @@ package org.orcid.persistence.jpa.entities.keys; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; import java.io.Serializable; /** diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/WorkExternalIdentifierEntityPk.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/WorkExternalIdentifierEntityPk.java index e32a3dac420..7801737a5d0 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/WorkExternalIdentifierEntityPk.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/keys/WorkExternalIdentifierEntityPk.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; /** * @author Declan Newman (declan) Date: 07/08/2012 diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/package-info.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/package-info.java index f3c05483fcb..273ddc8d09d 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/package-info.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/entities/package-info.java @@ -1,7 +1 @@ -@TypeDefs( { @TypeDef(name = "encryptedString", typeClass = EncryptedStringType.class, parameters = { @Parameter(name = "encryptorRegisteredName", value = "hibernateStringEncryptor") }) }) -package org.orcid.persistence.jpa.entities; - -import org.hibernate.annotations.TypeDefs; -import org.hibernate.annotations.TypeDef; -import org.hibernate.annotations.Parameter; -import org.jasypt.hibernate5.type.EncryptedStringType; \ No newline at end of file +package org.orcid.persistence.jpa.entities; \ No newline at end of file diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/jpa/type/EncryptedStringTypeContributor.java b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/type/EncryptedStringTypeContributor.java new file mode 100644 index 00000000000..b7691638c06 --- /dev/null +++ b/orcid-persistence/src/main/java/org/orcid/persistence/jpa/type/EncryptedStringTypeContributor.java @@ -0,0 +1,41 @@ +package org.orcid.persistence.jpa.type; + +import org.hibernate.boot.model.TypeContributions; +import org.hibernate.boot.model.TypeContributor; +import org.hibernate.service.ServiceRegistry; +import org.hibernate.type.BasicType; +import org.hibernate.type.BasicTypeReference; +import org.hibernate.type.StandardBasicTypes; + +/** + * Registers the legacy encryptedString logical type name in Hibernate 6. + * + * The old TypeDef or TypeDefs annotation API was removed, so this keeps + * compatibility for mappings that still refer to encryptedString by name. + */ +public class EncryptedStringTypeContributor implements TypeContributor { + + public static final String ENCRYPTED_STRING_TYPE_NAME = "encryptedString"; + + @Override + public void contribute(TypeContributions typeContributions, ServiceRegistry serviceRegistry) { + BasicType stringType = resolveStringType(typeContributions); + typeContributions.getTypeConfiguration() + .getBasicTypeRegistry() + .register(stringType, ENCRYPTED_STRING_TYPE_NAME); + } + + private BasicType resolveStringType(TypeContributions typeContributions) { + BasicType stringType = typeContributions.getTypeConfiguration() + .getBasicTypeRegistry() + .getRegisteredType("string"); + if (stringType != null) { + return stringType; + } + + BasicTypeReference stringReference = StandardBasicTypes.STRING; + return typeContributions.getTypeConfiguration() + .getBasicTypeRegistry() + .resolve(stringReference); + } +} \ No newline at end of file diff --git a/orcid-persistence/src/main/java/org/orcid/persistence/spring/OrcidEntityManagerFactory.java b/orcid-persistence/src/main/java/org/orcid/persistence/spring/OrcidEntityManagerFactory.java index 5c40306ca99..e2dd167d322 100644 --- a/orcid-persistence/src/main/java/org/orcid/persistence/spring/OrcidEntityManagerFactory.java +++ b/orcid-persistence/src/main/java/org/orcid/persistence/spring/OrcidEntityManagerFactory.java @@ -1,7 +1,7 @@ package org.orcid.persistence.spring; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.FactoryBean; diff --git a/orcid-persistence/src/main/java/org/orcid/statistics/jpa/entities/StatisticKeyEntity.java b/orcid-persistence/src/main/java/org/orcid/statistics/jpa/entities/StatisticKeyEntity.java index 047625d8807..adc3bf88df3 100644 --- a/orcid-persistence/src/main/java/org/orcid/statistics/jpa/entities/StatisticKeyEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/statistics/jpa/entities/StatisticKeyEntity.java @@ -4,13 +4,13 @@ import java.text.SimpleDateFormat; import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "statistic_key") diff --git a/orcid-persistence/src/main/java/org/orcid/statistics/jpa/entities/StatisticValuesEntity.java b/orcid-persistence/src/main/java/org/orcid/statistics/jpa/entities/StatisticValuesEntity.java index 10a2deae411..83e0ebc8fa6 100644 --- a/orcid-persistence/src/main/java/org/orcid/statistics/jpa/entities/StatisticValuesEntity.java +++ b/orcid-persistence/src/main/java/org/orcid/statistics/jpa/entities/StatisticValuesEntity.java @@ -2,17 +2,17 @@ import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "statistic_values") diff --git a/orcid-persistence/src/main/resources/META-INF/services/org.hibernate.boot.model.TypeContributor b/orcid-persistence/src/main/resources/META-INF/services/org.hibernate.boot.model.TypeContributor new file mode 100644 index 00000000000..a9182248ca6 --- /dev/null +++ b/orcid-persistence/src/main/resources/META-INF/services/org.hibernate.boot.model.TypeContributor @@ -0,0 +1 @@ +org.orcid.persistence.jpa.type.EncryptedStringTypeContributor diff --git a/orcid-persistence/src/main/resources/orcid-persistence-context.xml b/orcid-persistence/src/main/resources/orcid-persistence-context.xml index 228ed700ff7..8c979469f77 100644 --- a/orcid-persistence/src/main/resources/orcid-persistence-context.xml +++ b/orcid-persistence/src/main/resources/orcid-persistence-context.xml @@ -7,11 +7,11 @@ xmlns:jms="http://www.springframework.org/schema/jms" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd - http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd - http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd" > @@ -289,7 +289,7 @@ - + @@ -300,7 +300,7 @@ - + diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/AddressDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/AddressDaoTest.java index 94614a5898c..4e2d7a9c7c4 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/AddressDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/AddressDaoTest.java @@ -8,7 +8,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/BackupCodesDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/BackupCodesDaoTest.java index 726cf6fe906..313d36facef 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/BackupCodesDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/BackupCodesDaoTest.java @@ -7,7 +7,7 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/BiographyDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/BiographyDaoTest.java index fe4207ac681..4e225b389bd 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/BiographyDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/BiographyDaoTest.java @@ -7,7 +7,7 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ClientDetailsDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ClientDetailsDaoTest.java index adbc52f909b..b784aa911dc 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ClientDetailsDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ClientDetailsDaoTest.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ClientSecretDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ClientSecretDaoTest.java index 216ba3c4e86..a2f9f5d9958 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ClientSecretDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ClientSecretDaoTest.java @@ -7,7 +7,7 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/EmailDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/EmailDaoTest.java index 0195d14a87d..b48fdde9bc0 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/EmailDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/EmailDaoTest.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/EmailFrequencyDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/EmailFrequencyDaoTest.java index 6fa9118435a..fa38ec2f830 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/EmailFrequencyDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/EmailFrequencyDaoTest.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/EventDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/EventDaoTest.java index e672c47654a..22d4d6f70ae 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/EventDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/EventDaoTest.java @@ -8,8 +8,8 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.EntityManager; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; import org.apache.commons.lang3.reflect.FieldUtils; import org.junit.AfterClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/EventStatsDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/EventStatsDaoTest.java index 343b6fc8063..173ac24c3da 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/EventStatsDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/EventStatsDaoTest.java @@ -8,7 +8,7 @@ import org.orcid.test.OrcidJUnit4ClassRunner; import org.springframework.test.context.ContextConfiguration; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ExternalIdentifierDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ExternalIdentifierDaoTest.java index 10438cebaba..93f7216bfd7 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ExternalIdentifierDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ExternalIdentifierDaoTest.java @@ -13,8 +13,8 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/FindMyStuffDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/FindMyStuffDaoTest.java index 7a64b1d3a8e..ad1662e7a31 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/FindMyStuffDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/FindMyStuffDaoTest.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/IdentifierTypeDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/IdentifierTypeDaoTest.java index 24f62d9e7fd..b76083592c0 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/IdentifierTypeDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/IdentifierTypeDaoTest.java @@ -9,7 +9,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/InvalidRecordDataChangeDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/InvalidRecordDataChangeDaoTest.java index 1a9ce581227..9860a919791 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/InvalidRecordDataChangeDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/InvalidRecordDataChangeDaoTest.java @@ -9,7 +9,7 @@ import java.util.Iterator; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/NotificationDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/NotificationDaoTest.java index 38900733811..5b79386b14c 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/NotificationDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/NotificationDaoTest.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.reflect.FieldUtils; import org.hsqldb.types.NumberType; @@ -542,7 +542,8 @@ public void findNotificationsToDeleteByOffsetTest() { int count3 = 0; for(Object [] o : toDelete) { - BigInteger id = (BigInteger) o[0]; + // Handle both Long and BigInteger for Hibernate 6 compatibility + Long id = (o[0] instanceof Long) ? (Long) o[0] : ((BigInteger) o[0]).longValue(); String orcid = (String) o[1]; if("0000-0000-0000-0003".equals(orcid)) { diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/NotificationDao_NoDBPrefillTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/NotificationDao_NoDBPrefillTest.java index e7bf016db97..5056608b37c 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/NotificationDao_NoDBPrefillTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/NotificationDao_NoDBPrefillTest.java @@ -8,7 +8,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrcidOauth2AuthoriziationCodeDetailDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrcidOauth2AuthoriziationCodeDetailDaoTest.java index 1200d469198..d99c8c4d40e 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrcidOauth2AuthoriziationCodeDetailDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrcidOauth2AuthoriziationCodeDetailDaoTest.java @@ -7,7 +7,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrcidOauth2TokenDetailDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrcidOauth2TokenDetailDaoTest.java index 98aaf1435c5..dd18feaa29d 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrcidOauth2TokenDetailDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrcidOauth2TokenDetailDaoTest.java @@ -14,8 +14,8 @@ import java.util.List; import java.util.Locale; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgAffiliationRelationDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgAffiliationRelationDaoTest.java index fcca19d9ea7..0b50d198a67 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgAffiliationRelationDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgAffiliationRelationDaoTest.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgDisambiguatedDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgDisambiguatedDaoTest.java index f763e1f3869..8817f043040 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgDisambiguatedDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgDisambiguatedDaoTest.java @@ -9,8 +9,8 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.tuple.Pair; import org.junit.AfterClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgImportLogDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgImportLogDaoTest.java index f3618334b1e..5e7212ae869 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgImportLogDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OrgImportLogDaoTest.java @@ -7,7 +7,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OtherNameDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OtherNameDaoTest.java index d7dda3a3bbd..7efc34225f9 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/OtherNameDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/OtherNameDaoTest.java @@ -9,8 +9,8 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/PeerReviewDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/PeerReviewDaoTest.java index f40ac29e0ee..a112596a48a 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/PeerReviewDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/PeerReviewDaoTest.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileDaoTest.java index 66d117b9404..16aecb45219 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileDaoTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.EntityManager; -import javax.persistence.Query; +import jakarta.annotation.Resource; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileFundingDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileFundingDaoTest.java index 089fb2e232f..9d97196716f 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileFundingDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileFundingDaoTest.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileHistoryEventDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileHistoryEventDaoTest.java index 59aafe0dfef..38674b40c77 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileHistoryEventDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileHistoryEventDaoTest.java @@ -7,7 +7,7 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileKeywordDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileKeywordDaoTest.java index 0cbdfd12dd6..3e19ab05e77 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileKeywordDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ProfileKeywordDaoTest.java @@ -8,7 +8,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/RecordNameDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/RecordNameDaoTest.java index b79ffd5b034..b7395d07597 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/RecordNameDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/RecordNameDaoTest.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ResearchResourceDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ResearchResourceDaoTest.java index a5d8eb29b5f..1833a8f2c8e 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ResearchResourceDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ResearchResourceDaoTest.java @@ -10,8 +10,8 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ResearcherUrlDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ResearcherUrlDaoTest.java index 6bafb7e3df7..e5b6dc03280 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/ResearcherUrlDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/ResearcherUrlDaoTest.java @@ -9,9 +9,9 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceException; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceException; import org.apache.commons.lang3.reflect.FieldUtils; import org.junit.AfterClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/SpamDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/SpamDaoTest.java index df1cfc1edaa..00c4b539a30 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/SpamDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/SpamDaoTest.java @@ -8,9 +8,9 @@ import java.util.Arrays; import java.util.Date; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.transaction.Transactional; import org.apache.commons.lang3.reflect.FieldUtils; import org.junit.AfterClass; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/WebhookDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/WebhookDaoTest.java index a9c8dc7eec2..498e3cf54df 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/WebhookDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/WebhookDaoTest.java @@ -15,9 +15,9 @@ import java.util.List; import java.util.Set; -import javax.persistence.EntityManager; -import javax.persistence.Query; -import javax.persistence.TypedQuery; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; import org.junit.Before; import org.junit.Test; diff --git a/orcid-persistence/src/test/java/org/orcid/persistence/dao/WorkDaoTest.java b/orcid-persistence/src/test/java/org/orcid/persistence/dao/WorkDaoTest.java index 786774099ce..dfbffbea728 100644 --- a/orcid-persistence/src/test/java/org/orcid/persistence/dao/WorkDaoTest.java +++ b/orcid-persistence/src/test/java/org/orcid/persistence/dao/WorkDaoTest.java @@ -10,7 +10,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-persistence/src/test/resources/test-db-context.xml b/orcid-persistence/src/test/resources/test-db-context.xml index a91fb33d198..dea93d0dbb5 100644 --- a/orcid-persistence/src/test/resources/test-db-context.xml +++ b/orcid-persistence/src/test/resources/test-db-context.xml @@ -2,9 +2,9 @@ + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd"> org.springframework.security spring-security-web - - org.springframework.security.oauth - spring-security-oauth2 - @@ -61,6 +57,36 @@ spring-webmvc + + + jakarta.annotation + jakarta.annotation-api + + + jakarta.servlet + jakarta.servlet-api + + + jakarta.ws.rs + jakarta.ws.rs-api + + + + + org.freemarker + freemarker + + + + + org.apache.httpcomponents.core5 + httpcore5 + + + org.apache.httpcomponents.client5 + httpclient5 + + com.google.guava guava @@ -98,8 +124,8 @@ maven-compiler-plugin false - 11 - 11 + 17 + 17 diff --git a/orcid-pub-web/src/main/java/org/orcid/api/common/swagger/SwaggerUIBuilder.java b/orcid-pub-web/src/main/java/org/orcid/api/common/swagger/SwaggerUIBuilder.java index e77dd97d9db..f242d54a9aa 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/common/swagger/SwaggerUIBuilder.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/common/swagger/SwaggerUIBuilder.java @@ -5,7 +5,7 @@ import java.util.HashMap; import java.util.Map; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; import org.orcid.core.api.OrcidApiConstants; diff --git a/orcid-pub-web/src/main/java/org/orcid/api/filters/AnalyticsFilter.java b/orcid-pub-web/src/main/java/org/orcid/api/filters/AnalyticsFilter.java index 1e990992d6a..dc3ad7690eb 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/filters/AnalyticsFilter.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/filters/AnalyticsFilter.java @@ -1,13 +1,13 @@ package org.orcid.api.filters; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerResponseContext; -import javax.ws.rs.container.ContainerResponseFilter; -import javax.ws.rs.core.Context; -import javax.ws.rs.ext.Provider; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerResponseContext; +import jakarta.ws.rs.container.ContainerResponseFilter; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.ext.Provider; import org.orcid.api.common.analytics.AnalyticsProcess; import org.orcid.api.common.analytics.client.AnalyticsClient; diff --git a/orcid-pub-web/src/main/java/org/orcid/api/filters/ApiRateLimitFilter.java b/orcid-pub-web/src/main/java/org/orcid/api/filters/ApiRateLimitFilter.java index 865bb8a4b3a..f00fa899749 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/filters/ApiRateLimitFilter.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/filters/ApiRateLimitFilter.java @@ -5,11 +5,12 @@ import java.time.LocalDate; import java.util.*; -import javax.annotation.Resource; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang.LocaleUtils; import org.apache.commons.lang3.StringUtils; @@ -21,9 +22,10 @@ import org.orcid.core.manager.impl.OrcidUrlManager; import org.orcid.core.manager.v3.EmailManager; import org.orcid.core.manager.v3.RecordNameManager; -import org.orcid.core.oauth.service.OrcidTokenStore; +import org.orcid.persistence.dao.OrcidOauth2TokenDetailDao; import org.orcid.persistence.dao.ProfileDao; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; +import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.orcid.utils.email.MailGunManager; import org.orcid.utils.panoply.PanoplyRedshiftClient; @@ -68,14 +70,11 @@ public class ApiRateLimitFilter extends OncePerRequestFilter { @Autowired private EmailManager emailManager; - @Resource - private PanoplyRedshiftClient panoplyClient; - @Resource private PapiRateLimitRedisClient papiRedisClient; - @Autowired - private OrcidTokenStore orcidTokenStore; + @Resource(name="orcidOauth2TokenDetailDaoReadOnly") + private OrcidOauth2TokenDetailDao orcidOauth2TokenDetailDaoReadOnly; @Autowired private MessageSource messageSource; @@ -89,7 +88,6 @@ public class ApiRateLimitFilter extends OncePerRequestFilter { @Value("${org.orcid.papi.rate.limit.enabled:false}") private boolean enableRateLimiting; - // :192.168.65.1 127.0.0.1 @Value("${org.orcid.papi.rate.limit.ip.whiteSpaceSeparatedWhiteList:192.168.65.1 127.0.0.1}") private String papiWhiteSpaceSeparatedWhiteList; @@ -146,11 +144,15 @@ public void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletR String ipAddress = getClientIpAddress(httpServletRequest); if (!isIPInCidrWhiteListRange(ipAddress)) { - String clientId = null; if (tokenValue != null) { try { - clientId = orcidTokenStore.readClientId(tokenValue); + OrcidOauth2TokenDetail token = orcidOauth2TokenDetailDaoReadOnly.findByTokenValue(tokenValue); + if(token != null) { + clientId = token.getClientDetailsId(); + } + } catch (NoResultException ex) { + LOG.debug("No client found for token value, treating request as anonymous client"); } catch (Exception ex) { LOG.error("Exception when trying to get the client id from token value, ignoring and treating as anonymous client", ex); } diff --git a/orcid-pub-web/src/main/java/org/orcid/api/filters/PutAuthTokenActionFilter.java b/orcid-pub-web/src/main/java/org/orcid/api/filters/PutAuthTokenActionFilter.java index 669b65f1c34..623a02062bb 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/filters/PutAuthTokenActionFilter.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/filters/PutAuthTokenActionFilter.java @@ -2,12 +2,12 @@ import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.Context; -import javax.ws.rs.ext.Provider; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.ext.Provider; import org.orcid.core.togglz.Features; import org.slf4j.Logger; diff --git a/orcid-pub-web/src/main/java/org/orcid/api/identifiers/IdentifierApiServiceImpl.java b/orcid-pub-web/src/main/java/org/orcid/api/identifiers/IdentifierApiServiceImpl.java index 0dac414b960..fe94c47d619 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/identifiers/IdentifierApiServiceImpl.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/identifiers/IdentifierApiServiceImpl.java @@ -1,11 +1,11 @@ package org.orcid.api.identifiers; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.glassfish.jersey.message.XmlHeader; import org.orcid.api.identifiers.delegator.IdentifierApiServiceDelegator; diff --git a/orcid-pub-web/src/main/java/org/orcid/api/identifiers/delegator/IdentifierApiServiceDelegator.java b/orcid-pub-web/src/main/java/org/orcid/api/identifiers/delegator/IdentifierApiServiceDelegator.java index e8d696f1d88..c0d9b791003 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/identifiers/delegator/IdentifierApiServiceDelegator.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/identifiers/delegator/IdentifierApiServiceDelegator.java @@ -1,6 +1,6 @@ package org.orcid.api.identifiers.delegator; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; public interface IdentifierApiServiceDelegator { diff --git a/orcid-pub-web/src/main/java/org/orcid/api/identifiers/delegator/impl/IdentifierApiServiceDelegatorImpl.java b/orcid-pub-web/src/main/java/org/orcid/api/identifiers/delegator/impl/IdentifierApiServiceDelegatorImpl.java index 78f7b768bae..c54c79a815b 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/identifiers/delegator/impl/IdentifierApiServiceDelegatorImpl.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/identifiers/delegator/impl/IdentifierApiServiceDelegatorImpl.java @@ -3,9 +3,9 @@ import java.util.Collection; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.GenericEntity; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.GenericEntity; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang3.LocaleUtils; import org.orcid.api.identifiers.delegator.IdentifierApiServiceDelegator; diff --git a/orcid-pub-web/src/main/java/org/orcid/api/lod/ExperimentalRDFResource.java b/orcid-pub-web/src/main/java/org/orcid/api/lod/ExperimentalRDFResource.java index 83a259630a8..fa02587427a 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/lod/ExperimentalRDFResource.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/lod/ExperimentalRDFResource.java @@ -22,11 +22,11 @@ import static org.orcid.core.api.OrcidApiConstants.TEXT_N3; import static org.orcid.core.api.OrcidApiConstants.TEXT_TURTLE; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Response; import org.orcid.api.publicV2.server.delegator.PublicV2ApiServiceDelegator; import org.orcid.core.api.OrcidApiConstants; diff --git a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/PublicV2ApiServiceImplV2_0.java b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/PublicV2ApiServiceImplV2_0.java index 745509da5c3..99ec5427e00 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/PublicV2ApiServiceImplV2_0.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/PublicV2ApiServiceImplV2_0.java @@ -40,18 +40,18 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.orcid.api.common.swagger.SwaggerUIBuilder; import org.orcid.api.publicV2.server.delegator.PublicV2ApiServiceDelegator; @@ -67,7 +67,7 @@ import org.orcid.jaxb.model.record_v2.Work; import org.springframework.stereotype.Component; - +import org.apache.hc.core5.http.ParseException; /** * * @author Angel Montenegro @@ -381,7 +381,7 @@ public Response viewRecordRecord(@PathParam("orcid") String orcid) { @GET @Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML, VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON }) @Path(SEARCH_PATH) - public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) { + public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) throws ParseException { serviceDelegator.trackEvents(httpRequest); Map> solrParams = new HashMap<>(uriInfo.getQueryParameters()); Response jsonQueryResults = serviceDelegator.searchByQuery(solrParams); diff --git a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/PublicV2ApiServiceImplV2_1.java b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/PublicV2ApiServiceImplV2_1.java index d9c8799689a..f91dd82a052 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/PublicV2ApiServiceImplV2_1.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/PublicV2ApiServiceImplV2_1.java @@ -40,18 +40,18 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.orcid.api.common.swagger.SwaggerUIBuilder; import org.orcid.api.publicV2.server.delegator.PublicV2ApiServiceDelegator; @@ -67,6 +67,7 @@ import org.orcid.jaxb.model.record_v2.Work; import org.springframework.stereotype.Component; +import org.apache.hc.core5.http.ParseException; /** * * @author Angel Montenegro @@ -382,7 +383,7 @@ public Response viewRecordRecord(@PathParam("orcid") String orcid) { @GET @Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML, VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON }) @Path(SEARCH_PATH) - public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) { + public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) throws ParseException { serviceDelegator.trackEvents(httpRequest); Map> solrParams = new HashMap<>(uriInfo.getQueryParameters()); Response jsonQueryResults = serviceDelegator.searchByQuery(solrParams); diff --git a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/PublicV2ApiServiceDelegator.java b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/PublicV2ApiServiceDelegator.java index b51e80e01e6..69ac5860948 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/PublicV2ApiServiceDelegator.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/PublicV2ApiServiceDelegator.java @@ -3,8 +3,10 @@ import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Response; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Response; + +import org.apache.hc.core5.http.ParseException; /** * @@ -85,7 +87,7 @@ public interface PublicV2ApiServiceDelegator> solrParams); + Response searchByQuery(Map> solrParams) throws ParseException; Response viewClient(String clientId); diff --git a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/impl/PublicV2ApiServiceDelegatorImpl.java b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/impl/PublicV2ApiServiceDelegatorImpl.java index 3bb95275b73..ae7c00a46ff 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/impl/PublicV2ApiServiceDelegatorImpl.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/impl/PublicV2ApiServiceDelegatorImpl.java @@ -6,9 +6,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Response; import org.orcid.api.common.util.ActivityUtils; import org.orcid.api.common.util.ElementUtils; @@ -68,6 +68,7 @@ import org.orcid.jaxb.model.record.summary_v2.Works; import org.orcid.jaxb.model.record_v2.*; import org.orcid.jaxb.model.search_v2.Search; +import org.orcid.jaxb.model.record_v2.Record; import org.orcid.persistence.jpa.entities.EmailDomainEntity; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.springframework.beans.factory.annotation.Value; @@ -76,6 +77,8 @@ import de.undercouch.citeproc.csl.CSLItemData; import liquibase.repackaged.org.apache.commons.lang3.StringUtils; +import org.apache.hc.core5.http.ParseException; + /** *

* The delegator for the tier 2 API. @@ -150,9 +153,6 @@ public class PublicV2ApiServiceDelegatorImpl @Resource private ContributorUtils contributorUtilsReadOnly; - @Resource - private RecordManager recordManager; - @Resource private SourceUtils sourceUtils; @@ -168,9 +168,6 @@ public class PublicV2ApiServiceDelegatorImpl @Resource private LocaleManager localeManager; - @Resource - private OpenIDConnectKeyService openIDConnectKeyService; - @Resource private ClientManagerReadOnly clientManagerReadOnly; @@ -180,12 +177,6 @@ public class PublicV2ApiServiceDelegatorImpl @Resource private EventManager eventManager; - @Resource - private EmailDomainManager emailDomainManager; - - @Value("${org.orcid.core.baseUri}") - private String baseUrl; - @Override public Response viewStatusText() { return Response.ok(STATUS_OK_MESSAGE).build(); @@ -193,12 +184,12 @@ public Response viewStatusText() { /** * finds and returns the {@link org.orcid.jaxb.model.message.OrcidMessage} - * wrapped in a {@link javax.xml.ws.Response} with only the profile's bio + * wrapped in a {@link jakarta.xml.ws.Response} with only the profile's bio * details * * @param orcid * the ORCID to be used to identify the record - * @return the {@link javax.xml.ws.Response} with the + * @return the {@link jakarta.xml.ws.Response} with the * {@link org.orcid.jaxb.model.message.OrcidMessage} within it */ @Override @@ -552,7 +543,7 @@ public Response viewRecord(String orcid) { } @Override - public Response searchByQuery(Map> solrParams) { + public Response searchByQuery(Map> solrParams) throws ParseException { validateSearchParams(solrParams); Search search = orcidSearchManager.findOrcidIds(solrParams); return Response.ok(search).build(); diff --git a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/impl/PublicV2ApiServiceVersionedDelegatorImpl.java b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/impl/PublicV2ApiServiceVersionedDelegatorImpl.java index 37f2da1489a..475b0933d92 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/impl/PublicV2ApiServiceVersionedDelegatorImpl.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/delegator/impl/PublicV2ApiServiceVersionedDelegatorImpl.java @@ -3,9 +3,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Response; import org.orcid.api.publicV2.server.delegator.PublicV2ApiServiceDelegator; import org.orcid.core.common.manager.EventManager; @@ -15,6 +15,8 @@ import org.orcid.core.version.V2Convertible; import org.orcid.core.version.V2VersionConverterChain; +import org.apache.hc.core5.http.ParseException; + public class PublicV2ApiServiceVersionedDelegatorImpl implements PublicV2ApiServiceDelegator { @Resource @@ -27,16 +29,10 @@ public class PublicV2ApiServiceVersionedDelegatorImpl implements PublicV2ApiServ @Resource private V2VersionConverterChain v2_1VersionConverterChain; - - @Resource - private ProfileEntityCacheManager profileEntityCacheManager; @Resource private OrcidSecurityManager orcidSecurityManager; - - @Resource - private EventManager eventManager; - + @Override public Response viewStatusText() { return publicV2ApiServiceDelegator.viewStatusText(); @@ -249,7 +245,7 @@ public Response viewRecord(String orcid) { } @Override - public Response searchByQuery(Map> solrParams) { + public Response searchByQuery(Map> solrParams) throws ParseException { return processReponse(publicV2ApiServiceDelegator.searchByQuery(solrParams)); } diff --git a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/security/impl/PublicAPISecurityManagerV2Impl.java b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/security/impl/PublicAPISecurityManagerV2Impl.java index 9723dbe7ea9..76c9327c111 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/security/impl/PublicAPISecurityManagerV2Impl.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/publicV2/server/security/impl/PublicAPISecurityManagerV2Impl.java @@ -5,7 +5,7 @@ import java.util.Iterator; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.api.publicV2.server.security.PublicAPISecurityManagerV2; import org.orcid.core.exception.OrcidCoreExceptionMapper; diff --git a/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/PublicV3ApiServiceImplV3_0.java b/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/PublicV3ApiServiceImplV3_0.java index 7581c577c7b..875fa8928f4 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/PublicV3ApiServiceImplV3_0.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/PublicV3ApiServiceImplV3_0.java @@ -62,19 +62,20 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; + +import org.apache.hc.core5.http.ParseException; import org.orcid.api.common.swagger.SwaggerUIBuilder; import org.orcid.api.publicV3.server.delegator.PublicV3ApiServiceDelegator; import org.orcid.core.api.OrcidApiConstants; @@ -416,7 +417,7 @@ public Response viewRecordRecord(@PathParam("orcid") String orcid) { @GET @Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML, VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON }) @Path(SEARCH_PATH) - public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) { + public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) throws ParseException{ serviceDelegator.trackEvents(httpRequest); Map> solrParams = new HashMap<>(uriInfo.getQueryParameters()); Response jsonQueryResults = serviceDelegator.searchByQuery(solrParams); @@ -426,7 +427,7 @@ public Response searchByQuery(@QueryParam("q") @DefaultValue("") String query, @ @GET @Produces(TEXT_CSV) @Path(CSV_SEARCH_PATH) - public Response searchByQueryCSV(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) { + public Response searchByQueryCSV(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) throws ParseException{ serviceDelegator.trackEvents(httpRequest); Map> solrParams = new HashMap<>(uriInfo.getQueryParameters()); Response csvQueryResults = serviceDelegator.searchByQueryCSV(solrParams); @@ -436,7 +437,7 @@ public Response searchByQueryCSV(@QueryParam("q") @DefaultValue("") String query @GET @Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML, VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON }) @Path(EXPANDED_SEARCH_PATH) - public Response expandedSearchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) { + public Response expandedSearchByQuery(@QueryParam("q") @DefaultValue("") String query, @Context UriInfo uriInfo) throws ParseException{ serviceDelegator.trackEvents(httpRequest); Map> solrParams = new HashMap<>(uriInfo.getQueryParameters()); Response queryResults = serviceDelegator.expandedSearchByQuery(solrParams); diff --git a/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/delegator/PublicV3ApiServiceDelegator.java b/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/delegator/PublicV3ApiServiceDelegator.java index a96e8649e0d..c5970a330bc 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/delegator/PublicV3ApiServiceDelegator.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/delegator/PublicV3ApiServiceDelegator.java @@ -3,8 +3,10 @@ import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Response; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Response; + +import org.apache.hc.core5.http.ParseException; /** * @@ -87,7 +89,7 @@ public interface PublicV3ApiServiceDelegator> solrParams); + Response searchByQuery(Map> solrParams) throws ParseException; Response viewClient(String clientId); @@ -129,9 +131,9 @@ public interface PublicV3ApiServiceDelegator> solrParams); + Response searchByQueryCSV(Map> solrParams) throws ParseException; - Response expandedSearchByQuery(Map> solrParams); + Response expandedSearchByQuery(Map> solrParams)throws ParseException; void trackEvents(HttpServletRequest httpRequest); diff --git a/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/delegator/impl/PublicV3ApiServiceDelegatorImpl.java b/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/delegator/impl/PublicV3ApiServiceDelegatorImpl.java index 7901aae8fa8..124ecbd44aa 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/delegator/impl/PublicV3ApiServiceDelegatorImpl.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/publicV3/server/delegator/impl/PublicV3ApiServiceDelegatorImpl.java @@ -6,10 +6,10 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import org.orcid.api.common.util.v3.ActivityUtils; import org.orcid.api.common.util.v3.ElementUtils; @@ -85,12 +85,16 @@ import org.orcid.jaxb.model.v3.release.record.summary.Works; import org.orcid.jaxb.model.v3.release.search.Search; import org.orcid.jaxb.model.v3.release.search.expanded.ExpandedSearch; +import org.orcid.jaxb.model.v3.release.record.Record; +import org.orcid.persistence.jpa.entities.EmailDomainEntity; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import de.undercouch.citeproc.csl.CSLItemData; +import org.apache.hc.core5.http.ParseException; + @Component public class PublicV3ApiServiceDelegatorImpl implements PublicV3ApiServiceDelegator { @@ -183,9 +187,6 @@ public class PublicV3ApiServiceDelegatorImpl implements @Resource(name = "clientDetailsManagerReadOnlyV3") private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; - @Resource - private OpenIDConnectKeyService openIDConnectKeyService; - @Resource private StatusManager statusManager; @@ -195,15 +196,6 @@ public class PublicV3ApiServiceDelegatorImpl implements @Resource private EventManager eventManager; - @Resource - private EmailDomainManager emailDomainManager; - - @Resource - private SourceEntityUtils sourceEntityUtils; - - @Value("${org.orcid.core.baseUri}") - private String baseUrl; - private Boolean filterVersionOfIdentifiers = false; public Boolean getFilterVersionOfIdentifiers() { @@ -229,12 +221,12 @@ public Response viewStatus() { /** * finds and returns the {@link org.orcid.jaxb.model.message.OrcidMessage} - * wrapped in a {@link javax.xml.ws.Response} with only the profile's bio + * wrapped in a {@link jakarta.xml.ws.Response} with only the profile's bio * details * * @param orcid * the ORCID to be used to identify the record - * @return the {@link javax.xml.ws.Response} with the + * @return the {@link jakarta.xml.ws.Response} with the * {@link org.orcid.jaxb.model.message.OrcidMessage} within it */ @Override @@ -624,22 +616,22 @@ public Response viewRecord(String orcid) { return Response.ok(publicRecordUtils.getPublicRecord(orcid, filterVersionOfIdentifiers)).build(); } - @Override - public Response searchByQuery(Map> solrParams) { + @Override + public Response searchByQuery(Map> solrParams) throws ParseException { validateSearchParams(solrParams); Search search = orcidSearchManager.findOrcidIds(solrParams); return Response.ok(search).build(); } @Override - public Response searchByQueryCSV(Map> solrParams) { + public Response searchByQueryCSV(Map> solrParams) throws ParseException{ validateSearchParams(solrParams); String search = orcidSearchManager.findOrcidIdsAsCSV(solrParams); return Response.ok(search).build(); } @Override - public Response expandedSearchByQuery(Map> solrParams) { + public Response expandedSearchByQuery(Map> solrParams) throws ParseException{ validateSearchParams(solrParams); ExpandedSearch search = orcidSearchManager.expandedSearch(solrParams); return Response.ok(search).build(); diff --git a/orcid-pub-web/src/main/java/org/orcid/api/swagger/PublicSwaggerResource.java b/orcid-pub-web/src/main/java/org/orcid/api/swagger/PublicSwaggerResource.java index 7b5c0e81727..2908e03ec7e 100644 --- a/orcid-pub-web/src/main/java/org/orcid/api/swagger/PublicSwaggerResource.java +++ b/orcid-pub-web/src/main/java/org/orcid/api/swagger/PublicSwaggerResource.java @@ -1,9 +1,9 @@ package org.orcid.api.swagger; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Application; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Application; +import jakarta.ws.rs.core.MediaType; import org.orcid.core.api.OrcidApiConstants; import org.orcid.jaxb.model.message.ScopePathType; diff --git a/orcid-pub-web/src/main/resources/orcid-t1-security-context.xml b/orcid-pub-web/src/main/resources/orcid-t1-security-context.xml index 0e6b8dce4b6..242aa49bb70 100644 --- a/orcid-pub-web/src/main/resources/orcid-t1-security-context.xml +++ b/orcid-pub-web/src/main/resources/orcid-t1-security-context.xml @@ -2,83 +2,30 @@ + http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-6.0.xsd"> - - - - - - - - - - - - - - + + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -86,9 +33,6 @@ - - - - - + + diff --git a/orcid-pub-web/src/main/resources/orcid-t1-web-context.xml b/orcid-pub-web/src/main/resources/orcid-t1-web-context.xml index 38c9d27c763..debab7d9b4e 100644 --- a/orcid-pub-web/src/main/resources/orcid-t1-web-context.xml +++ b/orcid-pub-web/src/main/resources/orcid-t1-web-context.xml @@ -5,15 +5,17 @@ xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd - http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd"> + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> + + - + @@ -31,7 +33,6 @@ - diff --git a/orcid-pub-web/src/main/webapp/WEB-INF/web.xml b/orcid-pub-web/src/main/webapp/WEB-INF/web.xml index 2d6ae77b317..1fdd778917a 100644 --- a/orcid-pub-web/src/main/webapp/WEB-INF/web.xml +++ b/orcid-pub-web/src/main/webapp/WEB-INF/web.xml @@ -136,16 +136,6 @@ /* - - clientCredentialsTokenEndpointFilter - org.springframework.web.filter.DelegatingFilterProxy - - - - clientCredentialsTokenEndpointFilter - /oauth/token - - rateLimitingFilter org.springframework.web.filter.DelegatingFilterProxy @@ -179,7 +169,6 @@ clientIdAttributeFilter * - jersey diff --git a/orcid-pub-web/src/test/java/org/orcid/api/filters/ApiRateLimitFilterTest.java b/orcid-pub-web/src/test/java/org/orcid/api/filters/ApiRateLimitFilterTest.java index 25d1849dba8..1e53afff509 100644 --- a/orcid-pub-web/src/test/java/org/orcid/api/filters/ApiRateLimitFilterTest.java +++ b/orcid-pub-web/src/test/java/org/orcid/api/filters/ApiRateLimitFilterTest.java @@ -7,15 +7,14 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.orcid.core.api.rate_limit.PapiRateLimitRedisClient; -import org.orcid.core.oauth.service.OrcidTokenStore; import org.orcid.test.OrcidJUnit4ClassRunner; import org.orcid.test.TargetProxyHelper; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.context.ContextConfiguration; -import javax.annotation.Resource; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; +import jakarta.annotation.Resource; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; import java.io.IOException; import java.time.LocalDate; @@ -33,9 +32,6 @@ public class ApiRateLimitFilterTest { @Mock private FilterChain filterChainMock; - @Mock - private OrcidTokenStore orcidTokenStoreMock; - @Mock private PapiRateLimitRedisClient papiRateLimitRedisMock; @@ -47,13 +43,11 @@ public class ApiRateLimitFilterTest { public void doFilterInternal_rateLimitingDisabledTest() throws ServletException, IOException { MockitoAnnotations.initMocks(this); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", false); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); apiRateLimitFilter.doFilterInternal(httpServletRequestMock, httpServletResponseMock, filterChainMock); verify(filterChainMock, times(1)).doFilter(eq(httpServletRequestMock), eq(httpServletResponseMock)); - verify(orcidTokenStoreMock, never()).readClientId(anyString()); verify(papiRateLimitRedisMock, never()).getDailyLimitsForClient(anyString(), any()); verify(papiRateLimitRedisMock, never()).setTodayLimitsForClient(anyString(), any()); @@ -65,7 +59,6 @@ public void doFilterInternal_annonymousRequest_newEntry_X_FORWARDED_FOR_header_T String ip = "127.0.0.2"; TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", true); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); when(papiRateLimitRedisMock.getTodayDailyLimitsForClient(eq(ip))).thenReturn(null); @@ -73,7 +66,6 @@ public void doFilterInternal_annonymousRequest_newEntry_X_FORWARDED_FOR_header_T apiRateLimitFilter.doFilterInternal(httpServletRequestMock, httpServletResponseMock, filterChainMock); - verify(orcidTokenStoreMock, never()).readClientId(anyString()); verify(papiRateLimitRedisMock, times(1)).setTodayLimitsForClient(anyString(), any(JSONObject.class)); } @@ -83,7 +75,6 @@ public void doFilterInternal_annonymousRequest_newEntry_X_REAL_IP_header_Test() String ip = "127.0.0.2"; TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", true); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); when(papiRateLimitRedisMock.getTodayDailyLimitsForClient(eq(ip))).thenReturn(null); @@ -91,8 +82,6 @@ public void doFilterInternal_annonymousRequest_newEntry_X_REAL_IP_header_Test() apiRateLimitFilter.doFilterInternal(httpServletRequestMock, httpServletResponseMock, filterChainMock); - verify(orcidTokenStoreMock, never()).readClientId(anyString()); - verify(papiRateLimitRedisMock, never()).getDailyLimitsForClient(anyString(), any()); verify(papiRateLimitRedisMock, times(1)).setTodayLimitsForClient(anyString(), any(JSONObject.class)); } @@ -103,7 +92,6 @@ public void doFilterInternal_annonymousRequest_newEntry_whitelisted_IP_Test() th String ip = "127.0.0.1"; TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", true); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); when(papiRateLimitRedisMock.getTodayDailyLimitsForClient(eq(ip))).thenReturn(null); @@ -111,7 +99,6 @@ public void doFilterInternal_annonymousRequest_newEntry_whitelisted_IP_Test() th apiRateLimitFilter.doFilterInternal(httpServletRequestMock, httpServletResponseMock, filterChainMock); - verify(orcidTokenStoreMock, never()).readClientId(anyString()); verify(papiRateLimitRedisMock, never()).setTodayLimitsForClient(eq(ip), any()); } @@ -128,7 +115,6 @@ public void doFilterInternal_annonymousRequest_existingEntryTest() throws Servle dailyLimitsObj.put(PapiRateLimitRedisClient.KEY_LAST_MODIFIED, System.currentTimeMillis()); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", true); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); when(papiRateLimitRedisMock.getTodayDailyLimitsForClient(eq(ip))).thenReturn(dailyLimitsObj); @@ -136,9 +122,7 @@ public void doFilterInternal_annonymousRequest_existingEntryTest() throws Servle apiRateLimitFilter.doFilterInternal(httpServletRequestMock, httpServletResponseMock, filterChainMock); - verify(orcidTokenStoreMock, never()).readClientId(anyString()); verify(papiRateLimitRedisMock, times(1)).setTodayLimitsForClient(anyString(), any(JSONObject.class)); - } @Test @@ -148,9 +132,7 @@ public void doFilterInternal_clientRequest_newEntryTest() throws ServletExceptio String clientId = "clientId1"; httpServletRequestMock.addHeader("Authorization", "TEST_TOKEN"); - when(orcidTokenStoreMock.readClientId(eq("TEST_TOKEN"))).thenReturn(clientId); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", true); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); when(papiRateLimitRedisMock.getTodayDailyLimitsForClient(eq(ip))).thenReturn(null); @@ -176,9 +158,7 @@ public void doFilterInternal_clientRequest_existingEntryTest() throws ServletExc dailyLimitsObj.put(PapiRateLimitRedisClient.KEY_LAST_MODIFIED, System.currentTimeMillis()); httpServletRequestMock.addHeader("Authorization", "TEST_TOKEN"); - when(orcidTokenStoreMock.readClientId(eq("TEST_TOKEN"))).thenReturn(clientId); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", true); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); when(papiRateLimitRedisMock.getDailyLimitsForClient(eq(clientId), any())).thenReturn(dailyLimitsObj); @@ -203,7 +183,6 @@ public void doFilterInternal_checkLimitReachedTest() throws ServletException, IO dailyLimitsObj.put(PapiRateLimitRedisClient.KEY_LAST_MODIFIED, System.currentTimeMillis()); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", true); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); when(papiRateLimitRedisMock.getTodayDailyLimitsForClient(eq(ip))).thenReturn(dailyLimitsObj); @@ -224,7 +203,6 @@ public void doFilterInternal_annonymousRequest_whitelisted_cidr_IP_Test() throws String ip_in_cidr = "10.0.0.0"; TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", true); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); when(papiRateLimitRedisMock.getTodayDailyLimitsForClient(eq(ip_in_cidr))).thenReturn(null); @@ -232,7 +210,6 @@ public void doFilterInternal_annonymousRequest_whitelisted_cidr_IP_Test() throws apiRateLimitFilter.doFilterInternal(httpServletRequestMock, httpServletResponseMock, filterChainMock); - verify(orcidTokenStoreMock, never()).readClientId(anyString()); verify(papiRateLimitRedisMock, never()).setTodayLimitsForClient(eq(ip_in_cidr), any()); } @@ -242,7 +219,6 @@ public void doFilterInternal_annonymousRequest_not_whitelisted_cidr_IP_Test() th String ip_not_cidr = "20.0.0.0"; TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "enableRateLimiting", true); - TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "orcidTokenStore", orcidTokenStoreMock); TargetProxyHelper.injectIntoProxy(apiRateLimitFilter, "papiRedisClient", papiRateLimitRedisMock); when(papiRateLimitRedisMock.getTodayDailyLimitsForClient(eq(ip_not_cidr))).thenReturn(null); @@ -250,7 +226,6 @@ public void doFilterInternal_annonymousRequest_not_whitelisted_cidr_IP_Test() th apiRateLimitFilter.doFilterInternal(httpServletRequestMock, httpServletResponseMock, filterChainMock); - verify(orcidTokenStoreMock, never()).readClientId(anyString()); verify(papiRateLimitRedisMock, times(1)).setTodayLimitsForClient(eq(ip_not_cidr), any(JSONObject.class)); } } diff --git a/orcid-pub-web/src/test/java/org/orcid/api/identifiers/IdentifierApiServiceDelegatorTest.java b/orcid-pub-web/src/test/java/org/orcid/api/identifiers/IdentifierApiServiceDelegatorTest.java index 189a69936eb..7cd5ac2cf14 100644 --- a/orcid-pub-web/src/test/java/org/orcid/api/identifiers/IdentifierApiServiceDelegatorTest.java +++ b/orcid-pub-web/src/test/java/org/orcid/api/identifiers/IdentifierApiServiceDelegatorTest.java @@ -6,9 +6,9 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.GenericEntity; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.GenericEntity; +import jakarta.ws.rs.core.Response; import org.junit.Before; import org.junit.Test; diff --git a/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/PublicV2ApiServiceDelegatorTest.java b/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/PublicV2ApiServiceDelegatorTest.java index f7c3ced1132..e5a73d9f004 100644 --- a/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/PublicV2ApiServiceDelegatorTest.java +++ b/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/PublicV2ApiServiceDelegatorTest.java @@ -10,11 +10,12 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; +import org.apache.hc.core5.http.ParseException; import org.junit.*; import org.junit.runner.RunWith; import org.mockito.Matchers; @@ -1178,7 +1179,7 @@ public void testGetPrivateResearcherUrlUsingToken() { } @Test - public void testSearchByQuery() { + public void testSearchByQuery() throws ParseException { Search search = new Search(); Result result = new Result(); result.setOrcidIdentifier(new OrcidIdentifier("some-orcid-id")); @@ -1203,7 +1204,7 @@ public void testSearchByQuery() { } @Test(expected = OrcidBadRequestException.class) - public void testSearchByQueryTooManyRows() { + public void testSearchByQueryTooManyRows() throws ParseException { Map> params = new HashMap<>(); params.put("rows", Arrays.asList(Integer.toString(OrcidSearchManager.MAX_SEARCH_ROWS + 20))); @@ -1216,7 +1217,7 @@ public void testSearchByQueryTooManyRows() { } @Test(expected = SearchStartParameterLimitExceededException.class) - public void testSearchByQueryIllegalStart() { + public void testSearchByQueryIllegalStart() throws ParseException { Map> params = new HashMap<>(); params.put("start", Arrays.asList(Integer.toString(OrcidSearchManager.MAX_SEARCH_START + 20))); @@ -1233,7 +1234,7 @@ public void testSearchByQueryIllegalStart() { } @Test - public void testSearchByQueryLegalStart() { + public void testSearchByQueryLegalStart() throws ParseException { Map> params = new HashMap<>(); params.put("start", Arrays.asList(Integer.toString(OrcidSearchManager.MAX_SEARCH_START))); @@ -1261,7 +1262,7 @@ public void testViewClientNonExistent() { } @Test - public void testViewClient() { + public void testViewClient() throws ParseException { Response response = serviceDelegator.viewClient("APP-6666666666666666"); assertNotNull(response.getEntity()); assertTrue(response.getEntity() instanceof ClientSummary); diff --git a/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/PublicV2ApiServiceVersionedDelegatorTest.java b/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/PublicV2ApiServiceVersionedDelegatorTest.java index 2557b64cd25..c0e70bde46b 100644 --- a/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/PublicV2ApiServiceVersionedDelegatorTest.java +++ b/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/PublicV2ApiServiceVersionedDelegatorTest.java @@ -13,11 +13,12 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang.time.DateUtils; +import org.apache.hc.core5.http.ParseException; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -55,6 +56,8 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ContextConfiguration; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; @RunWith(OrcidJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:test-orcid-t1-web-context.xml" }) @@ -76,6 +79,9 @@ public class PublicV2ApiServiceVersionedDelegatorTest extends DBUnitTest { @Resource private ProfileDao profileDao; + @Resource + private PlatformTransactionManager transactionManager; + @Resource private V2VersionConverterChain v2VersionConverterChain; @@ -778,7 +784,7 @@ public void test03ViewPerson() { } @Test - public void testSearchByQuery() { + public void testSearchByQuery() throws ParseException { MockitoAnnotations.initMocks(this); Search search = new Search(); Result result = new Result(); @@ -806,7 +812,7 @@ public void testViewClientNonExistent() { } @Test - public void testViewClient() { + public void testViewClient() throws ParseException { Response response = serviceDelegator.viewClient("APP-6666666666666666"); assertNotNull(response.getEntity()); assertTrue(response.getEntity() instanceof ClientSummary); @@ -836,11 +842,15 @@ public void testViewBulkWorksNonExistentUser() { } private void updateProfileSubmissionDate(String orcid, int increment) { - // Update the submission date so it is long enough - ProfileEntity profileEntity = profileDao.find(orcid); - profileEntity.setSubmissionDate(DateUtils.addDays(new Date(), increment)); - profileDao.merge(profileEntity); - profileDao.flush(); + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.execute(status -> { + // Update the submission date so it is long enough + ProfileEntity profileEntity = profileDao.find(orcid); + profileEntity.setSubmissionDate(DateUtils.addDays(new Date(), increment)); + profileDao.merge(profileEntity); + profileDao.flush(); + return null; + }); } /** diff --git a/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/security/PublicAPISecurityManagerV2Test.java b/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/security/PublicAPISecurityManagerV2Test.java index b4157c2d6dc..4389bc9ddb0 100644 --- a/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/security/PublicAPISecurityManagerV2Test.java +++ b/orcid-pub-web/src/test/java/org/orcid/api/publicV2/server/security/PublicAPISecurityManagerV2Test.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-pub-web/src/test/java/org/orcid/api/publicV3/server/PublicV3ApiServiceDelegatorTest.java b/orcid-pub-web/src/test/java/org/orcid/api/publicV3/server/PublicV3ApiServiceDelegatorTest.java index 97f02c1e6e1..f1bd4e59461 100644 --- a/orcid-pub-web/src/test/java/org/orcid/api/publicV3/server/PublicV3ApiServiceDelegatorTest.java +++ b/orcid-pub-web/src/test/java/org/orcid/api/publicV3/server/PublicV3ApiServiceDelegatorTest.java @@ -17,11 +17,12 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; +import org.apache.hc.core5.http.ParseException; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -1214,7 +1215,7 @@ public void testGetPrivateResearcherUrlUsingToken() { } @Test - public void testSearchByQuery() { + public void testSearchByQuery() throws ParseException { Search search = new Search(); Result result = new Result(); result.setOrcidIdentifier(new OrcidIdentifier("some-orcid-id")); @@ -1239,7 +1240,7 @@ public void testSearchByQuery() { } @Test(expected = OrcidBadRequestException.class) - public void testSearchByQueryTooManyRows() { + public void testSearchByQueryTooManyRows() throws ParseException { Map> params = new HashMap<>(); params.put("rows", Arrays.asList(Integer.toString(OrcidSearchManager.MAX_SEARCH_ROWS + 20))); @@ -1252,7 +1253,7 @@ public void testSearchByQueryTooManyRows() { } @Test(expected = SearchStartParameterLimitExceededException.class) - public void testSearchByQueryIllegalStart() { + public void testSearchByQueryIllegalStart() throws ParseException { Map> params = new HashMap<>(); params.put("start", Arrays.asList(Integer.toString(OrcidSearchManager.MAX_SEARCH_START + 20))); @@ -1269,7 +1270,7 @@ public void testSearchByQueryIllegalStart() { } @Test - public void testSearchByQueryLegalStart() { + public void testSearchByQueryLegalStart() throws ParseException { Map> params = new HashMap<>(); params.put("start", Arrays.asList(Integer.toString(OrcidSearchManager.MAX_SEARCH_START))); @@ -1297,7 +1298,7 @@ public void testViewClientNonExistent() { } @Test - public void testViewClientSummary() { + public void testViewClientSummary() throws ParseException { Response response = serviceDelegator.viewClient("APP-6666666666666666"); assertNotNull(response.getEntity()); assertTrue(response.getEntity() instanceof ClientSummary); @@ -2162,7 +2163,7 @@ public void testViewClient() { } @Test - public void testExpandedSearchByQueryNoRowsParamSet() { + public void testExpandedSearchByQueryNoRowsParamSet() throws ParseException { ExpandedSearch search = new ExpandedSearch(); ExpandedResult result = new ExpandedResult(); search.getResults().add(result); diff --git a/orcid-pub-web/src/test/java/org/orcid/api/publicV3/server/security/PublicAPISecurityManagerV3Test.java b/orcid-pub-web/src/test/java/org/orcid/api/publicV3/server/security/PublicAPISecurityManagerV3Test.java index d2e6c52ab27..5995481e88c 100644 --- a/orcid-pub-web/src/test/java/org/orcid/api/publicV3/server/security/PublicAPISecurityManagerV3Test.java +++ b/orcid-pub-web/src/test/java/org/orcid/api/publicV3/server/security/PublicAPISecurityManagerV3Test.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-pub-web/src/test/resources/test-core-context.xml b/orcid-pub-web/src/test/resources/test-core-context.xml index 2c1cb08e585..f53e64ed165 100644 --- a/orcid-pub-web/src/test/resources/test-core-context.xml +++ b/orcid-pub-web/src/test/resources/test-core-context.xml @@ -2,9 +2,9 @@ + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> jakarta.xml.bind jakarta.xml.bind-api - 2.3.3 + 3.0.1 com.sun.xml.bind jaxb-impl - 2.3.3 + 3.0.2 - javax.annotation - javax.annotation-api - 1.3.2 + jakarta.annotation + jakarta.annotation-api + 2.1.1 org.togglz diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/autospam/AutospamEmailSender.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/autospam/AutospamEmailSender.java index 288a7bf2d3a..d579075f042 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/autospam/AutospamEmailSender.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/autospam/AutospamEmailSender.java @@ -4,7 +4,7 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.LocaleUtils; import org.orcid.core.constants.EmailConstants; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/autospam/cli/AutoLockSpamRecords.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/autospam/cli/AutoLockSpamRecords.java index 17480b67d7d..cd920c383ea 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/autospam/cli/AutoLockSpamRecords.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/autospam/cli/AutoLockSpamRecords.java @@ -10,7 +10,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import org.apache.commons.lang.StringUtils; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/cleanup/AuthorizationCodeCleanerCronJobImpl.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/cleanup/AuthorizationCodeCleanerCronJobImpl.java index 8e6cef3277b..f1d8b178241 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/cleanup/AuthorizationCodeCleanerCronJobImpl.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/cleanup/AuthorizationCodeCleanerCronJobImpl.java @@ -4,7 +4,7 @@ import java.time.temporal.ChronoUnit; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.cron.AuthorizationCodeCleanerCronJob; import org.orcid.persistence.dao.OrcidOauth2AuthoriziationCodeDetailDao; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/email/cli/manager/EmailMessageSenderImpl.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/email/cli/manager/EmailMessageSenderImpl.java index 3834e15bfd6..70ca2495c56 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/email/cli/manager/EmailMessageSenderImpl.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/email/cli/manager/EmailMessageSenderImpl.java @@ -18,7 +18,7 @@ import java.util.concurrent.Executors; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.datatype.XMLGregorianCalendar; import org.apache.commons.codec.binary.Base64; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/email/trickle/manager/impl/TrickleManagerImpl.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/email/trickle/manager/impl/TrickleManagerImpl.java index ac645f66eec..d2e264a2518 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/email/trickle/manager/impl/TrickleManagerImpl.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/email/trickle/manager/impl/TrickleManagerImpl.java @@ -4,7 +4,7 @@ import java.util.Date; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.email.trickle.producer.EmailTrickleItem; import org.orcid.core.manager.v3.EmailMessage; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/indexer/impl/OrcidRecordIndexerImpl.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/indexer/impl/OrcidRecordIndexerImpl.java index 16996a1fa8f..5da2c2c9813 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/indexer/impl/OrcidRecordIndexerImpl.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/indexer/impl/OrcidRecordIndexerImpl.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.messaging.JmsMessageSender; import org.orcid.core.utils.listener.LastModifiedMessage; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/jersey/ZenodoRecordsJsonBodyReader.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/jersey/ZenodoRecordsJsonBodyReader.java index 111ccf93740..3d744f6dd81 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/jersey/ZenodoRecordsJsonBodyReader.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/jersey/ZenodoRecordsJsonBodyReader.java @@ -10,13 +10,13 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/json" }) diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/io/OrgDataClient.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/io/OrgDataClient.java index a56333724be..26ff790477c 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/io/OrgDataClient.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/io/OrgDataClient.java @@ -7,8 +7,8 @@ import java.io.OutputStream; import java.util.Map; -import javax.annotation.Resource; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.MediaType; import org.apache.commons.io.IOUtils; import org.orcid.utils.jersey.JerseyClientHelper; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/manager/impl/IssnLoadManagerImpl.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/manager/impl/IssnLoadManagerImpl.java index 75c74f7d4ca..e64caa21b6d 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/manager/impl/IssnLoadManagerImpl.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/manager/impl/IssnLoadManagerImpl.java @@ -1,6 +1,6 @@ package org.orcid.scheduler.loader.manager.impl; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.scheduler.loader.manager.IssnLoadManager; import org.orcid.scheduler.loader.source.issn.IssnLoadSource; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/manager/impl/OrgLoadManagerImpl.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/manager/impl/OrgLoadManagerImpl.java index 23d22029f34..7ddc7e53819 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/manager/impl/OrgLoadManagerImpl.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/manager/impl/OrgLoadManagerImpl.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Optional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.persistence.dao.OrgImportLogDao; import org.orcid.persistence.jpa.entities.OrgImportLogEntity; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/LoadDataForIssnSource.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/LoadDataForIssnSource.java index 37b7608ccd4..fc2bb4192ef 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/LoadDataForIssnSource.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/LoadDataForIssnSource.java @@ -1,6 +1,6 @@ package org.orcid.scheduler.loader.source.cli; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.scheduler.loader.manager.IssnLoadManager; import org.orcid.scheduler.loader.manager.OrgLoadManager; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/LoadDataForOrganizationSource.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/LoadDataForOrganizationSource.java index b553c374dad..34ce3ee1002 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/LoadDataForOrganizationSource.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/LoadDataForOrganizationSource.java @@ -1,7 +1,7 @@ package org.orcid.scheduler.loader.source.cli; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.apache.commons.lang.StringUtils; import org.kohsuke.args4j.CmdLineException; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/ProcessOrganizationAsPartOfGroupForDisambiguatedOrgId.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/ProcessOrganizationAsPartOfGroupForDisambiguatedOrgId.java index 450f2d1c804..d8ae6b8371c 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/ProcessOrganizationAsPartOfGroupForDisambiguatedOrgId.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/ProcessOrganizationAsPartOfGroupForDisambiguatedOrgId.java @@ -1,7 +1,7 @@ package org.orcid.scheduler.loader.source.cli; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.apache.commons.lang.StringUtils; import org.kohsuke.args4j.CmdLineException; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/RorToRinggoldFundrefCSVMapping.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/RorToRinggoldFundrefCSVMapping.java index b0e59939101..9a7f572ef85 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/RorToRinggoldFundrefCSVMapping.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/cli/RorToRinggoldFundrefCSVMapping.java @@ -6,7 +6,7 @@ import java.util.HashMap; import java.util.List; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.apache.commons.lang.StringUtils; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/fundref/FundrefOrgLoadSource.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/fundref/FundrefOrgLoadSource.java index fbec5c0fe68..87c11738353 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/fundref/FundrefOrgLoadSource.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/fundref/FundrefOrgLoadSource.java @@ -7,7 +7,7 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/issn/IssnLoadSource.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/issn/IssnLoadSource.java index f4aa1f2c09f..57c89200e37 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/issn/IssnLoadSource.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/issn/IssnLoadSource.java @@ -7,7 +7,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.codehaus.jettison.json.JSONException; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/ror/RorOrgLoadSource.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/ror/RorOrgLoadSource.java index 11830af6152..fbac25b40d6 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/ror/RorOrgLoadSource.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/loader/source/ror/RorOrgLoadSource.java @@ -16,9 +16,9 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import javax.annotation.Resource; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.HttpHeaders; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.HttpHeaders; import org.apache.commons.lang.StringUtils; import org.orcid.core.manager.OrgDisambiguatedManager; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/mvp/OrcidIntegrationMVPNotifications.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/mvp/OrcidIntegrationMVPNotifications.java index a2809d98cd9..729e44b425f 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/mvp/OrcidIntegrationMVPNotifications.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/mvp/OrcidIntegrationMVPNotifications.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.json.JSONArray; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/report/PapiDailyLimitReport.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/report/PapiDailyLimitReport.java index 91ea05ea0c3..4fbba91c5ad 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/report/PapiDailyLimitReport.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/report/PapiDailyLimitReport.java @@ -2,7 +2,7 @@ import java.time.LocalDate; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.api.rate_limit.PapiRateLimitRedisClient; import org.orcid.core.togglz.Features; diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/tasks/impl/IdentityProviderLoaderImpl.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/tasks/impl/IdentityProviderLoaderImpl.java index 763b7a6449a..b5ff77b94eb 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/tasks/impl/IdentityProviderLoaderImpl.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/tasks/impl/IdentityProviderLoaderImpl.java @@ -7,7 +7,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; @@ -33,7 +33,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; public class IdentityProviderLoaderImpl implements IdentityProviderLoader { diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/validation/PublicProfileValidator.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/validation/PublicProfileValidator.java index fa75360f9f8..f75219209da 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/validation/PublicProfileValidator.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/validation/PublicProfileValidator.java @@ -4,11 +4,11 @@ import java.util.Calendar; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import javax.xml.XMLConstants; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.util.JAXBSource; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.util.JAXBSource; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; @@ -25,7 +25,7 @@ import org.springframework.beans.factory.annotation.Value; import org.xml.sax.SAXException; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; public class PublicProfileValidator { diff --git a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/web/event/impl/EventStatsImpl.java b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/web/event/impl/EventStatsImpl.java index 5087e88bbd2..80b61e0dc0c 100644 --- a/orcid-scheduler-web/src/main/java/org/orcid/scheduler/web/event/impl/EventStatsImpl.java +++ b/orcid-scheduler-web/src/main/java/org/orcid/scheduler/web/event/impl/EventStatsImpl.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.time.LocalDate; public class EventStatsImpl implements EventStats { diff --git a/orcid-scheduler-web/src/main/resources/orcid-scheduler-context.xml b/orcid-scheduler-web/src/main/resources/orcid-scheduler-context.xml index 3003ddb6320..264ea5450ab 100644 --- a/orcid-scheduler-web/src/main/resources/orcid-scheduler-context.xml +++ b/orcid-scheduler-web/src/main/resources/orcid-scheduler-context.xml @@ -5,10 +5,10 @@ xmlns:jms="http://www.springframework.org/schema/jms" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd - http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd - http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd + http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> diff --git a/orcid-scheduler-web/src/test/java/org/orcid/scheduler/email/cli/manager/EmailMessageSenderTest.java b/orcid-scheduler-web/src/test/java/org/orcid/scheduler/email/cli/manager/EmailMessageSenderTest.java index a0351048890..273b898b33c 100644 --- a/orcid-scheduler-web/src/test/java/org/orcid/scheduler/email/cli/manager/EmailMessageSenderTest.java +++ b/orcid-scheduler-web/src/test/java/org/orcid/scheduler/email/cli/manager/EmailMessageSenderTest.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.io.IOUtils; import org.junit.After; diff --git a/orcid-scheduler-web/src/test/resources/test-core-context.xml b/orcid-scheduler-web/src/test/resources/test-core-context.xml index 2c1cb08e585..f53e64ed165 100644 --- a/orcid-scheduler-web/src/test/resources/test-core-context.xml +++ b/orcid-scheduler-web/src/test/resources/test-core-context.xml @@ -2,9 +2,9 @@ + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd"> Test utilities that can be brought in to other modules with the test scope - 5.3.19 + 6.0.23 5.6.2 4.13.2 ${project.basedir} @@ -196,7 +196,32 @@ org.ehcache ehcache - 3.5.2 + 3.11.1 + jakarta + + + org.glassfish.jaxb + jaxb-runtime + + + org.glassfish.jaxb + jaxb-core + + + javax.xml.bind + jaxb-api + + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.8 + + + javax.xml.bind + jaxb-api + 2.3.1 diff --git a/orcid-test/src/main/java/org/orcid/test/DBUnitTest.java b/orcid-test/src/main/java/org/orcid/test/DBUnitTest.java index 1669db8ae09..3b14754f4f7 100644 --- a/orcid-test/src/main/java/org/orcid/test/DBUnitTest.java +++ b/orcid-test/src/main/java/org/orcid/test/DBUnitTest.java @@ -2,10 +2,12 @@ import static org.junit.Assert.fail; +import java.io.File; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.List; +import java.util.UUID; import org.dbunit.DatabaseUnitException; import org.dbunit.database.AmbiguousTableNameException; @@ -50,10 +52,13 @@ public class DBUnitTest { private static ApplicationContext context; - static { + static { + String ehcacheTestDir = System.getProperty("java.io.tmpdir") + File.separator + "ehcache-tests" + File.separator + UUID.randomUUID(); + System.setProperty("org.orcid.ehcache.dir", ehcacheTestDir); + try { context = new ClassPathXmlApplicationContext(TEST_CORE_CONTEXT); - } catch (Exception e) { + } catch (Exception e) { try { context = new ClassPathXmlApplicationContext(TEST_DB_CONTEXT); } catch (Exception e2) { @@ -66,7 +71,7 @@ public class DBUnitTest { e2.printStackTrace(); fail(); } - } + } } public static void initDBUnitData(List flatXMLDataFiles) throws Exception { diff --git a/orcid-utils/pom.xml b/orcid-utils/pom.xml index fd121b239c3..81bf227c582 100644 --- a/orcid-utils/pom.xml +++ b/orcid-utils/pom.xml @@ -65,6 +65,10 @@ solr-solrj ${solr.version} + + org.apache.httpcomponents.client5 + httpclient5 + @@ -77,13 +81,18 @@ jersey-hk2 ${jersey.version} + + jakarta.ws.rs + jakarta.ws.rs-api + 3.1.0 + + + jakarta.annotation + jakarta.annotation-api + 2.1.1 + + - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson.version} - com.fasterxml.jackson.core jackson-core @@ -96,7 +105,7 @@ jakarta.xml.bind jakarta.xml.bind-api - 2.3.3 + 3.0.1 jakarta.activation @@ -106,7 +115,7 @@ com.sun.xml.bind jaxb-impl - 2.3.6 + 3.0.2 runtime @@ -142,8 +151,8 @@ - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ArticleTitle.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ArticleTitle.java index 083f859953f..1084eef5333 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ArticleTitle.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ArticleTitle.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Author.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Author.java index 03001bc7de1..2ddaa2b6680 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Author.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Author.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Body.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Body.java index 7c39040cbf2..c90756c8982 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Body.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Body.java @@ -10,11 +10,11 @@ import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/BookCite.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/BookCite.java index e6c7d34cb09..d3201436d57 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/BookCite.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/BookCite.java @@ -9,12 +9,12 @@ package org.crossref.qrschema._3; import java.math.BigInteger; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Component.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Component.java index 7e120dbdee1..2e7b4b969f7 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Component.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Component.java @@ -11,14 +11,14 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ComponentList.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ComponentList.java index e67c7698574..6d231c90d5d 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ComponentList.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ComponentList.java @@ -10,10 +10,10 @@ import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ComponentNumber.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ComponentNumber.java index cbd1d7afc0d..e5229d8376e 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ComponentNumber.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ComponentNumber.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ConfCite.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ConfCite.java index e2aba10f385..5fcea99a795 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ConfCite.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ConfCite.java @@ -9,12 +9,12 @@ package org.crossref.qrschema._3; import java.math.BigInteger; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Contributor.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Contributor.java index 521b2a0720a..ef1fb4a7211 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Contributor.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Contributor.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Contributors.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Contributors.java index 909b403dc3c..59e499257ef 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Contributors.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Contributors.java @@ -10,11 +10,11 @@ import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrmItem.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrmItem.java index 0302a5a953b..f434f2832d5 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrmItem.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrmItem.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrossrefMetadata.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrossrefMetadata.java index afa2cada6d5..668fd9f2d57 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrossrefMetadata.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrossrefMetadata.java @@ -10,11 +10,11 @@ import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrossrefResult.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrossrefResult.java index aebee6af135..eb2a1730c54 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrossrefResult.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/CrossrefResult.java @@ -10,12 +10,12 @@ import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/DatabaseCite.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/DatabaseCite.java index d39c49263b5..31699d9832f 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/DatabaseCite.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/DatabaseCite.java @@ -9,12 +9,12 @@ package org.crossref.qrschema._3; import java.math.BigInteger; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Description.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Description.java index 4e2b02f665f..3beb8983113 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Description.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Description.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/DissertationCite.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/DissertationCite.java index fa136c0792e..1553f469545 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/DissertationCite.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/DissertationCite.java @@ -9,12 +9,12 @@ package org.crossref.qrschema._3; import java.math.BigInteger; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Doi.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Doi.java index 0eef2b1d13b..c4fce0cfb17 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Doi.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Doi.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/DoiRecord.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/DoiRecord.java index 5ebf27f76be..5344d5bf8bd 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/DoiRecord.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/DoiRecord.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAnyElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAnyElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/EditionNumber.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/EditionNumber.java index dcab4e2dfa9..df9bdf481dc 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/EditionNumber.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/EditionNumber.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/FirstPage.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/FirstPage.java index 9c15570d354..5b6c1f9e90e 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/FirstPage.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/FirstPage.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Format.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Format.java index bc603c55fe4..f2d7705d945 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Format.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Format.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ForwardLink.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ForwardLink.java index eb9176406f6..ae9651b93f6 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ForwardLink.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ForwardLink.java @@ -10,12 +10,12 @@ import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/GivenName.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/GivenName.java index 0b19374e754..a8cc39cebee 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/GivenName.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/GivenName.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Head.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Head.java index 0df918a7ff4..38f54bb0651 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Head.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Head.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Identifier.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Identifier.java index c4bf9fbe103..0576122b877 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Identifier.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Identifier.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/InstitutionName.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/InstitutionName.java index 1e2c3e32e38..dead10f0645 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/InstitutionName.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/InstitutionName.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Isbn.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Isbn.java index 2b64ec90cd5..af64f8083fc 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Isbn.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Isbn.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Issn.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Issn.java index 4aba0712037..cc464c00240 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Issn.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Issn.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Issue.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Issue.java index 739c19826a4..429fc9826c6 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Issue.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Issue.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ItemNumber.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ItemNumber.java index ef57a16f6a2..aa9b79a53c8 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ItemNumber.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ItemNumber.java @@ -8,12 +8,12 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalAbbreviation.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalAbbreviation.java index d5bbffba2a5..f86b665e6d4 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalAbbreviation.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalAbbreviation.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalCite.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalCite.java index c9997e6a5e7..eaf97aa33cb 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalCite.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalCite.java @@ -11,12 +11,12 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalTitle.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalTitle.java index c9cdaff53c3..4032e708d79 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalTitle.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/JournalTitle.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/LastPage.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/LastPage.java index ecc58b41604..5561c8b13a9 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/LastPage.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/LastPage.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ObjectFactory.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ObjectFactory.java index b143b6e0464..672f5bf2d76 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ObjectFactory.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ObjectFactory.java @@ -8,9 +8,9 @@ package org.crossref.qrschema._3; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.annotation.XmlElementDecl; -import javax.xml.bind.annotation.XmlRegistry; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlElementDecl; +import jakarta.xml.bind.annotation.XmlRegistry; import javax.xml.namespace.QName; diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Organization.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Organization.java index e0936a47bcb..b589bf1510f 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Organization.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Organization.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/PaperTitle.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/PaperTitle.java index 97797119fcf..394e3a0f7d2 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/PaperTitle.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/PaperTitle.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/PostedcontentCite.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/PostedcontentCite.java index 4036d9e4a9f..3012c2d9683 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/PostedcontentCite.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/PostedcontentCite.java @@ -9,12 +9,12 @@ package org.crossref.qrschema._3; import java.math.BigInteger; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/PubType.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/PubType.java index c8887aa1825..6455e8e352c 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/PubType.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/PubType.java @@ -8,9 +8,9 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/PublicationType.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/PublicationType.java index f1da01a515c..1fc15535e8a 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/PublicationType.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/PublicationType.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Query.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Query.java index 03492b1485e..affd0c5366e 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Query.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Query.java @@ -11,14 +11,14 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/QueryResult.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/QueryResult.java index d0c2ef2ffdc..343ba5f23aa 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/QueryResult.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/QueryResult.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ReportCite.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ReportCite.java index 7031d1878a3..8b7f975b54f 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/ReportCite.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/ReportCite.java @@ -9,12 +9,12 @@ package org.crossref.qrschema._3; import java.math.BigInteger; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/SeriesTitle.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/SeriesTitle.java index a13993b4fc6..8a187090162 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/SeriesTitle.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/SeriesTitle.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/StandardCite.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/StandardCite.java index 17abd7f619d..a2b9b2f1bfb 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/StandardCite.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/StandardCite.java @@ -9,12 +9,12 @@ package org.crossref.qrschema._3; import java.math.BigInteger; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Surname.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Surname.java index c73275bb346..f36dc90b7c6 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Surname.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Surname.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Title.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Title.java index 50f7eb0e91b..b412e9dfbc9 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Title.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Title.java @@ -8,11 +8,11 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Volume.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Volume.java index 96869575bf7..5537aca9a31 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Volume.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Volume.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/VolumeTitle.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/VolumeTitle.java index c8851d0d98f..69948746287 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/VolumeTitle.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/VolumeTitle.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Year.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Year.java index 9d9f5bcb47f..0bfcacab3f1 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/Year.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/Year.java @@ -8,14 +8,14 @@ package org.crossref.qrschema._3; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** diff --git a/orcid-utils/src/main/java/org/crossref/qrschema/_3/package-info.java b/orcid-utils/src/main/java/org/crossref/qrschema/_3/package-info.java index b8c78e83e99..8d6291fb98a 100644 --- a/orcid-utils/src/main/java/org/crossref/qrschema/_3/package-info.java +++ b/orcid-utils/src/main/java/org/crossref/qrschema/_3/package-info.java @@ -5,5 +5,5 @@ // Generated on: 2018.08.17 at 03:19:13 PM BST // -@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.crossref.org/qrschema/3.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://www.crossref.org/qrschema/3.0", elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED) package org.crossref.qrschema._3; diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Box.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Box.java index 1aa06b3781e..eab332da936 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Box.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Box.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ContributorType.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ContributorType.java index 0c6ef90c72b..6a351baf7ba 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ContributorType.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ContributorType.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/DateType.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/DateType.java index 63fe6248444..bb236d34045 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/DateType.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/DateType.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/DescriptionType.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/DescriptionType.java index de7734a02bb..2af98bfb87b 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/DescriptionType.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/DescriptionType.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/FunderIdentifierType.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/FunderIdentifierType.java index ece5ae5a1df..c893daf0c43 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/FunderIdentifierType.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/FunderIdentifierType.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ObjectFactory.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ObjectFactory.java index da40f75e5a2..0d7ab50d8bf 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ObjectFactory.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ObjectFactory.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.annotation.XmlElementDecl; -import javax.xml.bind.annotation.XmlRegistry; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlElementDecl; +import jakarta.xml.bind.annotation.XmlRegistry; import javax.xml.namespace.QName; diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Point.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Point.java index 7b10278632b..6bb5350d4bd 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Point.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Point.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/RelatedIdentifierType.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/RelatedIdentifierType.java index 9a29b3d43e8..908c84614d5 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/RelatedIdentifierType.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/RelatedIdentifierType.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/RelationType.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/RelationType.java index 3b84cf5316a..0420903c2fc 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/RelationType.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/RelationType.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Resource.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Resource.java index 142b196b12d..9c5be820240 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Resource.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/Resource.java @@ -11,19 +11,19 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementRef; -import javax.xml.bind.annotation.XmlMixed; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSchemaType; -import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.XmlValue; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElementRef; +import jakarta.xml.bind.annotation.XmlMixed; +import jakarta.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlSchemaType; +import jakarta.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlValue; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** *

Java class for anonymous complex type. diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ResourceType.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ResourceType.java index fc9624e7903..bea84ac32af 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ResourceType.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/ResourceType.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/TitleType.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/TitleType.java index f846c94f7a2..43930eb04d3 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/TitleType.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/TitleType.java @@ -8,9 +8,9 @@ package org.datacite.schema.kernel_4; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** diff --git a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/package-info.java b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/package-info.java index 254ea8de3a7..4616523239c 100644 --- a/orcid-utils/src/main/java/org/datacite/schema/kernel_4/package-info.java +++ b/orcid-utils/src/main/java/org/datacite/schema/kernel_4/package-info.java @@ -5,5 +5,5 @@ // Generated on: 2018.08.17 at 03:04:42 PM BST // -@javax.xml.bind.annotation.XmlSchema(namespace = "http://datacite.org/schema/kernel-4", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://datacite.org/schema/kernel-4", elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED) package org.datacite.schema.kernel_4; diff --git a/orcid-utils/src/main/java/org/orcid/utils/alerting/impl/SlackManagerImpl.java b/orcid-utils/src/main/java/org/orcid/utils/alerting/impl/SlackManagerImpl.java index 478f67d9136..72a794cfd83 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/alerting/impl/SlackManagerImpl.java +++ b/orcid-utils/src/main/java/org/orcid/utils/alerting/impl/SlackManagerImpl.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.utils.alerting.SlackManager; @@ -16,7 +16,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; /** * diff --git a/orcid-utils/src/main/java/org/orcid/utils/email/MailGunManager.java b/orcid-utils/src/main/java/org/orcid/utils/email/MailGunManager.java index 93546538e26..b72e266dd03 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/email/MailGunManager.java +++ b/orcid-utils/src/main/java/org/orcid/utils/email/MailGunManager.java @@ -2,7 +2,7 @@ import java.util.AbstractMap.SimpleEntry; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.apache.commons.lang3.StringUtils; import org.orcid.utils.jersey.JerseyClientHelper; @@ -12,8 +12,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import javax.ws.rs.core.Form; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Form; +import jakarta.ws.rs.core.MediaType; @Component public class MailGunManager { diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/JerseyClientHelper.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/JerseyClientHelper.java index 599b53bbc98..1c7a93148db 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/JerseyClientHelper.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/JerseyClientHelper.java @@ -7,19 +7,19 @@ import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.springframework.beans.factory.DisposableBean; import org.springframework.stereotype.Component; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.Invocation.Builder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.Invocation.Builder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; @Component public class JerseyClientHelper implements DisposableBean { diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/OrcidJerseyClientHandler.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/OrcidJerseyClientHandler.java index 9d59f438ffe..488ef1aaf41 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/OrcidJerseyClientHandler.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/OrcidJerseyClientHandler.java @@ -18,10 +18,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; - -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; public class OrcidJerseyClientHandler { @@ -30,10 +28,8 @@ public class OrcidJerseyClientHandler { static Client create(List> bodyReaders, Map properties) { Client client; ClientBuilder builder = ClientBuilder.newBuilder(); - //Always register the json provider - builder.register(JacksonJaxbJsonProvider.class) - // And the DOM provider - .register(W3CDocumentBodyReader.class); + // Register the custom DOM provider + builder.register(W3CDocumentBodyReader.class); for(Class c : bodyReaders) { builder.register(c); } @@ -48,7 +44,8 @@ static Client create(List> bodyReaders, Map properties) public static Client create(boolean isDevelopmentMode, Map properties) { Client client; ClientBuilder builder = ClientBuilder.newBuilder(); - builder.register(JacksonJaxbJsonProvider.class) + // Jersey 3.1.9 provides JSON handling automatically via MoxyJsonProvider + builder .register(V2ActivitiesSummaryBodyReader.class) .register(V2EducationBodyReader.class) .register(V2EmploymentBodyReader.class) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/marshaller/ORCIDMarshaller.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/marshaller/ORCIDMarshaller.java index b263d6b1117..d4ee7eb5a2c 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/marshaller/ORCIDMarshaller.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/marshaller/ORCIDMarshaller.java @@ -2,9 +2,9 @@ import java.io.ByteArrayOutputStream; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; import org.orcid.jaxb.model.error_v2.OrcidError; import org.orcid.jaxb.model.record.summary_v2.ActivitiesSummary; diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2ActivitiesSummaryBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2ActivitiesSummaryBodyReader.java index 8b3bc3fd9e8..c458d442f4b 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2ActivitiesSummaryBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2ActivitiesSummaryBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.record.summary_v2.ActivitiesSummary; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({"application/xml", "application/json"}) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2EducationBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2EducationBodyReader.java index 49d036dec7b..97593db6247 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2EducationBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2EducationBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.record_v2.Education; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({"application/xml", "application/json"}) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2EmploymentBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2EmploymentBodyReader.java index 51dba00791c..c36e28d809b 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2EmploymentBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2EmploymentBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.record_v2.Employment; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({"application/xml", "application/json"}) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2FundingBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2FundingBodyReader.java index a1c1a69b6a0..92eeb94d114 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2FundingBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2FundingBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.record_v2.Funding; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({"application/xml", "application/json"}) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2OrcidErrorBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2OrcidErrorBodyReader.java index 3a7b67deea3..00f0d5fe290 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2OrcidErrorBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2OrcidErrorBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.error_v2.OrcidError; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({"application/xml", "application/json"}) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2PeerReviewBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2PeerReviewBodyReader.java index 0083050cd08..ac9dd15b8b4 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2PeerReviewBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2PeerReviewBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.record_v2.PeerReview; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({"application/xml", "application/json"}) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2RecordBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2RecordBodyReader.java index 6b951b1a780..5ec7b6ad299 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2RecordBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2RecordBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.record_v2.Record; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({"application/xml", "application/json"}) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2WorkBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2WorkBodyReader.java index 16a039f0417..346fb62fd00 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2WorkBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V2WorkBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.record_v2.Work; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({"application/xml", "application/json"}) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ActivitiesSummaryBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ActivitiesSummaryBodyReader.java index c981cb303e3..89680188459 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ActivitiesSummaryBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ActivitiesSummaryBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.summary.ActivitiesSummary; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3DistinctionBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3DistinctionBodyReader.java index 435bc237b12..55a69a34547 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3DistinctionBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3DistinctionBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Distinction; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3EducationBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3EducationBodyReader.java index de3c8a3013a..f222944e565 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3EducationBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3EducationBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Education; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3EmploymentBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3EmploymentBodyReader.java index 659a005ed90..0715dc7be45 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3EmploymentBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3EmploymentBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Employment; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3FundingBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3FundingBodyReader.java index 2f1788e4d2d..ae3f332cf67 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3FundingBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3FundingBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Funding; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3InvitedPositionBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3InvitedPositionBodyReader.java index 564e44f2ae7..f7ff5b5af97 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3InvitedPositionBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3InvitedPositionBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.InvitedPosition; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3MembershipBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3MembershipBodyReader.java index fea6f201c3a..73025ff9ef4 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3MembershipBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3MembershipBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Membership; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3OrcidErrorBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3OrcidErrorBodyReader.java index 0da6007291a..dcab5fba739 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3OrcidErrorBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3OrcidErrorBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.error.OrcidError; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3PeerReviewBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3PeerReviewBodyReader.java index d7ae791c2a7..c315cc185ef 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3PeerReviewBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3PeerReviewBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.PeerReview; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3QualificationBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3QualificationBodyReader.java index 0017a4131b0..7eccef1ea56 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3QualificationBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3QualificationBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Qualification; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3RecordBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3RecordBodyReader.java index d8e00f4604b..62f2bc04c11 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3RecordBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3RecordBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Record; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ResearchResourceBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ResearchResourceBodyReader.java index 45a26619736..2e8cc00f029 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ResearchResourceBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ResearchResourceBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.ResearchResource; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ResearchResourcesBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ResearchResourcesBodyReader.java index c30500d1d9d..32c866dd2c7 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ResearchResourcesBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ResearchResourcesBodyReader.java @@ -5,20 +5,20 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Record; import org.orcid.jaxb.model.v3.release.record.summary.ResearchResources; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({"application/xml", "application/json"}) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ServiceBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ServiceBodyReader.java index 0d1a349d690..9c1c8330efa 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ServiceBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3ServiceBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Service; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3WorkBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3WorkBodyReader.java index 22ddb5fecd8..6f828e6254c 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3WorkBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/V3WorkBodyReader.java @@ -5,19 +5,19 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.orcid.jaxb.model.v3.release.record.Work; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/W3CDocumentBodyReader.java b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/W3CDocumentBodyReader.java index ca9e9c112c0..c5d36a32a6a 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/W3CDocumentBodyReader.java +++ b/orcid-utils/src/main/java/org/orcid/utils/jersey/unmarshaller/W3CDocumentBodyReader.java @@ -12,13 +12,13 @@ import org.w3c.dom.Document; import org.xml.sax.SAXException; -import javax.ws.rs.Consumes; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; @Provider @Consumes({ "application/xml", "application/json", "application/samlmetadata+xml" }) diff --git a/orcid-utils/src/main/java/org/orcid/utils/panoply/PanoplyRedshiftClient.java b/orcid-utils/src/main/java/org/orcid/utils/panoply/PanoplyRedshiftClient.java index 079482d53ea..d03dd142ec0 100644 --- a/orcid-utils/src/main/java/org/orcid/utils/panoply/PanoplyRedshiftClient.java +++ b/orcid-utils/src/main/java/org/orcid/utils/panoply/PanoplyRedshiftClient.java @@ -10,7 +10,7 @@ import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/orcid-web/pom.xml b/orcid-web/pom.xml index 00c9512757e..6b6e567058c 100644 --- a/orcid-web/pom.xml +++ b/orcid-web/pom.xml @@ -26,7 +26,21 @@ ${project.parent.version} - ${project.groupId} + ${project.parent.groupId} + orcid-model + + + ${project.parent.groupId} + orcid-core + ${project.parent.version} + + + ${project.parent.groupId} + orcid-persistence + ${project.parent.version} + + + ${project.parent.groupId} orcid-api-common ${project.parent.version} @@ -99,10 +113,6 @@ org.springframework.security spring-security-core - - org.springframework.security.oauth - spring-security-oauth2 - org.springframework.security spring-security-web @@ -124,24 +134,42 @@ - - org.springframework.session - spring-session-core - 2.7.4 - - - org.springframework.session - spring-session-data-redis - 2.7.4 - + + org.springframework.session + spring-session-data-redis + 3.0.3 + + + org.springframework.data + spring-data-redis + 3.0.12 + - - org.hibernate - hibernate-agroal - - - javax.validation - validation-api + + org.hibernate.orm + hibernate-core + + + org.hibernate.orm + hibernate-agroal + + + org.hibernate.orm + hibernate-c3p0 + + + org.hibernate.validator + hibernate-validator + + + jakarta.validation + jakarta.validation-api + + + org.glassfish + jakarta.el + 4.0.2 + runtime org.freemarker @@ -151,10 +179,11 @@ org.ehcache ehcache + jakarta - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api compile diff --git a/orcid-web/src/main/java/org/orcid/authorization/authentication/MFAAuthenticationDetailsSource.java b/orcid-web/src/main/java/org/orcid/authorization/authentication/MFAAuthenticationDetailsSource.java index 3a08a9f6b08..4de90e56af0 100644 --- a/orcid-web/src/main/java/org/orcid/authorization/authentication/MFAAuthenticationDetailsSource.java +++ b/orcid-web/src/main/java/org/orcid/authorization/authentication/MFAAuthenticationDetailsSource.java @@ -1,6 +1,6 @@ package org.orcid.authorization.authentication; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.security.authentication.AuthenticationDetailsSource; import org.springframework.security.web.authentication.WebAuthenticationDetails; diff --git a/orcid-web/src/main/java/org/orcid/authorization/authentication/MFAWebAuthenticationDetails.java b/orcid-web/src/main/java/org/orcid/authorization/authentication/MFAWebAuthenticationDetails.java index 1f52f588be4..1b67d1f4fba 100644 --- a/orcid-web/src/main/java/org/orcid/authorization/authentication/MFAWebAuthenticationDetails.java +++ b/orcid-web/src/main/java/org/orcid/authorization/authentication/MFAWebAuthenticationDetails.java @@ -1,7 +1,7 @@ package org.orcid.authorization.authentication; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import org.apache.thrift.TSerializable; import org.springframework.security.web.authentication.WebAuthenticationDetails; diff --git a/orcid-web/src/main/java/org/orcid/frontend/cli/AutoLockSpamRecords.java b/orcid-web/src/main/java/org/orcid/frontend/cli/AutoLockSpamRecords.java index 45edfe6e6d4..6c984f863c8 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/cli/AutoLockSpamRecords.java +++ b/orcid-web/src/main/java/org/orcid/frontend/cli/AutoLockSpamRecords.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; diff --git a/orcid-web/src/main/java/org/orcid/frontend/cli/SendWelcomeEmails.java b/orcid-web/src/main/java/org/orcid/frontend/cli/SendWelcomeEmails.java index 2c95ad0241b..78283fe974c 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/cli/SendWelcomeEmails.java +++ b/orcid-web/src/main/java/org/orcid/frontend/cli/SendWelcomeEmails.java @@ -4,7 +4,7 @@ import java.text.SimpleDateFormat; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.time.DurationFormatUtils; import org.kohsuke.args4j.CmdLineParser; diff --git a/orcid-web/src/main/java/org/orcid/frontend/email/RecordEmailSender.java b/orcid-web/src/main/java/org/orcid/frontend/email/RecordEmailSender.java index aac5e114f6c..17b0d5f26b0 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/email/RecordEmailSender.java +++ b/orcid-web/src/main/java/org/orcid/frontend/email/RecordEmailSender.java @@ -4,7 +4,7 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.LocaleUtils; import org.orcid.core.constants.EmailConstants; diff --git a/orcid-web/src/main/java/org/orcid/frontend/oauth2/OauthController.java b/orcid-web/src/main/java/org/orcid/frontend/oauth2/OauthController.java deleted file mode 100644 index 39d9c367553..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/oauth2/OauthController.java +++ /dev/null @@ -1,488 +0,0 @@ -package org.orcid.frontend.oauth2; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.security.Principal; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; - -import org.apache.commons.lang3.StringUtils; -import org.orcid.core.common.manager.EventManager; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.exception.ClientDeactivatedException; -import org.orcid.core.exception.LockedException; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.impl.OrcidUrlManager; -import org.orcid.core.manager.v3.ProfileEntityManager; -import org.orcid.core.oauth.OrcidRandomValueTokenServices; -import org.orcid.core.oauth.service.OrcidAuthorizationEndpoint; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator; -import org.orcid.core.togglz.Features; -import org.orcid.frontend.util.AuthorizationRequestLocalCache; -import org.orcid.frontend.util.OriginalAuthorizationRequestLocalCache; -import org.orcid.frontend.util.RequestInfoFormLocalCache; -import org.orcid.frontend.web.controllers.BaseControllerUtil; -import org.orcid.frontend.web.controllers.helper.OauthHelper; -import org.orcid.frontend.web.exception.OauthInvalidRequestException; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.ClientGrantedAuthorityEntity; -import org.orcid.persistence.jpa.entities.EventType; -import org.orcid.persistence.jpa.entities.keys.ClientGrantedAuthorityPk; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.exceptions.RedirectMismatchException; -import org.springframework.security.oauth2.common.exceptions.UnsupportedResponseTypeException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.stereotype.Controller; -import org.springframework.util.MultiValueMap; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.support.SessionStatus; -import org.springframework.web.bind.support.SimpleSessionStatus; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.view.RedirectView; -import org.springframework.web.util.UriComponentsBuilder; - -@Controller("oauthController") -public class OauthController { - - private BaseControllerUtil baseControllerUtil = new BaseControllerUtil(); - - @Resource - private OauthHelper oauthHelper; - - @Resource - private OrcidAuthorizationEndpoint authorizationEndpoint; - - @Resource - private OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - - @Resource - private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource - protected OrcidUrlManager orcidUrlManager; - - @Resource - protected OrcidRandomValueTokenServices tokenServices; - - @Resource(name = "profileEntityManagerV3") - private ProfileEntityManager profileEntityManager; - - @Resource - private EventManager eventManager; - - @Resource - private RequestInfoFormLocalCache requestInfoFormLocalCache; - - @Resource - private AuthorizationRequestLocalCache authorizationRequestLocalCache; - - @Resource - private OriginalAuthorizationRequestLocalCache originalAuthorizationRequestLocalCache; - - @RequestMapping(value = { "/oauth/custom/init.json" }, method = RequestMethod.POST) - public @ResponseBody RequestInfoForm loginGetHandler(HttpServletRequest request, Map model, @RequestParam Map requestParameters, - SessionStatus sessionStatus, Principal principal) throws UnsupportedEncodingException { - // Populate the request info form - RequestInfoForm requestInfoForm = generateRequestInfoForm(request, request.getQueryString(), model, requestParameters, sessionStatus, principal); - - // Store the request info form in the cache - requestInfoFormLocalCache.put(request.getSession().getId(), requestInfoForm); - - boolean isResponseSet = false; - - // Verify if we already have the response set in the URL - if (!PojoUtil.isEmpty(requestInfoForm.getResponseType())) { - MultiValueMap parameters = UriComponentsBuilder.fromUriString(requestInfoForm.getRedirectUrl()).build().getQueryParams(); - List responseParam = parameters.get(requestInfoForm.getResponseType()); - if (responseParam != null && !responseParam.isEmpty() && !PojoUtil.isEmpty(responseParam.get(0))) { - isResponseSet = true; - if (Features.EVENTS.isActive()) { - eventManager.createReauthorizeEvent(requestInfoForm.getClientId()); - } - } - } - - if (requestInfoForm.getError() != null || isResponseSet) { - return requestInfoForm; - } - - // validate client scopes - try { - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(requestInfoForm.getClientId()); - authorizationEndpoint.validateScope(requestInfoForm.getScopesAsString(), clientDetails, requestInfoForm.getResponseType()); - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetails); - } catch (InvalidScopeException | LockedException | ClientDeactivatedException | InvalidClientException e) { - if (e instanceof InvalidScopeException) { - requestInfoForm.setError("invalid_scope"); - requestInfoForm.setErrorDescription(e.getMessage()); - } else if (e instanceof InvalidClientException) { - requestInfoForm.setError("invalid_client"); - requestInfoForm.setErrorDescription(e.getMessage()); - } else if (e instanceof LockedException){ - requestInfoForm.setError("client_locked"); - requestInfoForm.setErrorDescription(e.getMessage()); - } else { - requestInfoForm.setError("client_deactivated"); - requestInfoForm.setErrorDescription(e.getMessage()); - } - return requestInfoForm; - } - - // Authorize the request if needed - return setAuthorizationRequest(request, model, requestParameters, sessionStatus, principal, requestInfoForm); - } - - @RequestMapping(value = { "/oauth/custom/authorize.json" }, method = RequestMethod.GET) - public @ResponseBody RequestInfoForm requestInfoForm(HttpServletRequest request, Map model, @RequestParam Map requestParameters, - SessionStatus sessionStatus, Principal principal) throws UnsupportedEncodingException { - RequestInfoForm requestInfoForm = requestInfoFormLocalCache.get(request.getSession().getId()); - oauthHelper.setUserName(requestInfoForm); - requestInfoFormLocalCache.put(request.getSession().getId(), requestInfoForm); - return setAuthorizationRequest(request, model, requestParameters, sessionStatus, principal, requestInfoForm); - } - - @RequestMapping(value = { "/oauth/custom/requestInfoForm.json" }, method = RequestMethod.GET) - public @ResponseBody RequestInfoForm customRequestInfoForm(HttpServletRequest request, Map model, @RequestParam Map requestParameters, - SessionStatus sessionStatus, Principal principal) throws UnsupportedEncodingException { - RequestInfoForm requestInfoForm = new RequestInfoForm(); - if(requestInfoFormLocalCache.containsKey(request.getSession().getId())) { - requestInfoForm = requestInfoFormLocalCache.get(request.getSession().getId()); - oauthHelper.setUserName(requestInfoForm); - if (requestParameters.isEmpty() && request.getSession().getAttribute(OrcidOauth2Constants.OAUTH_QUERY_STRING) != null) { - try { - String url = URLDecoder.decode((String) request.getSession().getAttribute(OrcidOauth2Constants.OAUTH_QUERY_STRING), "UTF-8").trim(); - if (url.startsWith("oauth=&")) { - url = url.replaceFirst("oauth=&", ""); - } - String[] pairs = url.split("&"); - for (int i = 0; i < pairs.length; i++) { - String pair = pairs[i]; - String[] keyValue = pair.split("="); - requestParameters.put(keyValue[0], keyValue[1]); - } - setAuthorizationRequest(request, model, requestParameters, sessionStatus, principal, requestInfoForm); - } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { - requestInfoForm.setError("oauth_error"); - requestInfoForm.setErrorDescription("Invalid request"); - } - } - } - return requestInfoForm; - } - - private RequestInfoForm generateRequestInfoForm(HttpServletRequest request, String queryString, Map model, @RequestParam Map requestParameters, - SessionStatus sessionStatus, Principal principal) throws UnsupportedEncodingException { - // Generate the request info form - String url = request.getQueryString(); - RequestInfoForm requestInfoForm = new RequestInfoForm(); - try { - // Get and save the request information form - requestInfoForm = oauthHelper.generateRequestInfoForm(url); - } catch (InvalidClientException e) { - requestInfoForm.setError("invalid_client"); - requestInfoForm.setErrorDescription(e.getMessage()); - return requestInfoForm; - } catch (OauthInvalidRequestException e) { - requestInfoForm.setError("oauth_error"); - requestInfoForm.setErrorDescription(e.getMessage()); - return requestInfoForm; - } catch (InvalidRequestException e) { - requestInfoForm.setError("oauth_error"); - requestInfoForm.setErrorDescription(e.getMessage()); - return requestInfoForm; - } - - // Check that the client have the required permissions - // Get client name - String clientId = requestInfoForm.getClientId(); - if (PojoUtil.isEmpty(clientId)) { - requestInfoForm.setError("invalid_client"); - requestInfoForm.setErrorDescription("invalid client_id"); - return requestInfoForm; - } - - // Validate client details - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(clientId); - try { - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetails); - } catch (LockedException e) { - requestInfoForm.setError("client_locked"); - requestInfoForm.setErrorDescription(e.getMessage()); - return requestInfoForm; - } catch (ClientDeactivatedException e) { - requestInfoForm.setError("client_deactivated"); - requestInfoForm.setErrorDescription(e.getMessage()); - return requestInfoForm; - } - - // Populate the user session - populateSession(request, requestInfoForm); - - // handle openID behaviour - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) - && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID)) { - String prompt = request.getParameter(OrcidOauth2Constants.PROMPT); - if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_NONE)) { - SecurityContext sci = getSecurityContext(request); - if (baseControllerUtil.getCurrentUser(sci) != null) { - requestInfoForm.setError("interaction_required"); - } else { - requestInfoForm.setError("login_required"); - } - - return requestInfoForm; - } - } - - // force a login even if the user is already logged in if openid - // prompt=login param present - boolean forceLogin = false; - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) - && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID)) { - String prompt = request.getParameter(OrcidOauth2Constants.PROMPT); - if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_LOGIN)) { - requestInfoForm.setForceLogin(true); - return requestInfoForm; - } - } - - //implicit id_token requests must have nonce. - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) - && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID) - && request.getParameter(OAuth2Utils.RESPONSE_TYPE).contains("id_token") - && request.getParameter(OrcidOauth2Constants.NONCE) == null) { - requestInfoForm.setError("invalid_request"); - requestInfoForm.setErrorDescription("Implicit id_token requests must have nonce"); - return requestInfoForm; - } - - SecurityContext sci = getSecurityContext(request); - - //Check for prompt=login and max_age. This is a MUST in the openid spec. - //If found redirect back to the signin page. - //Add check for prompt=confirm here. This is a SHOULD in the openid spec. - //If found, force user to confirm permissions. - boolean forceConfirm = false; - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID) ){ - String prompt = request.getParameter(OrcidOauth2Constants.PROMPT); - String maxAge = request.getParameter(OrcidOauth2Constants.MAX_AGE); - if (baseControllerUtil.getCurrentUser(sci) != null) { - String orcid = baseControllerUtil.getCurrentUser(sci).getUsername(); - if (maxAge != null) { - //if maxAge+lastlogin > now, force login. max_age is in seconds. - java.util.Date authTime = profileEntityManager.getLastLogin(orcid); //is also on the entity. - try { - long max = Long.parseLong(maxAge); - if (authTime == null || ((authTime.getTime() + (max * 1000)) < (new java.util.Date()).getTime())) { - requestInfoForm.setForceLogin(true); - return requestInfoForm; - } - } catch (NumberFormatException e) { - //ignore - } - } - if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_CONFIRM)) { - forceConfirm = true; - } else if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_LOGIN)) { - requestInfoForm.setForceLogin(true); - return requestInfoForm; - } - } - } - boolean usePersistentTokens = false; - - // Check if the client has persistent tokens enabled - if (clientDetails.isPersistentTokensEnabled()) { - usePersistentTokens = true; - } - - if (!forceConfirm && usePersistentTokens && baseControllerUtil.getCurrentUser(sci) != null) { - boolean tokenLongLifeAlreadyExists = tokenServices.longLifeTokenExist(requestInfoForm.getClientId(), baseControllerUtil.getCurrentUser(sci).getUsername(), OAuth2Utils.parseParameterList(requestInfoForm.getScopesAsString())); - if (tokenLongLifeAlreadyExists) { - setAuthorizationRequest(request, model, requestParameters, sessionStatus, principal, requestInfoForm); - AuthorizationRequest authorizationRequest = authorizationRequestLocalCache.get(request.getSession().getId()); - if (authorizationRequest != null) { - Map requestParams = new HashMap(); - copyRequestParameters(request, requestParams); - Map approvalParams = new HashMap(); - - requestParams.put(OAuth2Utils.USER_OAUTH_APPROVAL, "true"); - approvalParams.put(OAuth2Utils.USER_OAUTH_APPROVAL, "true"); - - requestParams.put(OrcidOauth2Constants.TOKEN_VERSION, OrcidOauth2Constants.PERSISTENT_TOKEN); - - boolean hasPersistent = hasPersistenTokensEnabled(requestInfoForm.getClientId(), requestInfoForm); - // Don't let non persistent clients persist - if (!hasPersistent && "true".equals(requestParams.get(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN))){ - requestParams.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "false"); - } - //default to client default if not set - if (requestParams.get(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN) == null) { - if (hasPersistent) - requestParams.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "true"); - else - requestParams.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "false"); - } - - // Session status - SimpleSessionStatus status = new SimpleSessionStatus(); - - authorizationRequest.setRequestParameters(requestParams); - // Authorization request model - Map modelAuth = new HashMap(); - modelAuth.put("authorizationRequest", authorizationRequest); - - Map originalRequest = originalAuthorizationRequestLocalCache.get(request.getSession().getId()); - if(originalRequest != null) { - modelAuth.put(OrcidOauth2Constants.ORIGINAL_AUTHORIZATION_REQUEST, originalRequest); - } - - // Approve using the spring authorization endpoint code. - //note this will also handle generating implicit tokens via getTokenGranter().grant("implicit",new ImplicitTokenRequest(tokenRequest, storedOAuth2Request)); - RedirectView view = (RedirectView) authorizationEndpoint.approveOrDeny(approvalParams, modelAuth, status, principal); - requestInfoForm.setRedirectUrl(view.getUrl()); - // Oauth has been approved, hence, remove the oauth flag from the session - requestInfoFormLocalCache.remove(request.getSession().getId()); - request.getSession().removeAttribute(OrcidOauth2Constants.OAUTH_2SCREENS); - } - } - } - - return requestInfoForm; - } - - private void populateSession(HttpServletRequest request, RequestInfoForm requestInfoForm) { - String url = request.getQueryString(); - - requestInfoFormLocalCache.put(request.getSession().getId(), requestInfoForm); - - // Save also the original query string - request.getSession().setAttribute(OrcidOauth2Constants.OAUTH_QUERY_STRING, url); - - // Save a flag to indicate this is a Oauth request - request.getSession().setAttribute(OrcidOauth2Constants.OAUTH_2SCREENS, true); - - //Required to be able to work with org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint to authorize the request - Map authorizationRequestMap = new HashMap(); - - authorizationRequestMap.put(OAuth2Utils.CLIENT_ID, requestInfoForm.getClientId()); - authorizationRequestMap.put(OAuth2Utils.REDIRECT_URI, requestInfoForm.getRedirectUrl()); - authorizationRequestMap.put(OrcidOauth2Constants.APPROVED, false); - authorizationRequestMap.put(OrcidOauth2Constants.RESOURCE_IDS, Set.of("orcid")); - - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(requestInfoForm.getClientId()); - ClientGrantedAuthorityEntity cgae = new ClientGrantedAuthorityEntity(); - cgae.setClientId(clientDetails.getClientId()); - cgae.setAuthority((clientDetails.getClientGrantedAuthorities().isEmpty()) ? "ROLE_CLIENT" : clientDetails.getClientGrantedAuthorities().get(0).getAuthority()); - authorizationRequestMap.put(OrcidOauth2Constants.AUTHORITIES, Set.of(cgae)); - - if(requestInfoForm.getStateParam() != null) { - authorizationRequestMap.put(OAuth2Utils.STATE, requestInfoForm.getStateParam()); - } - - if (requestInfoForm.getScopes() != null) { - Set scopes = new HashSet(); - requestInfoForm.getScopes().forEach(s -> {scopes.add(s.getValue());}); - authorizationRequestMap.put(OAuth2Utils.SCOPE, Set.copyOf(scopes)); - } - - if (requestInfoForm.getResponseType() != null) { - String scope = requestInfoForm.getScopesAsString(); - String responseType = requestInfoForm.getResponseType(); - if(authorizationEndpoint.isOpenIdWithTokenResponseType(scope, responseType)) { - authorizationRequestMap.put(OAuth2Utils.RESPONSE_TYPE, Set.of("id_token", "token")); - } else { - authorizationRequestMap.put(OAuth2Utils.RESPONSE_TYPE, Set.of(requestInfoForm.getResponseType())); - } - } - - Map originalAuthorizationRequest = Map.copyOf(authorizationRequestMap); - originalAuthorizationRequestLocalCache.put(request.getSession().getId(), originalAuthorizationRequest); - } - - private RequestInfoForm setAuthorizationRequest(HttpServletRequest request, Map model, @RequestParam Map requestParameters, - SessionStatus sessionStatus, Principal principal, RequestInfoForm requestInfoForm) { - SecurityContext sci = getSecurityContext(request); - authorizationRequestLocalCache.remove(request.getSession().getId()); - if (baseControllerUtil.getCurrentUser(sci) != null) { - // Authorize the request - try { - ModelAndView mav = authorizationEndpoint.authorize(model, requestParameters, sessionStatus, principal); - RedirectView rev = (RedirectView) mav.getView(); - if (rev != null) { - String url = rev.getUrl(); - String errorDescription = "error_description="; - if (url.contains("error")) { - requestInfoForm.setError("invalid_scope"); - requestInfoForm.setErrorDescription(url.substring(url.indexOf("error_description=") + errorDescription.length())); - } - } - - // If there are not errors, store the authorizationRequest in the local cache - if(StringUtils.isEmpty(requestInfoForm.getError())) { - AuthorizationRequest authRequest = (AuthorizationRequest) mav.getModel().get("authorizationRequest"); - authorizationRequestLocalCache.put(request.getSession().getId(), authRequest); - } - } catch (RedirectMismatchException e ) { - requestInfoForm.setError("invalid_grant"); - requestInfoForm.setErrorDescription("Redirect URI doesn't match your registered redirect URIs."); - } catch (UnsupportedResponseTypeException e) { - requestInfoForm.setError("unsupported_response_type"); - requestInfoForm.setErrorDescription("Unsupported response type."); - } - } - return requestInfoForm; - } - - private SecurityContext getSecurityContext(HttpServletRequest request) { - SecurityContext sci = null; - if (request.getSession() != null) { - sci = (SecurityContext) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT"); - } - return sci; - } - - protected boolean hasPersistenTokensEnabled(String clientId, RequestInfoForm requestInfoForm) throws IllegalArgumentException { - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(clientId); - if (clientDetails == null) { - requestInfoForm.setError("invalid_client"); - requestInfoForm.setErrorDescription("invalid client_id"); - return false; - } else { - return clientDetails.isPersistentTokensEnabled(); - } - } - - private void copyRequestParameters(HttpServletRequest request, Map params) { - if (request != null && request.getParameterMap() != null) { - Map savedParams = request.getParameterMap(); - copy(savedParams, params); - } - } - - protected void copy(Map savedParams, Map params) { - if (savedParams != null && !savedParams.isEmpty()) { - for (String key : savedParams.keySet()) { - String[] values = savedParams.get(key); - if (values != null && values.length > 0) - params.put(key, values[0]); - } - } - } -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/oauth2/RevokeController.java b/orcid-web/src/main/java/org/orcid/frontend/oauth2/RevokeController.java index 0fd7e9c0664..98a99c3f018 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/oauth2/RevokeController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/oauth2/RevokeController.java @@ -1,16 +1,14 @@ package org.orcid.frontend.oauth2; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang.StringUtils; import org.orcid.api.common.T2OrcidApiService; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.oauth.authorizationServer.AuthorizationServerUtil; import org.orcid.core.togglz.Features; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; import org.orcid.pojo.ajaxForm.PojoUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,25 +27,19 @@ public class RevokeController { private static final Logger LOGGER = LoggerFactory.getLogger(RevokeController.class); - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - @Resource private AuthorizationServerUtil authorizationServerUtil; - public void setOrcidOauth2TokenDetailService(OrcidOauth2TokenDetailService orcidOauth2TokenDetailService) { - this.orcidOauth2TokenDetailService = orcidOauth2TokenDetailService; - } - @RequestMapping public ResponseEntity revoke(HttpServletRequest request) throws IOException, URISyntaxException, InterruptedException { + String tokenToRevoke = request.getParameter("token"); + Response r = null; + if(Features.OAUTH_TOKEN_VALIDATION.isActive()) { // Forward the request to the authorization server - String tokenToRevoke = request.getParameter("token"); if (PojoUtil.isEmpty(tokenToRevoke)) { throw new IllegalArgumentException("Please provide the token to be param"); } - Response r = null; if(StringUtils.isNotBlank(request.getHeader("Authorization"))) { String authorization = request.getHeader("Authorization"); r = authorizationServerUtil.forwardTokenRevocationRequest(authorization, tokenToRevoke); @@ -62,32 +54,16 @@ public ResponseEntity revoke(HttpServletRequest request) throws IOException, return ResponseEntity.status(r.getStatus()).headers(responseHeaders).body(r.getEntity()); } else { String clientId = SecurityContextHolder.getContext().getAuthentication().getName(); - if (PojoUtil.isEmpty(clientId)) { - throw new IllegalArgumentException("Unable to validate client credentials"); - } - - String tokenToRevoke = request.getParameter("token"); + String clientSecret = request.getParameter("client_secret"); if (PojoUtil.isEmpty(tokenToRevoke)) { throw new IllegalArgumentException("Please provide the token to be param"); } - - OrcidOauth2TokenDetail token = orcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue(tokenToRevoke); - if (token == null) { - // Try to find it by refresh token - token = orcidOauth2TokenDetailService.findByRefreshTokenValue(tokenToRevoke); - } - - if (token != null && (token.getTokenDisabled() == null || !token.getTokenDisabled())) { - String tokenOwner = token.getClientDetailsId(); - if (clientId.equals(tokenOwner)) { - orcidOauth2TokenDetailService.revokeAccessToken(token.getTokenValue()); - } else { - LOGGER.warn("Client {} is trying to revoke token that belongs to client {}", clientId, tokenOwner); - } - } + r = authorizationServerUtil.forwardTokenRevocationRequest(clientId, clientSecret, tokenToRevoke); } - - return ResponseEntity.ok().build(); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.set(Features.OAUTH_TOKEN_VALIDATION.name(), + "ON"); + return ResponseEntity.status(r.getStatus()).headers(responseHeaders).body(r.getEntity()); } } diff --git a/orcid-web/src/main/java/org/orcid/frontend/salesforce/adapter/SalesForceAdapter.java b/orcid-web/src/main/java/org/orcid/frontend/salesforce/adapter/SalesForceAdapter.java index eaab761375f..afd12c4ff38 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/salesforce/adapter/SalesForceAdapter.java +++ b/orcid-web/src/main/java/org/orcid/frontend/salesforce/adapter/SalesForceAdapter.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; diff --git a/orcid-web/src/main/java/org/orcid/frontend/salesforce/manager/SalesforceManagerImpl.java b/orcid-web/src/main/java/org/orcid/frontend/salesforce/manager/SalesforceManagerImpl.java index d63dc2ea636..2fc86278bc4 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/salesforce/manager/SalesforceManagerImpl.java +++ b/orcid-web/src/main/java/org/orcid/frontend/salesforce/manager/SalesforceManagerImpl.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationFailureHandler.java b/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationFailureHandler.java index 60f7329f68a..07de5a122cb 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationFailureHandler.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationFailureHandler.java @@ -3,9 +3,9 @@ import java.io.IOException; import java.io.PrintWriter; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.security.DeprecatedProfileException; import org.orcid.core.security.InvalidUserTypeException; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationSuccessHandler.java b/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationSuccessHandler.java index 46236b48987..0eac509f644 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationSuccessHandler.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationSuccessHandler.java @@ -2,9 +2,9 @@ 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; import org.orcid.core.common.manager.EventManager; import org.orcid.core.togglz.Features; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationSuccessHandlerBase.java b/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationSuccessHandlerBase.java index f4d8d78bb1b..27b38a447c5 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationSuccessHandlerBase.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/AjaxAuthenticationSuccessHandlerBase.java @@ -1,8 +1,8 @@ package org.orcid.frontend.spring; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.LocaleUtils; import org.orcid.core.manager.SourceManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/LoggingStrictHttpFirewall.java b/orcid-web/src/main/java/org/orcid/frontend/spring/LoggingStrictHttpFirewall.java index edb9dd49725..83c4109e3e7 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/LoggingStrictHttpFirewall.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/LoggingStrictHttpFirewall.java @@ -1,7 +1,7 @@ package org.orcid.frontend.spring; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.web.firewall.FirewalledRequest; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/OrcidAccessDeniedHandler.java b/orcid-web/src/main/java/org/orcid/frontend/spring/OrcidAccessDeniedHandler.java index 70f9e6f2e6a..d58acb110ac 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/OrcidAccessDeniedHandler.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/OrcidAccessDeniedHandler.java @@ -2,10 +2,10 @@ import java.io.IOException; -import javax.annotation.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.manager.impl.OrcidUrlManager; import org.slf4j.Logger; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/OrcidAuthenticationProvider.java b/orcid-web/src/main/java/org/orcid/frontend/spring/OrcidAuthenticationProvider.java index 7af8b615e7f..6690fda7c2c 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/OrcidAuthenticationProvider.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/OrcidAuthenticationProvider.java @@ -3,7 +3,7 @@ import java.time.Instant; import java.util.Date; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; @@ -106,7 +106,7 @@ public Authentication authenticate(Authentication auth) throws AuthenticationExc profileEntityCacheManager.remove(userOrcid); } catch (Exception ex) { //TODO: This try/catch should be removed as soon as we confirm there are no more exceptions while updating the sign in lock. - if (!(ex instanceof javax.persistence.NoResultException)) { + if (!(ex instanceof jakarta.persistence.NoResultException)) { Throwable rootCause = ExceptionUtils.getRootCause(ex); if(rootCause != null) { LOGGER.error("An exception has occurred processing request from user " + auth.getName() + ". " + rootCause.getClass().getSimpleName() + ": " + rootCause.getMessage()); diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/ShibbolethAjaxAuthenticationSuccessHandler.java b/orcid-web/src/main/java/org/orcid/frontend/spring/ShibbolethAjaxAuthenticationSuccessHandler.java index 767072bb6b5..7916370a6fb 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/ShibbolethAjaxAuthenticationSuccessHandler.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/ShibbolethAjaxAuthenticationSuccessHandler.java @@ -6,10 +6,10 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.common.manager.EventManager; import org.orcid.core.manager.InstitutionalSignInManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/SocialAjaxAuthenticationSuccessHandler.java b/orcid-web/src/main/java/org/orcid/frontend/spring/SocialAjaxAuthenticationSuccessHandler.java index 3e050919e0d..a8a980739fc 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/SocialAjaxAuthenticationSuccessHandler.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/SocialAjaxAuthenticationSuccessHandler.java @@ -3,10 +3,10 @@ import java.io.IOException; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.constants.OrcidOauth2Constants; import org.orcid.core.manager.UserConnectionManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/configuration/OrcidRequestCache.java b/orcid-web/src/main/java/org/orcid/frontend/spring/configuration/OrcidRequestCache.java index 1e23c7d598d..f9056f75130 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/configuration/OrcidRequestCache.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/configuration/OrcidRequestCache.java @@ -4,8 +4,8 @@ import org.springframework.security.web.savedrequest.HttpSessionRequestCache; import org.springframework.stereotype.Service; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; @Service("orcidRequestCache") public class OrcidRequestCache extends HttpSessionRequestCache { diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/configuration/ResourceHandlersConfiguration.java b/orcid-web/src/main/java/org/orcid/frontend/spring/configuration/ResourceHandlersConfiguration.java index b5797b95e70..084259f77e8 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/configuration/ResourceHandlersConfiguration.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/configuration/ResourceHandlersConfiguration.java @@ -5,13 +5,13 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.resource.FixedVersionStrategy; import org.springframework.web.servlet.resource.VersionResourceResolver; @Configuration @EnableWebMvc -public class ResourceHandlersConfiguration extends WebMvcConfigurerAdapter { +public class ResourceHandlersConfiguration implements WebMvcConfigurer { @Value("${org.orcid.frontend.static.resource.cache.enabled:true}") private boolean cacheResources; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/i18n/OrcidCookieLocaleResolver.java b/orcid-web/src/main/java/org/orcid/frontend/spring/i18n/OrcidCookieLocaleResolver.java index 3077b13187c..f18e6737d2a 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/i18n/OrcidCookieLocaleResolver.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/i18n/OrcidCookieLocaleResolver.java @@ -5,10 +5,11 @@ import java.util.Locale; import java.util.TimeZone; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.context.i18n.LocaleContext; +import org.springframework.context.i18n.SimpleTimeZoneAwareLocaleContext; import org.springframework.context.i18n.TimeZoneAwareLocaleContext; import org.springframework.web.servlet.i18n.CookieLocaleResolver; @@ -20,34 +21,40 @@ public class OrcidCookieLocaleResolver extends CookieLocaleResolver { @Override public void setLocaleContext(HttpServletRequest request, HttpServletResponse response, LocaleContext localeContext) { - Locale locale = null; + // If context is null, pass null to super to handle cookie removal automatically + if (localeContext == null) { + super.setLocaleContext(request, response, null); + return; + } + + Locale locale = localeContext.getLocale(); TimeZone timeZone = null; - if (localeContext != null) { - locale = localeContext.getLocale(); - if (localeContext instanceof TimeZoneAwareLocaleContext) { - timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone(); - } + + if (localeContext instanceof TimeZoneAwareLocaleContext) { + timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone(); + } - if (!availableLocales.contains(locale)) { - Locale justLang = new Locale(locale.getLanguage()); - if (availableLocales.contains(justLang) || devLocales.contains(justLang)) { - locale = justLang; - } else { - locale = Locale.ENGLISH; - } + // Run custom Orcid validation + if (locale != null && !availableLocales.contains(locale)) { + Locale justLang = new Locale(locale.getLanguage()); + if (availableLocales.contains(justLang) || devLocales.contains(justLang)) { + locale = justLang; + } else { + locale = Locale.ENGLISH; } - - setCookieSecure(true); - addCookie(response, (locale != null ? toLocaleValue(locale) : "-") + (timeZone != null ? ' ' + timeZone.getID() : "")); - } else { - removeCookie(response); } - request.setAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME, (locale != null ? locale : determineDefaultLocale(request))); - request.setAttribute(TIME_ZONE_REQUEST_ATTRIBUTE_NAME, (timeZone != null ? timeZone : determineDefaultTimeZone(request))); + + setCookieSecure(true); + + // Wrap the validated locale/timezone and pass it to the parent class. + // Spring 6 will automatically build the cookie, add it to the response, + // and set the required LOCALE and TIME_ZONE request attributes for the rest of the request processing. + LocaleContext validatedContext = new SimpleTimeZoneAwareLocaleContext(locale, timeZone); + super.setLocaleContext(request, response, validatedContext); } @Override public void setCookieSecure(boolean cookieSecure) { super.setCookieSecure(cookieSecure); } -} +} \ No newline at end of file diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidEnableRedisHttpSession.java b/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidEnableRedisHttpSession.java index a4f9f702731..52c7ce09d49 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidEnableRedisHttpSession.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidEnableRedisHttpSession.java @@ -4,8 +4,6 @@ import org.springframework.context.annotation.Import; import org.springframework.session.FlushMode; import org.springframework.session.SaveMode; -import org.springframework.session.data.redis.RedisFlushMode; -import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration; import java.lang.annotation.*; @@ -24,11 +22,7 @@ public @interface OrcidEnableRedisHttpSession { String redisNamespace() default "spring:session"; - /** @deprecated */ - @Deprecated - RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE; - FlushMode flushMode() default FlushMode.ON_SAVE; SaveMode saveMode() default SaveMode.ON_SET_ATTRIBUTE; -} +} \ No newline at end of file diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidRedisHttpSessionConfiguration.java b/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidRedisHttpSessionConfiguration.java index 816470a38e3..497e91ec7ba 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidRedisHttpSessionConfiguration.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidRedisHttpSessionConfiguration.java @@ -36,7 +36,6 @@ import org.springframework.session.Session; import org.springframework.session.config.SessionRepositoryCustomizer; import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration; -import org.springframework.session.data.redis.RedisFlushMode; import org.springframework.session.data.redis.RedisIndexedSessionRepository; import org.springframework.session.data.redis.RedisSessionRepository; import org.springframework.session.data.redis.config.ConfigureNotifyKeyspaceEventsAction; @@ -49,7 +48,7 @@ import org.springframework.util.StringUtils; import org.springframework.util.StringValueResolver; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.time.Duration; import java.util.*; import java.util.concurrent.Executor; @@ -146,13 +145,6 @@ public void setRedisNamespace(String namespace) { this.redisNamespace = namespace; } - /** @deprecated */ - @Deprecated - public void setRedisFlushMode(RedisFlushMode redisFlushMode) { - Assert.notNull(redisFlushMode, "redisFlushMode cannot be null"); - this.setFlushMode(redisFlushMode.getFlushMode()); - } - public void setFlushMode(FlushMode flushMode) { Assert.notNull(flushMode, "flushMode cannot be null"); this.flushMode = flushMode; @@ -238,13 +230,7 @@ public void setImportMetadata(AnnotationMetadata importMetadata) { this.redisNamespace = this.embeddedValueResolver.resolveStringValue(redisNamespaceValue); } - FlushMode flushMode = (FlushMode)attributes.getEnum("flushMode"); - RedisFlushMode redisFlushMode = (RedisFlushMode)attributes.getEnum("redisFlushMode"); - if (flushMode == FlushMode.ON_SAVE && redisFlushMode != RedisFlushMode.ON_SAVE) { - flushMode = redisFlushMode.getFlushMode(); - } - - this.flushMode = flushMode; + this.flushMode = (FlushMode)attributes.getEnum("flushMode"); this.saveMode = (SaveMode)attributes.getEnum("saveMode"); } @@ -316,4 +302,4 @@ public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addCronTask(var10001::cleanupExpiredSessions, OrcidRedisHttpSessionConfiguration.this.cleanupCron); } } -} +} \ No newline at end of file diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidRedisIndexedSessionRepository.java b/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidRedisIndexedSessionRepository.java index a6574ed3e7b..4193f7d6925 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidRedisIndexedSessionRepository.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/session/redis/OrcidRedisIndexedSessionRepository.java @@ -24,7 +24,7 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.time.Duration; import java.time.Instant; import java.util.*; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/web/servlet/i18n/LocaleChangeInterceptor.java b/orcid-web/src/main/java/org/orcid/frontend/spring/web/servlet/i18n/LocaleChangeInterceptor.java index 835c1591994..d0e80cb1c3e 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/web/servlet/i18n/LocaleChangeInterceptor.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/web/servlet/i18n/LocaleChangeInterceptor.java @@ -3,15 +3,15 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.web.savedrequest.HttpSessionRequestCache; import org.springframework.security.web.savedrequest.SavedRequest; import org.springframework.util.StringUtils; +import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.LocaleResolver; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import org.springframework.web.servlet.support.RequestContextUtils; /** @@ -22,7 +22,7 @@ * @since 20.06.2003 * @see org.springframework.web.servlet.LocaleResolver */ -public class LocaleChangeInterceptor extends HandlerInterceptorAdapter { +public class LocaleChangeInterceptor implements HandlerInterceptor { /** * Default name of the locale specification parameter: "locale". diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/web/social/config/SocialSignInUtils.java b/orcid-web/src/main/java/org/orcid/frontend/spring/web/social/config/SocialSignInUtils.java index aabe75edbb5..06d9b68b4f2 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/web/social/config/SocialSignInUtils.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/web/social/config/SocialSignInUtils.java @@ -10,9 +10,9 @@ import java.nio.charset.StandardCharsets; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; diff --git a/orcid-web/src/main/java/org/orcid/frontend/spring/web/social/config/UserCookieGenerator.java b/orcid-web/src/main/java/org/orcid/frontend/spring/web/social/config/UserCookieGenerator.java index e37cc599605..191cd17a3e0 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/spring/web/social/config/UserCookieGenerator.java +++ b/orcid-web/src/main/java/org/orcid/frontend/spring/web/social/config/UserCookieGenerator.java @@ -1,8 +1,8 @@ package org.orcid.frontend.spring.web.social.config; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.util.CookieGenerator; diff --git a/orcid-web/src/main/java/org/orcid/frontend/util/AuthorizationRequestLocalCache.java b/orcid-web/src/main/java/org/orcid/frontend/util/AuthorizationRequestLocalCache.java deleted file mode 100644 index bed691f1a07..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/util/AuthorizationRequestLocalCache.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.orcid.frontend.util; -import org.ehcache.Cache; -import org.ehcache.CacheManager; -import org.ehcache.config.builders.CacheConfigurationBuilder; -import org.ehcache.config.builders.CacheManagerBuilder; -import org.ehcache.config.builders.ResourcePoolsBuilder; -import org.ehcache.expiry.Duration; -import org.ehcache.expiry.Expirations; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.concurrent.TimeUnit; - -@Component -public class AuthorizationRequestLocalCache { - - @Value("${org.orcid.core.session.localCache.ttl:10800}") - private int cacheTTLInSeconds; - - @Value("${org.orcid.core.session.localCache.heap:50000}") - private int heapSize; - - private CacheManager cacheManager; - private Cache cache; - - public AuthorizationRequestLocalCache() { - cacheManager = CacheManagerBuilder - .newCacheManagerBuilder().build(); - cacheManager.init(); - } - - @PostConstruct - public void initCache() { - cache = cacheManager - .createCache("authorizationRequestLocalCache", CacheConfigurationBuilder - .newCacheConfigurationBuilder( - String.class, AuthorizationRequest.class, - ResourcePoolsBuilder.heap(heapSize)).withExpiry(Expirations.timeToLiveExpiration(Duration.of(cacheTTLInSeconds, TimeUnit.SECONDS)))); - } - - public AuthorizationRequest get(String key) { - return cache.get(key); - } - - public void put(String key, AuthorizationRequest value) { - cache.put(key, value); - } - - public void remove(String key) { - cache.remove(key); - } - - public boolean containsKey(String key) { - return cache.containsKey(key); - } -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/util/OriginalAuthorizationRequestLocalCache.java b/orcid-web/src/main/java/org/orcid/frontend/util/OriginalAuthorizationRequestLocalCache.java deleted file mode 100644 index 47fb42e7013..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/util/OriginalAuthorizationRequestLocalCache.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.orcid.frontend.util; -import org.ehcache.Cache; -import org.ehcache.CacheManager; -import org.ehcache.config.builders.CacheConfigurationBuilder; -import org.ehcache.config.builders.CacheManagerBuilder; -import org.ehcache.config.builders.ResourcePoolsBuilder; -import org.ehcache.expiry.Duration; -import org.ehcache.expiry.Expirations; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -@Component -public class OriginalAuthorizationRequestLocalCache { - - @Value("${org.orcid.core.session.localCache.ttl:900}") - private int cacheTTLInSeconds; - - @Value("${org.orcid.core.session.localCache.heap:10000}") - private int heapSize; - - private CacheManager cacheManager; - private Cache cache; - - public OriginalAuthorizationRequestLocalCache() { - cacheManager = CacheManagerBuilder - .newCacheManagerBuilder().build(); - cacheManager.init(); - } - - @PostConstruct - public void initCache() { - cache = cacheManager - .createCache("originalAuthorizationRequestLocalCache", CacheConfigurationBuilder - .newCacheConfigurationBuilder( - String.class, Map.class, - ResourcePoolsBuilder.heap(heapSize)).withExpiry(Expirations.timeToLiveExpiration(Duration.of(cacheTTLInSeconds, TimeUnit.SECONDS)))); - } - - public Map get(String key) { - return cache.get(key); - } - - public void put(String key, Map value) { - cache.put(key, value); - } - - public void remove(String key) { - cache.remove(key); - } - - public boolean containsKey(String key) { - return cache.containsKey(key); - } -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/util/RequestInfoFormLocalCache.java b/orcid-web/src/main/java/org/orcid/frontend/util/RequestInfoFormLocalCache.java deleted file mode 100644 index 9e0450cdb7e..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/util/RequestInfoFormLocalCache.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.orcid.frontend.util; -import org.ehcache.Cache; -import org.ehcache.CacheManager; -import org.ehcache.config.builders.CacheConfigurationBuilder; -import org.ehcache.config.builders.CacheManagerBuilder; -import org.ehcache.config.builders.ResourcePoolsBuilder; -import org.ehcache.expiry.Duration; -import org.ehcache.expiry.Expirations; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.concurrent.TimeUnit; - -@Component -public class RequestInfoFormLocalCache { - - @Value("${org.orcid.core.session.localCache.ttl:10800}") - private int cacheTTLInSeconds; - - @Value("${org.orcid.core.session.localCache.heap:50000}") - private int heapSize; - - private CacheManager cacheManager; - private Cache cache; - - public RequestInfoFormLocalCache() { - cacheManager = CacheManagerBuilder - .newCacheManagerBuilder().build(); - cacheManager.init(); - } - - @PostConstruct - public void initCache() { - cache = cacheManager - .createCache("requestInfoFormLocalCache", CacheConfigurationBuilder - .newCacheConfigurationBuilder( - String.class, RequestInfoForm.class, - ResourcePoolsBuilder.heap(heapSize)).withExpiry(Expirations.timeToLiveExpiration(Duration.of(cacheTTLInSeconds, TimeUnit.SECONDS)))); - } - - public RequestInfoForm get(String key) { - return cache.get(key); - } - - public void put(String key, RequestInfoForm value) { - cache.put(key, value); - } - - public void remove(String key) { - cache.remove(key); - } - - public boolean containsKey(String key) { - return cache.containsKey(key); - } -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/AdminController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/AdminController.java index 47d9b9d88e2..c218d42555f 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/AdminController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/AdminController.java @@ -13,12 +13,12 @@ import java.util.StringTokenizer; import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/AffiliationsController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/AffiliationsController.java index 2eac5a47f8c..c95b9acf5ff 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/AffiliationsController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/AffiliationsController.java @@ -6,8 +6,8 @@ import java.util.Map; import java.util.stream.IntStream; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.orcid.api.common.util.v3.ActivityUtils; import org.orcid.core.manager.OrgDisambiguatedManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/BaseController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/BaseController.java index 7f06d4ea1fd..6273a4bf6d0 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/BaseController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/BaseController.java @@ -18,10 +18,10 @@ import java.util.TreeMap; import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.UriBuilder; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.UriBuilder; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringEscapeUtils; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/BaseWorkspaceController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/BaseWorkspaceController.java index 7ab1b0ac170..10d9553ab6f 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/BaseWorkspaceController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/BaseWorkspaceController.java @@ -10,9 +10,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import org.apache.commons.lang.StringUtils; import org.orcid.core.aop.ProfileLastModifiedAspect; @@ -20,7 +20,6 @@ import org.orcid.core.manager.EncryptionManager; import org.orcid.core.manager.v3.ActivityManager; import org.orcid.core.manager.v3.ProfileEntityManager; -import org.orcid.core.security.visibility.filter.VisibilityFilter; import org.orcid.frontend.web.util.NumberList; import org.orcid.frontend.web.util.YearsList; import org.orcid.pojo.ajaxForm.Contributor; @@ -45,9 +44,6 @@ public class BaseWorkspaceController extends BaseController { @Resource(name = "profileEntityManagerV3") protected ProfileEntityManager profileEntityManager; - @Resource(name = "visibilityFilter") - protected VisibilityFilter visibilityFilter; - @Resource private ProfileLastModifiedAspect profileLastModifiedAspect; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/CacheClearController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/CacheClearController.java index 0bf34f8e6c0..6aef3068bc4 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/CacheClearController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/CacheClearController.java @@ -1,6 +1,6 @@ package org.orcid.frontend.web.controllers; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.pojo.ajaxForm.Errors; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ClaimController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ClaimController.java index 1d360f8bf79..df1cc9ed3b2 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ClaimController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ClaimController.java @@ -5,13 +5,12 @@ import java.util.List; import java.util.Locale; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; -import org.apache.jena.sparql.function.library.e; import org.jasypt.exceptions.EncryptionOperationNotPossibleException; import org.orcid.core.exception.OrcidBadRequestException; import org.orcid.core.manager.EncryptionManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ClientsController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ClientsController.java index 618b6fdd669..e278085bf43 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ClientsController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ClientsController.java @@ -8,9 +8,9 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.orcid.core.exception.OrcidClientGroupManagementException; import org.orcid.core.manager.ProfileEntityCacheManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/CsrfController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/CsrfController.java index e598b68af0a..ba5404f5c4d 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/CsrfController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/CsrfController.java @@ -3,8 +3,8 @@ import java.util.Collections; import java.util.Map; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/DeveloperToolsController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/DeveloperToolsController.java index 3334936b164..2a20740e899 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/DeveloperToolsController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/DeveloperToolsController.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.core.manager.v3.ClientManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/EmailDomainController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/EmailDomainController.java index aa7d8ee7fb9..9cc9e46d4d6 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/EmailDomainController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/EmailDomainController.java @@ -2,8 +2,8 @@ import java.util.List; -import javax.annotation.Resource; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.ws.rs.core.MediaType; import org.orcid.core.common.manager.EmailDomainManager; import org.orcid.core.solr.OrcidSolrOrgsClient; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/FindMyStuffController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/FindMyStuffController.java index 318a0ec8cfd..841fd6ccc20 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/FindMyStuffController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/FindMyStuffController.java @@ -2,11 +2,10 @@ import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.FindMyStuffManager; import org.orcid.core.manager.v3.NotificationManager; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.pojo.FindMyStuffResult; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; @@ -21,9 +20,6 @@ public class FindMyStuffController extends BaseController{ @Resource NotificationController notificationsController; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenService; - @Resource(name = "notificationManagerV3") private NotificationManager notificationManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/FundingsController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/FundingsController.java index 4646516bc42..6f38cb68a8b 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/FundingsController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/FundingsController.java @@ -15,8 +15,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.orcid.core.locale.LocaleManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/GetMyDataController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/GetMyDataController.java index 309b033a62b..5620cb421c8 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/GetMyDataController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/GetMyDataController.java @@ -22,12 +22,12 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.MediaType; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.MediaType; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; import org.apache.commons.collections4.ListUtils; import org.orcid.core.manager.WorkEntityCacheManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/HomeController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/HomeController.java index 9522ecd8a53..dbe6630fa32 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/HomeController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/HomeController.java @@ -7,12 +7,12 @@ import java.util.Map; import java.util.ResourceBundle; -import javax.annotation.Resource; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/LoginController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/LoginController.java index 4b26382d314..784ee9cc0d8 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/LoginController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/LoginController.java @@ -1,101 +1,29 @@ package org.orcid.frontend.web.controllers; -import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.util.UUID; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; -import org.codehaus.jettison.json.JSONException; -import org.codehaus.jettison.json.JSONObject; -import org.orcid.core.common.manager.EventManager; import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.exception.ClientDeactivatedException; -import org.orcid.core.exception.LockedException; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.UserConnectionManager; import org.orcid.core.manager.v3.read_only.RecordNameManagerReadOnly; -import org.orcid.core.oauth.service.OrcidAuthorizationEndpoint; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator; -import org.orcid.core.security.OrcidUserDetailsService; -import org.orcid.core.togglz.Features; -import org.orcid.frontend.spring.web.social.config.SocialSignInUtils; -import org.orcid.frontend.spring.web.social.config.SocialType; -import org.orcid.frontend.spring.web.social.config.UserCookieGenerator; -import org.orcid.frontend.util.RequestInfoFormLocalCache; -import org.orcid.frontend.web.controllers.helper.OauthHelper; -import org.orcid.jaxb.model.message.ScopePathType; import org.orcid.jaxb.model.v3.release.common.Visibility; import org.orcid.jaxb.model.v3.release.record.Name; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.EventType; -import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.persistence.jpa.entities.UserconnectionEntity; -import org.orcid.persistence.jpa.entities.UserconnectionPK; import org.orcid.pojo.ajaxForm.Names; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.view.RedirectView; @Controller("loginController") -public class LoginController extends OauthControllerBase { - - private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class); - - @Resource - protected ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource - protected OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - - @Resource - protected OrcidAuthorizationEndpoint authorizationEndpoint; +public class LoginController extends BaseController { @Resource(name = "recordNameManagerV3") private RecordNameManagerReadOnly recordNameManager; - @Resource - protected UserConnectionManager userConnectionManager; - - @Resource - private OrcidUserDetailsService orcidUserDetailsService; - - @Resource - private UserCookieGenerator userCookieGenerator; - - @Resource - private SocialSignInUtils socialSignInUtils; - - @Resource - private OauthHelper oauthHelper; - - @Resource - private EventManager eventManager; - - @Resource - private RequestInfoFormLocalCache requestInfoFormLocalCache; - @RequestMapping(value = "/account/names/{type}", method = RequestMethod.GET) public @ResponseBody Names getAccountNames(@PathVariable String type) { String currentOrcid = getCurrentUserOrcid(); @@ -114,11 +42,6 @@ public class LoginController extends OauthControllerBase { @RequestMapping(value = { "/signin", "/login" }, method = RequestMethod.GET) public ModelAndView loginGetHandler(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { String query = request.getQueryString(); - if (!PojoUtil.isEmpty(query)) { - if (query.contains("oauth")) { - return handleOauthSignIn(request, response); - } - } ModelAndView mav = new ModelAndView("login"); if (!domainsAllowingRobots.contains(orcidUrlManager.getBaseDomainRmProtocall())) { mav.addObject("noIndex", true); @@ -154,252 +77,4 @@ public String sessionExpiredHandler() { return "session_expired"; } - private ModelAndView handleOauthSignIn(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { - String queryString = request.getQueryString(); - String redirectUri = null; - - // Get and save the request information form - RequestInfoForm requestInfoForm; - try { - requestInfoForm = oauthHelper.generateRequestInfoForm(queryString); - } catch (InvalidRequestException | InvalidClientException e) { - // convert to a 400 - ModelAndView mav = new ModelAndView("oauth-error"); - mav.setStatus(HttpStatus.BAD_REQUEST); - mav.addObject("noIndex", true); - return mav; - } - - // force a login even if the user is already logged in if openid - // prompt=login param present - boolean forceLogin = false; - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) - && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID)) { - String prompt = request.getParameter(OrcidOauth2Constants.PROMPT); - if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_LOGIN)) { - forceLogin = true; - } - } - - // Check if user is already logged in, if so, redirect it to - // oauth/authorize - UserDetails userDetails = getCurrentUser(); - if (!forceLogin && userDetails != null) { - redirectUri = orcidUrlManager.getBaseUrl() + "/oauth/authorize?"; - queryString = queryString.replace("oauth&", ""); - redirectUri = redirectUri + queryString; - RedirectView rView = new RedirectView(redirectUri); - return new ModelAndView(rView); - } - - // Redirect URI - redirectUri = requestInfoForm.getRedirectUrl(); - - // Check that the client have the required permissions - // Get client name - String clientId = requestInfoForm.getClientId(); - if (PojoUtil.isEmpty(clientId)) { - String redirectUriWithParams = redirectUri + "?error=invalid_client&error_description=invalid client_id"; - return new ModelAndView(new RedirectView(redirectUriWithParams)); - } - // Validate client details - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(clientId); - try { - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetails); - } catch (LockedException e) { - String redirectUriWithParams = redirectUri + "?error=client_locked&error_description=" + e.getMessage(); - return new ModelAndView(new RedirectView(redirectUriWithParams)); - } catch (ClientDeactivatedException e) { - String redirectUriWithParams = redirectUri + "?error=client_deactivated&error_description=" + e.getMessage(); - return new ModelAndView(new RedirectView(redirectUriWithParams)); - } - - // validate client scopes - try { - authorizationEndpoint.validateScope(requestInfoForm.getScopesAsString(), clientDetails, requestInfoForm.getResponseType()); - } catch (InvalidScopeException e) { - String redirectUriWithParams = redirectUri + "?error=invalid_scope&error_description=" + e.getMessage(); - return new ModelAndView(new RedirectView(redirectUriWithParams)); - } - - // handle openID prompt and max_age behaviour - // here we remove prompt=login if present - // here we remove max_age if present - // - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) - && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID)) { - String prompt = request.getParameter(OrcidOauth2Constants.PROMPT); - if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_NONE)) { - String redirectUriWithParams = requestInfoForm.getRedirectUrl(); - - if (requestInfoForm.getResponseType().contains(OrcidOauth2Constants.CODE_RESPONSE_TYPE)) - redirectUriWithParams += "?"; - else - redirectUriWithParams += "#"; - - redirectUriWithParams += "error=login_required"; - RedirectView rView = new RedirectView(redirectUriWithParams); - ModelAndView error = new ModelAndView(); - error.setView(rView); - return error; - } - if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_CONFIRM)) { - // keep - handled by OAuthAuthorizeController - } else if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_LOGIN)) { - // remove because otherwise we'll end up back here again! - queryString = removeQueryStringParams(queryString, OrcidOauth2Constants.PROMPT); - } - if (request.getParameter(OrcidOauth2Constants.MAX_AGE) != null) { - // remove because otherwise we'll end up back here again! - queryString = removeQueryStringParams(queryString, OrcidOauth2Constants.MAX_AGE); - } - } - - requestInfoFormLocalCache.put(request.getSession().getId(), requestInfoForm); - // Save also the original query string - request.getSession().setAttribute(OrcidOauth2Constants.OAUTH_QUERY_STRING, queryString); - // Save a flag to indicate this is a request from the new - request.getSession().setAttribute(OrcidOauth2Constants.OAUTH_2SCREENS, true); - ModelAndView mav = new ModelAndView("login"); - mav.addObject("noIndex", true); - return mav; - } - - @RequestMapping(value = { "/signin/facebook" }, method = RequestMethod.POST) - public RedirectView initFacebookLogin(HttpServletRequest request) { - String sessionState = UUID.randomUUID().toString(); - request.getSession().setAttribute("f_state", sessionState); - return socialSignInUtils.initFacebookLogin(sessionState); - } - - @RequestMapping(value = { "/signin/facebook" }, method = RequestMethod.GET) - public ModelAndView getFacebookLogin(HttpServletRequest request, HttpServletResponse response, @RequestParam(name = "state") String state, - @RequestParam(name = "code", required = false) String code, @RequestParam(name = "error", required = false) String error, - @RequestParam(name = "error_code", required = false) String errorCode, @RequestParam(name = "error_description", required = false) String errorDescription, - @RequestParam(name = "error_reason", required = false) String errorReason) throws UnsupportedEncodingException, IOException, JSONException { - String facebookSessionState = (String) request.getSession().getAttribute("f_state"); - if (!state.equals(facebookSessionState)) { - LOGGER.warn("Facebook session state doesnt match"); - return new ModelAndView("redirect:" + calculateRedirectUrl("/login")); - } - - if (StringUtils.isBlank(code)) { - LOGGER.warn("Can't login to Facebook, {}: {}", error, errorDescription); - return new ModelAndView("redirect:" + calculateRedirectUrl("/login")); - } - - JSONObject userData = socialSignInUtils.getFacebookUserData(code); - return processSocialLogin(request, response, SocialType.FACEBOOK, userData); - } - - @RequestMapping(value = { "/signin/google" }, method = RequestMethod.POST) - public RedirectView initGoogleLogin(HttpServletRequest request) { - String sessionState = UUID.randomUUID().toString(); - request.getSession().setAttribute("g_state", sessionState); - return socialSignInUtils.initGoogleLogin(sessionState); - } - - @RequestMapping(value = { "/signin/google" }, method = RequestMethod.GET) - public ModelAndView getGoogleLogin(HttpServletRequest request, HttpServletResponse response, @RequestParam(name = "state") String state, - @RequestParam(name = "code", required = false) String code) throws MalformedURLException, IOException, JSONException { - String googleSessionState = (String) request.getSession().getAttribute("g_state"); - if (!state.equals(googleSessionState)) { - LOGGER.warn("Google session state doesnt match"); - return new ModelAndView("redirect:" + calculateRedirectUrl("/login")); - } - if (StringUtils.isBlank(code)) { - LOGGER.warn("Can't login to Google"); - return new ModelAndView("redirect:" + calculateRedirectUrl("/login")); - } - - JSONObject userData = socialSignInUtils.getGoogleUserData(code); - return processSocialLogin(request, response, SocialType.GOOGLE, userData); - } - - private ModelAndView processSocialLogin(HttpServletRequest request, HttpServletResponse response, SocialType socialType, JSONObject userData) throws JSONException { - String providerUserId = userData.getString(OrcidOauth2Constants.PROVIDER_USER_ID); - String accessToken = userData.getString(OrcidOauth2Constants.ACCESS_TOKEN); - Long expiresIn = Long.valueOf(userData.getString(OrcidOauth2Constants.EXPIRES_IN)); - - UserconnectionEntity userConnection = userConnectionManager.findByProviderIdAndProviderUserId(userData.getString(OrcidOauth2Constants.PROVIDER_USER_ID), - socialType.value()); - String userConnectionId = null; - ModelAndView view = null; - if (userConnection != null) { - userConnectionId = userConnection.getId().getUserid(); - // Store relevant data in the session - socialSignInUtils.setSignedInData(request, userData); - - if(userConnection.isLinked()) { - // If user exists and is linked update user connection info - // and redirect to user record - view = updateUserConnectionAndSocialLogUserIn(request, response, socialType, userConnection.getOrcid(), userConnection.getId().getUserid(), providerUserId, - accessToken, expiresIn); - } else { - // Forward to account link page - view = socialLinking(request); - } - } else { - // Store relevant data in the session - socialSignInUtils.setSignedInData(request, userData); - // Store user info - userConnectionId = createUserConnection(socialType, providerUserId, userData.getString(OrcidOauth2Constants.EMAIL), - userData.getString(OrcidOauth2Constants.DISPLAY_NAME), accessToken, expiresIn); - // Forward to account link page - view = socialLinking(request); - } - if (userConnectionId == null) { - throw new IllegalArgumentException("Unable to find userConnectionId for providerUserId = " + providerUserId); - } - - if (Features.EVENTS.isActive()) { - eventManager.createEvent(EventType.SIGN_IN, request); - } - userCookieGenerator.addCookie(userConnectionId, response); - - if ("social_2FA".equals(view.getViewName())) { - return new ModelAndView("redirect:" + calculateRedirectUrl("/2fa-signin?social=true")); - } - - return view; - } - - private String createUserConnection(SocialType socialType, String providerUserId, String email, String userName, String accessToken, Long expireTime) { - LOGGER.info("Creating userconnection for type={}, providerUserId={}, userName={}", new Object[] { socialType.value(), providerUserId, userName }); - return userConnectionManager.create(providerUserId, socialType.value(), email, userName, accessToken, expireTime); - } - - private ModelAndView updateUserConnectionAndSocialLogUserIn(HttpServletRequest request, HttpServletResponse response, SocialType socialType, String userOrcid, - String userConnectionId, String providerUserId, String accessToken, Long expiresIn) { - LOGGER.info("Updating existing userconnection for orcid={}, type={}, providerUserId={}", new Object[] { userOrcid, socialType.value(), providerUserId }); - // Update user connection info - userConnectionManager.update(providerUserId, socialType.value(), accessToken, expiresIn); - - // Log user in - ProfileEntity profileEntity = profileEntityCacheManager.retrieve(userOrcid); - if (profileEntity.getUsing2FA()) { - return new ModelAndView("social_2FA"); - } - - UserconnectionPK pk = new UserconnectionPK(userConnectionId, socialType.value(), providerUserId); - String aCredentials = socialType.value() + ':' + providerUserId; - PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken(userOrcid, aCredentials); - token.setDetails(orcidUserDetailsService.loadUserByProfile(profileEntity)); - Authentication authentication = authenticationManager.authenticate(token); - userConnectionManager.updateLoginInformation(pk); - - // Update security context with user information - SecurityContextHolder.getContext().setAuthentication(authentication); - return new ModelAndView(new RedirectView(calculateRedirectUrl(request, response, false, false, "social"))); - } - - private ModelAndView socialLinking(HttpServletRequest request) { - String socialLinking = "/social-linking"; - String queryString = (String) request.getSession().getAttribute(OrcidOauth2Constants.OAUTH_QUERY_STRING); - if (queryString != null) { - socialLinking = socialLinking + "?" + queryString; - } - return new ModelAndView(new RedirectView(orcidUrlManager.getBaseUrl() + socialLinking, true)); - - } } diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageDelegatorsController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageDelegatorsController.java index 1f676f4deec..695e4969cc2 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageDelegatorsController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageDelegatorsController.java @@ -6,7 +6,7 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.SourceNameCacheManager; import org.orcid.core.manager.v3.SourceManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageMembersController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageMembersController.java index 4bf6b328f3c..3507deb8769 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageMembersController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageMembersController.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.TreeMap; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.exception.ClientAlreadyActiveException; import org.orcid.core.exception.ClientAlreadyDeactivatedException; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageProfileController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageProfileController.java index 6fc41a5cf6a..8347299d0b9 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageProfileController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ManageProfileController.java @@ -9,10 +9,10 @@ import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; @@ -1116,9 +1116,9 @@ private void verifyPrimaryEmailIfNeeded(String orcid) { if (!emailManager.isPrimaryEmailVerified(orcid)) { try { emailManager.verifyPrimaryEmail(orcid); - } catch(javax.persistence.NoResultException nre) { + } catch(jakarta.persistence.NoResultException nre) { slackManager.sendSystemAlert(String.format("User with orcid %s have no primary email, so, we are setting the newest verified email, or, the newest email in case non is verified as the primary one", orcid)); - } catch(javax.persistence.NonUniqueResultException nure) { + } catch(jakarta.persistence.NonUniqueResultException nure) { slackManager.sendSystemAlert(String.format("User with orcid %s have more than one primary email, so, we are setting the latest modified primary as the primary one", orcid)); } } diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/MembersListController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/MembersListController.java index 35c2bb11f4a..cffc2201299 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/MembersListController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/MembersListController.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.salesforce.model.CommunityType; import org.orcid.frontend.salesforce.manager.SalesforceManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/NotificationController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/NotificationController.java index 48c1432a716..ce760730900 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/NotificationController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/NotificationController.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthAuthorizeController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthAuthorizeController.java deleted file mode 100644 index a538b7287f1..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthAuthorizeController.java +++ /dev/null @@ -1,337 +0,0 @@ -package org.orcid.frontend.web.controllers; - -import java.io.UnsupportedEncodingException; -import java.util.HashMap; -import java.util.Map; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.exception.ClientDeactivatedException; -import org.orcid.core.exception.LockedException; -import org.orcid.core.common.manager.EventManager; -import org.orcid.core.manager.v3.ProfileEntityManager; -import org.orcid.core.oauth.OrcidRandomValueTokenServices; -import org.orcid.core.togglz.Features; -import org.orcid.frontend.util.AuthorizationRequestLocalCache; -import org.orcid.frontend.util.OriginalAuthorizationRequestLocalCache; -import org.orcid.frontend.util.RequestInfoFormLocalCache; -import org.orcid.frontend.web.controllers.helper.OauthHelper; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.persistence.jpa.entities.EventType; -import org.orcid.pojo.ajaxForm.OauthAuthorizeForm; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.util.OAuth2Utils; -import org.springframework.security.oauth2.provider.AuthorizationRequest; -import org.springframework.security.web.savedrequest.HttpSessionRequestCache; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.support.SimpleSessionStatus; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.view.RedirectView; - -@Controller("oauthAuthorizeController") -public class OauthAuthorizeController extends OauthControllerBase { - - private static final Logger LOGGER = LoggerFactory.getLogger(OauthAuthorizeController.class); - - @Resource - protected OrcidRandomValueTokenServices tokenServices; - - @Resource(name = "profileEntityManagerV3") - private ProfileEntityManager profileEntityManager; - - @Resource - private OauthHelper oauthHelper; - - @Resource - private EventManager eventManager; - - @Resource - private RequestInfoFormLocalCache requestInfoFormLocalCache; - - @Resource - private AuthorizationRequestLocalCache authorizationRequestLocalCache; - - @Resource - private OriginalAuthorizationRequestLocalCache originalAuthorizationRequestLocalCache; - - /** This is called if user is already logged in. - * Checks permissions have been granted to client and generates access code. - * - * @param request - * @param response - * @param mav - * @return - * @throws UnsupportedEncodingException - */ - @RequestMapping(value = "/oauth/confirm_access", method = RequestMethod.GET) - public ModelAndView loginGetHandler(HttpServletRequest request, HttpServletResponse response, ModelAndView mav) throws UnsupportedEncodingException { - //Get and save the request information form - - String queryString = request.getQueryString(); - RequestInfoForm requestInfoForm = oauthHelper.generateRequestInfoForm(queryString); - - // Store the request info form in the cache - requestInfoFormLocalCache.put(request.getSession().getId(), requestInfoForm); - - boolean usePersistentTokens = false; - - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(requestInfoForm.getClientId()); - // validate client scopes - try { - authorizationEndpoint.validateScope(requestInfoForm.getScopesAsString(), clientDetails,requestInfoForm.getResponseType()); - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetails); - } catch (InvalidScopeException | ClientDeactivatedException | LockedException e) { - String redirectUriWithParams = requestInfoForm.getRedirectUrl(); - if(e instanceof InvalidScopeException) { - redirectUriWithParams += "?error=invalid_scope&error_description=" + e.getMessage(); - } else if (e instanceof LockedException) { - redirectUriWithParams += "?error=client_locked&error_description=" + e.getMessage(); - } else { - redirectUriWithParams += "?error=client_deactivated&error_description=" + e.getMessage(); - } - RedirectView rView = new RedirectView(redirectUriWithParams); - ModelAndView error = new ModelAndView(); - error.setView(rView); - return error; - } - - //implicit id_token requests must have nonce. - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) - && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID) - && request.getParameter(OAuth2Utils.RESPONSE_TYPE).contains("id_token") - && request.getParameter(OrcidOauth2Constants.NONCE) == null) { - String redirectUriWithParams = requestInfoForm.getRedirectUrl(); - redirectUriWithParams += "#error=invalid_request "; - RedirectView rView = new RedirectView(redirectUriWithParams); - ModelAndView error = new ModelAndView(); - error.setView(rView); - return error; - } - - //Check for prompt=login and max_age. This is a MUST in the openid spec. - //If found redirect back to the signin page. - //Add check for prompt=confirm here. This is a SHOULD in the openid spec. - //If found, force user to confirm permissions. - boolean forceConfirm = false; - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID) ){ - String prompt = request.getParameter(OrcidOauth2Constants.PROMPT); - String maxAge = request.getParameter(OrcidOauth2Constants.MAX_AGE); - String orcid = getEffectiveUserOrcid(); - if (maxAge!=null){ - //if maxAge+lastlogin > now, force login. max_age is in seconds. - java.util.Date authTime = profileEntityManager.getLastLogin(orcid); //is also on the entity. - try{ - long max = Long.parseLong(maxAge); - if (authTime == null || ((authTime.getTime() + (max*1000)) < (new java.util.Date()).getTime())){ - return redirectToForceSignin(request); - } - }catch(NumberFormatException e){ - //ignore - } - } - if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_CONFIRM)){ - forceConfirm=true; - }else if (prompt!=null && prompt.equals(OrcidOauth2Constants.PROMPT_LOGIN)){ - return redirectToForceSignin(request); - } - } - - // Check if the client has persistent tokens enabled - if (clientDetails.isPersistentTokensEnabled()) { - usePersistentTokens = true; - } - - if (!forceConfirm && usePersistentTokens) { - boolean tokenLongLifeAlreadyExists = tokenServices.longLifeTokenExist(requestInfoForm.getClientId(), getEffectiveUserOrcid(), OAuth2Utils.parseParameterList(requestInfoForm.getScopesAsString())); - if (tokenLongLifeAlreadyExists) { - AuthorizationRequest authorizationRequest = authorizationRequestLocalCache.get(request.getSession().getId()); - Authentication auth = SecurityContextHolder.getContext().getAuthentication(); - Map requestParams = new HashMap(); - copyRequestParameters(request, requestParams); - Map approvalParams = new HashMap(); - - requestParams.put(OAuth2Utils.USER_OAUTH_APPROVAL, "true"); - approvalParams.put(OAuth2Utils.USER_OAUTH_APPROVAL, "true"); - - requestParams.put(OrcidOauth2Constants.TOKEN_VERSION, OrcidOauth2Constants.PERSISTENT_TOKEN); - - boolean hasPersistent = hasPersistenTokensEnabled(requestInfoForm.getClientId()); - // Don't let non persistent clients persist - if (!hasPersistent && "true".equals(requestParams.get(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN))){ - requestParams.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "false"); - } - //default to client default if not set - if (requestParams.get(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN) == null) { - if (hasPersistent) - requestParams.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "true"); - else - requestParams.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "false"); - } - - // Session status - SimpleSessionStatus status = new SimpleSessionStatus(); - - authorizationRequest.setRequestParameters(requestParams); - // Authorization request model - Map model = new HashMap(); - model.put("authorizationRequest", authorizationRequest); - - // Approve using the spring authorization endpoint code. - //note this will also handle generting implicit tokens via getTokenGranter().grant("implicit",new ImplicitTokenRequest(tokenRequest, storedOAuth2Request)); - RedirectView view = (RedirectView) authorizationEndpoint.approveOrDeny(approvalParams, model, status, auth); - ModelAndView authCodeView = new ModelAndView(); - authCodeView.setView(view); - return authCodeView; - } - } - - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID) ){ - String prompt = request.getParameter(OrcidOauth2Constants.PROMPT); - if (prompt!=null && prompt.equals(OrcidOauth2Constants.PROMPT_NONE)){ - String redirectUriWithParams = requestInfoForm.getRedirectUrl(); - redirectUriWithParams += "#error=interaction_required"; - RedirectView rView = new RedirectView(redirectUriWithParams); - ModelAndView error = new ModelAndView(); - error.setView(rView); - return error; - } - } - mav.addObject("noIndex", true); - mav.addObject("hideSupportWidget", true); - mav.setViewName("confirm-oauth-access"); - return mav; - } - - @RequestMapping(value = { "/oauth/custom/authorize.json" }, method = RequestMethod.POST) - public @ResponseBody RequestInfoForm authorize(HttpServletRequest request, HttpServletResponse response, @RequestBody OauthAuthorizeForm form) { - RequestInfoForm requestInfoForm = new RequestInfoForm(); - Authentication auth = SecurityContextHolder.getContext().getAuthentication(); - AuthorizationRequest authorizationRequest = authorizationRequestLocalCache.get(request.getSession().getId()); - if (requestInfoFormLocalCache.containsKey(request.getSession().getId())) { - requestInfoForm = requestInfoFormLocalCache.get(request.getSession().getId()); - } else if (authorizationRequest != null) { - requestInfoForm.setRedirectUrl(authorizationRequest.getRedirectUri()); - requestInfoForm.setClientId(authorizationRequest.getClientId()); - } else { - LOGGER.warn("Both authorizationRequest and requestInfoForm caches are empty"); - } - - Map requestParams = new HashMap(authorizationRequest.getRequestParameters()); - Map approvalParams = new HashMap(); - - // Add the persistent token information - if (form.getApproved()) { - requestParams.put(OAuth2Utils.USER_OAUTH_APPROVAL, "true"); - approvalParams.put(OAuth2Utils.USER_OAUTH_APPROVAL, "true"); - } else { - requestParams.put(OAuth2Utils.USER_OAUTH_APPROVAL, "false"); - approvalParams.put(OAuth2Utils.USER_OAUTH_APPROVAL, "false"); - } - requestParams.put(OrcidOauth2Constants.TOKEN_VERSION, OrcidOauth2Constants.PERSISTENT_TOKEN); - // Check if the client have persistent tokens enabled - requestParams.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "false"); - if (hasPersistenTokensEnabled(requestInfoForm.getClientId())) - // Then check if the client granted the persistent token - if (form.getPersistentTokenEnabled()) - requestParams.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "true"); - - // strip /email/read-private scope if user has not consented - if (requestInfoForm.containsEmailReadPrivateScope() && !form.isEmailAccessAllowed()) { - requestInfoForm.removeEmailReadPrivateScope(); - requestParams.put(OrcidOauth2Constants.SCOPE_PARAM, requestInfoForm.getScopesAsString()); - } - - // Session status - SimpleSessionStatus status = new SimpleSessionStatus(); - - authorizationRequest.setRequestParameters(requestParams); - // Authorization request model - Map model = new HashMap(); - model.put("authorizationRequest", authorizationRequest); - Map originalRequest = originalAuthorizationRequestLocalCache.get(request.getSession().getId()); - if(originalRequest != null) { - model.put(OrcidOauth2Constants.ORIGINAL_AUTHORIZATION_REQUEST, originalRequest); - } - - // Approve - try { - RedirectView view = (RedirectView) authorizationEndpoint.approveOrDeny(approvalParams, model, status, auth); - requestInfoForm.setRedirectUrl(view.getUrl()); - } catch (InvalidRequestException ire) { - LOGGER.error("Something changed on the request, here are the authorization request and original authorization request values:"); - LOGGER.error("Client id: original '{}' latest '{}'", originalRequest.get(OrcidOauth2Constants.CLIENT_ID), authorizationRequest.getClientId()); - LOGGER.error("State: original '{}' latest '{}'", originalRequest.get(OrcidOauth2Constants.STATE_PARAM), authorizationRequest.getState()); - LOGGER.error("Redirect uri: original '{}' latest '{}'", originalRequest.get(OrcidOauth2Constants.REDIRECT_URI_PARAM), authorizationRequest.getRedirectUri()); - LOGGER.error("Response type: original '{}' latest '{}'", originalRequest.get(OrcidOauth2Constants.RESPONSE_TYPE_PARAM), authorizationRequest.getResponseTypes()); - LOGGER.error("Scope: original '{}' latest '{}'", originalRequest.get(OrcidOauth2Constants.SCOPE_PARAM), authorizationRequest.getScope()); - LOGGER.error("Approved: original '{}' latest '{}'", originalRequest.get("approved"), authorizationRequest.isApproved()); - LOGGER.error("Resource Ids: original '{}' latest '{}'", originalRequest.get("resourceIds"), authorizationRequest.getResourceIds()); - LOGGER.error("Authorities: original '{}' latest '{}'", originalRequest.get("authorities"), authorizationRequest.getAuthorities()); - // Propagate the exception - throw ire; - } - if (Features.EVENTS.isActive()) { - EventType eventType = "true".equals(approvalParams.get("user_oauth_approval")) ? EventType.AUTHORIZE : EventType.AUTHORIZE_DENY; - String orcid = null; - Object principal = auth.getPrincipal(); - if (principal instanceof UserDetails) { - orcid = ((UserDetails) principal).getUsername(); - } else { - orcid = auth.getPrincipal().toString(); - } - eventManager.createEvent(eventType, request); - } - if(new HttpSessionRequestCache().getRequest(request, response) != null) - new HttpSessionRequestCache().removeRequest(request, response); - LOGGER.info("OauthConfirmAccessController form.getRedirectUri being sent to client browser: " + requestInfoForm.getRedirectUrl()); - //Oauth has been finalized, hence, remove the oauth flag from the session - - // Remove the request info form from the cache - requestInfoFormLocalCache.remove(request.getSession().getId()); - - request.getSession().removeAttribute(OrcidOauth2Constants.OAUTH_2SCREENS); - return requestInfoForm; - } - - /** - * Copies all request parameters into the provided params map - * - * @param request - * The server request - * @param params - * The map to copy the params - * */ - private void copyRequestParameters(HttpServletRequest request, Map params) { - if (request != null && request.getParameterMap() != null) { - Map savedParams = request.getParameterMap(); - copy(savedParams, params); - } - } - - private ModelAndView redirectToForceSignin(HttpServletRequest request) { - String q = request.getQueryString(); - q = removeQueryStringParams(q,"prompt","max_age"); - q += "&prompt=login"; - RedirectView rView = new RedirectView(orcidUrlManager.getBaseUrl() + "/signin?oauth&" +q); - ModelAndView m = new ModelAndView(); - m.setView(rView); - return m; - } - -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthControllerBase.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthControllerBase.java deleted file mode 100644 index e883d8f5a8c..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthControllerBase.java +++ /dev/null @@ -1,168 +0,0 @@ -package org.orcid.frontend.web.controllers; - -import java.util.Map; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; - -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.ProfileEntityCacheManager; -import org.orcid.core.manager.v3.read_only.RecordNameManagerReadOnly; -import org.orcid.core.oauth.service.OrcidAuthorizationEndpoint; -import org.orcid.core.oauth.service.OrcidOAuth2RequestValidator; -import org.orcid.authorization.authentication.MFAWebAuthenticationDetails; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.common.util.OAuth2Utils; - -@Deprecated -public class OauthControllerBase extends BaseController { - protected static String REDIRECT_URI_ERROR = "/oauth/error/redirect-uri-mismatch?client_id={0}"; - - @Resource - protected ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource - protected OrcidOAuth2RequestValidator orcidOAuth2RequestValidator; - - @Resource - protected ProfileEntityCacheManager profileEntityCacheManager; - - @Resource - protected AuthenticationManager authenticationManager; - - @Resource - protected OrcidAuthorizationEndpoint authorizationEndpoint; - - @Resource(name = "recordNameManagerReadOnlyV3") - private RecordNameManagerReadOnly recordNameManagerReadOnly; - - public AuthenticationManager getAuthenticationManager() { - return authenticationManager; - } - - public void setAuthenticationManager(AuthenticationManager authenticationManager) { - this.authenticationManager = authenticationManager; - } - - public OrcidAuthorizationEndpoint getAuthorizationEndpoint() { - return authorizationEndpoint; - } - - public void setAuthorizationEndpoint(OrcidAuthorizationEndpoint authorizationEndpoint) { - this.authorizationEndpoint = authorizationEndpoint; - } - - protected void fillOauthParams(RequestInfoForm requestInfoForm, Map params, Map approvalParams, boolean userEnabledPersistentTokens, boolean allowEmailAccess) { - if (requestInfoForm.containsEmailReadPrivateScope() && !allowEmailAccess) { - requestInfoForm.removeEmailReadPrivateScope(); - } - - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString())) { - params.put(OrcidOauth2Constants.SCOPE_PARAM, requestInfoForm.getScopesAsString()); - } - - params.put(OrcidOauth2Constants.TOKEN_VERSION, OrcidOauth2Constants.PERSISTENT_TOKEN); - params.put(OrcidOauth2Constants.CLIENT_ID_PARAM, requestInfoForm.getClientId()); - - // Redirect URI - if (!PojoUtil.isEmpty(requestInfoForm.getRedirectUrl())) { - params.put(OrcidOauth2Constants.REDIRECT_URI_PARAM, requestInfoForm.getRedirectUrl()); - } else { - params.put(OrcidOauth2Constants.REDIRECT_URI_PARAM, new String()); - } - - // Response type - if (!PojoUtil.isEmpty(requestInfoForm.getResponseType())) { - params.put(OrcidOauth2Constants.RESPONSE_TYPE_PARAM, requestInfoForm.getResponseType()); - } - // State param - if (!PojoUtil.isEmpty(requestInfoForm.getStateParam())) { - params.put(OrcidOauth2Constants.STATE_PARAM, requestInfoForm.getStateParam()); - } - - // Set approval params - params.put(OAuth2Utils.USER_OAUTH_APPROVAL, "true"); - approvalParams.put(OAuth2Utils.USER_OAUTH_APPROVAL, "true"); - - // Set persistent token flag - if(requestInfoForm.getClientHavePersistentTokens() && userEnabledPersistentTokens) { - params.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "true"); - } else { - params.put(OrcidOauth2Constants.GRANT_PERSISTENT_TOKEN, "false"); - } - - //OpenID connect - if (!PojoUtil.isEmpty(requestInfoForm.getNonce())){ - params.put(OrcidOauth2Constants.NONCE, requestInfoForm.getNonce()); - } - } - - /** - * Builds the redirect uri string to use when the user deny the request - * - * @param redirectUri - * Redirect uri - * @return the redirect uri string with the deny params - */ - protected String buildDenyRedirectUri(String redirectUri, String stateParam) { - if (!PojoUtil.isEmpty(redirectUri)) { - if (redirectUri.contains("?")) { - redirectUri = redirectUri.concat("&error=access_denied&error_description=User denied access"); - } else { - redirectUri = redirectUri.concat("?error=access_denied&error_description=User denied access"); - } - } - if (!PojoUtil.isEmpty(stateParam)) - redirectUri += "&state=" + stateParam; - return redirectUri; - } - - protected void copy(Map savedParams, Map params) { - if (savedParams != null && !savedParams.isEmpty()) { - for (String key : savedParams.keySet()) { - String[] values = savedParams.get(key); - if (values != null && values.length > 0) - params.put(key, values[0]); - } - } - } - - /***************************** - * Authenticate user methods - ****************************/ - protected Authentication authenticateUser(HttpServletRequest request, String email, String password) { - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(email, password); - token.setDetails(new MFAWebAuthenticationDetails(request)); - Authentication authentication = authenticationManager.authenticate(token); - SecurityContextHolder.getContext().setAuthentication(authentication); - return authentication; - } - - /** - * Checks if the client has the persistent tokens enabled - * - * @return true if the persistent tokens are enabled for that client - * @throws IllegalArgumentException - */ - protected boolean hasPersistenTokensEnabled(String clientId) throws IllegalArgumentException { - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(clientId); - if (clientDetails == null) - throw new IllegalArgumentException(getMessage("web.orcid.oauth_invalid_client.exception")); - return clientDetails.isPersistentTokensEnabled(); - } - - protected String removeQueryStringParams(String queryString, String... params) { - for (String param : params) { - String keyValue = param + "=[^&]*?"; - queryString = queryString.replaceAll("(&" + keyValue + "(?=(&|$))|^" + keyValue + "(&|$))", ""); - } - return queryString; - } -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthGenericCallsController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthGenericCallsController.java index 44a8a3bcc91..57370404f8a 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthGenericCallsController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthGenericCallsController.java @@ -1,64 +1,40 @@ package org.orcid.frontend.web.controllers; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; -import java.util.Enumeration; import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedHashMap; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.orcid.core.oauth.authorizationServer.AuthorizationServerUtil; -import org.orcid.api.common.oauth.OrcidClientCredentialEndPointDelegator; import org.orcid.core.constants.OrcidOauth2Constants; import org.orcid.core.oauth.OAuthError; import org.orcid.core.oauth.OAuthErrorUtils; import org.orcid.core.togglz.Features; -import org.orcid.frontend.util.RequestInfoFormLocalCache; -import org.orcid.pojo.ajaxForm.OauthAuthorizeForm; -import org.orcid.pojo.ajaxForm.OauthRegistrationForm; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.orcid.pojo.ajaxForm.Text; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; import static org.orcid.core.constants.OrcidOauth2Constants.IETF_EXCHANGE_GRANT_TYPE; @Controller("oauthGenericCallsController") -public class OauthGenericCallsController extends OauthControllerBase { +public class OauthGenericCallsController { private static final Logger logger = Logger.getLogger(OauthGenericCallsController.class); - @Resource - private RegistrationController registrationController; - - @Resource - private OrcidClientCredentialEndPointDelegator orcidClientCredentialEndPointDelegator; - @Context private UriInfo uriInfo; - @Resource - private RequestInfoFormLocalCache requestInfoFormLocalCache; - @Resource private AuthorizationServerUtil authorizationServerUtil; @@ -72,50 +48,32 @@ public ResponseEntity obtainOauth2TokenPost(HttpServletRequest request) throw error.setResponseStatus(Response.Status.BAD_REQUEST); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error); } - if(Features.OAUTH_AUTHORIZATION_CODE_EXCHANGE.isActive()) { - try { - Response response = null; - if(StringUtils.isNotBlank(request.getHeader("Authorization"))) { - response = handleBasicAuthentication(grantType, request); - } else { - response = handlePlainClientCredentials(grantType, request); - } - HttpHeaders responseHeaders = new HttpHeaders(); - responseHeaders.set(Features.OAUTH_AUTHORIZATION_CODE_EXCHANGE.name(), - "ON"); - return ResponseEntity.status(response.getStatus()).headers(responseHeaders).body(response.getEntity()); - } catch(Exception e) { - OAuthError error = OAuthErrorUtils.getOAuthError(e); - Map params = request.getParameterMap(); - if(params != null && !params.isEmpty()) { - String paramList = params.entrySet().stream() - .map(entry -> { - String paramValues = (entry.getValue() == null || entry.getValue().length == 0) ? "-NOTHING-" : String.join(",", entry.getValue()); - return entry.getKey() + "=" + paramValues; - }) - .collect(Collectors.joining(", ")); - logger.error("Exception sending request to authorization server: " + error.getErrorDescription() + " - Param list: " + paramList, e); - } - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(error); - } - } else { - String authorization = request.getHeader("Authorization"); - Enumeration paramNames = request.getParameterNames(); - MultivaluedMap formParams = new MultivaluedHashMap(); - while(paramNames.hasMoreElements()) { - String paramName = paramNames.nextElement(); - formParams.add(paramName, request.getParameter(paramName)); + try { + Response response = null; + if(StringUtils.isNotBlank(request.getHeader("Authorization"))) { + response = handleBasicAuthentication(grantType, request); + } else { + response = handlePlainClientCredentials(grantType, request); } - try { - Response response = orcidClientCredentialEndPointDelegator.obtainOauth2Token(authorization, formParams); - return ResponseEntity.status(response.getStatus()).body(response.getEntity()); - } catch(Exception e) { - OAuthError error = OAuthErrorUtils.getOAuthError(e); - HttpStatus status = HttpStatus.valueOf(error.getResponseStatus().getStatusCode()); - return ResponseEntity.status(status).body(error); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.set(Features.OAUTH_AUTHORIZATION_CODE_EXCHANGE.name(), + "ON"); + return ResponseEntity.status(response.getStatus()).headers(responseHeaders).body(response.getEntity()); + } catch(Exception e) { + OAuthError error = OAuthErrorUtils.getOAuthError(e); + Map params = request.getParameterMap(); + if(params != null && !params.isEmpty()) { + String paramList = params.entrySet().stream() + .map(entry -> { + String paramValues = (entry.getValue() == null || entry.getValue().length == 0) ? "-NOTHING-" : String.join(",", entry.getValue()); + return entry.getKey() + "=" + paramValues; + }) + .collect(Collectors.joining(", ")); + logger.error("Exception sending request to authorization server: " + error.getErrorDescription() + " - Param list: " + paramList, e); } + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(error); } } @@ -183,90 +141,4 @@ private Response handleBasicAuthentication(String grantType, HttpServletRequest return response; } - - @RequestMapping(value = "/oauth/custom/authorize/get_request_info_form.json", method = RequestMethod.GET) - public @ResponseBody RequestInfoForm getRequestInfoForm(HttpServletRequest request) throws UnsupportedEncodingException { - RequestInfoForm requestInfoForm = new RequestInfoForm(); - if(requestInfoFormLocalCache.containsKey(request.getSession().getId())) { - requestInfoForm = requestInfoFormLocalCache.get(request.getSession().getId()); - } - return requestInfoForm; - } - - @RequestMapping(value = "/oauth/custom/authorize/empty.json", method = RequestMethod.GET) - public @ResponseBody OauthAuthorizeForm getEmptyAuthorizeForm(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { - OauthAuthorizeForm empty = new OauthAuthorizeForm(); - Text emptyText = Text.valueOf(StringUtils.EMPTY); - empty.setPassword(emptyText); - empty.setUserName(emptyText); - - RequestInfoForm requestInfoForm = getRequestInfoForm(request); - if(requestInfoForm != null) { - if(!PojoUtil.isEmpty(requestInfoForm.getUserId())) { - empty.setUserName(Text.valueOf(requestInfoForm.getUserId())); - } - } - - return empty; - } - - /***************************** - * Validators - ****************************/ - @RequestMapping(value = "/oauth/custom/register/validateActivitiesVisibilityDefault.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm validateActivitiesVisibilityDefaul(@RequestBody OauthRegistrationForm reg) { - registrationController.registerActivitiesVisibilityDefaultValidate(reg); - return reg; - } - - @RequestMapping(value = "/oauth/custom/register/validatePasswordConfirm.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm validatePasswordConfirm(@RequestBody OauthRegistrationForm reg) { - registrationController.registerPasswordConfirmValidate(reg); - return reg; - } - - @RequestMapping(value = "/oauth/custom/register/validatePassword.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm validatePassword(@RequestBody OauthRegistrationForm reg) { - registrationController.registerPasswordValidate(reg); - return reg; - } - - @RequestMapping(value = "/oauth/custom/register/validateTermsOfUse.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm validateTermsOfUse(@RequestBody OauthRegistrationForm reg) { - registrationController.registerTermsOfUseValidate(reg); - return reg; - } - - @RequestMapping(value = "/oauth/custom/register/validateGivenNames.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm validateGivenName(@RequestBody OauthRegistrationForm reg) { - - registrationController.registerGivenNameValidate(reg); - return reg; - } - - - @RequestMapping(value = "/oauth/custom/register/validateFamilyNames.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm validateFamilyName(@RequestBody OauthRegistrationForm reg) { - - registrationController.registerFamilyNameValidate(reg); - return reg; - } - - @RequestMapping(value = "/oauth/custom/register/validateEmail.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm validateEmail(HttpServletRequest request, @RequestBody OauthRegistrationForm reg) { - registrationController.regEmailValidate(request, reg, true, false); - return reg; - } - - @RequestMapping(value = "/oauth/custom/register/validateEmailConfirm.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm validateEmailConfirm(@RequestBody OauthRegistrationForm reg) { - registrationController.regEmailConfirmValidate(reg); - return reg; - } - - @RequestMapping(value = "/oauth/custom/register/validateEmailsAdditional.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm validateEmailsAdditional(HttpServletRequest request, @RequestBody OauthRegistrationForm reg) { - additionalEmailsValidateOnRegister(request, reg); - return reg; - } } diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthLoginController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthLoginController.java deleted file mode 100644 index 91b838aa8b7..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthLoginController.java +++ /dev/null @@ -1,216 +0,0 @@ -package org.orcid.frontend.web.controllers; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.exception.ClientDeactivatedException; -import org.orcid.core.exception.LockedException; -import org.orcid.core.manager.v3.ProfileEntityManager; -import org.orcid.core.security.UnclaimedProfileExistsException; -import org.orcid.core.utils.OrcidRequestUtil; -import org.orcid.authorization.authentication.MFAWebAuthenticationDetails; -import org.orcid.frontend.util.RequestInfoFormLocalCache; -import org.orcid.frontend.web.controllers.helper.OauthHelper; -import org.orcid.frontend.web.exception.Bad2FARecoveryCodeException; -import org.orcid.frontend.web.exception.Bad2FAVerificationCodeException; -import org.orcid.frontend.web.exception.VerificationCodeFor2FARequiredException; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.pojo.ajaxForm.OauthAuthorizeForm; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.authentication.DisabledException; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.oauth2.common.exceptions.InvalidScopeException; -import org.springframework.security.oauth2.common.exceptions.RedirectMismatchException; -import org.springframework.security.web.savedrequest.HttpSessionRequestCache; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.support.SimpleSessionStatus; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.view.RedirectView; - -@Deprecated -@Controller("oauthLoginController") -public class OauthLoginController extends OauthControllerBase { - private static final Logger LOGGER = LoggerFactory.getLogger(OauthLoginController.class); - - @Resource(name = "profileEntityManagerV3") - private ProfileEntityManager profileEntityManager; - - @Resource - private OauthHelper oauthHelper; - - @Resource - private RequestInfoFormLocalCache requestInfoFormLocalCache; - - @RequestMapping(value = { "/oauth/signin", "/oauth/login" }, method = RequestMethod.GET) - public ModelAndView loginGetHandler(HttpServletRequest request, HttpServletResponse response, ModelAndView mav) throws UnsupportedEncodingException { - String url = request.getQueryString(); - // Get and save the request information form - RequestInfoForm requestInfoForm = oauthHelper.generateRequestInfoForm(url); - // Store the request info form in the cache - requestInfoFormLocalCache.put(request.getSession().getId(), requestInfoForm); - - // Check that the client have the required permissions - // Get client name - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(requestInfoForm.getClientId()); - - // validate client scopes - try { - authorizationEndpoint.validateScope(requestInfoForm.getScopesAsString(), clientDetails,requestInfoForm.getResponseType()); - orcidOAuth2RequestValidator.validateClientIsEnabled(clientDetails); - } catch (InvalidScopeException | ClientDeactivatedException | LockedException e) { - String redirectUriWithParams = requestInfoForm.getRedirectUrl(); - if (e instanceof InvalidScopeException) { - redirectUriWithParams += "?error=invalid_scope&error_description=" + e.getMessage(); - } else if (e instanceof LockedException) { - redirectUriWithParams += "?error=client_locked&error_description=" + e.getMessage(); - } else { - redirectUriWithParams += "?error=client_deactivated&error_description=" + e.getMessage(); - } - RedirectView rView = new RedirectView(redirectUriWithParams); - ModelAndView error = new ModelAndView(); - error.setView(rView); - return error; - } - - //handle openID behaviour - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString()) && ScopePathType.getScopesFromSpaceSeparatedString(requestInfoForm.getScopesAsString()).contains(ScopePathType.OPENID) ){ - String prompt = request.getParameter(OrcidOauth2Constants.PROMPT); - if (prompt != null && prompt.equals(OrcidOauth2Constants.PROMPT_NONE)){ - String redirectUriWithParams = requestInfoForm.getRedirectUrl(); - redirectUriWithParams += "?error=login_required"; - RedirectView rView = new RedirectView(redirectUriWithParams); - ModelAndView error = new ModelAndView(); - error.setView(rView); - return error; - } - } - mav.addObject("noIndex", true); - mav.addObject("hideSupportWidget", true); - mav.setViewName("oauth_login"); - return mav; - } - - @RequestMapping(value = { "/oauth/custom/signin.json", "/oauth/custom/login.json" }, method = RequestMethod.POST) - public @ResponseBody OauthAuthorizeForm authenticateAndAuthorize(HttpServletRequest request, HttpServletResponse response, @RequestBody OauthAuthorizeForm form) { - // Clean form errors - form.setErrors(new ArrayList()); - RequestInfoForm requestInfoForm = requestInfoFormLocalCache.get(request.getSession().getId()); - - boolean willBeRedirected = false; - if (form.getApproved()) { - // Validate name and password - validateUserNameAndPassword(form); - if (form.getErrors().isEmpty()) { - try { - // Authenticate user - copy2FAFields(form, request); - Authentication auth = authenticateUser(request, form.getUserName().getValue(), form.getPassword().getValue()); - profileEntityManager.updateLastLoginDetails(auth.getName(), OrcidRequestUtil.getIpAddress(request)); - - // Create authorization params - SimpleSessionStatus status = new SimpleSessionStatus(); - Map model = new HashMap(); - Map params = new HashMap(); - Map approvalParams = new HashMap(); - - fillOauthParams(requestInfoForm, params, approvalParams, form.getPersistentTokenEnabled(), form.isEmailAccessAllowed()); - - // Authorize - try { - authorizationEndpoint.authorize(model, params, status, auth); - } catch (RedirectMismatchException rUriError) { - String redirectUri = this.getBaseUri() + REDIRECT_URI_ERROR; - // Set the client id - redirectUri = redirectUri.replace("{0}", requestInfoForm.getClientId()); - // Set the response type if needed - if (!PojoUtil.isEmpty(requestInfoForm.getResponseType())) - redirectUri += "&response_type=" + requestInfoForm.getResponseType(); - // Set the redirect uri - if (!PojoUtil.isEmpty(requestInfoForm.getRedirectUrl())) - redirectUri += "&redirect_uri=" + requestInfoForm.getRedirectUrl(); - // Set the scope param - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString())) - redirectUri += "&scope=" + requestInfoForm.getScopesAsString(); - // Copy the state param if present - if (!PojoUtil.isEmpty(requestInfoForm.getStateParam())) - redirectUri += "&state=" + requestInfoForm.getStateParam(); - form.setRedirectUrl(redirectUri); - LOGGER.info("OauthLoginController being sent to client browser: " + form.getRedirectUrl()); - return form; - } - // Approve - RedirectView view = (RedirectView) authorizationEndpoint.approveOrDeny(approvalParams, model, status, auth); - form.setRedirectUrl(view.getUrl()); - willBeRedirected = true; - - - } catch (AuthenticationException ae) { - if(ae.getCause() instanceof DisabledException){ - // Handle this message in angular to allow AJAX action - form.getErrors().add("orcid.frontend.security.orcid_deactivated"); - } else if(ae.getCause() instanceof UnclaimedProfileExistsException) { - String email = PojoUtil.isEmpty(form.getUserName()) ? null : form.getUserName().getValue(); - String resendEmailUrl = createResendClaimUrl(email, request); - String errorMessage = getMessage("orcid.frontend.security.unclaimed_exists_1"); - errorMessage += ""; - errorMessage += getMessage("orcid.frontend.security.unclaimed_exists_2"); - errorMessage += "" + getMessage("orcid.frontend.security.unclaimed_exists_3"); - form.getErrors().add(errorMessage); - } else if (ae instanceof VerificationCodeFor2FARequiredException) { - form.setVerificationCodeRequired(true); - } else if (ae instanceof Bad2FAVerificationCodeException) { - form.getErrors().add(getMessage("orcid.frontend.security.2fa.bad_verification_code")); - } else if (ae instanceof Bad2FARecoveryCodeException) { - form.getErrors().add(getMessage("orcid.frontend.security.2fa.bad_recovery_code")); - } else { - form.getErrors().add(getMessage("orcid.frontend.security.bad_credentials")); - } - } - } - } else { - form.setRedirectUrl(buildDenyRedirectUri(requestInfoForm.getRedirectUrl(), requestInfoForm.getStateParam())); - willBeRedirected = true; - } - - // If there was an authentication error, dont log since the user will - // not be redirected yet - if (willBeRedirected) { - if (new HttpSessionRequestCache().getRequest(request, response) != null) - new HttpSessionRequestCache().removeRequest(request, response); - LOGGER.info("OauthConfirmAccessController form.getRedirectUri being sent to client browser: " + requestInfoForm.getRedirectUrl()); - } - return form; - } - - private void copy2FAFields(OauthAuthorizeForm form, HttpServletRequest request) { - if (form.getVerificationCode() != null) { - request.setAttribute(MFAWebAuthenticationDetails.VERIFICATION_CODE_PARAMETER, form.getVerificationCode().getValue()); - } - - if (form.getRecoveryCode() != null) { - request.setAttribute(MFAWebAuthenticationDetails.RECOVERY_CODE_PARAMETER, form.getRecoveryCode().getValue()); - } - } - - private void validateUserNameAndPassword(OauthAuthorizeForm form) { - if (PojoUtil.isEmpty(form.getUserName()) || PojoUtil.isEmpty(form.getPassword())) { - form.getErrors().add(getMessage("orcid.frontend.security.bad_credentials")); - } - } -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthRegistrationController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthRegistrationController.java deleted file mode 100644 index 45d177c8fd0..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OauthRegistrationController.java +++ /dev/null @@ -1,224 +0,0 @@ -package org.orcid.frontend.web.controllers; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.lang.StringUtils; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.utils.OrcidRequestUtil; -import org.orcid.frontend.util.RequestInfoFormLocalCache; -import org.orcid.frontend.web.controllers.helper.OauthHelper; -import org.orcid.jaxb.model.message.CreationMethod; -import org.orcid.pojo.ajaxForm.OauthRegistrationForm; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.orcid.pojo.ajaxForm.Text; -import org.orcid.utils.OrcidStringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.common.exceptions.RedirectMismatchException; -import org.springframework.security.web.savedrequest.HttpSessionRequestCache; -import org.springframework.security.web.savedrequest.SavedRequest; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.support.SimpleSessionStatus; -import org.springframework.web.servlet.support.RequestContextUtils; -import org.springframework.web.servlet.view.RedirectView; - -@Controller("oauthRegisterController") -public class OauthRegistrationController extends OauthControllerBase { - private static final Logger LOGGER = LoggerFactory.getLogger(OauthRegistrationController.class); - @Resource - private RegistrationController registrationController; - - @Resource - private RequestInfoFormLocalCache requestInfoFormLocalCache; - - public RegistrationController getRegistrationController() { - return registrationController; - } - - public void setRequestInfoFormLocalCache(RequestInfoFormLocalCache requestInfoFormLocalCache) { - this.requestInfoFormLocalCache = requestInfoFormLocalCache; - } - - public void setRegistrationController(RegistrationController registrationController) { - this.registrationController = registrationController; - } - - @RequestMapping(value = "/oauth/custom/register/empty.json", method = RequestMethod.GET) - public @ResponseBody OauthRegistrationForm getRegister(HttpServletRequest request, HttpServletResponse response) { - // Remove the session hash if needed - if (request.getSession().getAttribute(RegistrationController.GRECAPTCHA_SESSION_ATTRIBUTE_NAME) != null) { - request.getSession().removeAttribute(RegistrationController.GRECAPTCHA_SESSION_ATTRIBUTE_NAME); - } - OauthRegistrationForm empty = new OauthRegistrationForm(registrationController.getRegister(request, response)); - // Creation type in oauth will always be member referred - empty.setCreationType(Text.valueOf(CreationMethod.MEMBER_REFERRED.value())); - Text emptyText = Text.valueOf(StringUtils.EMPTY); - empty.setPassword(emptyText); - return empty; - } - - @RequestMapping(value = "/oauth/custom/register.json", method = RequestMethod.POST) - public @ResponseBody OauthRegistrationForm checkRegisterForm(HttpServletRequest request, HttpServletResponse response, @RequestBody OauthRegistrationForm form) { - form.setErrors(new ArrayList()); - RequestInfoForm requestInfoForm = requestInfoFormLocalCache.get(request.getSession().getId()); - - if (form.getApproved()) { - registrationController.validateRegistrationFields(request, form); - registrationController.validateGrcaptcha(request, form); - } else { - SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response); - String stateParam = null; - if (savedRequest != null && savedRequest.getParameterMap() != null && savedRequest.getParameterValues("state") != null) { - if (savedRequest.getParameterValues("state").length > 0) - stateParam = savedRequest.getParameterValues("state")[0]; - } - form.setRedirectUrl(buildDenyRedirectUri(requestInfoForm.getRedirectUrl(), stateParam)); - } - - return form; - } - - @RequestMapping(value = "/oauth/custom/registerConfirm.json", method = RequestMethod.POST) - public @ResponseBody RequestInfoForm registerAndAuthorize(HttpServletRequest request, HttpServletResponse response, @RequestBody OauthRegistrationForm form) { - RequestInfoForm requestInfoForm = requestInfoFormLocalCache.get(request.getSession().getId()); - if (form.getApproved()) { - boolean usedCaptcha = false; - - // If recatcha wasn't loaded do nothing. This is for countries that - // block google. - if (form.getGrecaptchaWidgetId().getValue() != null) { - // If the captcha verified key is not in the session, redirect - // to the login page - if (request.getSession().getAttribute(RegistrationController.GRECAPTCHA_SESSION_ATTRIBUTE_NAME) == null - || PojoUtil.isEmpty(form.getGrecaptcha()) - || !form.getGrecaptcha().getValue().equals( - request.getSession().getAttribute(RegistrationController.GRECAPTCHA_SESSION_ATTRIBUTE_NAME))) { - String redirectUri = this.getBaseUri() + REDIRECT_URI_ERROR; - // Set the client id - redirectUri = redirectUri.replace("{0}", requestInfoForm.getClientId()); - // Set the response type if needed - if (!PojoUtil.isEmpty(requestInfoForm.getResponseType())) - redirectUri += "&response_type=" + requestInfoForm.getResponseType(); - // Set the redirect uri - if (!PojoUtil.isEmpty(requestInfoForm.getRedirectUrl())) - redirectUri += "&redirect_uri=" + requestInfoForm.getRedirectUrl(); - // remove email access scope if present but not granted - if (requestInfoForm.containsEmailReadPrivateScope() && !form.isEmailAccessAllowed()) { - requestInfoForm.removeEmailReadPrivateScope(); - } - // Set the scope param - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString())) - redirectUri += "&scope=" + requestInfoForm.getScopesAsString(); - // Copy the state param if present - if (!PojoUtil.isEmpty(requestInfoForm.getStateParam())) - redirectUri += "&state=" + requestInfoForm.getStateParam(); - requestInfoForm.setRedirectUrl(redirectUri); - SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response); - if (savedRequest != null) - LOGGER.info("OauthConfirmAccessController original request: " + savedRequest.getRedirectUrl()); - LOGGER.info("OauthConfirmAccessController form.getRedirectUri being sent to client browser: " + requestInfoForm.getRedirectUrl()); - return requestInfoForm; - } - usedCaptcha = true; - } - - // Remove the session hash if needed - if (request.getSession().getAttribute(RegistrationController.GRECAPTCHA_SESSION_ATTRIBUTE_NAME) != null) { - request.getSession().removeAttribute(RegistrationController.GRECAPTCHA_SESSION_ATTRIBUTE_NAME); - } - - //Strip any html code from names before validating them - if(!PojoUtil.isEmpty(form.getFamilyNames())){ - form.getFamilyNames().setValue(OrcidStringUtils.stripHtml(form.getFamilyNames().getValue())); - } - - if(!PojoUtil.isEmpty(form.getGivenNames())) { - form.getGivenNames().setValue(OrcidStringUtils.stripHtml(form.getGivenNames().getValue())); - } - - // Check there are no errors - registrationController.validateRegistrationFields(request, form); - if (form.getErrors().isEmpty()) { - // Register user - try { - // Locale - Locale locale = RequestContextUtils.getLocale(request); - // Ip - String ip = OrcidRequestUtil.getIpAddress(request); - registrationController.createMinimalRegistration(request, form, usedCaptcha, locale, ip); - } catch(Exception e) { - LOGGER.error("Error registering a new user", e); - requestInfoForm.getErrors().add(getMessage("register.error.generalError")); - return requestInfoForm; - } - // Authenticate user - String email = form.getEmail().getValue(); - String password = form.getPassword().getValue(); - Authentication auth = authenticateUser(request, email, password); - // Create authorization params - SimpleSessionStatus status = new SimpleSessionStatus(); - Map model = new HashMap(); - Map params = new HashMap(); - Map approvalParams = new HashMap(); - - fillOauthParams(requestInfoForm, params, approvalParams, form.getPersistentTokenEnabled(), form.isEmailAccessAllowed()); - - // Authorize - try { - authorizationEndpoint.authorize(model, params, status, auth); - } catch (RedirectMismatchException rUriError) { - String redirectUri = this.getBaseUri() + REDIRECT_URI_ERROR; - // Set the client id - redirectUri = redirectUri.replace("{0}", requestInfoForm.getClientId()); - // Set the response type if needed - if (!PojoUtil.isEmpty(requestInfoForm.getResponseType())) - redirectUri += "&response_type=" + requestInfoForm.getResponseType(); - // Set the redirect uri - if (!PojoUtil.isEmpty(requestInfoForm.getRedirectUrl())) - redirectUri += "&redirect_uri=" + requestInfoForm.getRedirectUrl(); - // Set the scope param - if (!PojoUtil.isEmpty(requestInfoForm.getScopesAsString())) - redirectUri += "&scope=" + requestInfoForm.getScopesAsString(); - // Copy the state param if present - if (!PojoUtil.isEmpty(requestInfoForm.getStateParam())) - redirectUri += "&state=" + requestInfoForm.getStateParam(); - requestInfoForm.setRedirectUrl(redirectUri); - LOGGER.info("OauthRegisterController being sent to client browser: " + requestInfoForm.getRedirectUrl()); - return requestInfoForm; - } - - Boolean isOauth2ScreensRequest = (Boolean) request.getSession().getAttribute(OrcidOauth2Constants.OAUTH_2SCREENS); - if(isOauth2ScreensRequest != null && isOauth2ScreensRequest) { - // Just redirect to the authorization screen - String queryString = (String) request.getSession().getAttribute(OrcidOauth2Constants.OAUTH_QUERY_STRING); - requestInfoForm.setRedirectUrl(orcidUrlManager.getBaseUrl() + "/oauth/authorize?" + queryString); - request.getSession().removeAttribute(OrcidOauth2Constants.OAUTH_2SCREENS); - } else { - // Approve - RedirectView view = (RedirectView) authorizationEndpoint.approveOrDeny(approvalParams, model, status, auth); - requestInfoForm.setRedirectUrl(view.getUrl()); - } - } - } else { - requestInfoForm.setRedirectUrl(buildDenyRedirectUri(requestInfoForm.getRedirectUrl(), requestInfoForm.getStateParam())); - } - - if(new HttpSessionRequestCache().getRequest(request, response) != null) - new HttpSessionRequestCache().removeRequest(request, response); - LOGGER.info("OauthConfirmAccessController form.getRedirectUri being sent to client browser: " + requestInfoForm.getRedirectUrl()); - return requestInfoForm; - } -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OpenIDController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OpenIDController.java index e07a47db3ec..7af19076952 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OpenIDController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OpenIDController.java @@ -1,51 +1,43 @@ package org.orcid.frontend.web.controllers; import java.io.IOException; +import java.net.URISyntaxException; +import java.util.Arrays; import java.util.Set; import java.util.regex.Pattern; +import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.codehaus.jettison.json.JSONException; import org.orcid.core.manager.v3.read_only.PersonDetailsManagerReadOnly; -import org.orcid.core.oauth.openid.OpenIDConnectDiscoveryService; -import org.orcid.core.oauth.openid.OpenIDConnectKeyService; +import org.orcid.core.oauth.authorizationServer.AuthorizationServerUtil; import org.orcid.core.oauth.openid.OpenIDConnectUserInfo; import org.orcid.jaxb.model.message.ScopePathType; import org.orcid.jaxb.model.v3.release.record.Person; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; - -import net.minidev.json.JSONObject; +import org.codehaus.jettison.json.JSONObject; @Controller public class OpenIDController { - - @Resource - private OpenIDConnectKeyService openIDConnectKeyService; @Resource(name = "personDetailsManagerReadOnlyV3") private PersonDetailsManagerReadOnly personDetailsManagerReadOnly; - @Resource(name="orcidTokenStore") - private TokenStore tokenStore; - - @Resource OpenIDConnectDiscoveryService openIDConnectDiscoveryService; - + @Resource + private AuthorizationServerUtil authorizationServerUtil; + @Value("${org.orcid.core.baseUri}") private String path; @@ -59,7 +51,8 @@ public class OpenIDController { */ @RequestMapping(value = "/oauth/jwks", method = RequestMethod.GET, produces = "application/json") public @ResponseBody JSONObject getJWKS(HttpServletRequest request) { - return openIDConnectKeyService.getPublicJWK().toJSONObject(); + //TODO: This should be a FW proxy to the auth server, maybe from nginx + throw new UnsupportedOperationException("Should be requested from the auth server"); } /** Manually checks bearer token in header, looks up user or throws 403. @@ -68,7 +61,7 @@ public class OpenIDController { * @throws IOException */ @RequestMapping(value = "/oauth/userinfo", method = RequestMethod.GET, produces = "application/json") - public @ResponseBody ResponseEntity getUserInfo(HttpServletRequest request) throws IOException{ + public @ResponseBody ResponseEntity getUserInfo(HttpServletRequest request) throws IOException, JSONException, URISyntaxException, InterruptedException { if (request.getHeader("Authorization") != null) {//look in header String tokenValue = request.getHeader("Authorization").replaceAll("Bearer|bearer", "").trim(); OpenIDConnectUserInfo info = getInfoFromToken(tokenValue); @@ -79,7 +72,7 @@ public class OpenIDController { } @RequestMapping(value = "/oauth/userinfo", method = RequestMethod.POST, produces = "application/json") - public @ResponseBody ResponseEntity getUserInfoPOST(HttpServletRequest request) throws IOException{ + public @ResponseBody ResponseEntity getUserInfoPOST(HttpServletRequest request) throws IOException, JSONException, URISyntaxException, InterruptedException { if (request.getParameter("access_token") != null) { OpenIDConnectUserInfo info = getInfoFromToken(request.getParameter("access_token")); if (info != null) @@ -90,22 +83,31 @@ public class OpenIDController { //lookup token, check it's valid, check scope. //deal with incorrect bearer case in request (I'm looking at you spring security!) - private OpenIDConnectUserInfo getInfoFromToken(String tokenValue) { - OAuth2AccessToken tok = tokenStore.readAccessToken(tokenValue); - if (tok != null && !tok.isExpired()){ - boolean hasScope = false; - Set requestedScopes = ScopePathType.getScopesFromStrings(tok.getScope()); - for (ScopePathType scope : requestedScopes) { - if (scope.hasScope(ScopePathType.AUTHENTICATE)) { - hasScope = true; + private OpenIDConnectUserInfo getInfoFromToken(String tokenValue) throws JSONException, IOException, URISyntaxException, InterruptedException { + //TODO: Refactor this to get the information from the database + // This is unexpected and should be done with token introspection form the oauth server + JSONObject tokenInfo = authorizationServerUtil.tokenIntrospection(tokenValue); + if(tokenInfo == null) { + return null; + } + + boolean isTokenActive = tokenInfo.getBoolean("active"); + + if(isTokenActive) { + // If the token is user revoked it might be used for DELETE requests + Set scopes = Arrays.stream(tokenInfo.getString("scope").split("[\\s,]+")) + .collect(Collectors.toSet()); + OpenIDConnectUserInfo info = null; + for(String scope : scopes) { + ScopePathType scopePathType = ScopePathType.fromValue(scope); + if(scopePathType.hasScope(ScopePathType.AUTHENTICATE)) { + String orcid = tokenInfo.getString("username"); + Person person = personDetailsManagerReadOnly.getPublicPersonDetails(orcid); + return new OpenIDConnectUserInfo(orcid,person,path); } } - if (hasScope){ - String orcid = tok.getAdditionalInformation().get("orcid").toString(); - Person person = personDetailsManagerReadOnly.getPublicPersonDetails(orcid); - return new OpenIDConnectUserInfo(orcid,person,path); - } - } + return info; + } return null; } @@ -118,20 +120,18 @@ private OpenIDConnectUserInfo getInfoFromToken(String tokenValue) { */ @RequestMapping(value = "/.well-known/openid-configuration", method = RequestMethod.GET, produces = "application/json") public @ResponseBody String getOpenIDDiscovery(HttpServletRequest request) throws JsonProcessingException { - ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); - String json = ow.writeValueAsString(openIDConnectDiscoveryService.getConfig()); - return json; + //TODO: This should be a FW proxy to the auth server, maybe from nginx + throw new UnsupportedOperationException("Should be requested from the auth server"); } - - @JsonInclude(Include.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) public static class OpenIDConnectUserInfoAccessDenied extends OpenIDConnectUserInfo{ @JsonProperty("error") String error = "access_denied"; @JsonProperty("error-description") String errorDescription="access_token is invalid"; OpenIDConnectUserInfoAccessDenied(){ - + } } } diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OrgController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OrgController.java index 3e4ddb345dc..9c9778db8a8 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OrgController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/OrgController.java @@ -1,6 +1,6 @@ package org.orcid.frontend.web.controllers; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.OrgDisambiguatedManager; import org.orcid.core.manager.v3.OrgManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PIDController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PIDController.java index 04edcdd27fc..1ee7c88c412 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PIDController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PIDController.java @@ -1,6 +1,6 @@ package org.orcid.frontend.web.controllers; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.orcid.core.utils.v3.identifiers.PIDNormalizationService; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PasswordResetController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PasswordResetController.java index 248ec8286ca..d1bc8b935a6 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PasswordResetController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PasswordResetController.java @@ -10,11 +10,11 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.MediaType; import org.apache.commons.codec.binary.Base64; import org.jasypt.exceptions.EncryptionOperationNotPossibleException; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PeerReviewsController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PeerReviewsController.java index 23a24095afc..d4369199026 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PeerReviewsController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PeerReviewsController.java @@ -7,8 +7,8 @@ import java.util.Map; import java.util.Optional; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.orcid.core.exception.GroupIdRecordNotFoundException; import org.orcid.core.groupIds.issn.IssnGroupIdPatternMatcher; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicProfileController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicProfileController.java index d5bc25a1c34..552c1bffcd6 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicProfileController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicProfileController.java @@ -10,9 +10,9 @@ import java.util.Optional; import java.util.stream.IntStream; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.orcid.core.exception.DeactivatedException; @@ -33,7 +33,6 @@ import org.orcid.core.manager.v3.read_only.ProfileFundingManagerReadOnly; import org.orcid.core.manager.v3.read_only.ResearchResourceManagerReadOnly; import org.orcid.core.manager.v3.read_only.WorkManagerReadOnly; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.utils.v3.ContributorUtils; import org.orcid.core.utils.v3.SourceUtils; import org.orcid.core.utils.v3.activities.FundingComparators; @@ -127,9 +126,6 @@ public class PublicProfileController extends BaseWorkspaceController { @Resource private OrgDisambiguatedManager orgDisambiguatedManager; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenService; - @Resource(name = "sourceUtilsV3") private SourceUtils sourceUtils; @@ -220,7 +216,7 @@ public ModelAndView publicPreview(HttpServletRequest request, HttpServletRespons } if (!profile.isReviewed()) { - if (!orcidOauth2TokenService.hasToken(orcid, lastModifiedTime)) { + if (!profileEntityManagerReadOnly.hasToken(orcid, lastModifiedTime)) { mav.addObject("noIndex", true); } } @@ -276,7 +272,7 @@ private boolean isRecordReadyForIndexing(ProfileEntity profile) { // False if it is not reviewed and doesn't have any integration if(!profile.isReviewed()) { String userOrcid = profile.getId(); - if (!orcidOauth2TokenService.hasToken(userOrcid, getLastModifiedTime(userOrcid))) { + if (!profileEntityManagerReadOnly.hasToken(userOrcid, getLastModifiedTime(userOrcid))) { // If the user doesn't have any token, check if it was created by member, if so, // verify if that member pushed any work of affiliation on creation time SourceEntity source = profile.getSource(); diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordApiController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordApiController.java index c62b8c210a8..fc99281ad0a 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordApiController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordApiController.java @@ -1,6 +1,6 @@ package org.orcid.frontend.web.controllers; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.api.common.util.v3.PublicRecordUtils; import org.orcid.core.api.OrcidApiConstants; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordApiExceptionHandler.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordApiExceptionHandler.java index 997cc273b2d..6963e9268b4 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordApiExceptionHandler.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordApiExceptionHandler.java @@ -2,9 +2,9 @@ import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Response; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Response; import org.orcid.core.exception.OrcidCoreExceptionMapper; import org.orcid.core.exception.OrcidDeprecatedException; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordController.java index 9de6f1207fe..b3b45350341 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/PublicRecordController.java @@ -5,7 +5,7 @@ import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.common.manager.EventManager; import org.orcid.core.common.manager.SummaryManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/RecordCorrectionsController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/RecordCorrectionsController.java index 386c11d87f9..e713a8fd241 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/RecordCorrectionsController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/RecordCorrectionsController.java @@ -3,7 +3,7 @@ import java.util.Collections; import java.util.Optional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.OrcidSecurityManager; import org.orcid.core.manager.read_only.RecordCorrectionsManagerReadOnly; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/RegistrationController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/RegistrationController.java index 4027e47c308..76f39429ae0 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/RegistrationController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/RegistrationController.java @@ -14,9 +14,9 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; @@ -36,7 +36,6 @@ import org.orcid.frontend.spring.ShibbolethAjaxAuthenticationSuccessHandler; import org.orcid.frontend.spring.SocialAjaxAuthenticationSuccessHandler; import org.orcid.frontend.spring.web.social.config.SocialSignInUtils; -import org.orcid.frontend.util.RequestInfoFormLocalCache; import org.orcid.frontend.web.util.RecaptchaVerifier; import org.orcid.jaxb.model.common.AvailableLocales; import org.orcid.jaxb.model.message.CreationMethod; @@ -44,7 +43,6 @@ import org.orcid.jaxb.model.v3.release.record.AffiliationType; import org.orcid.persistence.constants.SendEmailFrequency; import org.orcid.persistence.jpa.entities.EventType; -import org.orcid.pojo.EmailListChange; import org.orcid.pojo.Redirect; import org.orcid.pojo.ajaxForm.AffiliationForm; import org.orcid.pojo.ajaxForm.Date; @@ -127,9 +125,6 @@ public class RegistrationController extends BaseController { @Resource private EventManager eventManager; - @Resource - private RequestInfoFormLocalCache requestInfoFormLocalCache; - @RequestMapping(value = "/register.json", method = RequestMethod.GET) public @ResponseBody Registration getRegister(HttpServletRequest request, HttpServletResponse response) { // Remove the session hash if needed @@ -160,21 +155,6 @@ public class RegistrationController extends BaseController { setError(reg.getTermsOfUse(), "validations.acceptTermsAndConditions"); - RequestInfoForm requestInfoForm = requestInfoFormLocalCache.get(request.getSession().getId()); - if (requestInfoForm != null) { - if (!PojoUtil.isEmpty(requestInfoForm.getUserEmail())) { - reg.getEmail().setValue(requestInfoForm.getUserEmail()); - } - - if (!PojoUtil.isEmpty(requestInfoForm.getUserGivenNames())) { - reg.getGivenNames().setValue(requestInfoForm.getUserGivenNames()); - } - - if (!PojoUtil.isEmpty(requestInfoForm.getUserFamilyNames())) { - reg.getFamilyNames().setValue(requestInfoForm.getUserFamilyNames()); - } - } - long numVal = generateRandomNumForValidation(); reg.setValNumServer(numVal); reg.setValNumClient(0); diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ResearchResourcesController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ResearchResourcesController.java index ca50e545869..7d1a4d7690a 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ResearchResourcesController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ResearchResourcesController.java @@ -2,7 +2,7 @@ import java.util.ArrayList; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.ResearchResourceManager; import org.orcid.frontend.web.pagination.Page; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ShibbolethController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ShibbolethController.java index cca24b951d5..7ed5d9424d0 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ShibbolethController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/ShibbolethController.java @@ -6,9 +6,9 @@ import java.util.Date; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.common.manager.EventManager; import org.orcid.core.constants.OrcidOauth2Constants; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/SocialController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/SocialController.java index 5270d5cc264..8c5cd9f96be 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/SocialController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/SocialController.java @@ -3,9 +3,9 @@ import java.util.ArrayList; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.constants.OrcidOauth2Constants; import org.orcid.core.manager.BackupCodeManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/SpamController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/SpamController.java index 7625b1d5799..6614009292b 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/SpamController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/SpamController.java @@ -1,6 +1,6 @@ package org.orcid.frontend.web.controllers; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.SpamManager; import org.orcid.pojo.Spam; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/StatusController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/StatusController.java index dd1fa6fff6b..817ed8e25bc 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/StatusController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/StatusController.java @@ -2,10 +2,10 @@ import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.orcid.core.locale.LocaleManager; import org.orcid.core.manager.StatusManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/TwoFactorAuthenticationController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/TwoFactorAuthenticationController.java index 8b8c124eae4..22bf65877f3 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/TwoFactorAuthenticationController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/TwoFactorAuthenticationController.java @@ -1,8 +1,8 @@ package org.orcid.frontend.web.controllers; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.manager.BackupCodeManager; import org.orcid.core.manager.EncryptionManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/UnsubscribeController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/UnsubscribeController.java index b04934ae650..ed1e826e0a0 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/UnsubscribeController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/UnsubscribeController.java @@ -4,7 +4,7 @@ import java.util.HashMap; import java.util.Map; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.codec.binary.Base64; import org.orcid.core.common.manager.EmailFrequencyManager; @@ -58,9 +58,9 @@ public ModelAndView unsubscribeView(@PathVariable("encryptedId") String encrypte if(!emailManagerReadOnly.isPrimaryEmailVerified(orcid)) { try { emailManager.verifyPrimaryEmail(orcid); - } catch(javax.persistence.NoResultException nre) { + } catch(jakarta.persistence.NoResultException nre) { slackManager.sendSystemAlert(String.format("User with orcid %s have no primary email, so, we are setting the newest verified email, or, the newest email in case non is verified as the primary one", orcid)); - } catch(javax.persistence.NonUniqueResultException nure) { + } catch(jakarta.persistence.NonUniqueResultException nure) { slackManager.sendSystemAlert(String.format("User with orcid %s have more than one primary email, so, we are setting the latest modified primary as the primary one", orcid)); } } diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/WorksController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/WorksController.java index 5073e3cb529..83843f9af0c 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/WorksController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/WorksController.java @@ -38,8 +38,8 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import java.util.*; import java.util.regex.Pattern; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/WorkspaceController.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/WorkspaceController.java index 776b18bacca..7d56e249a83 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/WorkspaceController.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/WorkspaceController.java @@ -14,10 +14,10 @@ import java.util.TreeMap; import java.util.stream.Collectors; -import javax.annotation.Resource; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.orcid.core.locale.LocaleManager; import org.orcid.core.manager.IdentifierTypeManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/helper/OauthHelper.java b/orcid-web/src/main/java/org/orcid/frontend/web/controllers/helper/OauthHelper.java deleted file mode 100644 index c9198e286f1..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/web/controllers/helper/OauthHelper.java +++ /dev/null @@ -1,263 +0,0 @@ -package org.orcid.frontend.web.controllers.helper; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.annotation.Resource; - -import org.apache.commons.lang.StringUtils; -import org.orcid.core.locale.LocaleManager; -import org.orcid.core.manager.ClientDetailsEntityCacheManager; -import org.orcid.core.manager.v3.EmailManager; -import org.orcid.core.manager.v3.ProfileEntityManager; -import org.orcid.core.manager.v3.read_only.RecordNameManagerReadOnly; -import org.orcid.frontend.web.controllers.BaseControllerUtil; -import org.orcid.frontend.web.controllers.RegistrationController; -import org.orcid.frontend.web.exception.OauthInvalidRequestException; -import org.orcid.jaxb.model.clientgroup.ClientType; -import org.orcid.jaxb.model.message.ScopePathType; -import org.orcid.jaxb.model.v3.release.record.Name; -import org.orcid.persistence.jpa.entities.ClientDetailsEntity; -import org.orcid.pojo.ajaxForm.PojoUtil; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.orcid.pojo.ajaxForm.ScopeInfoForm; -import org.orcid.utils.OrcidStringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.NoSuchMessageException; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; -import org.springframework.stereotype.Component; - -@Component -public class OauthHelper { - - private static final Logger LOGGER = LoggerFactory.getLogger(OauthHelper.class); - public static final String PUBLIC_MEMBER_NAME = "PubApp"; - - private final Pattern redirectUriPattern = Pattern.compile("redirect_uri=([^&]*)"); - private final Pattern responseTypePattern = Pattern.compile("response_type=([^&]*)"); - private final Pattern stateParamPattern = Pattern.compile("state=([^&]*)"); - private final Pattern orcidPattern = Pattern.compile("(&|\\?)orcid=([^&]*)"); - private final Pattern noncePattern = Pattern.compile("nonce=([^&]*)"); - private final Pattern clientIdPattern = Pattern.compile("client_id=([^&]*)"); - private final Pattern scopesPattern = Pattern.compile("scope=([^&]*)"); - private final Pattern maxAgePattern = Pattern.compile("max_age=([^&]*)"); - - private BaseControllerUtil baseControllerUtil = new BaseControllerUtil(); - - @Resource(name = "profileEntityManagerV3") - protected ProfileEntityManager profileEntityManager; - - @Resource(name = "recordNameManagerReadOnlyV3") - private RecordNameManagerReadOnly recordNameManagerReadOnly; - - @Resource - protected LocaleManager localeManager; - - @Resource - protected ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; - - @Resource(name = "emailManagerV3") - protected EmailManager emailManager; - - public RequestInfoForm generateRequestInfoForm(String requestUrl) throws UnsupportedEncodingException { - RequestInfoForm infoForm = new RequestInfoForm(); - - // If the user is logged in - String loggedUserOrcid = getEffectiveUserOrcid(); - if (!PojoUtil.isEmpty(loggedUserOrcid)) { - infoForm.setUserOrcid(loggedUserOrcid); - String creditName = recordNameManagerReadOnly.fetchDisplayableCreditName(loggedUserOrcid); - if (!PojoUtil.isEmpty(creditName)) { - infoForm.setUserName(URLDecoder.decode(creditName, "UTF-8").trim()); - } - } - - if (!PojoUtil.isEmpty(requestUrl)) { - Matcher matcher = clientIdPattern.matcher(requestUrl); - if (matcher.find()) { - String clientId = matcher.group(1); - // Check if the client has persistent tokens enabled - ClientDetailsEntity clientDetails = clientDetailsEntityCacheManager.retrieve(clientId); - if (clientDetails.isPersistentTokensEnabled()) { - infoForm.setClientHavePersistentTokens(true); - } - - // If client details is ok, continue - String clientName = clientDetails.getClientName() == null ? "" : clientDetails.getClientName(); - String clientEmailRequestReason = clientDetails.getEmailAccessReason() == null ? "" : clientDetails.getEmailAccessReason(); - String clientDescription = clientDetails.getClientDescription() == null ? "" : clientDetails.getClientDescription(); - String memberName = ""; - - // If client type is null it means it is a public client - if (ClientType.PUBLIC_CLIENT.equals(clientDetails.getClientType())) { - memberName = PUBLIC_MEMBER_NAME; - } else if (!PojoUtil.isEmpty(clientDetails.getGroupProfileId())) { - Name name = recordNameManagerReadOnly.getRecordName(clientDetails.getGroupProfileId()); - if (name != null) { - memberName = name.getCreditName() != null ? name.getCreditName().getContent() : ""; - } - } - - // If the group name is empty, use the same as the client - // name, since it should be a SSO user - if (StringUtils.isBlank(memberName)) { - memberName = clientName; - } - infoForm.setClientId(clientId); - infoForm.setClientDescription(clientDescription); - infoForm.setClientName(clientName); - infoForm.setClientEmailRequestReason(clientEmailRequestReason); - infoForm.setMemberName(memberName); - } else { - throw new OauthInvalidRequestException("Please specify a client id"); - } - - Matcher orcidMatcher = orcidPattern.matcher(requestUrl); - boolean userIdSet = false; - if (orcidMatcher.find()) { - String orcid = orcidMatcher.group(2); - try { - orcid = OrcidStringUtils.stripHtml(URLDecoder.decode(orcid, "UTF-8").trim()); - } catch (UnsupportedEncodingException e) { - } - if (!PojoUtil.isEmpty(orcid) && profileEntityManager.orcidExists(orcid)) { - infoForm.setUserId(orcid); - userIdSet = true; - } - } - - Matcher emailMatcher = RegistrationController.emailPattern.matcher(requestUrl); - if (emailMatcher.find()) { - String email = emailMatcher.group(1); - if (email != null && email.contains("%20")) { - email = email.replace("%20", "%2B"); - } - - email = OrcidStringUtils.stripHtml(URLDecoder.decode(email, StandardCharsets.UTF_8).trim()); - - if (!userIdSet && !PojoUtil.isEmpty(email)) { - email = OrcidStringUtils.filterEmailAddress(email); - if (emailManager.emailExists(email)) { - infoForm.setUserId(email); - } - } - infoForm.setUserEmail(email); - } - - Matcher scopeMatcher = scopesPattern.matcher(requestUrl); - if (scopeMatcher.find()) { - String scopes = scopeMatcher.group(1); - String scopesString = URLDecoder.decode(scopes, "UTF-8").trim(); - // Replace any number of spaces or a plus (+) sign with a single space - scopesString = scopesString.replaceAll("( |\\+)+", " "); - if(scopesString == null || scopesString.isBlank()) { - throw new OauthInvalidRequestException("Please specify the desired scopes"); - } - for (ScopePathType theScope : ScopePathType.getScopesFromSpaceSeparatedString(scopesString)) { - ScopeInfoForm scopeInfoForm = new ScopeInfoForm(); - scopeInfoForm.setValue(theScope.value()); - scopeInfoForm.setName(theScope.name()); - try { - scopeInfoForm.setDescription(getMessage(ScopePathType.class.getName() + '.' + theScope.name())); - scopeInfoForm.setLongDescription(getMessage(ScopePathType.class.getName() + '.' + theScope.name() + ".longDesc")); - } catch (NoSuchMessageException e) { - LOGGER.warn("Unable to find key message for scope: " + theScope.name() + " " + theScope.value()); - } - infoForm.getScopes().add(scopeInfoForm); - } - } else { - throw new OauthInvalidRequestException("Please specify the desired scopes"); - } - - Matcher redirectUriMatcher = redirectUriPattern.matcher(requestUrl); - if (redirectUriMatcher.find()) { - try { - infoForm.setRedirectUrl(OrcidStringUtils.stripHtml(URLDecoder.decode(redirectUriMatcher.group(1), "UTF-8").trim())); - } catch (UnsupportedEncodingException e) { - throw new OauthInvalidRequestException("Invalid redirect URL"); - } - } else { - throw new OauthInvalidRequestException("Please specify a redirect URL"); - } - - Matcher stateParamMatcher = stateParamPattern.matcher(requestUrl); - if (stateParamMatcher.find()) { - try { - infoForm.setStateParam(OrcidStringUtils.stripHtml(URLDecoder.decode(stateParamMatcher.group(1), "UTF-8").trim())); - } catch (UnsupportedEncodingException e) { - - } - } - - Matcher responseTypeMatcher = responseTypePattern.matcher(requestUrl); - if (responseTypeMatcher.find()) { - try { - infoForm.setResponseType(OrcidStringUtils.stripHtml(URLDecoder.decode(responseTypeMatcher.group(1), "UTF-8").trim())); - } catch (UnsupportedEncodingException e) { - throw new OauthInvalidRequestException("Invalid response type"); - } - } else { - throw new OauthInvalidRequestException("Please specify a response type"); - } - - Matcher givenNamesMatcher = RegistrationController.givenNamesPattern.matcher(requestUrl); - if (givenNamesMatcher.find()) { - infoForm.setUserGivenNames(OrcidStringUtils.stripHtml(URLDecoder.decode(givenNamesMatcher.group(1), "UTF-8").trim())); - } - - Matcher familyNamesMatcher = RegistrationController.familyNamesPattern.matcher(requestUrl); - if (familyNamesMatcher.find()) { - infoForm.setUserFamilyNames(OrcidStringUtils.stripHtml(URLDecoder.decode(familyNamesMatcher.group(1), "UTF-8").trim())); - } - - Matcher nonceMatcher = noncePattern.matcher(requestUrl); - if (nonceMatcher.find()) { - infoForm.setNonce(OrcidStringUtils.stripHtml(URLDecoder.decode(nonceMatcher.group(1), "UTF-8").trim())); - } - - Matcher maxAgeMatcher = maxAgePattern.matcher(requestUrl); - if (maxAgeMatcher.find()) { - String maxAge = OrcidStringUtils.stripHtml(URLDecoder.decode(maxAgeMatcher.group(1), "UTF-8").trim()); - if(!PojoUtil.isEmpty(maxAge)) { - try { - Long.parseLong(maxAge); - } catch(NumberFormatException nfe) { - throw new InvalidRequestException("Invalid max_age param"); - } - } - infoForm.setMaxAge(maxAge); - } - } - - return infoForm; - } - - public void setUserName(RequestInfoForm requestInfoForm) throws UnsupportedEncodingException { - String loggedUserOrcid = getEffectiveUserOrcid(); - if (!PojoUtil.isEmpty(loggedUserOrcid)) { - requestInfoForm.setUserOrcid(loggedUserOrcid); - String creditName = recordNameManagerReadOnly.fetchDisplayableCreditName(loggedUserOrcid); - if (!PojoUtil.isEmpty(creditName)) { - requestInfoForm.setUserName(URLDecoder.decode(creditName, "UTF-8").trim()); - } - } - } - - private String getEffectiveUserOrcid() { - UserDetails currentUser = baseControllerUtil.getCurrentUser(SecurityContextHolder.getContext()); - if (currentUser == null) { - return null; - } - return currentUser.getUsername(); - } - - public String getMessage(String messageCode, Object... messageParams) { - return localeManager.resolveMessage(messageCode, messageParams); - } -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/exception/OauthInvalidRequestException.java b/orcid-web/src/main/java/org/orcid/frontend/web/exception/OauthInvalidRequestException.java deleted file mode 100644 index 678da54756d..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/web/exception/OauthInvalidRequestException.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.orcid.frontend.web.exception; - -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.springframework.security.oauth2.common.exceptions.InvalidRequestException; - -@SuppressWarnings("serial") -public class OauthInvalidRequestException extends InvalidRequestException { - - public OauthInvalidRequestException(final String msg) { - super(msg); - } - - public OauthInvalidRequestException(final String msg, final Throwable t) { - super(msg, t); - } - -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/filter/OAuthAuthorizeNotSignedInFilter.java b/orcid-web/src/main/java/org/orcid/frontend/web/filter/OAuthAuthorizeNotSignedInFilter.java deleted file mode 100644 index 10e6339cf2c..00000000000 --- a/orcid-web/src/main/java/org/orcid/frontend/web/filter/OAuthAuthorizeNotSignedInFilter.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.orcid.frontend.web.filter; - -import java.io.IOException; - -import javax.annotation.Resource; -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 javax.servlet.http.HttpSession; - -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.impl.OrcidUrlManager; -import org.orcid.frontend.util.RequestInfoFormLocalCache; -import org.orcid.frontend.web.controllers.BaseControllerUtil; -import org.orcid.frontend.web.controllers.helper.OauthHelper; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.web.savedrequest.HttpSessionRequestCache; - -/** - * - * @author rcpeters - * - */ -public class OAuthAuthorizeNotSignedInFilter implements Filter { - - private BaseControllerUtil baseControllerUtil = new BaseControllerUtil(); - - @Resource - private OrcidUrlManager orcidUrlManager; - - @Resource - private OauthHelper oauthHelper; - - @Resource - private RequestInfoFormLocalCache requestInfoFormLocalCache; - - @Override - public void destroy() { - // Do nothing - } - - public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { - HttpServletRequest request = (HttpServletRequest) req; - if (OrcidUrlManager.getPathWithoutContextPath(request).equals("/oauth/authorize")) { - HttpServletResponse response = (HttpServletResponse) res; - HttpSession session = request.getSession(); - String queryString = request.getQueryString(); - boolean forceLogin = false; - - if (OrcidOauth2Constants.PROMPT_LOGIN.equals(request.getParameter(OrcidOauth2Constants.PROMPT))) { - //remove prompt param later on to prevent loop - forceLogin = true; - } - - //users not logged in must sign in - SecurityContext sci = null; - if (session != null) - sci = (SecurityContext)session.getAttribute("SPRING_SECURITY_CONTEXT"); - if (forceLogin || baseControllerUtil.getCurrentUser(sci) == null) { - if (session != null) { - new HttpSessionRequestCache().saveRequest(request, response); - RequestInfoForm rif = oauthHelper.generateRequestInfoForm(request.getQueryString()); - - // Store the request info form in the cache - requestInfoFormLocalCache.put(request.getSession().getId(), rif); - - request.getSession().setAttribute(OrcidOauth2Constants.OAUTH_QUERY_STRING, queryString); - } - response.sendRedirect(orcidUrlManager.getBaseUrl() + "/signin?oauth&" + queryString); - return; - } - } - chain.doFilter(req, res); - } - - @Override - public void init(FilterConfig arg0) throws ServletException { - // Do nothing - } - -} diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/filter/OrcidSwitchUserFilter.java b/orcid-web/src/main/java/org/orcid/frontend/web/filter/OrcidSwitchUserFilter.java index 41cdcc7b29d..df3cab3ce3d 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/filter/OrcidSwitchUserFilter.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/filter/OrcidSwitchUserFilter.java @@ -4,8 +4,8 @@ import java.util.Collection; import java.util.List; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.orcid.core.locale.LocaleManager; import org.orcid.core.manager.v3.SourceManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/DateCompare.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/DateCompare.java index a688d5e1705..198461c7f38 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/DateCompare.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/DateCompare.java @@ -1,7 +1,7 @@ package org.orcid.frontend.web.forms.validate; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FieldMatch.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FieldMatch.java index ddbd6ea1f23..b9eba971da0 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FieldMatch.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FieldMatch.java @@ -1,7 +1,7 @@ package org.orcid.frontend.web.forms.validate; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import java.lang.annotation.Documented; import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.TYPE; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FieldMatchValidator.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FieldMatchValidator.java index 96e49af80dc..b5157120f79 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FieldMatchValidator.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FieldMatchValidator.java @@ -1,7 +1,7 @@ package org.orcid.frontend.web.forms.validate; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.apache.commons.beanutils.BeanUtils; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FirstIntegerNotHigherThanSecondIntegerValidator.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FirstIntegerNotHigherThanSecondIntegerValidator.java index efecd6c1e89..aa4da048c1d 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FirstIntegerNotHigherThanSecondIntegerValidator.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/FirstIntegerNotHigherThanSecondIntegerValidator.java @@ -1,7 +1,7 @@ package org.orcid.frontend.web.forms.validate; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang.StringUtils; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerCompare.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerCompare.java index b789489782e..54cf415b26e 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerCompare.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerCompare.java @@ -8,8 +8,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Target( { TYPE, ANNOTATION_TYPE }) @Retention(RUNTIME) diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerStringCrossField.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerStringCrossField.java index f2ee0bb5ef4..993d076a1ad 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerStringCrossField.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerStringCrossField.java @@ -8,8 +8,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Target( { TYPE, ANNOTATION_TYPE }) @Retention(RUNTIME) diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerStringCrossFieldValidator.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerStringCrossFieldValidator.java index bc774cb01da..753e3b7ed7d 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerStringCrossFieldValidator.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/IntegerStringCrossFieldValidator.java @@ -2,8 +2,8 @@ import java.lang.reflect.InvocationTargetException; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang.StringUtils; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StartDateBeforeEndDateValidator.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StartDateBeforeEndDateValidator.java index f5d0160ff58..1b0be617c7c 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StartDateBeforeEndDateValidator.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StartDateBeforeEndDateValidator.java @@ -5,8 +5,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import java.lang.reflect.InvocationTargetException; import java.text.ParseException; import java.text.SimpleDateFormat; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StringMatchIgnoreCase.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StringMatchIgnoreCase.java index ddf80aa6e68..d02ac9607ad 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StringMatchIgnoreCase.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StringMatchIgnoreCase.java @@ -1,7 +1,7 @@ package org.orcid.frontend.web.forms.validate; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import java.lang.annotation.Documented; import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.TYPE; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StringMatchIgnoreCaseValidator.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StringMatchIgnoreCaseValidator.java index 842b66abc11..bdbb41dfbcd 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StringMatchIgnoreCaseValidator.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/StringMatchIgnoreCaseValidator.java @@ -1,7 +1,7 @@ package org.orcid.frontend.web.forms.validate; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.apache.commons.beanutils.BeanUtils; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/TextPattern.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/TextPattern.java index fb16e748550..ece5f8c073d 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/TextPattern.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/TextPattern.java @@ -6,10 +6,10 @@ import static java.lang.annotation.ElementType.*; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import javax.validation.Constraint; -import javax.validation.Payload; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Pattern.Flag; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Pattern.Flag; /** * The annotated Text must match the following regular expression. @@ -38,7 +38,7 @@ /** * @return The error message template. */ - String message() default "{javax.validation.constraints.Pattern.message}"; + String message() default "{jakarta.validation.constraints.Pattern.message}"; /** * @return The groups the constraint belongs to. diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/TextPatternValidator.java b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/TextPatternValidator.java index 27820392e6d..a5c295798ce 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/TextPatternValidator.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/forms/validate/TextPatternValidator.java @@ -3,9 +3,9 @@ import java.util.regex.Matcher; import java.util.regex.PatternSyntaxException; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; -import javax.validation.constraints.Pattern; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import jakarta.validation.constraints.Pattern; import org.orcid.pojo.ajaxForm.Text; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/pagination/ResearchResourcePaginator.java b/orcid-web/src/main/java/org/orcid/frontend/web/pagination/ResearchResourcePaginator.java index c23ecc7c6bb..51bab8951ba 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/pagination/ResearchResourcePaginator.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/pagination/ResearchResourcePaginator.java @@ -7,7 +7,7 @@ import org.orcid.jaxb.model.v3.release.record.summary.ResearchResources; import org.orcid.pojo.ResearchResourceGroupPojo; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/pagination/WorksPaginator.java b/orcid-web/src/main/java/org/orcid/frontend/web/pagination/WorksPaginator.java index a0e2892bb94..c8e6df0ef91 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/pagination/WorksPaginator.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/pagination/WorksPaginator.java @@ -7,7 +7,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.v3.WorksCacheManager; import org.orcid.core.manager.v3.WorksExtendedCacheManager; diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/util/ThirdPartyLinkManager.java b/orcid-web/src/main/java/org/orcid/frontend/web/util/ThirdPartyLinkManager.java index 6e18c6715f2..6e365957ebb 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/util/ThirdPartyLinkManager.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/util/ThirdPartyLinkManager.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.Locale; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.locale.LocaleManager; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.manager.ClientDetailsEntityCacheManager; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.core.utils.JsonUtils; import org.orcid.core.utils.cache.redis.RedisClient; import org.orcid.jaxb.model.clientgroup.RedirectUriType; @@ -42,12 +42,12 @@ public class ThirdPartyLinkManager implements InitializingBean { @Resource private LocaleManager localeManager; - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; - @Resource private RedisClient redisClient; + @Resource(name = "clientDetailsManagerReadOnlyV3") + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; + @Value("${org.orcid.core.utils.cache.redis.works-search-and-link-wizard.ttl:3600}") private int worksSearchAndLinkWizardCacheTtl; @@ -105,7 +105,7 @@ public List findSearchAndLinkWizardClients(Strin List list = getWorksSearchAndLinkWizardBaseList(); for (SearchAndLinkWizardFormSummary form : list) { form.setConnected(StringUtils.isNotBlank(currentUserOrcid) - && orcidOauth2TokenDetailService.doesClientKnowUser(form.getId(), currentUserOrcid)); + && clientDetailsManagerReadOnly.doesClientKnowUser(form.getId(), currentUserOrcid)); } return list; } diff --git a/orcid-web/src/main/java/org/orcid/frontend/web/util/UtilEndpoints.java b/orcid-web/src/main/java/org/orcid/frontend/web/util/UtilEndpoints.java index 5126ba1a6de..f97094c2c62 100644 --- a/orcid-web/src/main/java/org/orcid/frontend/web/util/UtilEndpoints.java +++ b/orcid-web/src/main/java/org/orcid/frontend/web/util/UtilEndpoints.java @@ -1,6 +1,6 @@ package org.orcid.frontend.web.util; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.orcid.core.manager.PasswordGenerationManager; import org.springframework.stereotype.Controller; diff --git a/orcid-web/src/main/resources/orcid-core-context-spam.xml b/orcid-web/src/main/resources/orcid-core-context-spam.xml index 124a0da9ad7..c216ad75f24 100644 --- a/orcid-web/src/main/resources/orcid-core-context-spam.xml +++ b/orcid-web/src/main/resources/orcid-core-context-spam.xml @@ -4,11 +4,11 @@ xmlns:cache="http://www.springframework.org/schema/cache" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jms="http://www.springframework.org/schema/jms" xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd - http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd"> + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd"> @@ -25,10 +25,6 @@ - - - - @@ -38,50 +34,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -784,8 +739,6 @@ - - @@ -794,8 +747,7 @@ - - + @@ -868,6 +820,7 @@ + @@ -949,7 +902,9 @@ - + + + @@ -1116,12 +1071,7 @@ - - - - - - + diff --git a/orcid-web/src/main/resources/orcid-frontend-security.xml b/orcid-web/src/main/resources/orcid-frontend-security.xml index 385c60f8d8b..18d8725ef17 100644 --- a/orcid-web/src/main/resources/orcid-frontend-security.xml +++ b/orcid-web/src/main/resources/orcid-frontend-security.xml @@ -2,15 +2,11 @@ + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> - - - + @@ -19,7 +15,6 @@ xmlns="http://www.springframework.org/schema/beans"> - @@ -159,84 +154,25 @@ - - - - - - - - - - - + + - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -265,7 +201,7 @@ - @@ -287,7 +223,7 @@ - @@ -392,7 +328,7 @@ + method="POST" access="ROLE_USER" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/orcid-web/src/main/resources/orcid-frontend-web-servlet.xml b/orcid-web/src/main/resources/orcid-frontend-web-servlet.xml index 8ab2419b817..dfc56a4f873 100644 --- a/orcid-web/src/main/resources/orcid-frontend-web-servlet.xml +++ b/orcid-web/src/main/resources/orcid-frontend-web-servlet.xml @@ -8,17 +8,19 @@ xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" - xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd - http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd - http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd + http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> + + diff --git a/orcid-web/src/main/webapp/WEB-INF/web.xml b/orcid-web/src/main/webapp/WEB-INF/web.xml index 7edb221dfb9..7281f48a729 100644 --- a/orcid-web/src/main/webapp/WEB-INF/web.xml +++ b/orcid-web/src/main/webapp/WEB-INF/web.xml @@ -82,16 +82,6 @@ org.springframework.web.filter.DelegatingFilterProxy - - clientCredentialsTokenEndpointFilter - org.springframework.web.filter.DelegatingFilterProxy - - - - clientCredentialsTokenEndpointFilter - /oauth/token - - springSecurityFilterChain /* diff --git a/orcid-web/src/test/java/org/orcid/frontend/email/RecordEmailSenderTest.java b/orcid-web/src/test/java/org/orcid/frontend/email/RecordEmailSenderTest.java index 8a8fc8a7c3e..9c76e0f0f9f 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/email/RecordEmailSenderTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/email/RecordEmailSenderTest.java @@ -13,8 +13,8 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.Resource; -import javax.xml.bind.JAXBException; +import jakarta.annotation.Resource; +import jakarta.xml.bind.JAXBException; import org.apache.commons.lang3.LocaleUtils; import org.junit.Before; @@ -30,7 +30,6 @@ import org.orcid.core.manager.v3.EmailManager; import org.orcid.core.manager.v3.RecordNameManager; import org.orcid.core.manager.v3.SourceManager; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.jaxb.model.common.AvailableLocales; import org.orcid.jaxb.model.v3.release.record.Email; import org.orcid.persistence.dao.GenericDao; @@ -39,7 +38,6 @@ import org.orcid.persistence.dao.ProfileEventDao; import org.orcid.persistence.jpa.entities.EmailEventEntity; import org.orcid.persistence.jpa.entities.ProfileEntity; -import org.orcid.persistence.jpa.entities.ProfileEventEntity; import org.orcid.pojo.EmailListChange; import org.orcid.test.OrcidJUnit4ClassRunner; import org.orcid.utils.email.MailGunManager; @@ -57,39 +55,15 @@ public class RecordEmailSenderTest { @Mock private ProfileEventDao mockProfileEventDao; - @Mock - private SourceManager sourceManager; - - @Mock - private NotificationDao mockNotificationDao; - @Mock private MailGunManager mockMailGunManager; - @Mock - private OrcidOauth2TokenDetailService mockOrcidOauth2TokenDetailService; - @Mock private ProfileEntityCacheManager mockProfileEntityCacheManager; @Mock private EmailManager mockEmailManager; - @Mock - private ProfileDao mockProfileDao; - - @Mock - private ProfileDao mockProfileDaoReadOnly; - - @Mock - private JpaJaxbNotificationAdapter mockNotificationAdapter; - - @Mock - public GenericDao mockEmailEventDao; - - @Mock - public EmailFrequencyManager mockEmailFrequencyManager; - @Mock public RecordNameManager mockRecordNameManager; diff --git a/orcid-web/src/test/java/org/orcid/frontend/oauth2/RevokeControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/oauth2/RevokeControllerTest.java index 6571af97cf1..e2bbc593b48 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/oauth2/RevokeControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/oauth2/RevokeControllerTest.java @@ -1,29 +1,24 @@ package org.orcid.frontend.oauth2; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.times; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Response; -import org.junit.After; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; -import org.orcid.core.togglz.Features; +import org.orcid.core.oauth.authorizationServer.AuthorizationServerUtil; import org.orcid.core.utils.SecurityContextTestUtils; -import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; -import org.togglz.junit.TogglzRule; - -import java.io.IOException; -import java.net.URISyntaxException; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.context.SecurityContextHolder; public class RevokeControllerTest { @@ -31,126 +26,82 @@ public class RevokeControllerTest { private HttpServletRequest request; @Mock - private OrcidOauth2TokenDetailService mockOrcidOauth2TokenDetailService; - - @Resource - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; + private AuthorizationServerUtil authorizationServerUtil; - @Rule - public TogglzRule togglzRule = TogglzRule.allDisabled(Features.class); - - private RevokeController revokeController = new RevokeController(); + @InjectMocks + private RevokeController revokeController; @Before public void before() { MockitoAnnotations.initMocks(this); - revokeController.setOrcidOauth2TokenDetailService(mockOrcidOauth2TokenDetailService); - when(request.getParameter("token")).thenReturn("token-value"); - OrcidOauth2TokenDetail token = new OrcidOauth2TokenDetail(); - token.setClientDetailsId("client-id"); - token.setTokenValue("token-value"); - token.setRefreshTokenValue("refresh-token-value"); - token.setTokenDisabled(false); - when(mockOrcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue("token-value")).thenReturn(token); - when(mockOrcidOauth2TokenDetailService.findByRefreshTokenValue("refresh-token-value")).thenReturn(token); - SecurityContextTestUtils.setUpSecurityContextForClientOnly("client-id"); } - - @After - public void after() { - revokeController.setOrcidOauth2TokenDetailService(orcidOauth2TokenDetailService); + + @Test + public void testRevokeWithClientIdAndSecret() throws Exception { + String clientId = "APP-1234567890123456"; + String clientSecret = "some-secret"; + String token = "some-token"; + + SecurityContextTestUtils.setUpSecurityContextForClientOnly(clientId); + + when(request.getParameter("token")).thenReturn(token); + when(request.getParameter("client_secret")).thenReturn(clientSecret); + when(request.getHeader("Authorization")).thenReturn(null); + + Response mockResponse = mock(Response.class); + when(mockResponse.getStatus()).thenReturn(200); + when(mockResponse.getEntity()).thenReturn("Success"); + + when(authorizationServerUtil.forwardTokenRevocationRequest(clientId, clientSecret, token)).thenReturn(mockResponse); + + ResponseEntity result = revokeController.revoke(request); + + assertNotNull(result); + assertEquals(200, result.getStatusCodeValue()); + assertEquals("Success", result.getBody()); + + verify(authorizationServerUtil).forwardTokenRevocationRequest(clientId, clientSecret, token); } - + @Test - public void noTokenTest() { + public void testRevokeWithBasicAuth() throws Exception { + String authorization = "Basic Y2xpZW50LWlkOnNlY3JldA=="; + String token = "some-token"; + + when(request.getParameter("token")).thenReturn(token); + when(request.getHeader("Authorization")).thenReturn(authorization); + + Response mockResponse = mock(Response.class); + when(mockResponse.getStatus()).thenReturn(200); + when(mockResponse.getEntity()).thenReturn("Success"); + + when(authorizationServerUtil.forwardTokenRevocationRequest(authorization, token)).thenReturn(mockResponse); + + ResponseEntity result = revokeController.revoke(request); + + assertNotNull(result); + assertEquals(200, result.getStatusCodeValue()); + assertEquals("Success", result.getBody()); + + verify(authorizationServerUtil).forwardTokenRevocationRequest(authorization, token); + } + + @Test + public void testRevokeNoToken() throws Exception { when(request.getParameter("token")).thenReturn(null); try { revokeController.revoke(request); - fail(); + fail("Should have thrown IllegalArgumentException"); } catch (IllegalArgumentException e) { assertEquals("Please provide the token to be param", e.getMessage()); - } catch (Exception e) { - fail(); } when(request.getParameter("token")).thenReturn(""); try { revokeController.revoke(request); - fail(); + fail("Should have thrown IllegalArgumentException"); } catch (IllegalArgumentException e) { assertEquals("Please provide the token to be param", e.getMessage()); - } catch (Exception e) { - fail(); - } - - when(request.getParameter("token")).thenReturn("token-value"); - try { - revokeController.revoke(request); - } catch (Exception e) { - fail(); } } - - @Test - public void notOwnerTest() throws IOException, URISyntaxException, InterruptedException { - SecurityContextTestUtils.setUpSecurityContextForClientOnly("other-client-id"); - - revokeController.revoke(request); - - verify(mockOrcidOauth2TokenDetailService, times(1)).findIgnoringDisabledByTokenValue("token-value"); - verify(mockOrcidOauth2TokenDetailService, times(0)).findByRefreshTokenValue(anyString()); - verify(mockOrcidOauth2TokenDetailService, times(0)).revokeAccessToken(anyString()); - } - - @Test - public void tokenAlreadyDisabledOrNonExistingTest() throws IOException, URISyntaxException, InterruptedException { - when(request.getParameter("token")).thenReturn("disabled-or-unexisting"); - - revokeController.revoke(request); - - verify(mockOrcidOauth2TokenDetailService, times(1)).findIgnoringDisabledByTokenValue("disabled-or-unexisting"); - verify(mockOrcidOauth2TokenDetailService, times(1)).findByRefreshTokenValue("disabled-or-unexisting"); - verify(mockOrcidOauth2TokenDetailService, times(0)).revokeAccessToken(anyString()); - } - - @Test - public void disableByTokenTest() throws IOException, URISyntaxException, InterruptedException { - when(request.getParameter("token")).thenReturn("token-value"); - - revokeController.revoke(request); - - verify(mockOrcidOauth2TokenDetailService, times(1)).findIgnoringDisabledByTokenValue("token-value"); - verify(mockOrcidOauth2TokenDetailService, times(0)).findByRefreshTokenValue(anyString()); - verify(mockOrcidOauth2TokenDetailService, times(1)).revokeAccessToken("token-value"); - } - - @Test - public void disableByRefreshTokenTest() throws IOException, URISyntaxException, InterruptedException { - when(request.getParameter("token")).thenReturn("refresh-token-value"); - - revokeController.revoke(request); - - verify(mockOrcidOauth2TokenDetailService, times(1)).findIgnoringDisabledByTokenValue("refresh-token-value"); - verify(mockOrcidOauth2TokenDetailService, times(1)).findByRefreshTokenValue("refresh-token-value"); - verify(mockOrcidOauth2TokenDetailService, times(1)).revokeAccessToken("token-value"); - } - - @Test - public void refreshTokenAlreadyDisabledTest() throws IOException, URISyntaxException, InterruptedException { - OrcidOauth2TokenDetail token = new OrcidOauth2TokenDetail(); - token.setClientDetailsId("client-id"); - token.setTokenValue("token-value"); - token.setRefreshTokenValue("refresh-token-value"); - token.setTokenDisabled(true); - when(mockOrcidOauth2TokenDetailService.findIgnoringDisabledByTokenValue("token-value")).thenReturn(token); - when(mockOrcidOauth2TokenDetailService.findByRefreshTokenValue("refresh-token-value")).thenReturn(token); - when(request.getParameter("token")).thenReturn("refresh-token-value"); - - revokeController.revoke(request); - - verify(mockOrcidOauth2TokenDetailService, times(1)).findIgnoringDisabledByTokenValue("refresh-token-value"); - verify(mockOrcidOauth2TokenDetailService, times(1)).findByRefreshTokenValue("refresh-token-value"); - // It should not call the disable function since it is already disabled - verify(mockOrcidOauth2TokenDetailService, times(0)).revokeAccessToken("refresh-token-value"); - } } diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/AdminControllerLegacyTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/AdminControllerLegacyTest.java index 1c27daad6ee..011c311b6c8 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/AdminControllerLegacyTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/AdminControllerLegacyTest.java @@ -55,11 +55,13 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; import javax.xml.datatype.XMLGregorianCalendar; import java.io.UnsupportedEncodingException; import java.util.*; @@ -89,6 +91,12 @@ public class AdminControllerLegacyTest extends BaseControllerTest { @Resource(name = "profileEntityManagerV3") private ProfileEntityManager profileEntityManager; + + @Resource + private EncryptionManager encryptionManager; + + @Resource(name = "transactionManager") + private PlatformTransactionManager transactionManager; @Mock private EmailManager mockEmailManager; @@ -481,40 +489,82 @@ public void findIdsTest() { @Test public void resetPasswordTest() throws IllegalAccessException, UnsupportedEncodingException { - ProfileEntity p = profileEntityManager.findByOrcid("4444-4444-4444-4441"); - assertEquals("e9adO9I4UpBwqI5tGR+qDodvAZ7mlcISn+T+kyqXPf2Z6PPevg7JijqYr6KGO8VOskOYqVOEK2FEDwebxWKGDrV/TQ9gRfKWZlzxssxsOnA=", p.getPassword()); - AdminChangePassword form = new AdminChangePassword(); - form.setOrcidOrEmail("4444-4444-4444-4441"); - form.setPassword("password1"); - adminController.resetPassword(mockRequest, mockResponse, form); - p = profileEntityManager.findByOrcid("4444-4444-4444-4441"); - assertFalse("e9adO9I4UpBwqI5tGR+qDodvAZ7mlcISn+T+kyqXPf2Z6PPevg7JijqYr6KGO8VOskOYqVOEK2FEDwebxWKGDrV/TQ9gRfKWZlzxssxsOnA=".equals(p.getPassword())); + String newPassword = "brandNewPass123"; + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.execute(status -> { + try { + ProfileEntity p = profileEntityManager.findByOrcid("4444-4444-4444-4441"); + assertEquals("e9adO9I4UpBwqI5tGR+qDodvAZ7mlcISn+T+kyqXPf2Z6PPevg7JijqYr6KGO8VOskOYqVOEK2FEDwebxWKGDrV/TQ9gRfKWZlzxssxsOnA=", p.getPassword()); + AdminChangePassword form = new AdminChangePassword(); + form.setOrcidOrEmail("4444-4444-4444-4441"); + form.setPassword(newPassword); + adminController.resetPassword(mockRequest, mockResponse, form); + assertNull(form.getError()); + } catch (IllegalAccessException | UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + return null; + }); + + transactionTemplate.execute(status -> { + ProfileEntity p = profileEntityManager.findByOrcid("4444-4444-4444-4441"); + assertTrue(encryptionManager.hashMatches(newPassword, p.getPassword())); + return null; + }); } @Test public void resetPasswordUsingEmailTest() throws IllegalAccessException, UnsupportedEncodingException { TargetProxyHelper.injectIntoProxy(adminController, "emailManagerReadOnly", mockEmailManagerReadOnly); - - ProfileEntity p = profileEntityManager.findByOrcid("4444-4444-4444-4442"); - assertEquals("e9adO9I4UpBwqI5tGR+qDodvAZ7mlcISn+T+kyqXPf2Z6PPevg7JijqYr6KGO8VOskOYqVOEK2FEDwebxWKGDrV/TQ9gRfKWZlzxssxsOnA=", p.getPassword()); - AdminChangePassword form = new AdminChangePassword(); - form.setOrcidOrEmail("michael@bentine.com"); - form.setPassword("password1"); - adminController.resetPassword(mockRequest, mockResponse, form); - p = profileEntityManager.findByOrcid("4444-4444-4444-4442"); - assertFalse("e9adO9I4UpBwqI5tGR+qDodvAZ7mlcISn+T+kyqXPf2Z6PPevg7JijqYr6KGO8VOskOYqVOEK2FEDwebxWKGDrV/TQ9gRfKWZlzxssxsOnA=".equals(p.getPassword())); + String newPassword = "brandNewPass123"; + + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.execute(status -> { + try { + ProfileEntity p = profileEntityManager.findByOrcid("4444-4444-4444-4442"); + assertEquals("e9adO9I4UpBwqI5tGR+qDodvAZ7mlcISn+T+kyqXPf2Z6PPevg7JijqYr6KGO8VOskOYqVOEK2FEDwebxWKGDrV/TQ9gRfKWZlzxssxsOnA=", p.getPassword()); + AdminChangePassword form = new AdminChangePassword(); + form.setOrcidOrEmail("michael@bentine.com"); + form.setPassword(newPassword); + adminController.resetPassword(mockRequest, mockResponse, form); + assertNull(form.getError()); + } catch (IllegalAccessException | UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + return null; + }); + + transactionTemplate.execute(status -> { + ProfileEntity p = profileEntityManager.findByOrcid("4444-4444-4444-4442"); + assertTrue(encryptionManager.hashMatches(newPassword, p.getPassword())); + return null; + }); } @Test public void resetPasswordTestOrcidURL() throws IllegalAccessException, UnsupportedEncodingException { - ProfileEntity p = profileEntityManager.findByOrcid("4444-4444-4444-4443"); - assertEquals("e9adO9I4UpBwqI5tGR+qDodvAZ7mlcISn+T+kyqXPf2Z6PPevg7JijqYr6KGO8VOskOYqVOEK2FEDwebxWKGDrV/TQ9gRfKWZlzxssxsOnA=", p.getPassword()); - AdminChangePassword form = new AdminChangePassword(); - form.setOrcidOrEmail("https://orcid.org/4444-4444-4444-4443"); - form.setPassword("password1"); - adminController.resetPassword(mockRequest, mockResponse, form); - p = profileEntityManager.findByOrcid("4444-4444-4444-4443"); - assertFalse("e9adO9I4UpBwqI5tGR+qDodvAZ7mlcISn+T+kyqXPf2Z6PPevg7JijqYr6KGO8VOskOYqVOEK2FEDwebxWKGDrV/TQ9gRfKWZlzxssxsOnA=".equals(p.getPassword())); + String newPassword = "brandNewPass123"; + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.execute(status -> { + try { + ProfileEntity p = profileEntityManager.findByOrcid("4444-4444-4444-4443"); + assertEquals("e9adO9I4UpBwqI5tGR+qDodvAZ7mlcISn+T+kyqXPf2Z6PPevg7JijqYr6KGO8VOskOYqVOEK2FEDwebxWKGDrV/TQ9gRfKWZlzxssxsOnA=", p.getPassword()); + AdminChangePassword form = new AdminChangePassword(); + form.setOrcidOrEmail("https://orcid.org/4444-4444-4444-4443"); + form.setPassword(newPassword); + adminController.resetPassword(mockRequest, mockResponse, form); + assertNull(form.getError()); + } catch (IllegalAccessException | UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + return null; + }); + + transactionTemplate.execute(status -> { + ProfileEntity p = profileEntityManager.findByOrcid("4444-4444-4444-4443"); + assertTrue(encryptionManager.hashMatches(newPassword, p.getPassword())); + return null; + }); } @Test diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/AdminControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/AdminControllerTest.java index 7ad391cf018..8cab34226aa 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/AdminControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/AdminControllerTest.java @@ -21,8 +21,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ClaimControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ClaimControllerTest.java index ead24a0f570..38f79aafaf9 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ClaimControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ClaimControllerTest.java @@ -11,9 +11,9 @@ import java.io.UnsupportedEncodingException; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.junit.Before; import org.junit.Test; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ClientsControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ClientsControllerTest.java index 17772c8f7b7..12dfdc15d18 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ClientsControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ClientsControllerTest.java @@ -13,7 +13,7 @@ import java.util.Collections; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.apache.commons.lang3.RandomStringUtils; import org.junit.AfterClass; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/DeveloperToolsControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/DeveloperToolsControllerTest.java index af0db26c99f..f70c5bfa82e 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/DeveloperToolsControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/DeveloperToolsControllerTest.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Set; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.After; import org.junit.Before; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/FundingsControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/FundingsControllerTest.java index 67322dd95e1..5aa643acafc 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/FundingsControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/FundingsControllerTest.java @@ -14,9 +14,9 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/GetMyDataControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/GetMyDataControllerTest.java index 21b38ceb697..0514fc743f3 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/GetMyDataControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/GetMyDataControllerTest.java @@ -34,9 +34,9 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; import org.junit.Before; import org.junit.Test; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ManageMembersControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ManageMembersControllerTest.java index 4b2275aa7ca..a85474bc32c 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ManageMembersControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ManageMembersControllerTest.java @@ -15,8 +15,8 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; -import javax.transaction.Transactional; +import jakarta.annotation.Resource; +import jakarta.transaction.Transactional; import org.junit.After; import org.junit.AfterClass; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OauthGenericCallsControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OauthGenericCallsControllerTest.java deleted file mode 100644 index 92cca1481d8..00000000000 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OauthGenericCallsControllerTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.orcid.frontend.web.controllers; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.isNull; -import static org.mockito.Mockito.when; - -import javax.ws.rs.core.Response; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.orcid.api.common.oauth.OrcidClientCredentialEndPointDelegator; -import org.orcid.core.exception.LockedException; -import org.orcid.core.oauth.OAuthError; -import org.orcid.core.togglz.Features; -import org.springframework.http.ResponseEntity; -import org.springframework.mock.web.MockHttpServletRequest; -import org.togglz.junit.TogglzRule; - -import java.io.IOException; -import java.net.URISyntaxException; - -public class OauthGenericCallsControllerTest { - - @Mock - private OrcidClientCredentialEndPointDelegator orcidClientCredentialEndPointDelegator; - - @InjectMocks - private OauthGenericCallsController controller; - - @Rule - public TogglzRule togglzRule = TogglzRule.allDisabled(Features.class); - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - } - - @Test - public void testObtainOauth2TokenPost() throws IOException, URISyntaxException, InterruptedException { - when(orcidClientCredentialEndPointDelegator.obtainOauth2Token(isNull(), any())).thenReturn( - Response.ok("some-success-entity").build()); - MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); - mockHttpServletRequest.addParameter("grant_type", "client_credentials"); - ResponseEntity responseEntity = controller.obtainOauth2TokenPost(mockHttpServletRequest); - assertNotNull(responseEntity); - assertNotNull(responseEntity.getBody()); - assertEquals("some-success-entity", responseEntity.getBody()); - } - - @Test - public void testObtainOauth2TokenPostLockedClient() throws IOException, URISyntaxException, InterruptedException { - when(orcidClientCredentialEndPointDelegator.obtainOauth2Token(isNull(), any())).thenThrow( - new LockedException("Client is locked")); - MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); - mockHttpServletRequest.addParameter("grant_type", "client_credentials"); - ResponseEntity responseEntity = controller.obtainOauth2TokenPost(mockHttpServletRequest); - assertNotNull(responseEntity); - assertNotNull(responseEntity.getBody()); - assertTrue(responseEntity.getBody() instanceof OAuthError); - - OAuthError error = (OAuthError) responseEntity.getBody(); - assertEquals(OAuthError.UNAUTHORIZED_CLIENT, error.getError()); - assertEquals("Client is locked", error.getErrorDescription()); - } - -} diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OauthRegistrationControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OauthRegistrationControllerTest.java deleted file mode 100644 index d6f9a7e3fef..00000000000 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OauthRegistrationControllerTest.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.orcid.frontend.web.controllers; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.io.UnsupportedEncodingException; -import java.security.Principal; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Matchers; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.orcid.core.oauth.OrcidOAuth2Authentication; -import org.orcid.core.oauth.service.OrcidAuthorizationEndpoint; -import org.orcid.frontend.util.RequestInfoFormLocalCache; -import org.orcid.jaxb.model.message.CreationMethod; -import org.orcid.pojo.ajaxForm.Checkbox; -import org.orcid.pojo.ajaxForm.OauthRegistrationForm; -import org.orcid.pojo.ajaxForm.Registration; -import org.orcid.pojo.ajaxForm.RequestInfoForm; -import org.orcid.pojo.ajaxForm.Text; -import org.orcid.test.DBUnitTest; -import org.orcid.test.OrcidJUnit4ClassRunner; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.core.Authentication; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.web.bind.support.SessionStatus; -import org.springframework.web.servlet.view.RedirectView; - -import com.google.common.collect.Lists; - -public class OauthRegistrationControllerTest { - OauthRegistrationController oauthRegistrationController = new OauthRegistrationController(); - - @Mock - RegistrationController registrationController; - - @Mock - OrcidAuthorizationEndpoint authorizationEndpoint; - - @Mock - AuthenticationManager authenticationManager; - - @Mock - private HttpServletRequest servletRequest; - - @Mock - private HttpServletResponse servletResponse; - - @Mock - private RequestInfoFormLocalCache requestInfoFormLocalCache; - - @Before - public void before() { - MockitoAnnotations.initMocks(this); - oauthRegistrationController.setRegistrationController(registrationController); - oauthRegistrationController.setAuthorizationEndpoint(authorizationEndpoint); - oauthRegistrationController.setAuthenticationManager(authenticationManager); - } - - @Test - public void testStripHtmlFromNames() throws UnsupportedEncodingException { - RequestInfoForm rf = new RequestInfoForm(); - HttpSession session = mock(HttpSession.class); - requestInfoFormLocalCache = mock(RequestInfoFormLocalCache.class); - when(requestInfoFormLocalCache.get(any())).thenReturn(rf); - oauthRegistrationController.setRequestInfoFormLocalCache(requestInfoFormLocalCache); - RedirectView mv = new RedirectView(); - when(servletRequest.getSession()).thenReturn(session); - when(session.getId()).thenReturn("ID1"); - when(authorizationEndpoint.approveOrDeny(Matchers.anyMap(), Matchers.anyMap(), any(SessionStatus.class), any(Principal.class))).thenReturn(mv); - when(authenticationManager.authenticate(any(Authentication.class))).thenAnswer(new Answer(){ - @Override - public Authentication answer(InvocationOnMock invocation) throws Throwable { - OrcidOAuth2Authentication mockedAuthentication = mock(OrcidOAuth2Authentication.class); - return mockedAuthentication; - } - }); - - Text email = Text.valueOf(System.currentTimeMillis() + "@test.orcid.org"); - - OauthRegistrationForm reg = new OauthRegistrationForm(); - org.orcid.pojo.ajaxForm.Visibility fv = new org.orcid.pojo.ajaxForm.Visibility(); - fv.setVisibility(org.orcid.jaxb.model.v3.release.common.Visibility.PUBLIC); - reg.setActivitiesVisibilityDefault(fv); - reg.setEmail(email); - reg.setEmailConfirm(email); - reg.setFamilyNames(Text.valueOf("")); - reg.setGivenNames(Text.valueOf("")); - reg.setPassword(Text.valueOf("1234abcd")); - reg.setPasswordConfirm(Text.valueOf("1234abcd")); - reg.setValNumClient(2L); - reg.setValNumServer(4L); - reg.setApproved(true); - Checkbox c = new Checkbox(); - c.setValue(true); - reg.setTermsOfUse(c); - reg.setCreationType(Text.valueOf(CreationMethod.DIRECT.value())); - reg.setPersistentTokenEnabled(true); - oauthRegistrationController.registerAndAuthorize(servletRequest, servletResponse, reg); - - ArgumentCaptor argument1 = ArgumentCaptor.forClass(HttpServletRequest.class); - ArgumentCaptor argument2 = ArgumentCaptor.forClass(Registration.class); - ArgumentCaptor argument3 = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor argument4 = ArgumentCaptor.forClass(Locale.class); - ArgumentCaptor argument5 = ArgumentCaptor.forClass(String.class); - - verify(registrationController).createMinimalRegistration(argument1.capture(), argument2.capture(), argument3.capture(), argument4.capture(), argument5.capture()); - assertNotNull(argument2.getValue()); - Registration registration = argument2.getValue(); - assertEquals(email.getValue(), registration.getEmail().getValue()); - assertEquals("Given Names", registration.getGivenNames().getValue()); - assertEquals("Family Name", registration.getFamilyNames().getValue()); - } -} diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OrgControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OrgControllerTest.java index b631f48457f..95b6ae1087c 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OrgControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/OrgControllerTest.java @@ -5,8 +5,8 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PIDControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PIDControllerTest.java index f515d1aab1c..977514cb926 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PIDControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PIDControllerTest.java @@ -2,7 +2,7 @@ import static org.junit.Assert.assertEquals; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PasswordResetControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PasswordResetControllerTest.java index 9b490f500ed..48032bdc398 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PasswordResetControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PasswordResetControllerTest.java @@ -14,9 +14,9 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import javax.xml.datatype.DatatypeConfigurationException; import org.junit.AfterClass; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PeerReviewsControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PeerReviewsControllerTest.java index 4989e46cffd..bba4f60ef4f 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PeerReviewsControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PeerReviewsControllerTest.java @@ -8,8 +8,8 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicProfileControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicProfileControllerTest.java index a95abc2f5cc..ad6c58ea362 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicProfileControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicProfileControllerTest.java @@ -13,9 +13,9 @@ import java.util.List; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang.time.DateUtils; import org.junit.AfterClass; @@ -30,7 +30,6 @@ import org.orcid.core.manager.EncryptionManager; import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.core.manager.v3.read_only.ProfileEntityManagerReadOnly; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.jaxb.model.common.Iso3166Country; import org.orcid.jaxb.model.v3.release.common.Visibility; import org.orcid.jaxb.model.v3.release.record.Address; @@ -52,6 +51,8 @@ import org.orcid.test.TargetProxyHelper; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; import org.springframework.web.server.MethodNotAllowedException; import org.springframework.web.servlet.ModelAndView; @@ -92,6 +93,9 @@ public class PublicProfileControllerTest extends DBUnitTest { @Resource private EncryptionManager encryptionManager; + + @Resource(name = "transactionManager") + private PlatformTransactionManager transactionManager; @Mock private HttpServletRequest request = Mockito.mock(HttpServletRequest.class); @@ -102,9 +106,6 @@ public class PublicProfileControllerTest extends DBUnitTest { @Mock private ProfileEntityCacheManager profileEntityCacheManagerMock; - @Mock - private OrcidOauth2TokenDetailService orcidOauth2TokenServiceMock; - @Mock private ProfileEntityManagerReadOnly profileEntityManagerReadOnlyMock; @@ -239,11 +240,16 @@ public void testViewValidUser() { @Test public void testViewClaimedUserWhenIsLongEnough() { + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + //Update the submission date so it is long enough - ProfileEntity profileEntity = profileDao.find(unclaimedUserOrcid); - profileEntity.setSubmissionDate(DateUtils.addDays(new Date(), -10)); - profileDao.merge(profileEntity); - profileDao.flush(); + transactionTemplate.execute(status -> { + ProfileEntity profileEntity = profileDao.find(unclaimedUserOrcid); + profileEntity.setSubmissionDate(DateUtils.addDays(new Date(), -10)); + profileDao.merge(profileEntity); + profileDao.flush(); + return null; + }); ModelAndView mav = publicProfileController.publicPreview(request, response, 1, 0, 15, unclaimedUserOrcid); assertEquals("public_profile_v3", mav.getViewName()); Map model = mav.getModel(); @@ -255,10 +261,13 @@ public void testViewClaimedUserWhenIsLongEnough() { assertFalse(model.containsKey("noIndex")); //Update the submission date so it is not long enough - profileEntity = profileDao.find(unclaimedUserOrcid); - profileEntity.setSubmissionDate(new Date()); - profileDao.merge(profileEntity); - profileDao.flush(); + transactionTemplate.execute(status -> { + ProfileEntity profileEntity = profileDao.find(unclaimedUserOrcid); + profileEntity.setSubmissionDate(new Date()); + profileDao.merge(profileEntity); + profileDao.flush(); + return null; + }); } @Test @@ -393,7 +402,6 @@ public void getUserInfoTest() { private void setupUserInfoMocks() { SourceEntity sourceEntity = new SourceEntity(new ClientDetailsEntity("APP-000000000001")); - TargetProxyHelper.injectIntoProxy(publicProfileController, "orcidOauth2TokenService", orcidOauth2TokenServiceMock); TargetProxyHelper.injectIntoProxy(publicProfileController, "profileEntityCacheManager", profileEntityCacheManagerMock); TargetProxyHelper.injectIntoProxy(publicProfileController, "profileEntityManagerReadOnly", profileEntityManagerReadOnlyMock); @@ -407,7 +415,7 @@ private void setupUserInfoMocks() { reviewedNoIntegrations.setRecordLocked(false); reviewedNoIntegrations.setReviewed(true); - when(orcidOauth2TokenServiceMock.hasToken(eq(reviewedNoIntegrationsOrcid), anyLong())).thenReturn(false); + when(profileEntityManagerReadOnlyMock.hasToken(eq(reviewedNoIntegrationsOrcid), anyLong())).thenReturn(false); when(profileEntityCacheManagerMock.retrieve(reviewedNoIntegrationsOrcid)).thenReturn(reviewedNoIntegrations); // Reviewed record with integrations @@ -415,7 +423,7 @@ private void setupUserInfoMocks() { reviewedWithIntegrations.setRecordLocked(false); reviewedWithIntegrations.setReviewed(true); - when(orcidOauth2TokenServiceMock.hasToken(eq(reviewedWithIntegrationsOrcid), anyLong())).thenReturn(true); + when(profileEntityManagerReadOnlyMock.hasToken(eq(reviewedWithIntegrationsOrcid), anyLong())).thenReturn(true); when(profileEntityCacheManagerMock.retrieve(reviewedWithIntegrationsOrcid)).thenReturn(reviewedWithIntegrations); // Un-reviewed record with no integrations @@ -423,7 +431,7 @@ private void setupUserInfoMocks() { unreviewedNoIntegrations.setRecordLocked(false); unreviewedNoIntegrations.setReviewed(false); - when(orcidOauth2TokenServiceMock.hasToken(eq(unreviewedNoIntegrationsOrcid), anyLong())).thenReturn(false); + when(profileEntityManagerReadOnlyMock.hasToken(eq(unreviewedNoIntegrationsOrcid), anyLong())).thenReturn(false); when(profileEntityCacheManagerMock.retrieve(unreviewedNoIntegrationsOrcid)).thenReturn(unreviewedNoIntegrations); // Un-reviewed record with integrations @@ -431,7 +439,7 @@ private void setupUserInfoMocks() { unreviewedWithIntegrations.setRecordLocked(false); unreviewedWithIntegrations.setReviewed(false); - when(orcidOauth2TokenServiceMock.hasToken(eq(unreviewedWithIntegrationsOrcid), anyLong())).thenReturn(true); + when(profileEntityManagerReadOnlyMock.hasToken(eq(unreviewedWithIntegrationsOrcid), anyLong())).thenReturn(true); when(profileEntityCacheManagerMock.retrieve(unreviewedWithIntegrationsOrcid)).thenReturn(unreviewedWithIntegrations); // Un reviewed record, created by member, with no integrations and no activities @@ -440,7 +448,7 @@ private void setupUserInfoMocks() { unreviewedWithIntegrations.setRecordLocked(false); unreviewedWithIntegrations.setReviewed(false); - when(orcidOauth2TokenServiceMock.hasToken(eq(unreviewedCreatedByMembersWithNoActivitiesOrcid), anyLong())).thenReturn(false); + when(profileEntityManagerReadOnlyMock.hasToken(eq(unreviewedCreatedByMembersWithNoActivitiesOrcid), anyLong())).thenReturn(false); when(profileEntityCacheManagerMock.retrieve(eq(unreviewedCreatedByMembersWithNoActivitiesOrcid))).thenReturn(unreviewedCreatedByMembersWithNoActivities); @@ -450,7 +458,7 @@ private void setupUserInfoMocks() { unreviewedWithIntegrations.setRecordLocked(false); unreviewedWithIntegrations.setReviewed(false); - when(orcidOauth2TokenServiceMock.hasToken(eq(unreviewedCreatedByMembersWithActivitiesOrcid), anyLong())).thenReturn(false); + when(profileEntityManagerReadOnlyMock.hasToken(eq(unreviewedCreatedByMembersWithActivitiesOrcid), anyLong())).thenReturn(false); when(profileEntityCacheManagerMock.retrieve(eq(unreviewedCreatedByMembersWithActivitiesOrcid))).thenReturn(unreviewedCreatedByMembersWithActivities); // Deprecated @@ -459,7 +467,7 @@ private void setupUserInfoMocks() { deprecated.setReviewed(true); deprecated.setPrimaryRecord(new ProfileEntity(primaryRecord)); - when(orcidOauth2TokenServiceMock.hasToken(eq(deprecatedUserOrcid), anyLong())).thenReturn(true); + when(profileEntityManagerReadOnlyMock.hasToken(eq(deprecatedUserOrcid), anyLong())).thenReturn(true); when(profileEntityCacheManagerMock.retrieve(deprecatedUserOrcid)).thenReturn(deprecated); // Locked @@ -467,7 +475,7 @@ private void setupUserInfoMocks() { locked.setRecordLocked(true); locked.setReviewed(true); - when(orcidOauth2TokenServiceMock.hasToken(eq(lockedUserOrcid), anyLong())).thenReturn(true); + when(profileEntityManagerReadOnlyMock.hasToken(eq(lockedUserOrcid), anyLong())).thenReturn(true); when(profileEntityCacheManagerMock.retrieve(lockedUserOrcid)).thenReturn(locked); @@ -476,7 +484,7 @@ private void setupUserInfoMocks() { allOk.setRecordLocked(false); allOk.setReviewed(true); - when(orcidOauth2TokenServiceMock.hasToken(eq(userOrcid), anyLong())).thenReturn(true); + when(profileEntityManagerReadOnlyMock.hasToken(eq(userOrcid), anyLong())).thenReturn(true); when(profileEntityCacheManagerMock.retrieve(userOrcid)).thenReturn(allOk); } } diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicRecordControllerLegacyTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicRecordControllerLegacyTest.java index f7d23d22630..0d790858395 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicRecordControllerLegacyTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicRecordControllerLegacyTest.java @@ -18,9 +18,9 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.Collections; import java.util.List; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicRecordControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicRecordControllerTest.java index 56cf17f5ed1..00a96982a46 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicRecordControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/PublicRecordControllerTest.java @@ -20,9 +20,9 @@ import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpSession; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Collections; import static org.junit.Assert.*; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/RecordCorrectionsControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/RecordCorrectionsControllerTest.java index 7a0c0f2b38d..764eb2c46f0 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/RecordCorrectionsControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/RecordCorrectionsControllerTest.java @@ -10,7 +10,7 @@ import java.util.Arrays; import java.util.Optional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/RegistrationControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/RegistrationControllerTest.java index a5ea591ce92..0e17e6de2bd 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/RegistrationControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/RegistrationControllerTest.java @@ -18,10 +18,10 @@ import java.util.List; import java.util.Locale; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; import org.apache.commons.codec.binary.Base64; import org.jasypt.exceptions.EncryptionOperationNotPossibleException; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ResearchResourceControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ResearchResourceControllerTest.java index 049a0f9160b..f43297ff8ff 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ResearchResourceControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ResearchResourceControllerTest.java @@ -10,10 +10,10 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; -import javax.persistence.NoResultException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.annotation.Resource; +import jakarta.persistence.NoResultException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ShibbolethControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ShibbolethControllerTest.java index 91fdf4e1001..05bd51d84f2 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ShibbolethControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/ShibbolethControllerTest.java @@ -9,10 +9,10 @@ import java.util.Locale; import java.util.Map; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; import org.junit.Before; import org.junit.Test; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/SpamControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/SpamControllerTest.java index 9979ef113e9..c8346485ea5 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/SpamControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/SpamControllerTest.java @@ -9,9 +9,9 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/TwoFactorAuthenticationControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/TwoFactorAuthenticationControllerTest.java index d316b41a942..a849d05417a 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/TwoFactorAuthenticationControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/TwoFactorAuthenticationControllerTest.java @@ -15,8 +15,8 @@ import org.orcid.pojo.*; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.List; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/WorksControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/WorksControllerTest.java index c838ffccabc..7fea9f97f5d 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/WorksControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/WorksControllerTest.java @@ -13,9 +13,9 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/WorkspaceControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/WorkspaceControllerTest.java index 6d5eb037589..d03c8de3b21 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/controllers/WorkspaceControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/controllers/WorkspaceControllerTest.java @@ -5,7 +5,7 @@ import java.util.ArrayList; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/filter/OAuthAuthorizeNotSignedInFilterTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/filter/OAuthAuthorizeNotSignedInFilterTest.java deleted file mode 100644 index 6f6b81154c2..00000000000 --- a/orcid-web/src/test/java/org/orcid/frontend/web/filter/OAuthAuthorizeNotSignedInFilterTest.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.orcid.frontend.web.filter; - -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Vector; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.orcid.core.constants.OrcidOauth2Constants; -import org.orcid.core.manager.impl.OrcidUrlManager; -import org.orcid.frontend.util.RequestInfoFormLocalCache; -import org.orcid.frontend.web.controllers.helper.OauthHelper; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; - -public class OAuthAuthorizeNotSignedInFilterTest { - - @InjectMocks - OAuthAuthorizeNotSignedInFilter oaFilter; - - @Mock - OrcidUrlManager orcidUrlManager; - - @Mock - HttpServletRequest request; - - @Mock - HttpServletResponse response; - - @Mock - HttpSession session; - - @Mock - FilterChain chain; - - @Mock - SecurityContext context; - - @Mock - UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken; - - @Mock - UserDetails orcidProfileUserDetails; - - @Mock - OauthHelper oauthHelper; - - @Mock - RequestInfoFormLocalCache requestInfoFormLocalCache; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - when(orcidUrlManager.getBaseUrl()).thenReturn("http://test.com"); - when(request.getHeaderNames()).thenReturn(new Vector().elements()); - when(request.getLocales()).thenReturn(new Vector().elements()); - when(request.getParameterMap()).thenReturn(new HashMap()); - when(request.getScheme()).thenReturn("i hate you with all my heart spring mvc"); - when(request.getRequestURL()).thenReturn(new StringBuffer("really, we should break up")); - when(session.getId()).thenReturn("ID1"); - } - - @Test - public void nullSession() throws IOException, ServletException { - when(request.getContextPath()).thenReturn("http://test.com"); - when(request.getRequestURI()).thenReturn("http://test.com/oauth/authorize"); - when(request.getQueryString()).thenReturn("test_param=param"); - when(request.getSession(false)).thenReturn(null); - - oaFilter.doFilter((ServletRequest) request, (ServletResponse) response, chain); - - verify(response).sendRedirect("http://test.com/signin?oauth&test_param=param"); - verify(chain, never()).doFilter(Mockito.any(), Mockito.any()); - } - - @Test - public void noSecurityContext() throws IOException, ServletException { - when(request.getContextPath()).thenReturn("http://test.com"); - when(request.getRequestURI()).thenReturn("http://test.com/oauth/authorize"); - when(request.getQueryString()).thenReturn("test_param=param"); - when(request.getSession()).thenReturn(session); - when(request.getSession(false)).thenReturn(session); - - oaFilter.doFilter((ServletRequest) request, (ServletResponse) response, chain); - - verify(response).sendRedirect("http://test.com/signin?oauth&test_param=param"); - verify(chain, never()).doFilter(Mockito.any(), Mockito.any()); - } - - @Test - public void noAuthentication() throws IOException, ServletException { - when(request.getContextPath()).thenReturn("http://test.com"); - when(request.getRequestURI()).thenReturn("http://test.com/oauth/authorize"); - when(request.getQueryString()).thenReturn("test_param=param"); - when(request.getSession()).thenReturn(session); - when(request.getSession(false)).thenReturn(session); - when(session.getAttribute("SPRING_SECURITY_CONTEXT")).thenReturn(context); - - oaFilter.doFilter((ServletRequest) request, (ServletResponse) response, chain); - - verify(response).sendRedirect("http://test.com/signin?oauth&test_param=param"); - verify(chain, never()).doFilter(Mockito.any(), Mockito.any()); - } - - @Test - public void hasOrcidProfileUserDetails() throws IOException, ServletException { - when(request.getContextPath()).thenReturn("http://test.com"); - when(request.getRequestURI()).thenReturn("http://test.com/oauth/authorize"); - when(request.getQueryString()).thenReturn("test_param=param"); - when(request.getSession()).thenReturn(session); - when(request.getSession(false)).thenReturn(session); - when(session.getAttribute("SPRING_SECURITY_CONTEXT")).thenReturn(context); - when(context.getAuthentication()).thenReturn(usernamePasswordAuthenticationToken); - when(usernamePasswordAuthenticationToken.getName()).thenReturn("0000-0000-0000-0000"); - when(usernamePasswordAuthenticationToken.getCredentials()).thenReturn("password"); - - oaFilter.doFilter((ServletRequest) request, (ServletResponse) response, chain); - - verify(response, never()).sendRedirect(Mockito.anyString()); - verify(chain).doFilter(Mockito.any(), Mockito.any()); - } - - @Test - public void notUriOauthAuthorize() throws IOException, ServletException { - when(request.getContextPath()).thenReturn("http://test.com"); - when(request.getRequestURI()).thenReturn("http://test.com/signin?oauth"); - when(request.getQueryString()).thenReturn("test_param=param"); - when(request.getSession(false)).thenReturn(null); - - oaFilter.doFilter((ServletRequest) request, (ServletResponse) response, chain); - - verify(response, never()).sendRedirect(Mockito.anyString()); - verify(chain).doFilter(Mockito.any(), Mockito.any()); - } - - @Test - public void oauth2ScreensFeatureEnabledTest() throws IOException, ServletException { - when(request.getContextPath()).thenReturn("http://test.com"); - when(request.getRequestURI()).thenReturn("http://test.com/oauth/authorize"); - when(request.getQueryString()).thenReturn("test_param=param"); - when(request.getSession()).thenReturn(session); - when(request.getSession(false)).thenReturn(session); - when(session.getAttribute("SPRING_SECURITY_CONTEXT")).thenReturn(context); - - oaFilter.doFilter((ServletRequest) request, (ServletResponse) response, chain); - - verify(response).sendRedirect("http://test.com/signin?oauth&test_param=param"); - verify(chain, never()).doFilter(Mockito.any(), Mockito.any()); - } - - @Test - public void oauth2ScreensFeatureFlagUsedTest() throws IOException, ServletException { - when(request.getContextPath()).thenReturn("http://test.com"); - when(request.getRequestURI()).thenReturn("http://test.com/oauth/authorize"); - when(request.getQueryString()).thenReturn("test_param=param&" + OrcidOauth2Constants.OAUTH_2SCREENS); - when(request.getSession()).thenReturn(session); - when(request.getSession(false)).thenReturn(session); - when(session.getAttribute("SPRING_SECURITY_CONTEXT")).thenReturn(context); - - oaFilter.doFilter((ServletRequest) request, (ServletResponse) response, chain); - - verify(response).sendRedirect("http://test.com/signin?oauth&test_param=param&" + OrcidOauth2Constants.OAUTH_2SCREENS); - verify(chain, never()).doFilter(Mockito.any(), Mockito.any()); - } -} diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/forms/validate/AbstractConstraintValidator.java b/orcid-web/src/test/java/org/orcid/frontend/web/forms/validate/AbstractConstraintValidator.java index 11a85698c69..4238fb2036b 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/forms/validate/AbstractConstraintValidator.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/forms/validate/AbstractConstraintValidator.java @@ -8,9 +8,9 @@ import java.util.Map; import java.util.Set; -import javax.annotation.Resource; -import javax.validation.ConstraintViolation; -import javax.validation.Validator; +import jakarta.annotation.Resource; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validator; import org.junit.runner.RunWith; import org.orcid.test.OrcidJUnit4ClassRunner; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/security/AuthenticationManagerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/security/AuthenticationManagerTest.java index 8898943f3d7..6005c722c1d 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/security/AuthenticationManagerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/security/AuthenticationManagerTest.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.Collection; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/util/BaseControllerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/util/BaseControllerTest.java index 84267bec032..57859f04575 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/util/BaseControllerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/util/BaseControllerTest.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.List; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.AfterClass; import org.junit.Before; diff --git a/orcid-web/src/test/java/org/orcid/frontend/web/util/ThirdPartyLinkManagerTest.java b/orcid-web/src/test/java/org/orcid/frontend/web/util/ThirdPartyLinkManagerTest.java index 7b545fda591..0bd26970589 100644 --- a/orcid-web/src/test/java/org/orcid/frontend/web/util/ThirdPartyLinkManagerTest.java +++ b/orcid-web/src/test/java/org/orcid/frontend/web/util/ThirdPartyLinkManagerTest.java @@ -18,8 +18,8 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.orcid.core.locale.LocaleManager; -import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.core.manager.ClientDetailsEntityCacheManager; +import org.orcid.core.manager.v3.read_only.ClientDetailsManagerReadOnly; import org.orcid.core.utils.cache.redis.RedisClient; import org.orcid.jaxb.model.clientgroup.RedirectUriType; import org.orcid.persistence.dao.ClientRedirectDao; @@ -38,10 +38,10 @@ public class ThirdPartyLinkManagerTest { private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; @Mock - private LocaleManager localeManager; + private ClientDetailsManagerReadOnly clientDetailsManagerReadOnly; @Mock - private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; + private LocaleManager localeManager; @Mock private RedisClient redisClient; @@ -222,8 +222,8 @@ public void findSearchAndLinkWizardClients_cacheMiss_buildsListAndSetsConnected( initSearchAndLinkWizardData(); Mockito.when(redisClient.get(eq("works-search-and-link-wizard-clients"))).thenReturn(null); - Mockito.when(orcidOauth2TokenDetailService.doesClientKnowUser(eq("APP-00001"), eq("0000-0000-0000-0001"))).thenReturn(true); - Mockito.when(orcidOauth2TokenDetailService.doesClientKnowUser(eq("APP-00002"), eq("0000-0000-0000-0001"))).thenReturn(false); + Mockito.when(clientDetailsManagerReadOnly.doesClientKnowUser(eq("APP-00001"), eq("0000-0000-0000-0001"))).thenReturn(true); + Mockito.when(clientDetailsManagerReadOnly.doesClientKnowUser(eq("APP-00002"), eq("0000-0000-0000-0001"))).thenReturn(false); List forms = thirdPartyLinkManager.findSearchAndLinkWizardClients("0000-0000-0000-0001"); assertNotNull(forms); @@ -253,7 +253,7 @@ public void findSearchAndLinkWizardClients_cacheHit_usesCachedValueAndSkipsDao() String cachedJson = "[{\"id\":\"APP-00001\",\"name\":\"Client One\",\"redirectUri\":\"https://test.orcid.org/search-link/1\",\"scopes\":\"/read-limited\",\"redirectUriMetadata\":{\"certified\":true}}]"; Mockito.when(redisClient.get(eq("works-search-and-link-wizard-clients"))).thenReturn(cachedJson); - Mockito.when(orcidOauth2TokenDetailService.doesClientKnowUser(eq("APP-00001"), eq("0000-0000-0000-0001"))).thenReturn(true); + Mockito.when(clientDetailsManagerReadOnly.doesClientKnowUser(eq("APP-00001"), eq("0000-0000-0000-0001"))).thenReturn(true); List forms = thirdPartyLinkManager.findSearchAndLinkWizardClients("0000-0000-0000-0001"); assertNotNull(forms); @@ -272,8 +272,8 @@ public void findSearchAndLinkWizardClients_badCachedValue_rebuildsAndStores() { ReflectionTestUtils.setField(thirdPartyLinkManager, "worksSearchAndLinkWizardCacheTtl", 99); Mockito.when(redisClient.get(eq("works-search-and-link-wizard-clients"))).thenReturn("{bad json"); - Mockito.when(orcidOauth2TokenDetailService.doesClientKnowUser(eq("APP-00001"), eq("0000-0000-0000-0001"))).thenReturn(true); - Mockito.when(orcidOauth2TokenDetailService.doesClientKnowUser(eq("APP-00002"), eq("0000-0000-0000-0001"))).thenReturn(false); + Mockito.when(clientDetailsManagerReadOnly.doesClientKnowUser(eq("APP-00001"), eq("0000-0000-0000-0001"))).thenReturn(true); + Mockito.when(clientDetailsManagerReadOnly.doesClientKnowUser(eq("APP-00002"), eq("0000-0000-0000-0001"))).thenReturn(false); List forms = thirdPartyLinkManager.findSearchAndLinkWizardClients("0000-0000-0000-0001"); assertNotNull(forms); diff --git a/orcid-web/src/test/resources/test-core-context.xml b/orcid-web/src/test/resources/test-core-context.xml index 2c1cb08e585..f53e64ed165 100644 --- a/orcid-web/src/test/resources/test-core-context.xml +++ b/orcid-web/src/test/resources/test-core-context.xml @@ -2,9 +2,9 @@ + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> The parent ORCID pom that all sub-projects reside under - 5.3.20 - 5.6.2 + 6.0.23 + 6.0.8 4.9.1 - 2.27 - 2.13.1 + 3.1.9 + 2.15.4 + 6.1.5 2.1.1 1.9.6 4.4.0 @@ -87,7 +88,7 @@ the software. 3.6.3 - 11 + [11,) @@ -123,8 +124,8 @@ the software. maven-compiler-plugin true - 11 - 11 + 17 + 17 @@ -132,7 +133,7 @@ the software. maven-surefire-plugin - -Duser.timezone=GMT + -Duser.timezone=GMT --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED alphabetical + + org.openrewrite.maven + rewrite-maven-plugin + 5.43.0 + + + org.openrewrite.java.migrate.UpgradeToJava17 + org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta + org.openrewrite.java.spring.framework.UpgradeSpringFramework_6_0 + org.openrewrite.hibernate.MigrateToHibernate62 + org.openrewrite.apache.httpclient5.UpgradeApacheHttpClient_5 + + + + + org.openrewrite.recipe + rewrite-migrate-java + 2.20.0 + + + org.openrewrite.recipe + rewrite-spring + 5.18.0 + + + + org.openrewrite.recipe + rewrite-hibernate + 2.19.1 + + + org.openrewrite.recipe + rewrite-apache + 1.4.2 + + + @@ -302,6 +341,7 @@ the software. build-helper-maven-plugin 1.10 + @@ -361,7 +401,6 @@ the software. junit junit - ${junit.version} test @@ -507,13 +546,6 @@ the software. - - - org.springframework.security.oauth - spring-security-oauth2 - 2.5.2.RELEASE - compile - org.springframework.security spring-security-acl @@ -639,9 +671,15 @@ the software. compile - javax.servlet - javax.servlet-api - 4.0.1 + jakarta.servlet + jakarta.servlet-api + 6.0.0 + compile + + + jakarta.annotation + jakarta.annotation-api + 2.1.1 compile @@ -660,15 +698,15 @@ the software. ${jackson.version} - org.apache.httpcomponents - httpclient - 4.5.13 + org.apache.httpcomponents.client5 + httpclient5 + 5.3.1 compile - org.apache.httpcomponents - httpcore - 4.4.4 + org.apache.httpcomponents.core5 + httpcore5 + 5.3.6 compile @@ -685,9 +723,9 @@ the software. - javax.ws.rs - javax.ws.rs-api - 2.1 + jakarta.ws.rs + jakarta.ws.rs-api + 3.1.0 @@ -696,21 +734,34 @@ the software. postgresql 42.7.2 + + + - org.hibernate - hibernate-agroal - 5.4.27.Final + org.hibernate.orm + hibernate-core + 6.4.4.Final - org.hibernate + org.hibernate.orm + hibernate-agroal + 6.4.4.Final + + + org.hibernate.orm hibernate-c3p0 - 5.3.6.Final + 6.4.4.Final - org.hibernate + org.hibernate.validator hibernate-validator - 5.4.3.Final + 8.0.1.Final + + jakarta.persistence + jakarta.persistence-api + 3.1.0 + org.liquibase liquibase-core @@ -734,13 +785,38 @@ the software. org.ehcache ehcache - 3.5.2 + 3.11.1 + jakarta + + + org.glassfish.jaxb + jaxb-runtime + + + org.glassfish.jaxb + jaxb-core + + + javax.xml.bind + jaxb-api + + javax.cache cache-api - 1.0.0 + 1.1.1 + + org.glassfish.jaxb + jaxb-runtime + 2.3.8 + + + javax.xml.bind + jaxb-api + 2.3.1 + @@ -771,9 +847,9 @@ the software. compile - javax.validation - validation-api - 2.0.1.Final + jakarta.validation + jakarta.validation-api + 3.0.2 args4j @@ -795,7 +871,7 @@ the software. org.jbibtex jbibtex - 1.0.7 + 1.0.20 net.sf.opencsv @@ -880,7 +956,7 @@ the software. net.bytebuddy byte-buddy - 1.10.5 + 1.14.12 org.hsqldb @@ -921,7 +997,7 @@ the software. org.orcid orcid-model - 3.3.9 + 4.0.0 org.orcid @@ -988,25 +1064,6 @@ the software. https://jcenter.bintray.com - - - m2.java.net - Java.net Maven 2 Repository - https://download.java.net/maven/2 - default - - - mc-release - Local Maven repository of releases - https://mc-repo.googlecode.com/svn/maven2/releases - - false - - - true - - -