Skip to content

Commit 8f20b9f

Browse files
committed
Merge branch 'master' into 1873-data-import-and-export
# Conflicts: # src/main/java/de/rwth/idsg/steve/web/controller/AboutSettingsController.java
2 parents 747d863 + d5fede6 commit 8f20b9f

39 files changed

+326
-308
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
2222

2323
steps:
24-
- uses: actions/checkout@v5
24+
- uses: actions/checkout@v6
2525
- name: Set up Java ${{ matrix.Java }}
2626
uses: actions/setup-java@v5
2727
with:

.github/workflows/review.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ jobs:
55
license-check:
66
runs-on: ubuntu-latest
77
steps:
8-
- uses: actions/checkout@v5
8+
- uses: actions/checkout@v6
99
with:
1010
fetch-depth: 0
1111

@@ -21,7 +21,7 @@ jobs:
2121
checkstyle:
2222
runs-on: 'ubuntu-latest'
2323
steps:
24-
- uses: actions/checkout@v5
24+
- uses: actions/checkout@v6
2525
- uses: actions/setup-java@v5
2626
with:
2727
distribution: 'temurin'

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<java.version>21</java.version>
4343
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
4444

45-
<cxf.version>4.1.3</cxf.version>
45+
<cxf.version>4.1.4</cxf.version>
4646
<plugin.license-maven.version>5.0.0</plugin.license-maven.version>
4747

4848
<!-- In Mysql: schema == database (http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_schema) -->
@@ -567,19 +567,19 @@
567567
<dependency>
568568
<groupId>org.owasp.encoder</groupId>
569569
<artifactId>encoder-jakarta-jsp</artifactId>
570-
<version>1.3.1</version>
570+
<version>1.4.0</version>
571571
</dependency>
572572

573573
<!-- Bouncy Castle for certificate signing (OCPP 1.6 Security) -->
574574
<dependency>
575575
<groupId>org.bouncycastle</groupId>
576576
<artifactId>bcprov-jdk18on</artifactId>
577-
<version>1.79</version>
577+
<version>1.82</version>
578578
</dependency>
579579
<dependency>
580580
<groupId>org.bouncycastle</groupId>
581581
<artifactId>bcpkix-jdk18on</artifactId>
582-
<version>1.79</version>
582+
<version>1.82</version>
583583
</dependency>
584584
</dependencies>
585585
</project>

src/main/java/de/rwth/idsg/steve/SteveException.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@
1818
*/
1919
package de.rwth.idsg.steve;
2020

21-
import static java.lang.String.format;
21+
import java.io.Serial;
2222

