Skip to content

Commit f5a9326

Browse files
Add more missing mixins and deserializers
1 parent 6a3c8e4 commit f5a9326

9 files changed

+94
-191
lines changed

web/src/main/java/org/springframework/security/web/webauthn/jackson/PublicKeyCredentialCreationOptionsMixin.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,21 @@
3535
* Jackson mixin for {@link PublicKeyCredentialCreationOptions}
3636
*
3737
* @author Rob Winch
38+
* @author Justin Cranford
3839
* @since 6.4
3940
*/
4041
public abstract class PublicKeyCredentialCreationOptionsMixin {
4142
@JsonCreator
4243
public PublicKeyCredentialCreationOptionsMixin(
43-
@JsonProperty("rp") PublicKeyCredentialRpEntity rp,
44-
@JsonProperty("user") PublicKeyCredentialUserEntity user,
45-
@JsonProperty("challenge") Bytes challenge,
46-
@JsonProperty("pubKeyCredParams") List<PublicKeyCredentialParameters> pubKeyCredParams,
47-
@JsonProperty("timeout") Duration timeout,
48-
@JsonProperty("excludeCredentials") List<PublicKeyCredentialDescriptor> excludeCredentials,
49-
@JsonProperty("authenticatorSelection") AuthenticatorSelectionCriteria authenticatorSelection,
50-
@JsonProperty("attestation") AttestationConveyancePreference attestation,
51-
@JsonProperty("extensions") AuthenticationExtensionsClientInputs extensions
44+
@JsonProperty("rp") PublicKeyCredentialRpEntity rp,
45+
@JsonProperty("user") PublicKeyCredentialUserEntity user,
46+
@JsonProperty("challenge") Bytes challenge,
47+
@JsonProperty("pubKeyCredParams") List<PublicKeyCredentialParameters> pubKeyCredParams,
48+
@JsonProperty("timeout") Duration timeout,
49+
@JsonProperty("excludeCredentials") List<PublicKeyCredentialDescriptor> excludeCredentials,
50+
@JsonProperty("authenticatorSelection") AuthenticatorSelectionCriteria authenticatorSelection,
51+
@JsonProperty("attestation") AttestationConveyancePreference attestation,
52+
@JsonProperty("extensions") AuthenticationExtensionsClientInputs extensions
5253
) {
5354
}
5455
}

web/src/main/java/org/springframework/security/web/webauthn/jackson/PublicKeyCredentialRequestOptionsDeserializer.java

Lines changed: 0 additions & 83 deletions
This file was deleted.

web/src/main/java/org/springframework/security/web/webauthn/jackson/PublicKeyCredentialRequestOptionsMixin.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,16 @@
1616

1717
package org.springframework.security.web.webauthn.jackson;
1818

19-
import com.fasterxml.jackson.annotation.JsonInclude;
20-
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
21-
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
19+
import com.fasterxml.jackson.annotation.JsonCreator;
20+
import com.fasterxml.jackson.annotation.JsonProperty;
21+
import org.springframework.security.web.webauthn.api.AuthenticationExtensionsClientInputs;
22+
import org.springframework.security.web.webauthn.api.Bytes;
23+
import org.springframework.security.web.webauthn.api.PublicKeyCredentialDescriptor;
2224
import org.springframework.security.web.webauthn.api.PublicKeyCredentialRequestOptions;
25+
import org.springframework.security.web.webauthn.api.UserVerificationRequirement;
26+
27+
import java.time.Duration;
28+
import java.util.List;
2329

2430
/**
2531
* Jackson mixin for {@link PublicKeyCredentialRequestOptions}
@@ -28,8 +34,15 @@
2834
* @author Justin Cranford
2935
* @since 6.4
3036
*/
31-
@JsonSerialize(using = PublicKeyCredentialRequestOptionsSerializer.class)
32-
@JsonDeserialize(using = PublicKeyCredentialRequestOptionsDeserializer.class)
33-
@JsonInclude(content = JsonInclude.Include.NON_NULL)
3437
class PublicKeyCredentialRequestOptionsMixin {
38+
@JsonCreator
39+
public PublicKeyCredentialRequestOptionsMixin(
40+
@JsonProperty("challenge") Bytes challenge,
41+
@JsonProperty("timeout") Duration timeout,
42+
@JsonProperty("rpId") String rpId,
43+
@JsonProperty("allowCredentials") List<PublicKeyCredentialDescriptor> allowCredentials,
44+
@JsonProperty("userVerification") UserVerificationRequirement userVerification,
45+
@JsonProperty("extensions") AuthenticationExtensionsClientInputs extensions
46+
) {
47+
}
3548
}

