25
25
package com .yubico .webauthn .data
26
26
27
27
import com .fasterxml .jackson .core .`type` .TypeReference
28
+ import com .fasterxml .jackson .databind .JsonNode
28
29
import com .fasterxml .jackson .databind .ObjectMapper
29
30
import com .fasterxml .jackson .databind .exc .ValueInstantiationException
30
31
import com .fasterxml .jackson .databind .json .JsonMapper
31
32
import com .fasterxml .jackson .databind .node .BooleanNode
33
+ import com .fasterxml .jackson .databind .node .JsonNodeFactory
32
34
import com .fasterxml .jackson .databind .node .ObjectNode
33
35
import com .fasterxml .jackson .databind .node .TextNode
34
36
import com .fasterxml .jackson .datatype .jdk8 .Jdk8Module
@@ -44,6 +46,7 @@ import com.yubico.webauthn.extension.appid.Generators._
44
46
import org .junit .runner .RunWith
45
47
import org .scalacheck .Arbitrary
46
48
import org .scalacheck .Arbitrary .arbitrary
49
+ import org .scalacheck .Gen
47
50
import org .scalatest .funspec .AnyFunSpec
48
51
import org .scalatest .matchers .should .Matchers
49
52
import org .scalatestplus .junit .JUnitRunner
@@ -62,6 +65,7 @@ class JsonIoSpec
62
65
.builder()
63
66
.addModule(new Jdk8Module ())
64
67
.build()
68
+ val jf : JsonNodeFactory = JsonNodeFactory .instance
65
69
66
70
describe(" The class" ) {
67
71
@@ -392,6 +396,44 @@ class JsonIoSpec
392
396
]]() {}
393
397
)
394
398
}
399
+
400
+ describe(""" tolerates and ignores the "response" sub-attribute:""" ) {
401
+ def test [T <: JsonNode ](attrName : String , genAttrValue : Gen [T ]): Unit = {
402
+ type P = PublicKeyCredential [
403
+ AuthenticatorAttestationResponse ,
404
+ ClientRegistrationExtensionOutputs ,
405
+ ]
406
+ it(s " ${attrName}. " ) {
407
+ forAll(
408
+ arbitrary[P ],
409
+ genAttrValue,
410
+ ) { (value : P , attrValue : T ) =>
411
+ val tree : ObjectNode = json.valueToTree(value)
412
+ tree
413
+ .get(" response" )
414
+ .asInstanceOf [ObjectNode ]
415
+ .set(attrName, attrValue)
416
+ val encoded = json.writeValueAsString(tree)
417
+ val decoded =
418
+ PublicKeyCredential .parseRegistrationResponseJson(encoded)
419
+ val recoded : ObjectNode = json.valueToTree[ObjectNode ](decoded)
420
+ recoded.has(attrName) should be(false )
421
+ }
422
+ }
423
+ }
424
+
425
+ test(
426
+ " publicKeyAlgorithm" ,
427
+ arbitraryCOSEAlgorithmIdentifier.arbitrary.map(i =>
428
+ jf.numberNode(i.getId)
429
+ ),
430
+ )
431
+
432
+ test(
433
+ " publicKey" ,
434
+ arbitrary[String ].map(new TextNode (_)),
435
+ )
436
+ }
395
437
}
396
438
397
439
describe(" The function PublicKeyCredential.parseAssertionResponseJson" ) {
0 commit comments