diff --git a/api/api-iam/iam-internal-client/src/main/java/fr/gouv/vitamui/iam/internal/client/ExternalParametersInternalRestClient.java b/api/api-iam/iam-internal-client/src/main/java/fr/gouv/vitamui/iam/internal/client/ExternalParametersInternalRestClient.java index 30e69cdb425..b51ab6aeb4b 100644 --- a/api/api-iam/iam-internal-client/src/main/java/fr/gouv/vitamui/iam/internal/client/ExternalParametersInternalRestClient.java +++ b/api/api-iam/iam-internal-client/src/main/java/fr/gouv/vitamui/iam/internal/client/ExternalParametersInternalRestClient.java @@ -39,6 +39,7 @@ import fr.gouv.vitamui.commons.api.CommonConstants; import fr.gouv.vitamui.commons.api.domain.ExternalParametersDto; import fr.gouv.vitamui.commons.api.domain.PaginatedValuesDto; +import fr.gouv.vitamui.commons.rest.client.AbstractHttpContext; import fr.gouv.vitamui.commons.rest.client.BasePaginatingAndSortingRestClient; import fr.gouv.vitamui.commons.rest.client.InternalHttpContext; import fr.gouv.vitamui.iam.common.rest.RestApi; @@ -55,8 +56,6 @@ /** * A REST client to check existence, read, create, update and delete the external parameters. - * - * */ public class ExternalParametersInternalRestClient extends BasePaginatingAndSortingRestClient { @@ -69,10 +68,11 @@ public ExternalParametersInternalRestClient(final RestTemplate restTemplate, fin /** * Retrieve the external parameters associated to the authenticated user. + * * @param context * @return the external parameters */ - public ExternalParametersDto getMyExternalParameters(final InternalHttpContext context) { + public ExternalParametersDto getMyExternalParameters(final AbstractHttpContext context) { LOGGER.debug("getMyExternalParameters"); final HttpEntity request = new HttpEntity<>(buildHeaders(context)); @@ -100,11 +100,13 @@ protected Class getDtoClass() { @Override protected ParameterizedTypeReference> getDtoListClass() { - return new ParameterizedTypeReference>() {}; + return new ParameterizedTypeReference>() { + }; } @Override protected ParameterizedTypeReference> getDtoPaginatedClass() { - return new ParameterizedTypeReference>() {}; + return new ParameterizedTypeReference>() { + }; } } diff --git a/api/api-ingest/ingest-external/pom.xml b/api/api-ingest/ingest-external/pom.xml index ec33a13f89a..0e1e95b0c40 100644 --- a/api/api-ingest/ingest-external/pom.xml +++ b/api/api-ingest/ingest-external/pom.xml @@ -52,6 +52,17 @@ iam-security + + + org.odftoolkit + odfdom-java + + + org.apache.odftoolkit + simple-odf + + + org.springframework.boot @@ -94,33 +105,12 @@ spring-boot-devtools - - - org.odftoolkit - odfdom-java - - - org.apache.odftoolkit - simple-odf - - io.micrometer micrometer-registry-prometheus - - fr.gouv.vitamui.commons - commons-vitam - - - - - fr.gouv.vitamui - ingest-commons - - org.projectlombok @@ -205,10 +195,6 @@ junit-vintage-engine test - - fr.gouv.vitamui.commons - commons-mongo - diff --git a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/config/ApiIngestExternalApplicationProperties.java b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/config/ApiIngestExternalApplicationProperties.java index d58a9ad4fba..fee56d7c439 100644 --- a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/config/ApiIngestExternalApplicationProperties.java +++ b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/config/ApiIngestExternalApplicationProperties.java @@ -57,5 +57,4 @@ public class ApiIngestExternalApplicationProperties { private RestClientConfiguration securityClient; - private RestClientConfiguration ingestInternalClient; } diff --git a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/config/ApiIngestServerConfig.java b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/config/ApiIngestServerConfig.java index c19c40e8f28..7a723355ab6 100644 --- a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/config/ApiIngestServerConfig.java +++ b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/config/ApiIngestServerConfig.java @@ -40,7 +40,6 @@ import fr.gouv.vitam.ingest.external.client.IngestExternalClient; import fr.gouv.vitamui.commons.api.application.AbstractContextConfiguration; import fr.gouv.vitamui.commons.rest.RestExceptionHandler; -import fr.gouv.vitamui.commons.rest.client.configuration.RestClientConfiguration; import fr.gouv.vitamui.commons.rest.configuration.SwaggerConfiguration; import fr.gouv.vitamui.commons.vitam.api.access.LogbookService; import fr.gouv.vitamui.commons.vitam.api.config.VitamAccessConfig; @@ -58,14 +57,13 @@ import fr.gouv.vitamui.iam.security.service.InternalAuthentificationService; import fr.gouv.vitamui.iam.security.service.InternalSecurityService; import fr.gouv.vitamui.ingest.external.server.security.WebSecurityConfig; -import fr.gouv.vitamui.ingest.external.server.service.AccessContractInternalService; -import fr.gouv.vitamui.ingest.external.server.service.IngestExternalParametersService; -import fr.gouv.vitamui.ingest.external.server.service.IngestGeneratorODTFile; -import fr.gouv.vitamui.ingest.external.server.service.IngestInternalService; +import fr.gouv.vitamui.ingest.external.server.service.internal.AccessContractInternalService; +import fr.gouv.vitamui.ingest.external.server.service.internal.IngestExternalParametersService; +import fr.gouv.vitamui.ingest.external.server.service.internal.IngestGeneratorODTFile; +import fr.gouv.vitamui.ingest.external.server.service.internal.IngestInternalService; import fr.gouv.vitamui.security.client.ContextRestClient; import fr.gouv.vitamui.security.client.SecurityRestClientFactory; import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -76,9 +74,14 @@ import java.util.Arrays; @Configuration -@Import({RestExceptionHandler.class, VitamAdministrationConfig.class, VitamAccessConfig.class, - WebSecurityConfig.class, VitamIngestConfig.class, - SwaggerConfiguration.class, HttpMessageConvertersAutoConfiguration.class}) +@Import({RestExceptionHandler.class, + SwaggerConfiguration.class, + //MongoConfig.class, not sure to need it + WebSecurityConfig.class, + VitamAccessConfig.class, + VitamIngestConfig.class, + VitamAdministrationConfig.class, + HttpMessageConvertersAutoConfiguration.class}) public class ApiIngestServerConfig extends AbstractContextConfiguration { @Bean @@ -97,6 +100,19 @@ public ContextRestClient contextCrudRestClient(final SecurityRestClientFactory s return securityRestClientFactory.getContextRestClient(); } + @Bean + public MappingJackson2HttpMessageConverter customizedJacksonMessageConverter() { + MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); + converter.setSupportedMediaTypes( + Arrays.asList( + MediaType.APPLICATION_JSON, + new MediaType("application", "*+json"), + MediaType.APPLICATION_OCTET_STREAM + ) + ); + return converter; + } + @Bean public ExternalApiAuthenticationProvider apiAuthenticationProvider( final ExternalAuthentificationService externalAuthentificationService @@ -129,72 +145,54 @@ public IamInternalRestClientFactory iamInternalRestClientFactory( } @Bean - public InternalSecurityService securityService() { - return new InternalSecurityService(); - } - - @Bean - public CustomerInternalRestClient customerInternalRestClient( + public UserInternalRestClient userInternalRestClient( final IamInternalRestClientFactory iamInternalRestClientFactory ) { - return iamInternalRestClientFactory.getCustomerInternalRestClient(); - } - - @Bean - public IngestGeneratorODTFile ingestGeneratorODTFile() { - return new IngestGeneratorODTFile(); + return iamInternalRestClientFactory.getUserInternalRestClient(); } @Bean - public ExternalParametersInternalRestClient externalParametersInternalRestClient( - final IamInternalRestClientFactory iamInternalRestClientFactory + public InternalApiAuthenticationProvider internalApiAuthenticationProvider( + final InternalAuthentificationService internalAuthentificationService ) { - return iamInternalRestClientFactory.getExternalParametersInternalRestClient(); + return new InternalApiAuthenticationProvider(internalAuthentificationService); } + + @Bean - @ConfigurationProperties(prefix = "clients.iam-internal") - public RestClientConfiguration IamInternalRestClientConfiguration() { - return new RestClientConfiguration(); + public InternalAuthentificationService internalAuthentificationService( + final UserInternalRestClient userInternalRestClient + ) { + return new InternalAuthentificationService(userInternalRestClient); } @Bean - public MappingJackson2HttpMessageConverter customizedJacksonMessageConverter() { - MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); - converter.setSupportedMediaTypes( - Arrays.asList( - MediaType.APPLICATION_JSON, - new MediaType("application", "*+json"), - MediaType.APPLICATION_OCTET_STREAM - ) - ); - return converter; + public InternalSecurityService securityService() { + return new InternalSecurityService(); } @Bean - public InternalApiAuthenticationProvider internalApiAuthenticationProvider( - final InternalAuthentificationService internalAuthentificationService + public CustomerInternalRestClient customerInternalRestClient( + final IamInternalRestClientFactory iamInternalRestClientFactory ) { - return new InternalApiAuthenticationProvider(internalAuthentificationService); + return iamInternalRestClientFactory.getCustomerInternalRestClient(); } @Bean - public UserInternalRestClient userInternalRestClient( - final IamInternalRestClientFactory iamInternalRestClientFactory - ) { - return iamInternalRestClientFactory.getUserInternalRestClient(); + public IngestGeneratorODTFile ingestGeneratorODTFile() { + return new IngestGeneratorODTFile(); } @Bean - public InternalAuthentificationService internalAuthentificationService( - final UserInternalRestClient userInternalRestClient + public ExternalParametersInternalRestClient externalParametersInternalRestClient( + final IamInternalRestClientFactory iamInternalRestClientFactory ) { - return new InternalAuthentificationService(userInternalRestClient); + return iamInternalRestClientFactory.getExternalParametersInternalRestClient(); } @Bean public IngestInternalService ingestInternalService( - final ExternalSecurityService externalSecurityService, final InternalSecurityService internalSecurityService, final LogbookService logbookService, final ObjectMapper objectMapper, @@ -203,10 +201,10 @@ public IngestInternalService ingestInternalService( final CustomerInternalRestClient customerInternalRestClient, final IngestGeneratorODTFile ingestGeneratorODTFile, final IngestExternalParametersService ingestExternalParametersService, - final AccessContractInternalService accessContractInternalService + final AccessContractInternalService accessContractInternalService, + final ExternalSecurityService externalSecurityService ) { return new IngestInternalService( - externalSecurityService, internalSecurityService, logbookService, objectMapper, @@ -215,6 +213,7 @@ public IngestInternalService ingestInternalService( customerInternalRestClient, ingestGeneratorODTFile, ingestExternalParametersService, + externalSecurityService, accessContractInternalService ); } diff --git a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/rest/IngestExternalController.java b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/rest/IngestExternalController.java index 5d97430c77e..c81fcdc7bb5 100644 --- a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/rest/IngestExternalController.java +++ b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/rest/IngestExternalController.java @@ -49,7 +49,7 @@ import fr.gouv.vitamui.commons.utils.VitamUIUtils; import fr.gouv.vitamui.commons.vitam.api.dto.LogbookOperationDto; import fr.gouv.vitamui.ingest.common.rest.RestApi; -import fr.gouv.vitamui.ingest.external.server.service.IngestInternalService; +import fr.gouv.vitamui.ingest.external.server.service.internal.IngestInternalService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; @@ -69,7 +69,6 @@ import java.io.IOException; import java.io.InputStream; -import java.net.URISyntaxException; import java.util.Optional; /** @@ -83,7 +82,6 @@ public class IngestExternalController { private static final Logger LOGGER = LoggerFactory.getLogger(IngestExternalController.class); - //private final IngestExternalService ingestExternalService; private final IngestInternalService ingestInternalService; @Autowired @@ -99,7 +97,7 @@ public PaginatedValuesDto getAllPaginated( @RequestParam(required = false) final Optional criteria, @RequestParam(required = false) final Optional orderBy, @RequestParam(required = false) final Optional direction - ) throws PreconditionFailedException, InvalidParseOperationException, IOException { + ) throws PreconditionFailedException, IOException { direction.ifPresent(SanityChecker::sanitizeCriteria); orderBy.ifPresent(SanityChecker::checkSecureParameter); SanityChecker.sanitizeCriteria(criteria); @@ -124,14 +122,13 @@ public LogbookOperationDto getOne(@PathVariable("id") final String id) ParameterChecker.checkParameter("The Identifier is a mandatory parameter: ", id); SanityChecker.checkSecureParameter(id); LOGGER.debug("get One Ingest id={}", id); - return ingestInternalService.getOne(id); } @Secured(ServicesData.ROLE_LOGBOOKS) @GetMapping(RestApi.INGEST_REPORT_ODT + CommonConstants.PATH_ID) public byte[] generateODTReport(final @PathVariable("id") String id) - throws PreconditionFailedException, InvalidParseOperationException, IOException, URISyntaxException { + throws PreconditionFailedException, InvalidParseOperationException { ParameterChecker.checkParameter("The Identifier is a mandatory parameter :", id); SanityChecker.checkSecureParameter(id); LOGGER.debug("export ODT report for ingest with id :{}", id); @@ -146,7 +143,7 @@ public ResponseEntity streamingUpload( @RequestHeader(value = CommonConstants.X_ACTION) final String action, @RequestHeader(value = CommonConstants.X_CONTEXT_ID) final String contextId, @RequestHeader(value = CommonConstants.X_ORIGINAL_FILENAME_HEADER) final String originalFileName - ) throws InvalidParseOperationException, PreconditionFailedException, IngestExternalException { + ) throws PreconditionFailedException, IngestExternalException { ParameterChecker.checkParameter( "The action and the context ID are mandatory parameters: ", action, diff --git a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/AbstractService.java b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/AbstractService.java deleted file mode 100644 index 2870c7d9652..00000000000 --- a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/AbstractService.java +++ /dev/null @@ -1,22 +0,0 @@ -package fr.gouv.vitamui.ingest.external.server.service; - -import fr.gouv.vitam.common.client.VitamContext; -import fr.gouv.vitamui.commons.rest.client.ExternalHttpContext; -import fr.gouv.vitamui.iam.security.service.ExternalSecurityService; - -public class AbstractService { - - private final ExternalSecurityService externalSecurityService; - - public AbstractService(ExternalSecurityService externalSecurityService) { - this.externalSecurityService = externalSecurityService; - } - - protected VitamContext buildVitamContext() { - VitamContext vitamContext = externalSecurityService.getVitamContext(); - ExternalHttpContext externalHttpContext = externalSecurityService.getHttpContext(); - vitamContext.setAccessContract(externalHttpContext.getAccessContract()); - vitamContext.setTenantId(externalSecurityService.getTenantIdentifier()); - return vitamContext; - } -} diff --git a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/AccessContractInternalService.java b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/AccessContractInternalService.java similarity index 98% rename from api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/AccessContractInternalService.java rename to api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/AccessContractInternalService.java index ffb2f332b58..694a0d943dd 100644 --- a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/AccessContractInternalService.java +++ b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/AccessContractInternalService.java @@ -24,7 +24,7 @@ * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you * accept its terms. */ -package fr.gouv.vitamui.ingest.external.server.service; +package fr.gouv.vitamui.ingest.external.server.service.internal; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestConverter.java b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestConverter.java similarity index 97% rename from api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestConverter.java rename to api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestConverter.java index 9c8d1603380..48a5817c658 100644 --- a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestConverter.java +++ b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestConverter.java @@ -34,7 +34,7 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL-C license and that you accept its terms. */ -package fr.gouv.vitamui.ingest.external.server.service; +package fr.gouv.vitamui.ingest.external.server.service.internal; import fr.gouv.vitamui.commons.vitam.api.dto.LogbookOperationDto; diff --git a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestExternalParametersService.java b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestExternalParametersService.java similarity index 59% rename from api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestExternalParametersService.java rename to api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestExternalParametersService.java index 6bd90f0e74c..6b470e8f54f 100644 --- a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestExternalParametersService.java +++ b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestExternalParametersService.java @@ -25,17 +25,18 @@ * accept its terms. */ -package fr.gouv.vitamui.ingest.external.server.service; +package fr.gouv.vitamui.ingest.external.server.service.internal; +import fr.gouv.vitam.common.client.VitamContext; import fr.gouv.vitamui.commons.api.domain.ExternalParametersDto; import fr.gouv.vitamui.commons.api.domain.ParameterDto; import fr.gouv.vitamui.iam.internal.client.ExternalParametersInternalRestClient; -import fr.gouv.vitamui.iam.security.service.InternalSecurityService; +import fr.gouv.vitamui.iam.security.service.ExternalSecurityService; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Optional; +import java.util.Objects; /** * The service to retrieve profile thresholds. @@ -46,39 +47,50 @@ public class IngestExternalParametersService { public static final String PARAM_ACCESS_CONTRACT_NAME = "PARAM_ACCESS_CONTRACT"; private final ExternalParametersInternalRestClient externalParametersInternalRestClient; - private final InternalSecurityService securityService; + private final ExternalSecurityService externalSecurityService; @Autowired public IngestExternalParametersService( final ExternalParametersInternalRestClient externalParametersInternalRestClient, - InternalSecurityService securityService + ExternalSecurityService externalSecurityService ) { this.externalParametersInternalRestClient = externalParametersInternalRestClient; - this.securityService = securityService; + this.externalSecurityService = externalSecurityService; } /** - * Service to return the access contract defined on profil using external parameters + * Service to return the access contract defined on profile using external parameters * - * @return Optional of access contract otherwise Optional.empty + * @return access contract throws IllegalArgumentException */ - public Optional retrieveProfilAccessContract() { - Optional accessContractOpt = Optional.empty(); - final ExternalParametersDto myExternalParameter = externalParametersInternalRestClient.getMyExternalParameters( - securityService.getHttpContext() + public String retrieveAccessContractFromExternalParam() { + ExternalParametersDto myExternalParameter = externalParametersInternalRestClient.getMyExternalParameters( + externalSecurityService.getHttpContext() ); - if (myExternalParameter != null && CollectionUtils.isNotEmpty(myExternalParameter.getParameters())) { - final ParameterDto parameterAccessContract = myExternalParameter - .getParameters() - .stream() - .filter(parameter -> PARAM_ACCESS_CONTRACT_NAME.equals(parameter.getKey())) - .findFirst() - .orElse(null); - if (parameterAccessContract != null && parameterAccessContract.getValue() != null) { - String accessContractValue = parameterAccessContract.getValue(); - accessContractOpt = Optional.of(accessContractValue); - } + if (myExternalParameter == null || CollectionUtils.isEmpty(myExternalParameter.getParameters())) { + throw new IllegalArgumentException("No external profile defined for access contract defined"); } - return accessContractOpt; + + ParameterDto parameterAccessContract = myExternalParameter + .getParameters() + .stream() + .filter(parameter -> PARAM_ACCESS_CONTRACT_NAME.equals(parameter.getKey())) + .findFirst() + .orElse(null); + if (Objects.isNull(parameterAccessContract) || Objects.isNull(parameterAccessContract.getValue())) { + throw new IllegalArgumentException("No access contract defined"); + } + return parameterAccessContract.getValue(); + } + + /** + * This function create a VitamContext + * + * @return + */ + public VitamContext buildVitamContextFromExternalParam() { + return new VitamContext(externalSecurityService.getTenantIdentifier()) + .setAccessContract(retrieveAccessContractFromExternalParam()) + .setApplicationSessionId(externalSecurityService.getApplicationId()); } } diff --git a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestGeneratorODTFile.java b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestGeneratorODTFile.java similarity index 99% rename from api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestGeneratorODTFile.java rename to api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestGeneratorODTFile.java index 5946a3d4a48..6f6264941ca 100644 --- a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestGeneratorODTFile.java +++ b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestGeneratorODTFile.java @@ -35,7 +35,7 @@ * knowledge of the CeCILL-C license and that you accept its terms. */ -package fr.gouv.vitamui.ingest.external.server.service; +package fr.gouv.vitamui.ingest.external.server.service.internal; import fr.gouv.vitamui.commons.api.exception.IngestFileGenerationException; import fr.gouv.vitamui.commons.vitam.seda.LevelType; diff --git a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestInternalService.java b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestInternalService.java similarity index 86% rename from api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestInternalService.java rename to api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestInternalService.java index 8411f666943..bda26323d14 100644 --- a/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/IngestInternalService.java +++ b/api/api-ingest/ingest-external/src/main/java/fr/gouv/vitamui/ingest/external/server/service/internal/IngestInternalService.java @@ -24,7 +24,7 @@ * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you * accept its terms. */ -package fr.gouv.vitamui.ingest.external.server.service; +package fr.gouv.vitamui.ingest.external.server.service.internal; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -37,7 +37,6 @@ import fr.gouv.vitam.common.exception.VitamClientException; import fr.gouv.vitam.common.external.client.IngestCollection; import fr.gouv.vitam.common.model.RequestResponse; -import fr.gouv.vitam.common.model.RequestResponseOK; import fr.gouv.vitam.common.model.logbook.LogbookOperation; import fr.gouv.vitam.ingest.external.api.exception.IngestExternalException; import fr.gouv.vitam.ingest.external.client.IngestExternalClient; @@ -64,7 +63,6 @@ import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.Resource; import org.springframework.http.ResponseEntity; -import org.springframework.web.multipart.MultipartFile; import org.w3c.dom.Document; import javax.ws.rs.core.Response; @@ -82,7 +80,7 @@ /** * Ingest Internal service communication with VITAM. */ -public class IngestInternalService extends AbstractService { +public class IngestInternalService { private static final Logger LOGGER = LoggerFactory.getLogger(IngestInternalService.class); @@ -104,12 +102,12 @@ public class IngestInternalService extends AbstractService { private final IngestGeneratorODTFile ingestGeneratorODTFile; private final IngestExternalParametersService ingestExternalParametersService; + private final ExternalSecurityService externalSecurityService; private final AccessContractInternalService accessContractInternalService; @Autowired public IngestInternalService( - final ExternalSecurityService externalSecurityService, final InternalSecurityService internalSecurityService, final LogbookService logbookService, final ObjectMapper objectMapper, @@ -118,9 +116,9 @@ public IngestInternalService( final CustomerInternalRestClient customerInternalRestClient, final IngestGeneratorODTFile ingestGeneratorODTFile, final IngestExternalParametersService ingestExternalParametersService, + final ExternalSecurityService externalSecurityService, final AccessContractInternalService accessContractInternalService ) { - super(externalSecurityService); this.internalSecurityService = internalSecurityService; this.ingestExternalClient = ingestExternalClient; this.logbookService = logbookService; @@ -129,31 +127,10 @@ public IngestInternalService( this.customerInternalRestClient = customerInternalRestClient; this.ingestGeneratorODTFile = ingestGeneratorODTFile; this.ingestExternalParametersService = ingestExternalParametersService; + this.externalSecurityService = externalSecurityService; this.accessContractInternalService = accessContractInternalService; } - public RequestResponseOK upload(MultipartFile path, String contextId, String action) - throws IngestExternalException { - final VitamContext vitamContext = this.buildVitamContext(); - RequestResponse ingestResponse = null; - try { - LOGGER.info("Upload EvIdAppSession : {} ", vitamContext.getApplicationSessionId()); - ingestResponse = ingestService.ingest(vitamContext, path.getInputStream(), contextId, action); - LOGGER.info("The recieved stream size : " + path.getInputStream().available() + " is sent to Vitam"); - - if (ingestResponse.isOk()) { - LOGGER.debug("Ingest passed successfully : " + ingestResponse.toString()); - } else { - LOGGER.debug("Ingest failed with status : " + ingestResponse.getHttpCode()); - } - } catch (IOException | IngestExternalException e) { - LOGGER.debug("Error sending upload to vitam ", e); - throw new IngestExternalException(e); - } - - return (RequestResponseOK) ingestResponse; - } - public PaginatedValuesDto getAllPaginated( final Integer pageNumber, final Integer size, @@ -161,14 +138,13 @@ public PaginatedValuesDto getAllPaginated( final Optional direction, Optional criteria ) { - final VitamContext vitamContext = this.buildVitamContext(); - final Optional accessContractOpt = ingestExternalParametersService.retrieveProfilAccessContract(); + VitamContext vitamContext = ingestExternalParametersService.buildVitamContextFromExternalParam(); + final String accessContract = vitamContext.getAccessContract(); Set originatingAgencies = null; Boolean everyOriginatingAgency = false; - if (accessContractOpt.isPresent()) { + if (accessContract != null) { final Optional accessContractDtoOpt = accessContractInternalService.getOne( - vitamContext, - accessContractOpt.get() + vitamContext, accessContract ); if (accessContractDtoOpt.isPresent()) { originatingAgencies = accessContractDtoOpt.get().getOriginatingAgencies(); @@ -195,7 +171,7 @@ public PaginatedValuesDto getAllPaginated( throw new InternalServerException("Can't parse criteria as Vitam query", e); } - LogbookOperationsResponseDto results = this.findAll(query); + LogbookOperationsResponseDto results = this.findAll(vitamContext, query); boolean hasMore = pageNumber * size + results.getHits().getSize() < results.getHits().getTotal(); List valuesDto = IngestConverter.convertVitamsToDtos(results.getResults()); LOGGER.debug("After Conversion: {}", valuesDto); @@ -205,7 +181,7 @@ public PaginatedValuesDto getAllPaginated( public LogbookOperationDto getOne(final String id) { final RequestResponse requestResponse; try { - final VitamContext vitamContext = this.buildVitamContext(); + VitamContext vitamContext = ingestExternalParametersService.buildVitamContextFromExternalParam(); LOGGER.info("Ingest EvIdAppSession : {} ", vitamContext.getApplicationSessionId()); requestResponse = logbookService.selectOperationbyId(id, vitamContext); @@ -227,10 +203,9 @@ public LogbookOperationDto getOne(final String id) { } } - private LogbookOperationsResponseDto findAll(JsonNode query) { + private LogbookOperationsResponseDto findAll(VitamContext vitamContext, JsonNode query) { final RequestResponse requestResponse; try { - final VitamContext vitamContext = this.buildVitamContext(); LOGGER.info("All Ingest EvIdAppSession : {} ", vitamContext.getApplicationSessionId()); requestResponse = logbookService.selectOperations(query, vitamContext); @@ -249,9 +224,8 @@ private LogbookOperationsResponseDto findAll(JsonNode query) { } } - public String getManifestAsString(final String id) { + public String getManifestAsString(VitamContext vitamContext, final String id) { try { - final VitamContext vitamContext = this.buildVitamContext(); String manifest = ""; Response response = ingestExternalClient.downloadObjectAsync(vitamContext, id, IngestCollection.MANIFESTS); Object entity = response.getEntity(); @@ -267,9 +241,8 @@ public String getManifestAsString(final String id) { } } - public String getAtrAsString(final String id) { + public String getAtrAsString(VitamContext vitamContext, final String id) { try { - final VitamContext vitamContext = this.buildVitamContext(); String atr = ""; Response response = ingestExternalClient.downloadObjectAsync( vitamContext, @@ -290,16 +263,16 @@ public String getAtrAsString(final String id) { } public byte[] generateODTReport(final String id) - throws IOException, URISyntaxException, IngestFileGenerationException { - final VitamContext vitamContext = this.buildVitamContext(); + throws IngestFileGenerationException { + VitamContext vitamContext = ingestExternalParametersService.buildVitamContextFromExternalParam(); CustomerDto myCustomer = customerInternalRestClient.getMyCustomer(internalSecurityService.getHttpContext()); Resource customerLogo = null; try { LOGGER.info("Generate ODT Report : get Manifest and ATR of the operation ID : {} ", id); - Document atr = ingestGeneratorODTFile.convertStringToXMLDocument(getAtrAsString(id)); + Document atr = ingestGeneratorODTFile.convertStringToXMLDocument(getAtrAsString(vitamContext, id)); Document manifest = ingestGeneratorODTFile.convertStringToXMLDocument( - getManifestAsString(id) + getManifestAsString(vitamContext, id) ); TextDocument document; try { @@ -357,7 +330,9 @@ public byte[] generateODTReport(final String id) public ResponseEntity streamingUpload(InputStream inputStream, String contextId, String action) throws IngestExternalException { try { - final VitamContext vitamContext = this.buildVitamContext(); + VitamContext vitamContext = new VitamContext(externalSecurityService.getTenantIdentifier()) + .setApplicationSessionId(externalSecurityService.getApplicationId()); + RequestResponse ingestResponse = ingestExternalClient.ingest( vitamContext, inputStream, @@ -370,7 +345,6 @@ public ResponseEntity streamingUpload(InputStream inputStream, String cont throw new VitamClientException("Error on ingest streaming Upload"); } final String operationId = ingestResponse.getVitamHeaders().get(GlobalDataRest.X_REQUEST_ID); - //FIXME do we need the operation Id in Vitamui ??? LOGGER.debug("Ingest passed successfully : " + ingestResponse + " with operationId = " + operationId); return ResponseEntity.ok().header(GlobalDataRest.X_REQUEST_ID, operationId).build(); diff --git a/api/api-ingest/ingest-external/src/main/resources/application-dev.yml b/api/api-ingest/ingest-external/src/main/resources/application-dev.yml index 4cadbe9929d..b6c280a3c69 100644 --- a/api/api-ingest/ingest-external/src/main/resources/application-dev.yml +++ b/api/api-ingest/ingest-external/src/main/resources/application-dev.yml @@ -12,6 +12,7 @@ spring: discovery: enabled: false register: false + #FIXME check why we have db access data: mongodb: uri: mongodb://mongod_dbuser_iam:mongod_dbpwd_iam@localhost:27018/iam?connectTimeoutMS=2000 @@ -69,8 +70,6 @@ spring: activate: on-profile: gateway -tmp_folder_path: "src/main/resources" - gateway: enabled: true @@ -78,3 +77,5 @@ server: ssl: client-auth: want client-certificate-header-name: x-ssl-cert + +tmp_folder_path: "src/main/resources" diff --git a/api/api-ingest/ingest-external/src/main/resources/spring.properties b/api/api-ingest/ingest-external/src/main/resources/spring.properties deleted file mode 100644 index da97d1db45d..00000000000 --- a/api/api-ingest/ingest-external/src/main/resources/spring.properties +++ /dev/null @@ -1 +0,0 @@ -spring.index.ignore=true diff --git a/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/ApiIngestExternalApplicationTest.java b/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/ApiIngestExternalApplicationTest.java index 197d6ece2d9..4d75dea893f 100644 --- a/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/ApiIngestExternalApplicationTest.java +++ b/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/ApiIngestExternalApplicationTest.java @@ -60,7 +60,6 @@ public class ApiIngestExternalApplicationTest { public void testContextLoads() { assertThat(env).isNotNull(); assertThat(apiIngestExternalApplicationProperties).isNotNull(); - assertThat(apiIngestExternalApplicationProperties.getIngestInternalClient()).isNotNull(); assertThat(apiIngestExternalApplicationProperties.getIamInternalClient()).isNotNull(); assertThat(apiIngestExternalApplicationProperties.getSecurityClient()).isNotNull(); } diff --git a/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/rest/IngestExternalControllerTest.java b/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/rest/IngestExternalControllerTest.java index 5e03ef33d20..8a0598e6363 100644 --- a/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/rest/IngestExternalControllerTest.java +++ b/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/rest/IngestExternalControllerTest.java @@ -41,8 +41,7 @@ import fr.gouv.vitamui.iam.security.service.ExternalSecurityService; import fr.gouv.vitamui.ingest.common.rest.RestApi; import fr.gouv.vitamui.ingest.external.client.IngestExternalRestClient; -import fr.gouv.vitamui.ingest.external.server.service.IngestExternalService; -import fr.gouv.vitamui.ingest.internal.client.IngestInternalRestClient; +import fr.gouv.vitamui.ingest.external.server.service.internal.IngestInternalService; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -53,19 +52,17 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) -@WebMvcTest(controllers = { IngestExternalController.class }) +@WebMvcTest(controllers = {IngestExternalController.class}) public class IngestExternalControllerTest extends ApiIngestExternalControllerTest { private static final Logger LOGGER = LoggerFactory.getLogger(IngestExternalControllerTest.class); @MockBean - private IngestExternalService ingestExternalService; + private IngestInternalService ingestInternalService; @MockBean private IngestExternalRestClient ingestExternalRestClient; - @MockBean - private IngestInternalRestClient ingestInternalRestClient; @MockBean private ExternalSecurityService externalSecurityService; @@ -93,7 +90,7 @@ protected String getRessourcePrefix() { @Override protected String[] getServices() { - return new String[] { ServicesData.SERVICE_INGEST }; + return new String[] {ServicesData.SERVICE_INGEST}; } @Override @@ -103,9 +100,8 @@ protected Class getDtoClass() { @Test public void testIngest() { - Assert.assertNotNull(ingestExternalService); + Assert.assertNotNull(ingestInternalService); Assert.assertNotNull(externalSecurityService); Assert.assertNotNull(ingestExternalRestClient); - Assert.assertNotNull(ingestInternalRestClient); } } diff --git a/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/service/IngestGeneratorODTFileTest.java b/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/service/IngestGeneratorODTFileTest.java new file mode 100644 index 00000000000..73ad528ce84 --- /dev/null +++ b/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/service/IngestGeneratorODTFileTest.java @@ -0,0 +1,59 @@ +/* + * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2022) + * + * contact.vitam@culture.gouv.fr + * + * This software is a computer program whose purpose is to implement a digital archiving back-office system managing + * high volumetry securely and efficiently. + * + * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free + * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as + * circulated by CEA, CNRS and INRIA at the following URL "https://cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, + * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the + * successive licensors have only limited liability. + * + * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or + * developing or reproducing the software by the user in light of its specific status of free software, that may mean + * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and + * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the + * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data + * to be ensured and, more generally, to use and operate it in the same conditions as regards security. + * + * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you + * accept its terms. + * + */ + +package fr.gouv.vitamui.ingest.external.server.service; + +import fr.gouv.vitam.common.PropertiesUtils; +import fr.gouv.vitamui.ingest.common.dto.ArchiveUnitDto; +import fr.gouv.vitamui.ingest.external.server.service.internal.IngestGeneratorODTFile; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; + +import java.io.FileNotFoundException; +import java.util.List; + +class IngestGeneratorODTFileTest { + + IngestGeneratorODTFile ingestGeneratorODTFile = new IngestGeneratorODTFile(); + + @Test + void getValuesForDynamicTable_avoid_attachment_units_with_updateOperation() throws FileNotFoundException { + Document atr = ingestGeneratorODTFile.convertStringToXMLDocument( + PropertiesUtils.getResourceAsString("ODT_report/atr.xml") + ); + Document manifest = ingestGeneratorODTFile.convertStringToXMLDocument( + PropertiesUtils.getResourceAsString("ODT_report/manifest.xml") + ); + + List archiveUnitDtos = ingestGeneratorODTFile.getValuesForDynamicTable(atr, manifest); + + Assertions.assertEquals(archiveUnitDtos.size(), 249); + Assertions.assertFalse(archiveUnitDtos.stream().anyMatch(a -> a.getTitle().equals("Discours du ministre"))); + } +} diff --git a/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/service/IngestInternalServiceTest.java b/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/service/IngestInternalServiceTest.java new file mode 100644 index 00000000000..15dcbf58772 --- /dev/null +++ b/api/api-ingest/ingest-external/src/test/java/fr/gouv/vitamui/ingest/external/server/service/IngestInternalServiceTest.java @@ -0,0 +1,94 @@ +package fr.gouv.vitamui.ingest.external.server.service; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.gouv.vitam.common.client.VitamContext; +import fr.gouv.vitam.common.exception.VitamClientException; +import fr.gouv.vitam.common.model.RequestResponseOK; +import fr.gouv.vitam.common.model.administration.AccessContractModel; +import fr.gouv.vitam.common.model.logbook.LogbookOperation; +import fr.gouv.vitamui.commons.vitam.api.access.LogbookService; +import fr.gouv.vitamui.commons.vitam.api.administration.AccessContractService; +import fr.gouv.vitamui.ingest.external.server.service.internal.AccessContractInternalService; +import fr.gouv.vitamui.ingest.external.server.service.internal.IngestExternalParametersService; +import fr.gouv.vitamui.ingest.external.server.service.internal.IngestInternalService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class IngestInternalServiceTest { + + @Mock + private IngestExternalParametersService ingestExternalParametersService; + + @Mock + private LogbookService logbookService; + + @Mock + private AccessContractService accessContractService; + + @Mock + private AccessContractInternalService accessContractInternalService; + + @Spy + private ObjectMapper objectMapper = new ObjectMapper(); + + @InjectMocks + private IngestInternalService ingestInternalService; + + @BeforeEach + public void beforeEach() { + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + accessContractInternalService = new AccessContractInternalService(accessContractService, objectMapper); + VitamContext vitamContext = new VitamContext(1).setAccessContract("ContratTNR"); + doReturn(vitamContext).when(ingestExternalParametersService).buildVitamContextFromExternalParam(); + } + + /** + * Test for #13172 bug + */ + @Test + public void getAllPaginatedWhenEmptyOriginatingAgenciesAndEveryOriginatingAgencyIsFalse() + throws VitamClientException { + final VitamContext vitamContext = new VitamContext(1); + final String accessContract = "AccessContract42"; + final String criteria = "{\"evTypeProc\":\"INGEST\"}"; + vitamContext.setAccessContract(accessContract); + when(ingestExternalParametersService.buildVitamContextFromExternalParam()).thenReturn(vitamContext); + final AccessContractModel accessContractModel = new AccessContractModel(); + accessContractModel.setEveryOriginatingAgency(false); + accessContractModel.setOriginatingAgencies(Collections.emptySet()); + + final LogbookOperation logbookOperation = new LogbookOperation(); + logbookOperation.setEvId("1"); + logbookOperation.setEvents(Collections.emptyList()); + when(logbookService.selectOperations(any(JsonNode.class), any(VitamContext.class))).thenReturn( + new RequestResponseOK().addResult(logbookOperation).setHttpCode(200) + ); + + assertDoesNotThrow( + () -> + ingestInternalService.getAllPaginated( + 0, + 10, + Optional.empty(), + Optional.empty(), + Optional.of(criteria) + ) + ); + } +} diff --git a/api/api-ingest/ingest-external/src/test/resources/application.yml b/api/api-ingest/ingest-external/src/test/resources/application.yml index b5214cbfe86..afb91f113e4 100644 --- a/api/api-ingest/ingest-external/src/test/resources/application.yml +++ b/api/api-ingest/ingest-external/src/test/resources/application.yml @@ -25,3 +25,8 @@ ingest-external: swagger: layer: api-external + + +tmp_folder_path: "src/main/resources" + +logbook.scheduling.sendEventToVitamTasks.enabled: false diff --git a/api/api-ingest/ingest-external/src/main/resources/logbook_messages.properties b/api/api-ingest/ingest-external/src/test/resources/logbook_messages.properties similarity index 51% rename from api/api-ingest/ingest-external/src/main/resources/logbook_messages.properties rename to api/api-ingest/ingest-external/src/test/resources/logbook_messages.properties index c3c27517694..20d7e93e33b 100644 --- a/api/api-ingest/ingest-external/src/main/resources/logbook_messages.properties +++ b/api/api-ingest/ingest-external/src/test/resources/logbook_messages.properties @@ -1 +1,3 @@ ################################### USER ########################## + +outMessg.EXT_VITAMUI_CREATE_USER\.OK=L'utilisateur a été créé diff --git a/api/api-ingest/pom.xml b/api/api-ingest/pom.xml index 05793e3a942..d07ab09afa9 100644 --- a/api/api-ingest/pom.xml +++ b/api/api-ingest/pom.xml @@ -15,9 +15,9 @@ ingest-external - + ingest-internal-client + ingest-external-client + ingest-commons diff --git a/deployment/ansible-vitamui/app_ingest.yml b/deployment/ansible-vitamui/app_ingest.yml index 51e9b4bd5b2..6e98209384d 100644 --- a/deployment/ansible-vitamui/app_ingest.yml +++ b/deployment/ansible-vitamui/app_ingest.yml @@ -1,4 +1,4 @@ -# Ingest external calls VITAM +# Ingest external calls VITAMdevelop - hosts: hosts_vitamui_ingest_external gather_facts: no any_errors_fatal: true