web/src/main/java/org/springframework/security/web/webauthn/jackson/PublicKeyCredentialRequestOptionsSerializer.java

Lines changed: 0 additions & 61 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.springframework.security.web.webauthn.jackson;
2+
3+
import org.springframework.security.web.webauthn.api.AuthenticationExtensionsClientInput;
4+
5+
// ImmutableAuthenticationExtensionsClientInputs wraps a List<AuthenticationExtensionsClientInput<T>>.
6+
// Since only CredProtectAuthenticationExtensionsClientInput implements AuthenticationExtensionsClientInput<T>,
7+
// a second class is needed to help test with two extensions.
8+
/**
9+
* Implements <a href=
10+
* "https://fidoalliance.org/specs/fido-v2.2-rd-20230321/fido-client-to-authenticator-protocol-v2.2-rd-20230321.html#sctn-minpinlength-extension">
11+
* Minimum PIN Length Extension (minPinLength)</a>.
12+
*
13+
* @author Justin Cranford
14+
* @since 6.5
15+
*/
16+
record MinPinLengthAuthenticationExtensionsClientInput(Boolean getInput) implements AuthenticationExtensionsClientInput<Boolean> {
17+
@Override
18+
public String getExtensionId() {
19+
return "minPinLength";
20+
}
21+
}

web/src/test/java/org/springframework/security/web/webauthn/jackson/PublicKeyCredentialCreationOptionsGivens.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.springframework.security.web.webauthn.jackson;
22

33
import org.springframework.security.web.webauthn.api.AttestationConveyancePreference;
4-
import org.springframework.security.web.webauthn.api.AuthenticationExtensionsClientInput;
54
import org.springframework.security.web.webauthn.api.AuthenticatorAttachment;
65
import org.springframework.security.web.webauthn.api.AuthenticatorSelectionCriteria;
76
import org.springframework.security.web.webauthn.api.AuthenticatorTransport;
@@ -111,22 +110,4 @@ public static PublicKeyCredentialCreationOptions create() {
111110
)
112111
.build();
113112
}
114-
115-
// ImmutableAuthenticationExtensionsClientInputs wraps a List<AuthenticationExtensionsClientInput<T>>.
116-
// Since only CredProtectAuthenticationExtensionsClientInput implements AuthenticationExtensionsClientInput<T>,
117-
// a second class is needed to help test with two extensions.
118-
/**
119-
* Implements <a href=
120-
* "https://fidoalliance.org/specs/fido-v2.2-rd-20230321/fido-client-to-authenticator-protocol-v2.2-rd-20230321.html#sctn-minpinlength-extension">
121-
* Minimum PIN Length Extension (minPinLength)</a>.
122-
*
123-
* @author Justin Cranford
124-
* @since 6.5
125-
*/
126-
record MinPinLengthAuthenticationExtensionsClientInput(Boolean getInput) implements AuthenticationExtensionsClientInput<Boolean> {
127-
@Override
128-
public String getExtensionId() {
129-
return "minPinLength";
130-
}
131-
}
132113
}

web/src/test/java/org/springframework/security/web/webauthn/jackson/PublicKeyCredentialCreationOptionsTests.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,11 @@
1616

1717
package org.springframework.security.web.webauthn.jackson;
1818

19-
import com.fasterxml.jackson.databind.DeserializationFeature;
2019
import com.fasterxml.jackson.databind.ObjectMapper;
2120
import com.fasterxml.jackson.databind.SerializationFeature;
2221
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
2322
import org.junit.jupiter.api.BeforeEach;
2423
import org.junit.jupiter.api.Test;
25-
import org.springframework.security.web.webauthn.api.ImmutablePublicKeyCredentialUserEntity;
2624
import org.springframework.security.web.webauthn.api.PublicKeyCredentialCreationOptions;
2725

