Skip to content

Commit 60bebd1

Browse files
Add more missing mixins and deserializers
1 parent ad6379d commit 60bebd1

26 files changed

+324
-238
lines changed

web/src/main/java/org/springframework/security/web/webauthn/api/AuthenticatorTransport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public static AuthenticatorTransport valueOf(String value) {
112112
}
113113

114114
public static AuthenticatorTransport[] values() {
115-
return new AuthenticatorTransport[] { USB, NFC, BLE, HYBRID, INTERNAL };
115+
return new AuthenticatorTransport[] { USB, NFC, BLE, SMART_CARD, HYBRID, INTERNAL };
116116
}
117117

118118
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ class AuthenticationExtensionsClientInputDeserializer extends StdDeserializer<Au
3939
}
4040

4141
@Override
42-
public AuthenticationExtensionsClientInput deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException {
43-
while (parser.nextToken() != JsonToken.END_OBJECT) {
42+
public AuthenticationExtensionsClientInput deserialize(JsonParser parser, DeserializationContext ctxt)
43+
throws IOException {
44+
if (parser.nextToken() != JsonToken.END_OBJECT) {
4445
String extensionId = parser.currentName();
4546
Object value = parser.readValueAs(Object.class);
4647
return new ImmutableAuthenticationExtensionsClientInput(extensionId, value);
4748
}
48-
4949
return null;
5050
}
5151
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,7 @@
2626

2727
import java.io.IOException;
2828
import java.util.ArrayList;
29-
import java.util.HashMap;
3029
import java.util.List;
31-
import java.util.Map;
3230

3331
/**
3432
* Jackson deserializer for {@link AuthenticationExtensionsClientInputs}
@@ -44,12 +42,13 @@ class AuthenticationExtensionsClientInputsDeserializer extends StdDeserializer<A
4442
}
4543

4644
@Override
47-
public AuthenticationExtensionsClientInputs deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
45+
public AuthenticationExtensionsClientInputs deserialize(JsonParser parser, DeserializationContext ctxt)
46+
throws IOException {
4847
final AuthenticationExtensionsClientInputDeserializer authenticationExtensionsClientInputDeserializer = new AuthenticationExtensionsClientInputDeserializer();
4948

5049
final List<AuthenticationExtensionsClientInput> extensions = new ArrayList<>();
51-
while (p.nextToken() != JsonToken.END_OBJECT) {
52-
extensions.add(authenticationExtensionsClientInputDeserializer.deserialize(p, ctxt));
50+
while (parser.nextToken() != JsonToken.END_OBJECT) {
51+
extensions.add(authenticationExtensionsClientInputDeserializer.deserialize(parser, ctxt));
5352
}
5453
return new ImmutableAuthenticationExtensionsClientInputs(extensions);
5554
}

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

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

19-
import com.fasterxml.jackson.core.JacksonException;
2019
import com.fasterxml.jackson.core.JsonParser;
2120
import com.fasterxml.jackson.core.JsonToken;
2221
import com.fasterxml.jackson.databind.DeserializationContext;
@@ -44,18 +43,17 @@ class AuthenticatorSelectionCriteriaDeserializer extends StdDeserializer<Authent
4443
}
4544

4645
@Override
47-
public AuthenticatorSelectionCriteria deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException {
46+
public AuthenticatorSelectionCriteria deserialize(JsonParser parser, DeserializationContext ctxt)
47+
throws IOException {
4848
final AuthenticatorSelectionCriteriaBuilder builder = AuthenticatorSelectionCriteria.builder();
4949
while (parser.nextToken() != JsonToken.END_OBJECT) {
5050
final String fieldName = parser.currentName();
51+
parser.nextToken();
5152
if ("authenticatorAttachment".equals(fieldName)) {
52-
parser.nextToken(); // Move to value
5353
builder.authenticatorAttachment(AuthenticatorAttachment.valueOf(parser.getText()));
5454
} else if ("residentKey".equals(fieldName)) {
55-
parser.nextToken(); // Move to value
5655
builder.residentKey(ResidentKeyRequirement.valueOf(parser.getText()));
5756
} else if ("userVerification".equals(fieldName)) {
58-
parser.nextToken(); // Move to value
5957
builder.userVerification(UserVerificationRequirement.valueOf(parser.getText()));
6058
} else {
6159
throw new IOException("Unsupported field name: " + fieldName);

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import com.fasterxml.jackson.databind.SerializerProvider;
2121
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
2222
import org.springframework.security.web.webauthn.api.AuthenticatorSelectionCriteria;
23-
import org.springframework.security.web.webauthn.api.AuthenticatorTransport;
2423

2524
import java.io.IOException;
2625

@@ -29,7 +28,7 @@
2928
*
3029
* @author Rob Winch
3130
* @author Justin Cranford
32-
* @since 6.5
31+
* @since 6.4
3332
*/
3433
@SuppressWarnings("serial")
3534
class AuthenticatorSelectionCriteriaSerializer extends StdSerializer<AuthenticatorSelectionCriteria> {
@@ -42,12 +41,18 @@ class AuthenticatorSelectionCriteriaSerializer extends StdSerializer<Authenticat
4241
public void serialize(AuthenticatorSelectionCriteria value, JsonGenerator gen, SerializerProvider provider)
4342
throws IOException {
4443
gen.writeStartObject();
45-
gen.writeFieldName("authenticatorAttachment");
46-
gen.writeString(value.getAuthenticatorAttachment().getValue());
47-
gen.writeFieldName("residentKey");
48-
gen.writeString(value.getResidentKey().getValue());
49-
gen.writeFieldName("userVerification");
50-
gen.writeString(value.getUserVerification().getValue());
44+
if (value.getAuthenticatorAttachment() != null) {
45+
gen.writeFieldName("authenticatorAttachment");
46+
gen.writeString(value.getAuthenticatorAttachment().getValue());
47+
}
48+
if (value.getResidentKey() != null) {
49+
gen.writeFieldName("residentKey");
50+
gen.writeString(value.getResidentKey().getValue());
51+
}
52+
if (value.getUserVerification() != null) {
53+
gen.writeFieldName("userVerification");
54+
gen.writeString(value.getUserVerification().getValue());
55+
}
5156
gen.writeEndObject();
5257
}
5358

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

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,18 @@
1616

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

19-
import java.io.IOException;
20-
21-
import com.fasterxml.jackson.core.JacksonException;
2219
import com.fasterxml.jackson.core.JsonParser;
2320
import com.fasterxml.jackson.databind.DeserializationContext;
2421
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
25-
2622
import org.springframework.security.web.webauthn.api.AuthenticatorTransport;
2723

24+
import java.io.IOException;
25+
2826
/**
2927
* Jackson deserializer for {@link AuthenticatorTransport}
3028
*
3129
* @author Rob Winch
30+
* @author Justin Cranford
3231
* @since 6.4
3332
*/
3433
@SuppressWarnings("serial")
@@ -40,14 +39,9 @@ class AuthenticatorTransportDeserializer extends StdDeserializer<AuthenticatorTr
4039

4140
@Override
4241
public AuthenticatorTransport deserialize(JsonParser parser, DeserializationContext ctxt)
43-
throws IOException, JacksonException {
42+
throws IOException {
4443
String transportValue = parser.readValueAs(String.class);
45-
for (AuthenticatorTransport transport : AuthenticatorTransport.values()) {
46-
if (transport.getValue().equals(transportValue)) {
47-
return transport;
48-
}
49-
}
50-
return null;
44+
return AuthenticatorTransport.valueOf(transportValue);
5145
}
5246

5347
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
* @author Rob Winch
3131
* @since 6.4
3232
*/
33+
@SuppressWarnings("serial")
3334
class AuthenticatorTransportSerializer extends JsonSerializer<AuthenticatorTransport> {
3435

3536
@Override

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

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,18 @@
1616

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

19-
import java.io.IOException;
20-
21-
import com.fasterxml.jackson.core.JacksonException;
2219
import com.fasterxml.jackson.core.JsonParser;
2320
import com.fasterxml.jackson.databind.DeserializationContext;
2421
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
25-
2622
import org.springframework.security.web.webauthn.api.COSEAlgorithmIdentifier;
2723

24+
import java.io.IOException;
25+
2826
/**
2927
* Jackson serializer for {@link COSEAlgorithmIdentifier}
3028
*
3129
* @author Rob Winch
30+
* @author Justin Cranford
3231
* @since 6.4
3332
*/
3433
@SuppressWarnings("serial")
@@ -40,14 +39,9 @@ class COSEAlgorithmIdentifierDeserializer extends StdDeserializer<COSEAlgorithmI
4039

4140
@Override
4241
public COSEAlgorithmIdentifier deserialize(JsonParser parser, DeserializationContext ctxt)
43-
throws IOException, JacksonException {
42+
throws IOException {
4443
Long transportValue = parser.readValueAs(Long.class);
45-
for (COSEAlgorithmIdentifier identifier : COSEAlgorithmIdentifier.values()) {
46-
if (identifier.getValue() == transportValue.longValue()) {
47-
return identifier;
48-
}
49-
}
50-
return null;
44+
return COSEAlgorithmIdentifier.valueOf(transportValue);
5145
}
5246

5347
}
Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,32 @@
1717
package org.springframework.security.web.webauthn.jackson;
1818

1919
import java.io.IOException;
20+
import java.time.Duration;
2021

21-
import com.fasterxml.jackson.core.JacksonException;
2222
import com.fasterxml.jackson.core.JsonParser;
2323
import com.fasterxml.jackson.databind.DeserializationContext;
2424
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
2525

26-
import org.springframework.security.web.webauthn.api.PublicKeyCredentialType;
27-
2826
/**
29-
* Jackson deserializer for {@link PublicKeyCredentialType}
27+
* Jackson deserializer for {@link Duration}
3028
*
31-
* @author Rob Winch
32-
* @since 6.4
29+
* @author Justin Cranford
30+
* @since 6.5
3331
*/
3432
@SuppressWarnings("serial")
35-
class PublicKeyCredentialTypeDeserializer extends StdDeserializer<PublicKeyCredentialType> {
33+
class DurationDeserializer extends StdDeserializer<Duration> {
3634

3735
/**
38-
* Creates a new instance.
36+
* Creates an instance.
3937
*/
40-
PublicKeyCredentialTypeDeserializer() {
41-
super(PublicKeyCredentialType.class);
38+
DurationDeserializer() {
39+
super(Duration.class);
4240
}
4341

4442
@Override
45-
public PublicKeyCredentialType deserialize(JsonParser parser, DeserializationContext ctxt)
46-
throws IOException, JacksonException {
47-
String type = parser.readValueAs(String.class);
48-
return PublicKeyCredentialType.valueOf(type);
43+
public Duration deserialize(JsonParser parser, DeserializationContext ctxt)
44+
throws IOException {
45+
long millis = parser.getLongValue();
46+
return Duration.ofMillis(millis);
4947
}
50-
5148
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import com.fasterxml.jackson.annotation.JsonCreator;
2020
import com.fasterxml.jackson.annotation.JsonProperty;
21+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
22+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
2123
import org.springframework.security.web.webauthn.api.AttestationConveyancePreference;
2224
import org.springframework.security.web.webauthn.api.AuthenticationExtensionsClientInputs;
2325
import org.springframework.security.web.webauthn.api.AuthenticatorSelectionCriteria;
@@ -38,14 +40,14 @@
3840
* @author Justin Cranford
3941
* @since 6.4
4042
*/
41-
public abstract class PublicKeyCredentialCreationOptionsMixin {
43+
abstract class PublicKeyCredentialCreationOptionsMixin {
4244
@JsonCreator
4345
public PublicKeyCredentialCreationOptionsMixin(
4446
@JsonProperty("rp") PublicKeyCredentialRpEntity rp,
4547
@JsonProperty("user") PublicKeyCredentialUserEntity user,
4648
@JsonProperty("challenge") Bytes challenge,
4749
@JsonProperty("pubKeyCredParams") List<PublicKeyCredentialParameters> pubKeyCredParams,
48-
@JsonProperty("timeout") Duration timeout,
50+
@JsonProperty("timeout") @JsonSerialize(using=DurationSerializer.class) @JsonDeserialize(using=DurationDeserializer.class) Duration timeout,
4951
@JsonProperty("excludeCredentials") List<PublicKeyCredentialDescriptor> excludeCredentials,
5052
@JsonProperty("authenticatorSelection") AuthenticatorSelectionCriteria authenticatorSelection,
5153
@JsonProperty("attestation") AttestationConveyancePreference attestation,

0 commit comments

Comments
 (0)