Skip to content

Commit e540d12

Browse files
committed
Refactor initSigningRequest()
- Support both web-eid-mobile:// and https://webeid.ee as base uri - Remove origin from request object
1 parent bc92645 commit e540d12

File tree

3 files changed

+52
-45
lines changed

3 files changed

+52
-45
lines changed

example/src/main/java/eu/webeid/example/config/WebEidMobileProperties.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@
2323
package eu.webeid.example.config;
2424

2525
import jakarta.validation.constraints.NotBlank;
26+
import jakarta.validation.constraints.Pattern;
2627
import org.springframework.boot.context.properties.ConfigurationProperties;
2728
import org.springframework.validation.annotation.Validated;
2829

2930
@Validated
3031
@ConfigurationProperties(prefix = "web-eid-mobile")
3132
public record WebEidMobileProperties(
32-
@NotBlank String baseRequestUri,
33+
@NotBlank @Pattern(regexp = "^.*(?:[^/]|://)$", message = "Base URI must not have a trailing slash") String baseRequestUri,
3334
boolean requestSigningCert) {
3435
}

example/src/main/java/eu/webeid/example/service/MobileSigningService.java

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
package eu.webeid.example.service;
2424

2525
import com.fasterxml.jackson.annotation.JsonInclude;
26-
import com.fasterxml.jackson.annotation.JsonProperty;
2726
import com.fasterxml.jackson.databind.ObjectMapper;
2827
import com.fasterxml.jackson.databind.ObjectWriter;
28+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
29+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
2930
import eu.webeid.example.config.WebEidMobileProperties;
3031
import eu.webeid.example.security.WebEidAuthentication;
3132
import eu.webeid.example.service.dto.CertificateDTO;
@@ -36,12 +37,14 @@
3637
import org.slf4j.LoggerFactory;
3738
import org.springframework.stereotype.Component;
3839
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
40+
import org.springframework.web.util.UriComponentsBuilder;
3941

4042
import java.io.IOException;
4143
import java.security.NoSuchAlgorithmException;
4244
import java.security.cert.CertificateException;
4345
import java.util.Base64;
4446
import java.util.List;
47+
import java.util.Objects;
4548

