2323package eu .webeid .example .service ;
2424
2525import com .fasterxml .jackson .annotation .JsonInclude ;
26- import com .fasterxml .jackson .annotation .JsonProperty ;
2726import com .fasterxml .jackson .databind .ObjectMapper ;
2827import com .fasterxml .jackson .databind .ObjectWriter ;
28+ import com .fasterxml .jackson .databind .PropertyNamingStrategies ;
29+ import com .fasterxml .jackson .databind .annotation .JsonNaming ;
2930import eu .webeid .example .config .WebEidMobileProperties ;
3031import eu .webeid .example .security .WebEidAuthentication ;
3132import eu .webeid .example .service .dto .CertificateDTO ;
3637import org .slf4j .LoggerFactory ;
3738import org .springframework .stereotype .Component ;
3839import org .springframework .web .servlet .support .ServletUriComponentsBuilder ;
40+ import org .springframework .web .util .UriComponentsBuilder ;
3941
4042import java .io .IOException ;
4143import java .security .NoSuchAlgorithmException ;
4244import java .security .cert .CertificateException ;
4345import java .util .Base64 ;
4446import java .util .List ;
47+ import java .util .Objects ;
4548
4649@ Component
4750public 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}
0 commit comments