diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java index ab770675cfed66bb4611346ebdf300aab838cb0c..82dcc6d3e12f93a0f9b6e74c1a355e295215b058 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java @@ -34,6 +34,7 @@ import org.springframework.core.task.TaskExecutor; import com.google.protobuf.ByteString; +import de.ozgcloud.apilib.file.OzgCloudFile; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.nachrichten.NachrichtenManagerConfiguration; import de.ozgcloud.nachrichten.common.grpc.GrpcDownloader; @@ -151,9 +152,14 @@ class AntragraumGrpcService extends AntragraumServiceGrpc.AntragraumServiceImplB public void getAttachmentMetadata(GrpcGetAttachmentMetadataRequest request, StreamObserver<GrpcGetAttachmentMetadataResponse> responseObserver) { var attachment = service.getAttachmentMetadata(attachmentFileRequestMapper.fromMetadataRequest(request)); - responseObserver.onNext(GrpcGetAttachmentMetadataResponse.newBuilder() - .setFileMetadata(ozgCloudFileMapper.toMetadata(attachment)).build()); + responseObserver.onNext(buildAttachmentMetadataResponse(attachment)); responseObserver.onCompleted(); } + + private GrpcGetAttachmentMetadataResponse buildAttachmentMetadataResponse(OzgCloudFile attachment) { + return GrpcGetAttachmentMetadataResponse.newBuilder() + .setFileMetadata(ozgCloudFileMapper.toMetadata(attachment)) + .build(); + } } diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java index 75c004d0813a2c2502c79c4e5c1ca94385b6e01c..40aad53c4011c6cd6fac3c2e4f8117d07baff41a 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java @@ -25,8 +25,6 @@ package de.ozgcloud.nachrichten.antragraum; import static java.util.Objects.*; -import java.io.DataOutputStream; -import java.io.IOException; import java.io.OutputStream; import java.time.ZonedDateTime; import java.util.Comparator; @@ -48,7 +46,6 @@ import de.ozgcloud.apilib.common.errorhandling.NotFoundException; import de.ozgcloud.apilib.file.OzgCloudFile; import de.ozgcloud.apilib.file.OzgCloudFileId; import de.ozgcloud.apilib.file.OzgCloudFileService; -import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.nachrichten.NachrichtenManagerConfiguration; import de.ozgcloud.nachrichten.NachrichtenManagerProperties; import de.ozgcloud.nachrichten.common.vorgang.Vorgang; @@ -111,14 +108,14 @@ public class AntragraumService { LOG.info("Starting Antragraum Service"); } - public String getAntragsraumUrl() { - return properties.getUrl(); - } - public String getUserNotificationText() { return USER_NOTIFICATION_TEMPLATE.formatted(getAntragsraumUrl()); } + public String getAntragsraumUrl() { + return properties.getUrl(); + } + public Stream<RueckfrageHead> findRueckfragen(String samlToken) { verifyToken(samlToken); @@ -156,7 +153,7 @@ public class AntragraumService { public String sendRueckfrageAnswer(String samlToken, String rueckfrageId, PostfachNachricht nachricht) { verifyToken(samlToken); - verifyPostfachIdFromNachricht(samlToken, nachricht); + verifyPostfachIdFromPostfachNachricht(samlToken, nachricht); return postfachNachrichtService.persistAnswer(rueckfrageId, nachricht); } @@ -172,33 +169,17 @@ public class AntragraumService { var nachricht = nachrichtMapper.fromMapToPostfachMail(postfachNachrichtService.getById(id)); - verifyPostfachIdFromNachricht(samlToken, nachricht); + verifyPostfachIdFromPostfachNachricht(samlToken, nachricht); return nachricht; } - void verifyPostfachIdFromNachricht(String samlToken, PostfachNachricht nachricht) { + void verifyPostfachIdFromPostfachNachricht(String samlToken, PostfachNachricht nachricht) { var vorgang = vorgangService.getVorgang(nachricht.getVorgangId()); verifyPostfachId(samlToken, nachricht, vorgang); } - String getPostfachId(String samlToken) { - return decrypter.decryptPostfachId(parser.parse(samlToken)); - } - - public boolean isAccessible(String samlToken, String trustLevel) { - return getTrustLevel(samlToken).getIntValue() >= TrustLevel.fromString(trustLevel).getIntValue(); - } - - TrustLevel getTrustLevel(String samlToken) { - return TrustLevel.fromString(decrypter.decryptTrustLevel(parseSamlToken(samlToken))); - } - - Response parseSamlToken(String samlToken) { - return parser.parse(samlToken); - } - public void getAttachmentContent(AttachmentFileRequest request, OutputStream outputStream) { try { verifyAccessToFile(request); @@ -206,12 +187,7 @@ public class AntragraumService { IOUtils.closeQuietly(outputStream); throw e; } - - try (var dataOutput = new DataOutputStream(outputStream)) { - ozgCloudFileService.writeFileDataToStream(OzgCloudFileId.from(request.getFileId()), dataOutput); - } catch (IOException e) { - throw new TechnicalException("Error on getting attachment file content.", e); - } + ozgCloudFileService.writeFileDataToStream(OzgCloudFileId.from(request.getFileId()), outputStream); } public OzgCloudFile getAttachmentMetadata(AttachmentFileRequest request) { @@ -222,7 +198,7 @@ public class AntragraumService { void verifyAccessToFile(AttachmentFileRequest request) { verifyToken(request.getSamlToken()); var nachricht = attachedItemService.getPostfachNachricht(request.getNachrichtId()); - verifyAccessToVorgang(request.getSamlToken(), nachricht); + verifyAccessToPostfachNachricht(request.getSamlToken(), nachricht); verifyFileId(request.getFileId(), nachricht); } @@ -233,7 +209,7 @@ public class AntragraumService { } } - void verifyAccessToVorgang(String token, PostfachNachricht nachricht) { + void verifyAccessToPostfachNachricht(String token, PostfachNachricht nachricht) { var vorgang = vorgangService.getVorgang(nachricht.getVorgangId()); verifyPostfachId(token, nachricht, vorgang); verifyTrustLevel(token, nachricht, vorgang); @@ -245,12 +221,28 @@ public class AntragraumService { } } + String getPostfachId(String samlToken) { + return decrypter.decryptPostfachId(parser.parse(samlToken)); + } + void verifyTrustLevel(String token, PostfachNachricht nachricht, Vorgang vorgang) { if (!isAccessible(token, vorgang.getTrustLevel())) { throw new NotFoundException(GenericId.from(nachricht.getId()), POSTFACH_NACHRICHT); } } + public boolean isAccessible(String samlToken, String trustLevel) { + return getTrustLevel(samlToken).getIntValue() >= TrustLevel.fromString(trustLevel).getIntValue(); + } + + TrustLevel getTrustLevel(String samlToken) { + return TrustLevel.fromString(decrypter.decryptTrustLevel(parseSamlToken(samlToken))); + } + + Response parseSamlToken(String samlToken) { + return parser.parse(samlToken); + } + void verifyFileId(String fileId, PostfachNachricht nachricht) { if (!nachricht.getAttachments().contains(fileId)) { throw new NotFoundException(GenericId.from(nachricht.getId()), POSTFACH_NACHRICHT); diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteService.java index b04d4daeafce7b3b4b1d5c725e043c66d4dd686e..d7607de3d693db332191ce174d6553d30a9fba32 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteService.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/AttachedItemRemoteService.java @@ -79,8 +79,8 @@ class AttachedItemRemoteService { .build(); } - public PostfachNachricht getPostfachNachrichtById(String nachrichtId) { - var response = getVorgangAttachedItemServiceStub().getById(buildGetByIdRequest(nachrichtId)); + public PostfachNachricht getPostfachNachrichtById(String postfachNachrichtId) { + var response = getVorgangAttachedItemServiceStub().getById(buildGetByIdRequest(postfachNachrichtId)); return postfachNachrichtMapper.fromAttachedItem(response.getVorgangAttachedItem()); } @@ -88,9 +88,9 @@ class AttachedItemRemoteService { return vorgangAttachedItemServiceStub.withInterceptors(new NachrichtenCallContextAttachingInterceptor()); } - GrpcVorgangAttachedItemRequest buildGetByIdRequest(String id) { + GrpcVorgangAttachedItemRequest buildGetByIdRequest(String postfachNachrichtId) { return GrpcVorgangAttachedItemRequest.newBuilder() - .setId(id) + .setId(postfachNachrichtId) .build(); } } diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java index d0fe6486cee6c5e1ef54c0373e004df6f4ab47a1..8b6fb121f9dcfcb9dc8e206ae447d23b5c019e9c 100644 --- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java @@ -5,9 +5,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.PipedOutputStream; +import java.io.OutputStream; import java.time.ZonedDateTime; import java.util.List; import java.util.Map; @@ -23,7 +21,6 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.MockedConstruction; import org.mockito.MockedStatic; import org.mockito.Spy; import org.opensaml.saml.saml2.core.Response; @@ -33,7 +30,6 @@ import de.ozgcloud.apilib.file.OzgCloudFile; import de.ozgcloud.apilib.file.OzgCloudFileId; import de.ozgcloud.apilib.file.OzgCloudFileService; import de.ozgcloud.apilib.file.OzgCloudFileTestFactory; -import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.nachrichten.NachrichtenManagerProperties; import de.ozgcloud.nachrichten.common.vorgang.GrpcPostfachAddressTestFactory; import de.ozgcloud.nachrichten.common.vorgang.GrpcServiceKontoTestFactory; @@ -323,7 +319,7 @@ class AntragraumServiceTest { @BeforeEach void mock() { doNothing().when(service).verifyToken(any()); - doNothing().when(service).verifyPostfachIdFromNachricht(any(), any()); + doNothing().when(service).verifyPostfachIdFromPostfachNachricht(any(), any()); } @Test @@ -341,10 +337,10 @@ class AntragraumServiceTest { } @Test - void shouldVerifyPostfachIdFromNachricht() { + void shouldVerifyPostfachIdFromPostfachNachricht() { service.sendRueckfrageAnswer(SAML_TOKEN, RUECKFRAGE_ID, NACHRICHT); - verify(service).verifyPostfachIdFromNachricht(SAML_TOKEN, NACHRICHT); + verify(service).verifyPostfachIdFromPostfachNachricht(SAML_TOKEN, NACHRICHT); } } @@ -420,7 +416,7 @@ class AntragraumServiceTest { when(nachrichtMapper.fromMapToPostfachMail(any())).thenReturn(nachricht); doNothing().when(service).verifyToken(any()); - doNothing().when(service).verifyPostfachIdFromNachricht(any(), any()); + doNothing().when(service).verifyPostfachIdFromPostfachNachricht(any(), any()); } @Test @@ -452,10 +448,10 @@ class AntragraumServiceTest { } @Test - void shouldCallVerifyPostfachIdFromNachricht() { + void shouldCallVerifyPostfachIdFromPostfachNachricht() { getRueckfrage(); - verify(service).verifyPostfachIdFromNachricht(samlToken, nachricht); + verify(service).verifyPostfachIdFromPostfachNachricht(samlToken, nachricht); } private PostfachNachricht getRueckfrage() { @@ -463,9 +459,9 @@ class AntragraumServiceTest { } } - @DisplayName("Verify postfachId from Nachricht") + @DisplayName("Verify postfachId from PostfachNachricht") @Nested - class TestVerifyPostfachIdFromNachricht { + class TestVerifyPostfachIdFromPostfachNachricht { private static final String SAML_TOKEN = "TOKEN"; private static final PostfachNachricht POSTFACH_NACHRICHT = PostfachNachrichtTestFactory.create(); @@ -479,14 +475,14 @@ class AntragraumServiceTest { @Test void shouldCallVorgangService() { - service.verifyPostfachIdFromNachricht(SAML_TOKEN, POSTFACH_NACHRICHT); + service.verifyPostfachIdFromPostfachNachricht(SAML_TOKEN, POSTFACH_NACHRICHT); verify(vorgangService).getVorgang(MessageTestFactory.VORGANG_ID); } @Test void shouldCallVerifyPostfachId() { - service.verifyPostfachIdFromNachricht(SAML_TOKEN, POSTFACH_NACHRICHT); + service.verifyPostfachIdFromPostfachNachricht(SAML_TOKEN, POSTFACH_NACHRICHT); verify(service).verifyPostfachId(SAML_TOKEN, POSTFACH_NACHRICHT, vorgang); } @@ -625,29 +621,16 @@ class AntragraumServiceTest { class TestGetAttachmentContent { @Mock - private PipedOutputStream pipedOutputStream; + private OutputStream outputStream; private final AttachmentFileRequest request = AttachmentFileRequestTestFactory.create(); @Nested - class OnNoException { - - private MockedConstruction<DataOutputStream> dataOutputStreamMockedConstruction; - private DataOutputStream dataOutputStream; - private PipedOutputStream underlyingStream; + class OnSuccessfullVerification { @BeforeEach void mock() { doNothing().when(service).verifyAccessToFile(request); - dataOutputStreamMockedConstruction = mockConstruction(DataOutputStream.class, (dataOutputStream, context) -> { - underlyingStream = (PipedOutputStream) context.arguments().get(0); - this.dataOutputStream = dataOutputStream; - }); - } - - @AfterEach - void cleanUp() { - dataOutputStreamMockedConstruction.close(); } @Test @@ -657,54 +640,17 @@ class AntragraumServiceTest { verify(service).verifyAccessToFile(request); } - @Test - void shouldCreateDataOutputStream() { - callGetAttachmentContent(); - - assertThat(dataOutputStreamMockedConstruction.constructed()).hasSize(1); - } - - @Test - void shouldCreateDataOutputStreamWithPipedOutputStream() { - callGetAttachmentContent(); - - assertThat(underlyingStream).isEqualTo(pipedOutputStream); - } - @Test void shouldCallOzgCloudFileServiceToWriteData() { callGetAttachmentContent(); - verify(ozgCloudFileService).writeFileDataToStream(OzgCloudFileId.from(AttachmentFileRequestTestFactory.FILE_ID), dataOutputStream); + verify(ozgCloudFileService).writeFileDataToStream(OzgCloudFileId.from(AttachmentFileRequestTestFactory.FILE_ID), outputStream); } - @Test - @SneakyThrows - void shouldCloseDataOutputStream() { - callGetAttachmentContent(); - - verify(dataOutputStream).close(); - } - } - - @Nested - class OnIOException { - - @Test - @SneakyThrows - void shouldThrowTechnicalException() { - doNothing().when(service).verifyAccessToFile(request); - - try (var dataOutputStreamMockedConstruction = mockConstruction(DataOutputStream.class, - (outputStream, context) -> doThrow(IOException.class).when(outputStream).close())) { - - assertThrows(TechnicalException.class, () -> callGetAttachmentContent()); - } - } } @Nested - class OnRuntimeException { + class OnUnsuccessfullVerification { private MockedStatic<IOUtils> mockedIOUtils; private RuntimeException exception; @@ -727,7 +673,7 @@ class AntragraumServiceTest { callGetAttachmentContent(); } catch (RuntimeException e) { } - mockedIOUtils.verify(() -> IOUtils.closeQuietly(pipedOutputStream)); + mockedIOUtils.verify(() -> IOUtils.closeQuietly(outputStream)); } @Test @@ -738,7 +684,7 @@ class AntragraumServiceTest { @SneakyThrows private void callGetAttachmentContent() { - service.getAttachmentContent(request, pipedOutputStream); + service.getAttachmentContent(request, outputStream); } } @@ -790,7 +736,7 @@ class AntragraumServiceTest { @BeforeEach void mock() { when(attachedItemService.getPostfachNachricht(AttachmentFileRequestTestFactory.NACHRICHT_ID)).thenReturn(nachricht); - doNothing().when(service).verifyAccessToVorgang(AttachmentFileRequestTestFactory.TOKEN, nachricht); + doNothing().when(service).verifyAccessToPostfachNachricht(AttachmentFileRequestTestFactory.TOKEN, nachricht); doNothing().when(service).verifyFileId(AttachmentFileRequestTestFactory.FILE_ID, nachricht); } @@ -809,10 +755,10 @@ class AntragraumServiceTest { } @Test - void shouldCallVerifyAccessToVorgang() { + void shouldCallVerifyAccessToPostfachNachricht() { callVerifyAccessToFile(); - verify(service).verifyAccessToVorgang(AttachmentFileRequestTestFactory.TOKEN, nachricht); + verify(service).verifyAccessToPostfachNachricht(AttachmentFileRequestTestFactory.TOKEN, nachricht); } @Test @@ -829,7 +775,7 @@ class AntragraumServiceTest { } @Nested - class TestVerifyAccessToVorgang { + class TestVerifyAccessToPostfachNachricht { private final PostfachNachricht nachricht = PostfachNachrichtTestFactory.create(); private final Vorgang vorgang = VorgangTestFactory.create(); @@ -843,27 +789,27 @@ class AntragraumServiceTest { @Test void shouldCallVorgangService() { - verifyAccessToVorgang(); + verifyAccessToPostfachNachricht(); verify(vorgangService).getVorgang(MessageTestFactory.VORGANG_ID); } @Test void shouldCallVerifyPostfachId() { - verifyAccessToVorgang(); + verifyAccessToPostfachNachricht(); verify(service).verifyPostfachId(AttachmentFileRequestTestFactory.TOKEN, nachricht, vorgang); } @Test void shouldVerifyTrustLevel() { - verifyAccessToVorgang(); + verifyAccessToPostfachNachricht(); verify(service).verifyTrustLevel(AttachmentFileRequestTestFactory.TOKEN, nachricht, vorgang); } - private void verifyAccessToVorgang() { - service.verifyAccessToVorgang(AttachmentFileRequestTestFactory.TOKEN, nachricht); + private void verifyAccessToPostfachNachricht() { + service.verifyAccessToPostfachNachricht(AttachmentFileRequestTestFactory.TOKEN, nachricht); } } diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/FileContentTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/FileContentTestFactory.java deleted file mode 100644 index e36617b77b7921b98aae465fdcde16710eb43084..0000000000000000000000000000000000000000 --- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/FileContentTestFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.ozgcloud.nachrichten.antragraum; - -import java.util.Random; - -public class FileContentTestFactory { - - public static byte[] createContentInByte(int fileSize) { - Random r = new Random(); - byte[] chunk = new byte[fileSize]; - for (int i = 0; i < chunk.length; i++) { - chunk[i] = (byte) (r.nextInt('z' - 'a') + 'a'); - } - return chunk; - } - -}