2323
/**
2424
* @author Sevket Goekay <sevketgokay@gmail.com>
2525
* @since 28.08.2014
2626
*/
2727
public class SteveException extends RuntimeException {
2828

29+
@Serial
2930
private static final long serialVersionUID = 3081743035434873349L;
3031

3132
public SteveException(String message) {
@@ -41,19 +42,19 @@ public SteveException(String message, Throwable cause) {
4142
// -------------------------------------------------------------------------
4243

4344
public SteveException(String template, Object arg1) {
44-
this(format(template, arg1));
45+
this(template.formatted(arg1));
4546
}
4647

4748
public SteveException(String template, Object arg1, Throwable cause) {
48-
this(format(template, arg1), cause);
49+
this(template.formatted(arg1), cause);
4950
}
5051

5152
public SteveException(String template, Object arg1, Object arg2) {
52-
this(format(template, arg1, arg2));
53+
this(template.formatted(arg1, arg2));
5354
}
5455

5556
public SteveException(String template, Object arg1, Object arg2, Throwable cause) {
56-
this(format(template, arg1, arg2), cause);
57+
this(template.formatted(arg1, arg2), cause);
5758
}
5859

5960
// -------------------------------------------------------------------------
@@ -63,7 +64,7 @@ public SteveException(String template, Object arg1, Object arg2, Throwable cause
6364
public static class AlreadyExists extends SteveException {
6465

6566
public AlreadyExists(String template, Object arg1) {
66-
super(format(template, arg1));
67+
super(template.formatted(arg1));
6768
}
6869
}
6970

src/main/java/de/rwth/idsg/steve/config/BeanConfiguration.java

Lines changed: 14 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818
*/
1919
package de.rwth.idsg.steve.config;
2020

21-
import com.fasterxml.jackson.databind.DeserializationFeature;
22-
import com.fasterxml.jackson.databind.ObjectMapper;
23-
import com.fasterxml.jackson.databind.SerializationFeature;
21+
import com.fasterxml.jackson.datatype.joda.JodaModule;
2422
import com.mysql.cj.conf.PropertyKey;
2523
import com.zaxxer.hikari.HikariConfig;
2624
import com.zaxxer.hikari.HikariDataSource;
@@ -35,28 +33,24 @@
3533
import org.jooq.impl.DSL;
3634
import org.jooq.impl.DataSourceConnectionProvider;
3735
import org.jooq.impl.DefaultConfiguration;
36+
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
3837
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
3938
import org.springframework.context.annotation.Bean;
4039
import org.springframework.context.annotation.ComponentScan;
4140
import org.springframework.context.annotation.Configuration;
4241
import org.springframework.context.annotation.Primary;
43-
import org.springframework.format.support.FormattingConversionService;
44-
import org.springframework.http.converter.HttpMessageConverter;
45-
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
4642
import org.springframework.scheduling.annotation.EnableAsync;
4743
import org.springframework.scheduling.annotation.EnableScheduling;
4844
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
4945
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
50-
import org.springframework.web.accept.ContentNegotiationManager;
51-
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
5246
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
53-
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
5447
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
55-
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
5648
import org.springframework.web.servlet.view.InternalResourceViewResolver;
5749

5850
import javax.sql.DataSource;
59-
import java.util.List;
51+
52+
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
53+
import static com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS;
6054

6155
/**
6256
* Configuration and beans of Spring Framework.
@@ -66,7 +60,6 @@
6660
*/
6761
@Slf4j
6862
@Configuration
69-
@EnableWebMvc
7063
@EnableScheduling
7164
@EnableAsync
7265
@ComponentScan("de.rwth.idsg.steve")
@@ -200,35 +193,15 @@ public void addResourceHandlers(final ResourceHandlerRegistry registry) {
200193
// API config
201194
// -------------------------------------------------------------------------
202195

203-
@Override
204-
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
205-
for (HttpMessageConverter<?> converter : converters) {
206-
if (converter instanceof MappingJackson2HttpMessageConverter) {
207-
MappingJackson2HttpMessageConverter conv = (MappingJackson2HttpMessageConverter) converter;
208-
ObjectMapper objectMapper = conv.getObjectMapper();
209-
objectMapper.findAndRegisterModules();
210-
// if the client sends unknown props, just ignore them instead of failing
211-
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
212-
// default is true
213-
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
214-
break;
215-
}
216-
}
217-
}
218-
219-
/**
220-
* Find the ObjectMapper used in MappingJackson2HttpMessageConverter and initialized by Spring automatically.
221-
* MappingJackson2HttpMessageConverter is not a Bean. It is created in {@link WebMvcConfigurationSupport#addDefaultHttpMessageConverters(List)}.
222-
* Therefore, we have to access it via proxies that reference it. RequestMappingHandlerAdapter is a Bean, created in
223-
* {@link WebMvcConfigurationSupport#requestMappingHandlerAdapter(ContentNegotiationManager, FormattingConversionService, org.springframework.validation.Validator)}.
224-
*/
225196
@Bean
226-
@Primary
227-
public ObjectMapper jacksonObjectMapper(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
228-
return requestMappingHandlerAdapter.getMessageConverters().stream()
229-
.filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
230-
.findAny()
231-
.map(conv -> ((MappingJackson2HttpMessageConverter) conv).getObjectMapper())
232-
.orElseThrow(() -> new RuntimeException("There is no MappingJackson2HttpMessageConverter in Spring context"));
197+
public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
198+
return builder -> {
199+
// default is true
200+
builder.featuresToDisable(WRITE_DATES_AS_TIMESTAMPS);
201+
// if the client sends unknown props, just ignore them instead of failing
202+
builder.featuresToDisable(FAIL_ON_UNKNOWN_PROPERTIES);
203+
// we still use joda DateTime...
204+
builder.modulesToInstall(new JodaModule());
205+
};
233206
}
234207
}

src/main/java/de/rwth/idsg/steve/ocpp/ChargePointServiceInvoker.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,28 @@
1919
package de.rwth.idsg.steve.ocpp;
2020

2121
import de.rwth.idsg.steve.ocpp.task.CancelReservationTask;
22+
import de.rwth.idsg.steve.ocpp.task.CertificateSignedTask;
2223
import de.rwth.idsg.steve.ocpp.task.ChangeAvailabilityTask;
2324
import de.rwth.idsg.steve.ocpp.task.ChangeConfigurationTask;
2425
import de.rwth.idsg.steve.ocpp.task.ClearCacheTask;
2526
import de.rwth.idsg.steve.ocpp.task.ClearChargingProfileTask;
2627
import de.rwth.idsg.steve.ocpp.task.DataTransferTask;
28+
import de.rwth.idsg.steve.ocpp.task.DeleteCertificateTask;
29+
import de.rwth.idsg.steve.ocpp.task.ExtendedTriggerMessageTask;
2730
import de.rwth.idsg.steve.ocpp.task.GetCompositeScheduleTask;
2831
import de.rwth.idsg.steve.ocpp.task.GetConfigurationTask;
2932
import de.rwth.idsg.steve.ocpp.task.GetDiagnosticsTask;
33+
import de.rwth.idsg.steve.ocpp.task.GetInstalledCertificateIdsTask;
3034
import de.rwth.idsg.steve.ocpp.task.GetLocalListVersionTask;
35+
import de.rwth.idsg.steve.ocpp.task.GetLogTask;
36+
import de.rwth.idsg.steve.ocpp.task.InstallCertificateTask;
3137
import de.rwth.idsg.steve.ocpp.task.RemoteStartTransactionTask;
3238
import de.rwth.idsg.steve.ocpp.task.RemoteStopTransactionTask;
3339
import de.rwth.idsg.steve.ocpp.task.ReserveNowTask;
3440
import de.rwth.idsg.steve.ocpp.task.ResetTask;
3541
import de.rwth.idsg.steve.ocpp.task.SendLocalListTask;
3642
import de.rwth.idsg.steve.ocpp.task.SetChargingProfileTask;
43+
import de.rwth.idsg.steve.ocpp.task.SignedUpdateFirmwareTask;
3744
import de.rwth.idsg.steve.ocpp.task.TriggerMessageTask;
3845
import de.rwth.idsg.steve.ocpp.task.UnlockConnectorTask;
3946
import de.rwth.idsg.steve.ocpp.task.UpdateFirmwareTask;
@@ -94,4 +101,22 @@ public interface ChargePointServiceInvoker {
94101
void getCompositeSchedule(ChargePointSelect cp, GetCompositeScheduleTask task);
95102

96103
void triggerMessage(ChargePointSelect cp, TriggerMessageTask task);
104+
105+
// -------------------------------------------------------------------------
106+
// "Improved security for OCPP 1.6-J" additions
107+
// -------------------------------------------------------------------------
108+
109+
void extendedTriggerMessage(ChargePointSelect cp, ExtendedTriggerMessageTask task);
110+
111+
void getLog(ChargePointSelect cp, GetLogTask task);
112+
113+
void signedUpdateFirmware(ChargePointSelect cp, SignedUpdateFirmwareTask task);
114+
115+
void installCertificate(ChargePointSelect cp, InstallCertificateTask task);
116+
117+
void deleteCertificate(ChargePointSelect cp, DeleteCertificateTask task);
118+
119+
void certificateSigned(ChargePointSelect cp, CertificateSignedTask task);
120+
121+
void getInstalledCertificateIds(ChargePointSelect cp, GetInstalledCertificateIdsTask task);
97122
}

src/main/java/de/rwth/idsg/steve/ocpp/ChargePointServiceInvokerImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,30 +247,37 @@ public void triggerMessage(ChargePointSelect cp, TriggerMessageTask task) {
247247
// "Improved security for OCPP 1.6-J" additions. Only for JSON
248248
// -------------------------------------------------------------------------
249249

250+
@Override
250251
public void extendedTriggerMessage(ChargePointSelect cp, ExtendedTriggerMessageTask task) {
251252
chargePointServiceJsonInvoker.runPipeline(cp, task);
252253
}
253254

255+
@Override
254256
public void getLog(ChargePointSelect cp, GetLogTask task) {
255257
chargePointServiceJsonInvoker.runPipeline(cp, task);
256258
}
257259

260+
@Override
258261
public void signedUpdateFirmware(ChargePointSelect cp, SignedUpdateFirmwareTask task) {
259262
chargePointServiceJsonInvoker.runPipeline(cp, task);
260263
}
261264

265+
@Override
262266
public void installCertificate(ChargePointSelect cp, InstallCertificateTask task) {
263267
chargePointServiceJsonInvoker.runPipeline(cp, task);
264268
}
265269

270+
@Override
266271
public void deleteCertificate(ChargePointSelect cp, DeleteCertificateTask task) {
267272
chargePointServiceJsonInvoker.runPipeline(cp, task);
268273
}
269274

275+
@Override
270276
public void certificateSigned(ChargePointSelect cp, CertificateSignedTask task) {
271277
chargePointServiceJsonInvoker.runPipeline(cp, task);
272278
}
273279

280+
@Override
274281
public void getInstalledCertificateIds(ChargePointSelect cp, GetInstalledCertificateIdsTask task) {
275282
chargePointServiceJsonInvoker.runPipeline(cp, task);
276283
}

src/main/java/de/rwth/idsg/steve/ocpp/soap/ChargePointServiceSoapInvoker.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,28 @@
2020

2121
import de.rwth.idsg.steve.ocpp.ChargePointServiceInvoker;
2222
import de.rwth.idsg.steve.ocpp.task.CancelReservationTask;
23+
import de.rwth.idsg.steve.ocpp.task.CertificateSignedTask;
2324
import de.rwth.idsg.steve.ocpp.task.ChangeAvailabilityTask;
2425
import de.rwth.idsg.steve.ocpp.task.ChangeConfigurationTask;
2526
import de.rwth.idsg.steve.ocpp.task.ClearCacheTask;
2627
import de.rwth.idsg.steve.ocpp.task.ClearChargingProfileTask;
2728
import de.rwth.idsg.steve.ocpp.task.DataTransferTask;
29+
import de.rwth.idsg.steve.ocpp.task.DeleteCertificateTask;
30+
import de.rwth.idsg.steve.ocpp.task.ExtendedTriggerMessageTask;
2831
import de.rwth.idsg.steve.ocpp.task.GetCompositeScheduleTask;
2932
import de.rwth.idsg.steve.ocpp.task.GetConfigurationTask;
3033
import de.rwth.idsg.steve.ocpp.task.GetDiagnosticsTask;
34+
import de.rwth.idsg.steve.ocpp.task.GetInstalledCertificateIdsTask;
3135
import de.rwth.idsg.steve.ocpp.task.GetLocalListVersionTask;
36+
import de.rwth.idsg.steve.ocpp.task.GetLogTask;
37+
import de.rwth.idsg.steve.ocpp.task.InstallCertificateTask;
3238
import de.rwth.idsg.steve.ocpp.task.RemoteStartTransactionTask;
3339
import de.rwth.idsg.steve.ocpp.task.RemoteStopTransactionTask;
3440
import de.rwth.idsg.steve.ocpp.task.ReserveNowTask;
3541
import de.rwth.idsg.steve.ocpp.task.ResetTask;
3642
import de.rwth.idsg.steve.ocpp.task.SendLocalListTask;
3743
import de.rwth.idsg.steve.ocpp.task.SetChargingProfileTask;
44+
import de.rwth.idsg.steve.ocpp.task.SignedUpdateFirmwareTask;
3845
import de.rwth.idsg.steve.ocpp.task.TriggerMessageTask;
3946
import de.rwth.idsg.steve.ocpp.task.UnlockConnectorTask;
4047
import de.rwth.idsg.steve.ocpp.task.UpdateFirmwareTask;
@@ -52,6 +59,7 @@ public class ChargePointServiceSoapInvoker implements ChargePointServiceInvoker
5259

5360
public static final Exception EXCEPTION_V12 = new IllegalArgumentException("This operation is not supported by this OCPP 1.2 station");
5461
public static final Exception EXCEPTION_V15 = new IllegalArgumentException("This operation is not supported by this OCPP 1.5 station");
62+
public static final Exception EXCEPTION_NO_SOAP = new IllegalArgumentException("This operation is not supported by SOAP stations");
5563

5664
private final ClientProviderWithCache<ocpp.cp._2010._08.ChargePointService> soapV12Helper;
5765
private final ClientProviderWithCache<ocpp.cp._2012._06.ChargePointService> soapV15Helper;
@@ -244,6 +252,45 @@ public void triggerMessage(ChargePointSelect cp, TriggerMessageTask task) {
244252
}
245253
}
246254

255+
// -------------------------------------------------------------------------
256+
// "Improved security for OCPP 1.6-J" additions
257+
// -------------------------------------------------------------------------
258+
259+
@Override
260+
public void extendedTriggerMessage(ChargePointSelect cp, ExtendedTriggerMessageTask task) {
261+
task.failed(cp.getChargeBoxId(), EXCEPTION_NO_SOAP);
262+
}
263+
264+
@Override
265+
public void getLog(ChargePointSelect cp, GetLogTask task) {
266+
task.failed(cp.getChargeBoxId(), EXCEPTION_NO_SOAP);
267+
}
268+
269+
@Override
270+
public void signedUpdateFirmware(ChargePointSelect cp, SignedUpdateFirmwareTask task) {
271+
task.failed(cp.getChargeBoxId(), EXCEPTION_NO_SOAP);
272+
}
273+
274+
@Override
275+
public void installCertificate(ChargePointSelect cp, InstallCertificateTask task) {
276+
task.failed(cp.getChargeBoxId(), EXCEPTION_NO_SOAP);
277+
}
278+
279+
@Override
280+
public void deleteCertificate(ChargePointSelect cp, DeleteCertificateTask task) {
281+
task.failed(cp.getChargeBoxId(), EXCEPTION_NO_SOAP);
282+
}
283+
284+
@Override
285+
public void certificateSigned(ChargePointSelect cp, CertificateSignedTask task) {
286+
task.failed(cp.getChargeBoxId(), EXCEPTION_NO_SOAP);
287+
}
288+
289+
@Override
290+
public void getInstalledCertificateIds(ChargePointSelect cp, GetInstalledCertificateIdsTask task) {
291+
task.failed(cp.getChargeBoxId(), EXCEPTION_NO_SOAP);
292+
}
293+
247294
// -------------------------------------------------------------------------
248295
// Helpers
249296
// -------------------------------------------------------------------------

0 commit comments

Comments
 (0)