4649
@Component
4750
public class MobileSigningService {
@@ -59,62 +62,63 @@ public MobileSigningService(SigningService signingService, WebEidMobilePropertie
5962
this.webEidMobileProperties = webEidMobileProperties;
6063
}
6164

62-
public MobileInitRequest initSigningRequest(WebEidAuthentication authentication) throws IOException, CertificateException, NoSuchAlgorithmException {
65+
public MobileInitRequest initCertificateOrSigningRequest(WebEidAuthentication authentication) throws IOException, CertificateException, NoSuchAlgorithmException {
6366
String signingCertificate = authentication.getSigningCertificate();
6467
List<SupportedSignatureAlgorithm> supportedSignatureAlgorithms = authentication.getSupportedSignatureAlgorithms();
6568
if (signingCertificate == null || supportedSignatureAlgorithms == null) {
66-
return initSigningRequest(authentication, null);
69+
return initCertificateRequest();
6770
}
6871
CertificateDTO certificateDTO = new CertificateDTO();
6972
certificateDTO.setCertificate(signingCertificate);
7073
certificateDTO.setSupportedSignatureAlgorithms(mapSupportedAlgorithms(supportedSignatureAlgorithms));
7174
return initSigningRequest(authentication, certificateDTO);
7275
}
7376

74-
@SuppressWarnings("javax.annotation.Tainted")
75-
public MobileInitRequest initSigningRequest(
76-
WebEidAuthentication authentication,
77-
CertificateDTO certificateDTO)
78-
throws IOException, CertificateException, NoSuchAlgorithmException {
79-
80-
final boolean isSigningFlow = certificateDTO != null;
81-
final String flowLabel = isSigningFlow ? "signing" : "certificate";
82-
LOG.info("Initiating {} request", flowLabel);
83-
84-
DigestDTO digest = null;
85-
if (isSigningFlow) {
86-
digest = signingService.prepareContainer(certificateDTO, authentication);
87-
}
88-
77+
public MobileInitRequest initSigningRequest(WebEidAuthentication authentication, CertificateDTO certificateDTO) throws IOException, CertificateException, NoSuchAlgorithmException {
78+
Objects.requireNonNull(authentication, "authentication must not be null");
79+
Objects.requireNonNull(certificateDTO, "certificateDTO must not be null");
8980
final String responseUri = ServletUriComponentsBuilder.fromCurrentContextPath()
90-
.path(isSigningFlow ? SIGNATURE_RESPONSE_PATH : CERTIFICATE_RESPONSE_PATH)
81+
.path(SIGNATURE_RESPONSE_PATH)
9182
.build()
9283
.toUriString();
93-
94-
final String origin = ServletUriComponentsBuilder.fromCurrentContextPath()
95-
.build()
96-
.toUriString()
97-
.replaceAll("/$", "");
98-
99-
final RequestObject initRequest = isSigningFlow
100-
? new RequestObject(
84+
final DigestDTO digest = signingService.prepareContainer(certificateDTO, authentication);
85+
final RequestObject initRequest = new RequestObject(
10186
responseUri,
10287
certificateDTO.getCertificate(),
10388
digest.getHash(),
104-
digest.getHashFunction(),
105-
origin)
106-
: new RequestObject(responseUri, null, null, null, origin);
89+
digest.getHashFunction());
90+
final String payloadJson = OBJECT_WRITER.writeValueAsString(initRequest);
91+
final String encoded = Base64.getUrlEncoder()
92+
.withoutPadding()
93+
.encodeToString(payloadJson.getBytes());
94+
final String requestUri = getRequestUri(WEB_EID_MOBILE_SIGN_PATH, encoded);
95+
96+
return new MobileInitRequest(requestUri);
97+
}
10798

99+
private MobileInitRequest initCertificateRequest() throws IOException {
100+
final String responseUri = ServletUriComponentsBuilder.fromCurrentContextPath()
101+
.path(CERTIFICATE_RESPONSE_PATH)
102+
.build()
103+
.toUriString();
104+
final RequestObject initRequest = new RequestObject(responseUri, null, null, null);
108105
final String payloadJson = OBJECT_WRITER.writeValueAsString(initRequest);
109106
final String encoded = Base64.getUrlEncoder()
110107
.withoutPadding()
111108
.encodeToString(payloadJson.getBytes());
109+
final String requestUri = getRequestUri(WEB_EID_GET_CERT_PATH, encoded);
112110

113-
String base = webEidMobileProperties.baseRequestUri();
114-
String path = isSigningFlow ? WEB_EID_MOBILE_SIGN_PATH : WEB_EID_GET_CERT_PATH;
115-
String deepLink = base + path + "#" + encoded;
111+
return new MobileInitRequest(requestUri);
112+
}
116113

117-
return new MobileInitRequest(deepLink);
114+
private String getRequestUri(String path, String encodedPayload) {
115+
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(webEidMobileProperties.baseRequestUri());
116+
if (webEidMobileProperties.baseRequestUri().startsWith("http")) {
117+
builder.pathSegment(path);
118+
} else {
119+
builder.host(path);
120+
}
121+
return builder.fragment(encodedPayload).toUriString();
118122
}
119123

120124
private List<SignatureAlgorithmDTO> mapSupportedAlgorithms(List<SupportedSignatureAlgorithm> algorithms) {
@@ -127,16 +131,19 @@ private List<SignatureAlgorithmDTO> mapSupportedAlgorithms(List<SupportedSignatu
127131
}).toList();
128132
}
129133

134+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
130135
public record MobileInitRequest(
131-
@JsonProperty("request_uri") String requestUri
132-
) { }
136+
String requestUri
137+
) {
138+
}
133139

140+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
134141
@JsonInclude(JsonInclude.Include.NON_NULL)
135142
record RequestObject(
136-
@JsonProperty("response_uri") String responseUri,
137-
@JsonProperty("signing_certificate") String signingCertificate,
138-
@JsonProperty("hash") String hash,
139-
@JsonProperty("hash_function") String hashFunction,
140-
@JsonProperty("origin") String origin
141-
) { }
143+
String responseUri,
144+
String signingCertificate,
145+
String hash,
146+
String hashFunction
147+
) {
148+
}
142149
}

example/src/main/java/eu/webeid/example/web/rest/SigningController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,14 @@ public FileDTO signature(@RequestBody SignatureDTO data) {
7373

7474
@PostMapping("mobile/init")
7575
public ResponseEntity<MobileInitRequest> mobileInit(WebEidAuthentication authentication) throws CertificateException, IOException, NoSuchAlgorithmException {
76-
return ResponseEntity.ok(mobileSigningService.initSigningRequest(authentication));
76+
return ResponseEntity.ok(mobileSigningService.initCertificateOrSigningRequest(authentication));
7777
}
7878

7979
@GetMapping("mobile/certificate")
8080
public ModelAndView mobileCertificateResponse() {
8181
return new ModelAndView("webeid-callback");
8282
}
8383

84-
@SuppressWarnings("javax.annotation.Tainted")
8584
@PostMapping("mobile/certificate")
8685
public ResponseEntity<MobileInitRequest> mobileCertificate(@RequestBody CertificateDTO certificateDTO, WebEidAuthentication authentication) throws CertificateException, IOException, NoSuchAlgorithmException {
8786
return ResponseEntity.ok(mobileSigningService.initSigningRequest(authentication, certificateDTO));

0 commit comments

Comments
 (0)