2826
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@@ -41,27 +39,23 @@ class PublicKeyCredentialCreationOptionsTests {
4139
void setup() {
4240
this.mapper = new ObjectMapper();
4341
this.mapper.enable(SerializationFeature.INDENT_OUTPUT);
44-
// this.mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
4542
this.mapper.registerModule(new WebauthnJackson2Module());
46-
// this.mapper.addMixin(PublicKeyCredentialRequestOptions.class, PublicKeyCredentialRequestOptionsMixin.class);
47-
// this.mapper.addMixin(ImmutableAuthenticationExtensionsClientInputs.class, AuthenticationExtensionsClientInputsMixin.class);
48-
// this.mapper.addMixin(AuthenticationExtensionsClientInputs.class, AuthenticationExtensionsClientInputsMixin.class);
49-
// this.mapper.addMixin(AuthenticationExtensionsClientInput.class, AuthenticationExtensionsClientInputMixin.class);
50-
// this.mapper.addMixin(PublicKeyCredentialDescriptor.class, PublicKeyCredentialDescriptorMixin.class);
51-
// this.mapper.addMixin(CredProtectAuthenticationExtensionsClientInput.class, CredProtectAuthenticationExtensionsClientInputMixin.class);
52-
// this.mapper.addMixin(CredProtect.class, CredProtectMixin.class);
5343
this.mapper.registerModule(new JavaTimeModule());
5444
}
5545

5646
@Test
5747
public void testSerializeDeserialize() {
5848
final PublicKeyCredentialCreationOptions given = PublicKeyCredentialCreationOptionsGivens.create();
49+
5950
final String serialized = assertDoesNotThrow(() -> this.mapper.writeValueAsString(given));
6051
System.out.println("serialized:\n" + serialized + "\n\n");
52+
6153
final PublicKeyCredentialCreationOptions deserialized = assertDoesNotThrow(() -> this.mapper.readValue(serialized, PublicKeyCredentialCreationOptions.class));
6254
System.out.println("deserialized:\n" + deserialized + "\n\n");
55+
6356
final String serializedAgain = assertDoesNotThrow(() -> this.mapper.writeValueAsString(deserialized));
6457
System.out.println("serializedAgain:\n" + serializedAgain + "\n\n");
58+
6559
assertEquals(serialized, serializedAgain);
6660
}
6761
}

web/src/test/java/org/springframework/security/web/webauthn/jackson/PublicKeyCredentialRequestOptionsGivens.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.util.Set;
1717

1818
/**
19-
* Object for {@code PublicKeyCredentialRequestOptionsHelper}
19+
* Object for {@code PublicKeyCredentialRequestOptions}
2020
*
2121
* @author Justin Cranford
2222
* @since 6.5
@@ -34,14 +34,40 @@ public static PublicKeyCredentialRequestOptions create() {
3434
PublicKeyCredentialDescriptor.builder()
3535
.id(Bytes.random())
3636
.type(PublicKeyCredentialType.PUBLIC_KEY)
37-
.transports(Set.of(AuthenticatorTransport.INTERNAL, AuthenticatorTransport.HYBRID))
37+
.transports(Set.of(AuthenticatorTransport.USB))
38+
.build(),
39+
PublicKeyCredentialDescriptor.builder()
40+
.id(Bytes.random())
41+
.type(PublicKeyCredentialType.PUBLIC_KEY)
42+
.transports(Set.of(AuthenticatorTransport.NFC))
43+
.build(),
44+
PublicKeyCredentialDescriptor.builder()
45+
.id(Bytes.random())
46+
.type(PublicKeyCredentialType.PUBLIC_KEY)
47+
.transports(Set.of(AuthenticatorTransport.BLE))
48+
.build(),
49+
PublicKeyCredentialDescriptor.builder()
50+
.id(Bytes.random())
51+
.type(PublicKeyCredentialType.PUBLIC_KEY)
52+
.transports(Set.of(AuthenticatorTransport.SMART_CARD))
53+
.build(),
54+
PublicKeyCredentialDescriptor.builder()
55+
.id(Bytes.random())
56+
.type(PublicKeyCredentialType.PUBLIC_KEY)
57+
.transports(Set.of(AuthenticatorTransport.HYBRID))
58+
.build(),
59+
PublicKeyCredentialDescriptor.builder()
60+
.id(Bytes.random())
61+
.type(PublicKeyCredentialType.PUBLIC_KEY)
62+
.transports(Set.of(AuthenticatorTransport.INTERNAL))
3863
.build()
3964
)
4065
)
4166
.userVerification(UserVerificationRequirement.PREFERRED)
4267
.extensions(
4368
new ImmutableAuthenticationExtensionsClientInputs(
44-
new CredProtectAuthenticationExtensionsClientInput(new CredProtect(ProtectionPolicy.USER_VERIFICATION_REQUIRED, true))
69+
new CredProtectAuthenticationExtensionsClientInput(new CredProtect(ProtectionPolicy.USER_VERIFICATION_REQUIRED, true)),
70+
new MinPinLengthAuthenticationExtensionsClientInput(true)
4571
)
4672
)
4773
.build();

0 commit comments

Comments
 (0)