Commit 62badde0 authored by Anastasios Poimenidis's avatar Anastasios Poimenidis
Browse files

fix: remove organization keycloak credentials before persist

parent 9d7a171d
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@
    <dependency>
    <groupId>org.etsi.osl.hypo.core</groupId>
    <artifactId>common</artifactId>
    <version>1.4.9</version>
    <version>1.5.4</version>
    </dependency>

    <dependency>
+32 −1
Original line number Diff line number Diff line
@@ -153,7 +153,9 @@ public class OrganizationService {
                organization.setHref("https://serverRoot/tmf-api/party/v4/organization/");
            if (organization.getType() == null) organization.setType("organization");

            organizationRepository.persist(organization);
            // remove sensitive characteristics
            // they will be stored in Vault
            storeOrganizationCredentials(organization);

            // send KAFKA message to Registry API to store the organization Auth Credentials
            if (StringUtils.isNotBlank(authHeader)) {
@@ -385,6 +387,35 @@ public class OrganizationService {
        }
    }

    private void storeOrganizationCredentials(Organization organization) {
        Set<String> organizationCredentialsCharacteristicsNames =
                Set.of(EXTERNAL_TMF_API_USERNAME, EXTERNAL_TMF_API_PASSWORD);

        Set<Characteristic> partyCharacteristic = organization.getPartyCharacteristic();

        if (CollectionUtils.isEmpty(partyCharacteristic)) {
            organizationRepository.persist(organization);
            return;
        }

        // obtain characteristics for keycloak
        Set<Characteristic> partyCharacteristicsCredentials =
                partyCharacteristic.stream()
                        .filter(
                                characteristic ->
                                        organizationCredentialsCharacteristicsNames.contains(characteristic.getName()))
                        .collect(Collectors.toSet());

        // remove keycloak characteristics before storing them
        partyCharacteristic.removeAll(partyCharacteristicsCredentials);

        // store in db
        organizationRepository.persist(organization);

        // add back characteristics for POST response
        organization.getPartyCharacteristic().addAll(partyCharacteristicsCredentials);
    }

    private void sendDeleteCredentialsMessageToRegistry(String organizationId, String authHeader) {
        OrganizationAuthCredentials organizationAuthCredentials =
                this.getOrganizationAuthCredentials(organizationId, null, null);
+2 −2
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ import org.etsi.osl.hypo.api.tmf.services.inventory.schema.Service;
import org.etsi.osl.hypo.api.tmf.value.SetValue;
import org.etsi.osl.hypo.api.tmf.value.TextValue;
import org.etsi.osl.hypo.core.common.OrganizationCharacteristics;
import org.etsi.osl.hypo.core.common.ServiceBaseObject;
import org.etsi.osl.hypo.core.common.ServiceBaseOrganizationObject;
import org.etsi.osl.hypo.core.common.service.inventory.CloudEventPlatformServiceUpdate;
import org.etsi.osl.hypo.core.common.service.inventory.CloudEventServiceActivationState;
import org.etsi.osl.hypo.core.common.service.inventory.CloudEventServiceTerminationData;
@@ -427,7 +427,7 @@ public class KafkaMessagesWrapper {
        return organizationCharacteristicsReference;
    }

    private <T extends ServiceBaseObject> void populateServiceTerminationDataWithIds(
    private <T extends ServiceBaseOrganizationObject> void populateServiceTerminationDataWithIds(
            T serviceTerminationData, Service service) {

        String serviceId = service.getTmfId();
+39 −1
Original line number Diff line number Diff line
@@ -3,9 +3,12 @@ package org.etsi.osl.hypo.api.tmf.party.api.services;
import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;
import static org.etsi.osl.hypo.api.tmf.common.api.constants.ApiConstants.DOMAIN_GATEWAY_STATUS;
import static org.etsi.osl.hypo.api.tmf.common.constants.OssConstants.EXTERNAL_TMF_API_PASSWORD;
import static org.etsi.osl.hypo.api.tmf.common.constants.OssConstants.EXTERNAL_TMF_API_USERNAME;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -25,6 +28,7 @@ import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import net.joshka.junit.json.params.JsonFileSource;
import org.etsi.osl.hypo.api.tmf.common.schema.ValueEntity;
@@ -70,6 +74,15 @@ class OrganizationServiceTest {
        String organizationId = UUID.randomUUID().toString();
        organization.setTmfId(organizationId);

        doAnswer(
                        invocation -> {
                            Organization argument = invocation.getArgument(0);
                            assertNotExistingKeycloakCredentials(argument);
                            return null;
                        })
                .when(organizationRepository)
                .persist(any(Organization.class));

        // act
        organizationService.createOrganization(organization, authHeader);

@@ -83,7 +96,10 @@ class OrganizationServiceTest {
                                                any(OrganizationAuthCredentials.class), eq(authHeader)));

        // verify calls
        verify(organizationRepository, times(1)).persist(organization);
        ArgumentCaptor<Organization> organizationArgumentCaptor = ArgumentCaptor.captor();
        verify(organizationRepository, times(1)).persist(organizationArgumentCaptor.capture());
        Organization capturedOrganization = organizationArgumentCaptor.getValue();
        assertExistingKeycloakCredentials(capturedOrganization);

        ArgumentCaptor<OrganizationAuthCredentials> captor = ArgumentCaptor.captor();

@@ -97,6 +113,28 @@ class OrganizationServiceTest {
        assertThat(organizationAuthCredentials.getPassword()).isEqualTo(password);
    }

    private void assertNotExistingKeycloakCredentials(Organization organization) {
        Set<String> characteristics =
                organization.getPartyCharacteristic().stream()
                        .map(Characteristic::getName)
                        .collect(Collectors.toSet());

        assertThat(characteristics)
                .isNotEmpty()
                .doesNotContain(EXTERNAL_TMF_API_USERNAME, EXTERNAL_TMF_API_PASSWORD);
    }

    private void assertExistingKeycloakCredentials(Organization organization) {
        Set<String> characteristics =
                organization.getPartyCharacteristic().stream()
                        .map(Characteristic::getName)
                        .collect(Collectors.toSet());

        assertThat(characteristics)
                .isNotEmpty()
                .contains(EXTERNAL_TMF_API_USERNAME, EXTERNAL_TMF_API_PASSWORD);
    }

    @ParameterizedTest
    @JsonFileSource(
            resources = {