Skip to content

Commit

Permalink
[VAS] Bug 11519: collect problems after access contract fixes (#1362)
Browse files Browse the repository at this point in the history
[VAS] Bug 11519: copy external config
  • Loading branch information
laedanrex committed Jul 18, 2023
1 parent df3205e commit 4926e53
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,7 @@
*/
package fr.gouv.vitamui.referential.internal.server.config;

import fr.gouv.vitamui.commons.vitam.api.administration.VitamOperationService;
import fr.gouv.vitamui.referential.common.service.*;
import fr.gouv.vitamui.referential.internal.server.logbookmanagement.LogbookManagementOperationInternalService;
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;
import org.springframework.context.annotation.Import;

import com.fasterxml.jackson.databind.ObjectMapper;

import fr.gouv.vitam.access.external.client.AccessExternalClient;
import fr.gouv.vitam.access.external.client.AdminExternalClient;
import fr.gouv.vitamui.commons.api.application.AbstractContextConfiguration;
Expand All @@ -55,14 +45,35 @@
import fr.gouv.vitamui.commons.rest.configuration.SwaggerConfiguration;
import fr.gouv.vitamui.commons.vitam.api.access.UnitService;
import fr.gouv.vitamui.commons.vitam.api.administration.AgencyService;
import fr.gouv.vitamui.commons.vitam.api.administration.VitamOperationService;
import fr.gouv.vitamui.commons.vitam.api.config.VitamAccessConfig;
import fr.gouv.vitamui.commons.vitam.api.config.VitamAdministrationConfig;
import fr.gouv.vitamui.iam.internal.client.ExternalParametersInternalRestClient;
import fr.gouv.vitamui.iam.internal.client.IamInternalRestClientFactory;
import fr.gouv.vitamui.iam.internal.client.UserInternalRestClient;
import fr.gouv.vitamui.iam.security.provider.InternalApiAuthenticationProvider;
import fr.gouv.vitamui.iam.security.service.InternalAuthentificationService;
import fr.gouv.vitamui.iam.security.service.InternalSecurityService;
import fr.gouv.vitamui.referential.common.service.AccessionRegisterService;
import fr.gouv.vitamui.referential.common.service.IngestContractService;
import fr.gouv.vitamui.referential.common.service.OntologyService;
import fr.gouv.vitamui.referential.common.service.OperationService;
import fr.gouv.vitamui.referential.common.service.VitamAgencyService;
import fr.gouv.vitamui.referential.common.service.VitamArchivalProfileUnitService;
import fr.gouv.vitamui.referential.common.service.VitamBatchReportService;
import fr.gouv.vitamui.referential.common.service.VitamContextService;
import fr.gouv.vitamui.referential.common.service.VitamFileFormatService;
import fr.gouv.vitamui.referential.common.service.VitamProfileService;
import fr.gouv.vitamui.referential.common.service.VitamRuleService;
import fr.gouv.vitamui.referential.common.service.VitamSecurityProfileService;
import fr.gouv.vitamui.referential.common.service.VitamUIAccessContractService;
import fr.gouv.vitamui.referential.common.service.VitamUIManagementContractService;
import fr.gouv.vitamui.referential.internal.server.security.WebSecurityConfig;
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;
import org.springframework.context.annotation.Import;

@Configuration
@Import({RestExceptionHandler.class, SwaggerConfiguration.class, WebSecurityConfig.class, VitamAccessConfig.class,
Expand All @@ -76,23 +87,27 @@ public RestClientConfiguration IamInternalRestClientConfiguration() {
}

@Bean
public IamInternalRestClientFactory iamInternalRestClientFactory(final RestClientConfiguration IamInternalRestClientConfiguration,
final RestTemplateBuilder restTemplateBuilder) {
public IamInternalRestClientFactory iamInternalRestClientFactory(
final RestClientConfiguration IamInternalRestClientConfiguration,
final RestTemplateBuilder restTemplateBuilder) {
return new IamInternalRestClientFactory(IamInternalRestClientConfiguration, restTemplateBuilder);
}

@Bean
public UserInternalRestClient userInternalRestClient(final IamInternalRestClientFactory iamInternalRestClientFactory) {
public UserInternalRestClient userInternalRestClient(
final IamInternalRestClientFactory iamInternalRestClientFactory) {
return iamInternalRestClientFactory.getUserInternalRestClient();
}

@Bean
public InternalAuthentificationService internalAuthentificationService(final UserInternalRestClient userInternalRestClient) {
public InternalAuthentificationService internalAuthentificationService(
final UserInternalRestClient userInternalRestClient) {
return new InternalAuthentificationService(userInternalRestClient);
}

@Bean
public InternalApiAuthenticationProvider internalApiAuthenticationProvider(final InternalAuthentificationService internalAuthentificationService) {
public InternalApiAuthenticationProvider internalApiAuthenticationProvider(
final InternalAuthentificationService internalAuthentificationService) {
return new InternalApiAuthenticationProvider(internalAuthentificationService);
}

Expand All @@ -107,7 +122,8 @@ public VitamUIAccessContractService vitamUIAccessContractService(final AdminExte
}

@Bean
public VitamAgencyService vitamAgencyService(final AdminExternalClient adminClient, final AgencyService agencyService, ObjectMapper objectMapper, final
public VitamAgencyService vitamAgencyService(final AdminExternalClient adminClient,
final AgencyService agencyService, ObjectMapper objectMapper, final
AccessExternalClient accessClient) {
return new VitamAgencyService(adminClient, agencyService, objectMapper, accessClient);
}
Expand All @@ -123,12 +139,14 @@ public IngestContractService ingestContractService(final AdminExternalClient adm
}

@Bean
public VitamFileFormatService vitamFileFormatService(final AdminExternalClient adminClient, ObjectMapper objectMapper, final AccessExternalClient accessClient) {
public VitamFileFormatService vitamFileFormatService(final AdminExternalClient adminClient,
ObjectMapper objectMapper, final AccessExternalClient accessClient) {
return new VitamFileFormatService(adminClient, objectMapper, accessClient);
}

@Bean
public VitamArchivalProfileUnitService vitamArchivalProfileService(final AdminExternalClient adminClient, ObjectMapper objectMapper, final AccessExternalClient accessClient) {
public VitamArchivalProfileUnitService vitamArchivalProfileService(final AdminExternalClient adminClient,
ObjectMapper objectMapper, final AccessExternalClient accessClient) {
return new VitamArchivalProfileUnitService(adminClient, objectMapper, accessClient);
}

Expand All @@ -138,7 +156,8 @@ public VitamProfileService vitamProfileService(final AdminExternalClient adminCl
}

@Bean
public VitamRuleService vitamRuleService(final AdminExternalClient adminClient, ObjectMapper objectMapper, final AccessExternalClient accessClient) {
public VitamRuleService vitamRuleService(final AdminExternalClient adminClient, ObjectMapper objectMapper,
final AccessExternalClient accessClient) {
return new VitamRuleService(adminClient, objectMapper, accessClient);
}

Expand All @@ -148,7 +167,8 @@ public VitamContextService vitamContextService(final AdminExternalClient adminCl
}

@Bean
public VitamSecurityProfileService vitamSecurityProfileService(final AdminExternalClient adminClient, ObjectMapper objectMapper) {
public VitamSecurityProfileService vitamSecurityProfileService(final AdminExternalClient adminClient,
ObjectMapper objectMapper) {
return new VitamSecurityProfileService(adminClient, objectMapper);
}

Expand Down Expand Up @@ -181,4 +201,10 @@ public VitamBatchReportService vitamBatchReportService(final AdminExternalClient
public VitamOperationService vitamOperationService(final AdminExternalClient adminExternalClient) {
return new VitamOperationService(adminExternalClient);
}

@Bean
public ExternalParametersInternalRestClient externalParametersInternalRestClient(
final IamInternalRestClientFactory iamInternalRestClientFactory) {
return iamInternalRestClientFactory.getExternalParametersInternalRestClient();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@
import fr.gouv.vitamui.commons.api.CommonConstants;
import fr.gouv.vitamui.commons.api.ParameterChecker;
import fr.gouv.vitamui.commons.api.exception.PreconditionFailedException;
import fr.gouv.vitamui.commons.api.exception.UnexpectedDataException;
import fr.gouv.vitamui.commons.api.logger.VitamUILogger;
import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory;
import fr.gouv.vitamui.commons.vitam.api.dto.VitamUISearchResponseDto;
import fr.gouv.vitamui.iam.security.service.InternalSecurityService;
import fr.gouv.vitamui.referential.common.rest.RestApi;
import fr.gouv.vitamui.referential.internal.server.service.ExternalParametersService;
import fr.gouv.vitamui.referential.internal.server.unit.UnitInternalService;
import lombok.Getter;
import lombok.Setter;
Expand All @@ -76,6 +76,9 @@ public class UnitInternalController {
@Autowired
private UnitInternalService unitInternalService;

@Autowired
private ExternalParametersService externalParametersService;

@Autowired
private InternalSecurityService securityService;

Expand All @@ -90,7 +93,7 @@ public JsonNode findUnitById(
PreconditionFailedException {
final VitamContext vitamContext = securityService.buildVitamContext(tenantId, accessContractId);
ParameterChecker.checkParameter("The Identifier is a mandatory parameter: ", id);
SanityChecker.checkSecureParameter(id,accessContractId);
SanityChecker.checkSecureParameter(id, accessContractId);
return unitInternalService.findUnitById(id, vitamContext);
}

Expand All @@ -100,7 +103,8 @@ public JsonNode findByDsl(
@RequestHeader(value = CommonConstants.X_TENANT_ID_HEADER) final Integer tenantId,
@RequestHeader(value = CommonConstants.X_ACCESS_CONTRACT_ID_HEADER) final String accessContractId,
@PathVariable final Optional<String> id,
@RequestBody final JsonNode dsl) throws VitamClientException, InvalidParseOperationException, PreconditionFailedException {
@RequestBody final JsonNode dsl)
throws VitamClientException, InvalidParseOperationException, PreconditionFailedException {
final VitamContext vitamContext = securityService.buildVitamContext(tenantId, accessContractId);
SanityChecker.sanitizeJson(dsl);
SanityChecker.checkSecureParameter(accessContractId);
Expand All @@ -112,7 +116,8 @@ public JsonNode findObjectMetadataById(
@RequestHeader(value = CommonConstants.X_TENANT_ID_HEADER) final Integer tenantId,
@RequestHeader(value = CommonConstants.X_ACCESS_CONTRACT_ID_HEADER) final String accessContractId,
@PathVariable final String id,
@RequestBody final JsonNode dsl) throws VitamClientException, InvalidParseOperationException, PreconditionFailedException {
@RequestBody final JsonNode dsl)
throws VitamClientException, InvalidParseOperationException, PreconditionFailedException {
final VitamContext vitamContext = securityService.buildVitamContext(tenantId, accessContractId);
ParameterChecker.checkParameter("The Identifier is a mandatory parameter: ", id);
SanityChecker.sanitizeJson(dsl);
Expand All @@ -122,16 +127,12 @@ public JsonNode findObjectMetadataById(

@GetMapping(RestApi.FILING_PLAN_PATH)
public VitamUISearchResponseDto getFilingAndHoldingUnits(
@RequestHeader(value = CommonConstants.X_TENANT_ID_HEADER) final Integer tenantId,
@RequestHeader(value = CommonConstants.X_ACCESS_CONTRACT_ID_HEADER) final String accessContractId)
@RequestHeader(value = CommonConstants.X_TENANT_ID_HEADER) final Integer tenantId)
throws VitamClientException, IOException, InvalidParseOperationException, PreconditionFailedException {
ParameterChecker.checkParameter("The accessContractId is a mandatory parameter: ", accessContractId);
SanityChecker.checkSecureParameter(accessContractId);
LOGGER.debug("Get filing and holding units with projections on needed fields ONLY!");
SanityChecker.checkSecureParameter(accessContractId);
final VitamContext vitamContext = securityService.buildVitamContext(tenantId, accessContractId);
final JsonNode fillingOrHoldingQuery = unitInternalService.createQueryForFillingOrHoldingUnit();
return objectMapper.treeToValue(unitInternalService.searchUnits(fillingOrHoldingQuery, vitamContext),
return objectMapper.treeToValue(unitInternalService.searchUnits(fillingOrHoldingQuery,
externalParametersService.buildVitamContextFromExternalParam()),
VitamUISearchResponseDto.class);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* 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.referential.internal.server.service;

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 org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Objects;

/**
* The service to retrieve profile thresholds.
*/
@Service
public class ExternalParametersService {
public static final String PARAM_ACCESS_CONTRACT_NAME = "PARAM_ACCESS_CONTRACT";

private final ExternalParametersInternalRestClient externalParametersInternalRestClient;
private final InternalSecurityService securityService;

@Autowired
public ExternalParametersService(final ExternalParametersInternalRestClient externalParametersInternalRestClient,
final InternalSecurityService securityService) {
this.externalParametersInternalRestClient = externalParametersInternalRestClient;
this.securityService = securityService;
}

/**
* Service to return the access contract defined on profile using external parameters
*
* @return access contract throws IllegalArgumentException
*/
public String retrieveAccessContractFromExternalParam() {
ExternalParametersDto myExternalParameter =
externalParametersInternalRestClient.getMyExternalParameters(securityService.getHttpContext());
if (myExternalParameter == null || CollectionUtils.isEmpty(myExternalParameter.getParameters())) {
throw new IllegalArgumentException("No external profile defined for access contract defined");
}

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(securityService.getTenantIdentifier()).setAccessContract(
retrieveAccessContractFromExternalParam())
.setApplicationSessionId(securityService.getApplicationId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ import { FilingHoldingSchemeHandler } from './filing-holding-scheme.handler';
styleUrls: ['./filing-holding-scheme.component.scss'],
})
export class FilingHoldingSchemeComponent implements OnInit, OnChanges, OnDestroy {

@Input() transactionId: string;

@Output() showArchiveUnitDetails = new EventEmitter<Unit>();
Expand Down Expand Up @@ -83,11 +83,9 @@ export class FilingHoldingSchemeComponent implements OnInit, OnChanges, OnDestro
this.initialNodeFacetState();
}

ngOnChanges(changes: SimpleChanges): void {
if (changes.accessContract) {
this.loadingHolding = true;
this.initFilingHoldingSchemeTree();
}
ngOnChanges(_: SimpleChanges): void {
this.loadingHolding = true;
this.initFilingHoldingSchemeTree();
}

ngOnDestroy(): void {
Expand Down

0 comments on commit 4926e53

Please sign in to comment.