Skip to content

Commit 11359db

Browse files
authored
Moved and renamed some classes of the malware scan implementation (#442)
1 parent 95ecedc commit 11359db

File tree

14 files changed

+74
-84
lines changed

14 files changed

+74
-84
lines changed

.pipeline/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ steps:
3434
options:
3535
- sonar.qualitygate.wait=true
3636
- sonar.java.source=17
37-
- sonar.exclusions=**/node_modules/**,**/target/**
37+
- sonar.exclusions=**/node_modules/**,**/target/**,**/test/**
3838
- sonar.coverage.jacoco.xmlReportPaths=cds-feature-attachments/target/site/jacoco/jacoco.xml
3939
- sonar.coverage.exclusions=cds-feature-attachments/src/test/**,cds-feature-attachments/src/gen/**,integration-tests/**

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/configuration/Registration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
import com.sap.cds.feature.attachments.service.malware.AttachmentMalwareScanner;
3737
import com.sap.cds.feature.attachments.service.malware.DefaultAttachmentMalwareScanner;
3838
import com.sap.cds.feature.attachments.service.malware.client.DefaultMalwareScanClient;
39-
import com.sap.cds.feature.attachments.service.malware.client.HttpClientProviderFactory;
39+
import com.sap.cds.feature.attachments.service.malware.client.HttpClientProvider;
4040
import com.sap.cds.feature.attachments.service.malware.client.MalwareScanClient;
41-
import com.sap.cds.feature.attachments.service.malware.client.MalwareScanClientProviderFactory;
41+
import com.sap.cds.feature.attachments.service.malware.client.MalwareScanClientProvider;
4242
import com.sap.cds.services.ServiceCatalog;
4343
import com.sap.cds.services.cds.ApplicationService;
4444
import com.sap.cds.services.draft.DraftService;
@@ -143,14 +143,14 @@ private static MalwareScanClient buildMalwareScanClient(CdsEnvironment environme
143143
if (bindingOpt.isPresent()) {
144144
ServiceBinding binding = bindingOpt.get();
145145
ConnectionPool connectionPool = getConnectionPool(environment);
146-
HttpClientProviderFactory clientProviderFactory = new MalwareScanClientProviderFactory(binding,
146+
HttpClientProvider clientProvider = new MalwareScanClientProvider(binding,
147147
connectionPool);
148148
if (logger.isInfoEnabled()) {
149149
logger.info(
150150
"Using Malware Scanning service binding with name '{}' and plan '{}' for malware scanning of attachments.",
151151
binding.getName().orElse("unknown"), binding.getServicePlan().orElse("unknown"));
152152
}
153-
return new DefaultMalwareScanClient(clientProviderFactory);
153+
return new DefaultMalwareScanClient(clientProvider);
154154
}
155155

156156
logger.info("No Malware Scanning service binding found, malware scanning is disabled.");

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/service/malware/DefaultAttachmentMalwareScanner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import com.sap.cds.feature.attachments.generated.cds4j.sap.attachments.StatusCode;
2222
import com.sap.cds.feature.attachments.service.AttachmentService;
2323
import com.sap.cds.feature.attachments.service.malware.client.MalwareScanClient;
24-
import com.sap.cds.feature.attachments.service.malware.client.model.MalwareScanResultStatus;
24+
import com.sap.cds.feature.attachments.service.malware.client.MalwareScanResultStatus;
2525
import com.sap.cds.ql.Select;
2626
import com.sap.cds.ql.Update;
2727
import com.sap.cds.ql.cqn.CqnSelect;

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/service/malware/client/DefaultMalwareScanClient.java

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919

2020
import com.fasterxml.jackson.databind.DeserializationFeature;
2121
import com.fasterxml.jackson.databind.ObjectMapper;
22-
import com.sap.cds.feature.attachments.service.malware.client.model.MalwareScanResult;
23-
import com.sap.cds.feature.attachments.service.malware.client.model.MalwareScanResultStatus;
2422
import com.sap.cds.services.ServiceException;
2523

2624
/**
@@ -35,33 +33,29 @@ public class DefaultMalwareScanClient implements MalwareScanClient {
3533

3634
private final ObjectMapper mapper = buildObjectMapper();
3735

38-
private final HttpClientProviderFactory clientProviderFactory;
36+
private final HttpClientProvider clientProvider;
3937

4038
/**
4139
* Constructs a new instance of {@link DefaultMalwareScanClient}.
4240
*
43-
* @param clientProviderFactory the required {@link HttpClientProviderFactory} to create the HTTP client to access
44-
* the Malware Scan Service.
41+
* @param clientProvider the required {@link HttpClientProvider} to create the HTTP client to access
42+
* the Malware Scan Service.
4543
*
4644
* @throws NullPointerException if the {@code clientProviderFactory} is {@code null}.
4745
*/
48-
public DefaultMalwareScanClient(HttpClientProviderFactory clientProviderFactory) {
49-
this.clientProviderFactory = requireNonNull(clientProviderFactory, "clientProviderFactory must not be null");
46+
public DefaultMalwareScanClient(HttpClientProvider clientProvider) {
47+
this.clientProvider = requireNonNull(clientProvider, "clientProvider must not be null");
5048
}
5149

5250
@Override
5351
public MalwareScanResultStatus scanContent(InputStream content) {
5452
logger.info("Start scanning document");
55-
return scanContentWithClient(content);
56-
}
57-
58-
private MalwareScanResultStatus scanContentWithClient(InputStream content) {
59-
HttpClient httpClient = clientProviderFactory.getHttpClient();
6053
HttpPost request = buildHttpRequest(content);
61-
return executeRequest(httpClient, request);
54+
return executeRequest(request);
6255
}
6356

64-
private MalwareScanResultStatus executeRequest(HttpClient httpClient, HttpPost request) {
57+
private MalwareScanResultStatus executeRequest(HttpPost request) {
58+
HttpClient httpClient = clientProvider.getHttpClient();
6559
try (CloseableHttpResponse response = (CloseableHttpResponse) httpClient.execute(request)) {
6660
MalwareScanResult malwareScanResult = convertHttpResponseToJavaObject(response);
6761
return mapResponseToStatus(malwareScanResult);
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
import org.apache.http.client.HttpClient;
77

88
/**
9-
* Factory for creating a {@link HttpClient} to access the Malware Scan Service.
9+
* A provider for getting a {@link HttpClient} to access the Malware Scan Service.
1010
*/
11-
public interface HttpClientProviderFactory {
11+
public interface HttpClientProvider {
1212

1313
/**
1414
* Returns an {@link HttpClient} to send HTTP requests to the Malware Scan Service.
15-
*
15+
*
1616
* @return an {@link HttpClient} to send HTTP requests to the Malware Scan Service.
1717
*/
1818
HttpClient getHttpClient();

cds-feature-attachments/src/main/java/com/sap/cds/feature/attachments/service/malware/client/MalwareScanClient.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
package com.sap.cds.feature.attachments.service.malware.client;
55

66
import java.io.InputStream;
7-
8-
import com.sap.cds.feature.attachments.service.malware.client.model.MalwareScanResultStatus;
97
import com.sap.cds.services.ServiceException;
108

119
/**
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@
1717
import com.sap.cloud.sdk.cloudplatform.security.BasicCredentials;
1818

1919
/**
20-
* The default factory for creating a {@link HttpClient} for the Malware Scan Service.
20+
* The default provider for getting a {@link HttpClient} for the Malware Scan Service.
2121
*/
22-
public final class MalwareScanClientProviderFactory implements HttpClientProviderFactory {
22+
public final class MalwareScanClientProvider implements HttpClientProvider {
2323

2424
private final HttpClient httpClient;
2525

2626
/**
27-
* Creates a new instance of {@link MalwareScanClientProviderFactory}.
27+
* Creates a new instance of {@link MalwareScanClientProvider}.
2828
*
2929
* @param binding the required {@link ServiceBinding} to the Malware Scan Service
3030
* @param configuration the required {@link ConnectionPool} configuration
3131
*/
32-
public MalwareScanClientProviderFactory(ServiceBinding binding, ConnectionPool configuration) {
32+
public MalwareScanClientProvider(ServiceBinding binding, ConnectionPool configuration) {
3333
Map<String, Object> credentials = binding.getCredentials();
3434

3535
BasicCredentials basic = new BasicCredentials((String) credentials.get("username"),
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
/**************************************************************************
22
* (C) 2019-2025 SAP SE or an SAP affiliate company. All rights reserved. *
33
**************************************************************************/
4-
package com.sap.cds.feature.attachments.service.malware.client.model;
4+
package com.sap.cds.feature.attachments.service.malware.client;
55

6+
import com.google.common.annotations.VisibleForTesting;
67
import java.io.Serial;
78
import java.io.Serializable;
89

@@ -19,11 +20,12 @@ public class MalwareScanResult implements Serializable {
1920
private String mimeType;
2021

2122
/**
22-
* Default constructor with no parameters.
23+
* Default constructor with no parameters. Required for Jackson deserialization.
2324
*/
2425
public MalwareScanResult() {
2526
}
2627

28+
@VisibleForTesting
2729
MalwareScanResult(boolean malwareDetected, boolean encryptedContentDetected, long scanSize, String mimeType) {
2830
this.malwareDetected = malwareDetected;
2931
this.encryptedContentDetected = encryptedContentDetected;
@@ -33,7 +35,7 @@ public MalwareScanResult() {
3335

3436
/**
3537
* Indicates if malware was detected.
36-
*
38+
*
3739
* @return <code>true</code> if malware was detected, otherwise <code>false</code>.
3840
*/
3941
public boolean isMalwareDetected() {
@@ -42,7 +44,7 @@ public boolean isMalwareDetected() {
4244

4345
/**
4446
* Indicates if encrypted content was detected.
45-
*
47+
*
4648
* @return <code>true</code> if encrypted content was detected, otherwise <code>false</code>.
4749
*/
4850
public boolean isEncryptedContentDetected() {
@@ -51,7 +53,7 @@ public boolean isEncryptedContentDetected() {
5153

5254
/**
5355
* The size of the scanned file.
54-
*
56+
*
5557
* @return the size of the scanned file.
5658
*/
5759
public long getScanSize() {
@@ -60,7 +62,7 @@ public long getScanSize() {
6062

6163
/**
6264
* The mime type of the file scanned.
63-
*
65+
*
6466
* @return the mime type of the file scanned.
6567
*/
6668
public String getMimeType() {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**************************************************************************
22
* (C) 2019-2025 SAP SE or an SAP affiliate company. All rights reserved. *
33
**************************************************************************/
4-
package com.sap.cds.feature.attachments.service.malware.client.model;
4+
package com.sap.cds.feature.attachments.service.malware.client;
55

66
/**
77
* The results returned from the Malware Scan backing service. The status of the scan can be one of the following:

cds-feature-attachments/src/test/java/com/sap/cds/feature/attachments/service/malware/DefaultAttachmentMalwareScannerTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.sap.cds.feature.attachments.service.malware;
22

33
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
45
import static org.junit.jupiter.api.Assertions.assertThrows;
56
import static org.mockito.ArgumentMatchers.any;
67
import static org.mockito.Mockito.mock;
@@ -26,7 +27,7 @@
2627
import com.sap.cds.feature.attachments.handler.helper.RuntimeHelper;
2728
import com.sap.cds.feature.attachments.service.AttachmentService;
2829
import com.sap.cds.feature.attachments.service.malware.client.MalwareScanClient;
29-
import com.sap.cds.feature.attachments.service.malware.client.model.MalwareScanResultStatus;
30+
import com.sap.cds.feature.attachments.service.malware.client.MalwareScanResultStatus;
3031
import com.sap.cds.ql.cqn.CqnSelect;
3132
import com.sap.cds.ql.cqn.CqnUpdate;
3233
import com.sap.cds.services.ServiceException;
@@ -250,11 +251,11 @@ void clientNotCalledIfNoInstanceBound() {
250251

251252
@Test
252253
void mapStatus() {
253-
assertThat(DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.CLEAN)).isEqualTo(StatusCode.CLEAN);
254-
assertThat(DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.ENCRYPTED)).isEqualTo(StatusCode.INFECTED);
255-
assertThat(DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.FAILED)).isEqualTo(StatusCode.FAILED);
256-
assertThat(DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.INFECTED)).isEqualTo(StatusCode.INFECTED);
257-
assertThat(DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.NO_SCANNER)).isEqualTo(StatusCode.CLEAN);
254+
assertEquals(StatusCode.CLEAN, DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.CLEAN));
255+
assertEquals(StatusCode.INFECTED,DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.ENCRYPTED));
256+
assertEquals(StatusCode.FAILED, DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.FAILED));
257+
assertEquals(StatusCode.INFECTED, DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.INFECTED));
258+
assertEquals(StatusCode.CLEAN, DefaultAttachmentMalwareScanner.mapStatus(MalwareScanResultStatus.NO_SCANNER));
258259
}
259260

260261
private void verifyPersistenceServiceCalledCorrectlyForReadAndUpdate(MalwareScanResultStatus expectedStatus) {

0 commit comments

Comments
 (0)