Pull request #139: RED-2900: Added missing migration of digital signature

Merge in RED/persistence-service from RED-2900-ds to master

* commit '0fb4867ee050806de04a54302c80f6c4575737df':
  RED-2900: Added missing migration of digital signature
This commit is contained in:
Dominique Eiflaender 2021-12-02 10:57:52 +01:00
commit 00fb70c3bf
5 changed files with 253 additions and 34 deletions

View File

@ -0,0 +1,49 @@
package com.iqser.red.service.peristence.v1.server.migration;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Base64;
import javax.annotation.PostConstruct;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import lombok.SneakyThrows;
@Service
public class MigrationEncryptionDecryptionService {
@Value("${configuration-service.crypto.key:redaction}")
private String key;
private SecretKeySpec secretKey;
@SneakyThrows
@PostConstruct
protected void postConstruct() {
byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
var sha = MessageDigest.getInstance("SHA-1");
keyBytes = sha.digest(keyBytes);
keyBytes = Arrays.copyOf(keyBytes, 16);
secretKey = new SecretKeySpec(keyBytes, "AES");
}
@SneakyThrows
public String encrypt(String strToEncrypt) {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
}
@SneakyThrows
public String decrypt(String strToDecrypt) {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)), StandardCharsets.UTF_8);
}
}

View File

@ -1,42 +1,127 @@
package com.iqser.red.service.peristence.v1.server.migration;
import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId;
import static java.util.stream.Collectors.toList;
import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.iqser.red.service.peristence.v1.server.exception.MigrationException;
import com.iqser.red.service.peristence.v1.server.migration.model.*;
import com.iqser.red.service.peristence.v1.server.migration.model.CommentRow;
import com.iqser.red.service.peristence.v1.server.migration.model.ConfigurationRow;
import com.iqser.red.service.peristence.v1.server.migration.model.DigitalSignatureModel;
import com.iqser.red.service.peristence.v1.server.migration.model.DossierAttributeRow;
import com.iqser.red.service.peristence.v1.server.migration.model.DossierAttributesConfig;
import com.iqser.red.service.peristence.v1.server.migration.model.EntryRow;
import com.iqser.red.service.peristence.v1.server.migration.model.FileAttributesConfig;
import com.iqser.red.service.peristence.v1.server.migration.model.IdRemovalRow;
import com.iqser.red.service.peristence.v1.server.migration.model.ManualForceRedactionRow;
import com.iqser.red.service.peristence.v1.server.migration.model.ManualImageRecategorizationRow;
import com.iqser.red.service.peristence.v1.server.migration.model.ManualLegalBasisChangeRow;
import com.iqser.red.service.peristence.v1.server.migration.model.ManualRedactionEntryRow;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationAuditModel;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationComment;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationDossier;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationDossierTemplate;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationDownloadStatus;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationFileStatus;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationNotification;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationRedactionLog;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationRedactionLogEntry;
import com.iqser.red.service.peristence.v1.server.migration.model.MigrationViewedPage;
import com.iqser.red.service.peristence.v1.server.migration.model.NewIdForDossierTemplate;
import com.iqser.red.service.peristence.v1.server.migration.model.Status;
import com.iqser.red.service.peristence.v1.server.migration.model.VersionRow;
import com.iqser.red.service.peristence.v1.server.migration.model.VersionType;
import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService;
import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.*;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.IdRemovalEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualForceRedactionEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualImageRecategorizationEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualLegalBasisChangeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.RectangleEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ViewedPageEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.audit.AuditEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.*;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.*;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DictionaryEntryEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.LegalBasisEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.LegalBasisMappingEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.RuleSetEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.*;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ColorsRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.CommentRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeConfigRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DownloadStatusRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.EntryRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributeConfigRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesGeneralConfigurationRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ForceRedactionRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ImageRecategorizationRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisChangeRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisMappingRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ManualRedactionRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RemoveRedactionRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RuleSetRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ViewedPagesRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.Comment;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
import com.iqser.red.service.redaction.v1.model.*;
import com.iqser.red.service.redaction.v1.model.Change;
import com.iqser.red.service.redaction.v1.model.ChangeType;
import com.iqser.red.service.redaction.v1.model.Engine;
import com.iqser.red.service.redaction.v1.model.Rectangle;
import com.iqser.red.service.redaction.v1.model.RedactionLog;
import com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist;
import com.iqser.red.storage.commons.service.StorageService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId;
import static java.util.stream.Collectors.toList;
@SuppressWarnings("PMD")
@Slf4j
@ -79,6 +164,9 @@ public class MigrationService {
private final CommentRepository commentRepository;
private final StorageService storageService;
private final MigrationEncryptionDecryptionService migrationEncryptionDecryptionService;
private final EncryptionDecryptionService encryptionDecryptionService;
private final DigitalSignatureRepository digitalSignatureRepository;
@SneakyThrows
@ -102,7 +190,7 @@ public class MigrationService {
dossierTemplates.forEach(dossierTemplate -> {
migrateDossierTemplate(dossierTemplate);
log.info("Migrated dossierTemplates");
addValues(dossierAttributesOldIdToNewId,migrateDossierAttributeConfiguration(dossierTemplate.getDossierTemplateId(), configurationRows));
addValues(dossierAttributesOldIdToNewId, migrateDossierAttributeConfiguration(dossierTemplate.getDossierTemplateId(), configurationRows));
log.info("Migrated dossier attributes config");
addValues(fileAttributesOldIdToNewId, migrateFileAttributeConfiguration(dossierTemplate.getDossierTemplateId(), configurationRows));
log.info("Migrated file attributes config");
@ -114,9 +202,11 @@ public class MigrationService {
log.info("Migrated default colors");
migrateRules(dossierTemplate.getDossierTemplateId(), versions);
log.info("Migrated rules");
});
log.info("Migrated reportTemplates");
migrateDigitalSignature();
log.info("Migrated digital signature");
migrateReportTemplates();
log.info("Migrated reportTemplates");
migrateDossiers();
@ -161,7 +251,9 @@ public class MigrationService {
}
private void addValues(Map<String, List<NewIdForDossierTemplate>> existing, Map<String, List<NewIdForDossierTemplate>> newValues){
private void addValues(Map<String, List<NewIdForDossierTemplate>> existing,
Map<String, List<NewIdForDossierTemplate>> newValues) {
newValues.entrySet().forEach(entry -> {
existing.computeIfAbsent(entry.getKey(), x -> new ArrayList<>()).addAll(entry.getValue());
});
@ -359,13 +451,11 @@ public class MigrationService {
.equals(dossierTemplateId) && versionRow.getVersionType() == VersionType.RULE.ordinal())
.findFirst();
if(!versionOptional.isPresent()){
if (!versionOptional.isPresent()) {
log.warn("no rules version found for dossier template {}", dossierTemplateId);
return;
}
var version = versionOptional
.get()
.getVersion();
var version = versionOptional.get().getVersion();
String rules = new String(fileManagementStorageService.getStoredObjectBytes(String.format("rules/%s-rules.drl", dossierTemplateId)));
RuleSetEntity ruleSet = new RuleSetEntity();
@ -501,7 +591,6 @@ public class MigrationService {
.processedDate(redaction.getProcessedDate())
.softDeletedTime(redaction.getSoftDeletedTime())
.fileStatus(file)
.build();
legalBasisChangeRepository.save(manualLegalBasisChange);
@ -530,7 +619,6 @@ public class MigrationService {
.processedDate(redaction.getProcessedDate())
.softDeletedTime(redaction.getSoftDeletedTime())
.fileStatus(file)
.build();
removeRedactionRepository.save(idRemoval);
@ -671,7 +759,9 @@ public class MigrationService {
break;
case REPROCESS:
if (oldFile.getLastSuccessfulStatus() != null) {
workflowStatus = oldFile.getLastSuccessfulStatus().equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus().name());
workflowStatus = oldFile.getLastSuccessfulStatus()
.equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus()
.name());
processingStatus = ProcessingStatus.REPROCESS;
} else {
workflowStatus = WorkflowStatus.NEW;
@ -680,7 +770,9 @@ public class MigrationService {
break;
case PROCESSING:
if (oldFile.getLastSuccessfulStatus() != null) {
workflowStatus = oldFile.getLastSuccessfulStatus().equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus().name());
workflowStatus = oldFile.getLastSuccessfulStatus()
.equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus()
.name());
processingStatus = ProcessingStatus.PROCESSING;
} else {
workflowStatus = WorkflowStatus.NEW;
@ -689,7 +781,9 @@ public class MigrationService {
break;
case ERROR:
if (oldFile.getLastSuccessfulStatus() != null) {
workflowStatus = oldFile.getLastSuccessfulStatus().equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus().name());
workflowStatus = oldFile.getLastSuccessfulStatus()
.equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus()
.name());
processingStatus = ProcessingStatus.ERROR;
} else {
workflowStatus = WorkflowStatus.NEW;
@ -698,7 +792,9 @@ public class MigrationService {
break;
case DELETED:
if (oldFile.getLastSuccessfulStatus() != null) {
workflowStatus = oldFile.getLastSuccessfulStatus().equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus().name());
workflowStatus = oldFile.getLastSuccessfulStatus()
.equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus()
.name());
processingStatus = ProcessingStatus.DELETED;
} else {
workflowStatus = WorkflowStatus.NEW;
@ -723,7 +819,9 @@ public class MigrationService {
break;
case FULLREPROCESS:
if (oldFile.getLastSuccessfulStatus() != null) {
workflowStatus = oldFile.getLastSuccessfulStatus().equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus().name());
workflowStatus = oldFile.getLastSuccessfulStatus()
.equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus()
.name());
processingStatus = ProcessingStatus.FULLREPROCESS;
} else {
workflowStatus = WorkflowStatus.NEW;
@ -732,7 +830,9 @@ public class MigrationService {
break;
case OCR_PROCESSING:
if (oldFile.getLastSuccessfulStatus() != null) {
workflowStatus = oldFile.getLastSuccessfulStatus().equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus().name());
workflowStatus = oldFile.getLastSuccessfulStatus()
.equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus()
.name());
processingStatus = ProcessingStatus.OCR_PROCESSING;
} else {
workflowStatus = WorkflowStatus.NEW;
@ -741,7 +841,9 @@ public class MigrationService {
break;
case INDEXING:
if (oldFile.getLastSuccessfulStatus() != null) {
workflowStatus = oldFile.getLastSuccessfulStatus().equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus().name());
workflowStatus = oldFile.getLastSuccessfulStatus()
.equals(Status.UNASSIGNED) ? WorkflowStatus.NEW : WorkflowStatus.valueOf(oldFile.getLastSuccessfulStatus()
.name());
processingStatus = ProcessingStatus.INDEXING;
} else {
workflowStatus = WorkflowStatus.NEW;
@ -970,6 +1072,35 @@ public class MigrationService {
}
@SneakyThrows
private void migrateDigitalSignature() {
byte[] confTableBytes = fileManagementStorageService.getStoredObjectBytes(getMigrationId("configuration_table_v1"));
Map<String, String> configMap = objectMapper.readValue(confTableBytes, new TypeReference<Map<String, String>>() {
});
if (!configMap.containsKey("DIGITAL_SIGNATURE")) {
return;
}
var oldEncrypted = configMap.get("DIGITAL_SIGNATURE");
var oldSignature = objectMapper.readValue(migrationEncryptionDecryptionService.decrypt(oldEncrypted), DigitalSignatureModel.class);
DigitalSignatureEntity digitalSignatureEntity = DigitalSignatureEntity.builder()
.location(oldSignature.getLocation())
.reason(oldSignature.getReason())
.contactInfo(oldSignature.getContactInfo())
.certificateName(oldSignature.getCertificateName())
.build();
digitalSignatureEntity.setPrivateKey(encryptionDecryptionService.encrypt(oldSignature.getPrivateKey()));
digitalSignatureEntity.setPassword(encryptionDecryptionService.encrypt(oldSignature.getPassword()));
digitalSignatureRepository.save(digitalSignatureEntity);
}
private void migrateWatermark(String dossierTemplateId, List<ConfigurationRow> configurationRows) {
configurationRows.stream()

View File

@ -0,0 +1,22 @@
package com.iqser.red.service.peristence.v1.server.migration.model;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor
@Builder
public class DigitalSignatureModel {
private String location;
private String reason;
private String contactInfo;
private String certificateName;
private byte[] privateKey;
private String password;
}

View File

@ -15,6 +15,7 @@ import org.springframework.core.io.ClassPathResource;
import com.iqser.red.service.peristence.v1.server.Application;
import com.iqser.red.service.peristence.v1.server.integration.client.AuditClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DigitalSignatureClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierAttributeClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierAttributeConfigClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient;
@ -99,6 +100,9 @@ public class MigrationTest extends AbstractPersistenceServerServiceTest {
@Autowired
private RedactionLogClient redactionLogClient;
@Autowired
private DigitalSignatureClient digitalSignatureClient;
@Test
@SneakyThrows
@ -197,6 +201,11 @@ public class MigrationTest extends AbstractPersistenceServerServiceTest {
.getInputStream()
.readAllBytes());
ClassPathResource confTable1Json = new ClassPathResource("files/migration/configuration_table_v1.json");
when(fileManagementStorageService.getStoredObjectBytes(getMigrationId("configuration_table_v1"))).thenReturn(confTable1Json
.getInputStream()
.readAllBytes());
when(fileManagementStorageService.getStoredObjectBytes(String.format("rules/%s-rules.drl", "6d945ebb-604b-4781-a72b-0f07e8ceb3e6")))
.thenReturn("Rules".getBytes(StandardCharsets.UTF_8));
when(fileManagementStorageService.getStoredObjectBytes(String.format("rules/%s-rules.drl", "49156a1f-30cc-412f-8778-eb5bd842d709")))
@ -290,6 +299,9 @@ public class MigrationTest extends AbstractPersistenceServerServiceTest {
});
assertThat(files.size()).isEqualTo(33);
var digitalSignature = digitalSignatureClient.getDigitalSignature();
assertThat(digitalSignature.getCertificateName()).isNotEmpty();
var auditCategories = auditClient.getCategories();
assertThat(auditCategories.size()).isEqualTo(7);