Skip to content

Commit adecca0

Browse files
committed
Extract test utility object Helpers
1 parent 8e6cddc commit adecca0

File tree

5 files changed

+101
-153
lines changed

5 files changed

+101
-153
lines changed

webauthn-server-attestation/src/test/scala/com/yubico/webauthn/attestation/DeviceIdentificationSpec.scala

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,17 @@
2525
package com.yubico.webauthn.attestation
2626

2727
import java.util.Collections
28-
import java.util.Optional
2928

30-
import com.yubico.internal.util.scala.JavaConverters._
3129
import com.yubico.internal.util.CertificateParser
3230
import com.yubico.internal.util.JacksonCodecs
3331
import com.yubico.webauthn.attestation.resolver.SimpleAttestationResolver
3432
import com.yubico.webauthn.attestation.resolver.SimpleTrustResolver
3533
import com.yubico.webauthn.test.RealExamples
36-
import com.yubico.webauthn.CredentialRepository
37-
import com.yubico.webauthn.RelyingParty
38-
import com.yubico.webauthn.data.ByteArray
39-
import com.yubico.webauthn.data.PublicKeyCredentialDescriptor
4034
import com.yubico.webauthn.FinishRegistrationOptions
41-
import com.yubico.webauthn.RegisteredCredential
35+
import com.yubico.webauthn.RelyingParty
4236
import com.yubico.webauthn.data.PublicKeyCredentialCreationOptions
4337
import com.yubico.webauthn.data.PublicKeyCredentialParameters
38+
import com.yubico.webauthn.test.Helpers
4439
import org.junit.runner.RunWith
4540
import org.scalatest.FunSpec
4641
import org.scalatest.Matchers
@@ -59,21 +54,13 @@ class DeviceIdentificationSpec extends FunSpec with Matchers {
5954
)
6055
}
6156

62-
private val emptyCredentialRepository = new CredentialRepository {
63-
override def getCredentialIdsForUsername(username: String): java.util.Set[PublicKeyCredentialDescriptor] = Set.empty.asJava
64-
override def getUserHandleForUsername(username: String): Optional[ByteArray] = None.asJava
65-
override def getUsernameForUserHandle(userHandle: ByteArray): Optional[String] = None.asJava
66-
override def lookup(credentialId: ByteArray, userHandle: ByteArray): Optional[RegisteredCredential] = None.asJava
67-
override def lookupAll(credentialId: ByteArray): java.util.Set[RegisteredCredential] = Set.empty.asJava
68-
}
69-
7057
describe("A RelyingParty with the default StandardMetadataService") {
7158

7259
describe("correctly identifies") {
7360
def check(expectedName: String, testData: RealExamples.Example) {
7461
val rp = RelyingParty.builder()
7562
.identity(testData.rp)
76-
.credentialRepository(emptyCredentialRepository)
63+
.credentialRepository(Helpers.CredentialRepository.empty)
7764
.metadataService(new StandardMetadataService())
7865
.build()
7966

webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyAssertionSpec.scala

Lines changed: 10 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import com.yubico.webauthn.data.UserIdentity
5151
import com.yubico.webauthn.data.UserVerificationRequirement
5252
import com.yubico.webauthn.exception.InvalidSignatureCountException
5353
import com.yubico.webauthn.extension.appid.AppId
54+
import com.yubico.webauthn.test.Helpers
5455
import com.yubico.webauthn.test.Util.toStepWithUtilities
5556
import org.junit.runner.RunWith
5657
import org.scalacheck.Gen
@@ -73,14 +74,6 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
7374
private def sha256(bytes: ByteArray): ByteArray = crypto.hash(bytes)
7475
private def sha256(data: String): ByteArray = sha256(new ByteArray(data.getBytes(Charset.forName("UTF-8"))))
7576

76-
private val emptyCredentialRepository = new CredentialRepository {
77-
override def getCredentialIdsForUsername(username: String): java.util.Set[PublicKeyCredentialDescriptor] = Set.empty.asJava
78-
override def getUserHandleForUsername(username: String): Optional[ByteArray] = None.asJava
79-
override def getUsernameForUserHandle(userHandle: ByteArray): Optional[String] = None.asJava
80-
override def lookup(credentialId: ByteArray, userHandle: ByteArray): Optional[RegisteredCredential] = None.asJava
81-
override def lookupAll(credentialId: ByteArray): java.util.Set[RegisteredCredential] = Set.empty.asJava
82-
}
83-
8477
private object Defaults {
8578

8679
val rpId = RelyingPartyIdentity.builder().id("localhost").name("Test party").build()
@@ -123,29 +116,6 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
123116

124117
private def getPublicKeyBytes(credentialKey: KeyPair): ByteArray = WebAuthnTestCodecs.ecPublicKeyToCose(credentialKey.getPublic.asInstanceOf[ECPublicKey])
125118

126-
private def credRepoWithUser(user: UserIdentity, credential: RegisteredCredential): CredentialRepository = new CredentialRepository {
127-
override def getCredentialIdsForUsername(username: String): java.util.Set[PublicKeyCredentialDescriptor] =
128-
if (username == user.getName)
129-
Set(PublicKeyCredentialDescriptor.builder().id(credential.getCredentialId).build()).asJava
130-
else Set.empty.asJava
131-
override def getUserHandleForUsername(username: String): Optional[ByteArray] =
132-
if (username == user.getName)
133-
Some(user.getId).asJava
134-
else None.asJava
135-
override def getUsernameForUserHandle(userHandle: ByteArray): Optional[String] =
136-
if (userHandle == user.getId)
137-
Some(user.getName).asJava
138-
else None.asJava
139-
override def lookup(credentialId: ByteArray, userHandle: ByteArray): Optional[RegisteredCredential] =
140-
if (credentialId == credential.getCredentialId && userHandle == user.getId)
141-
Some(credential).asJava
142-
else None.asJava
143-
override def lookupAll(credentialId: ByteArray): java.util.Set[RegisteredCredential] =
144-
if (credentialId == credential.getCredentialId)
145-
Set(credential).asJava
146-
else Set.empty.asJava
147-
}
148-
149119
def finishAssertion(
150120
allowCredentials: Option[java.util.List[PublicKeyCredentialDescriptor]] = Some(List(PublicKeyCredentialDescriptor.builder().id(Defaults.credentialId).build()).asJava),
151121
allowOriginPort: Boolean = false,
@@ -242,7 +212,7 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
242212
it(s"If the parameter is not set, or set to empty, the default of ${default} is used.") {
243213
val rp = RelyingParty.builder()
244214
.identity(Defaults.rpId)
245-
.credentialRepository(emptyCredentialRepository)
215+
.credentialRepository(Helpers.CredentialRepository.empty)
246216
.build()
247217
val request1 = rp.startAssertion(StartAssertionOptions.builder().build())
248218
val request2 = rp.startAssertion(StartAssertionOptions.builder().userVerification(Optional.empty[UserVerificationRequirement]).build())
@@ -254,7 +224,7 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
254224
it(s"If the parameter is set, that value is used.") {
255225
val rp = RelyingParty.builder()
256226
.identity(Defaults.rpId)
257-
.credentialRepository(emptyCredentialRepository)
227+
.credentialRepository(Helpers.CredentialRepository.empty)
258228
.build()
259229

260230
forAll { uv: UserVerificationRequirement =>
@@ -397,7 +367,7 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
397367
describe("3. Using credential’s id attribute (or the corresponding rawId, if base64url encoding is inappropriate for your use case), look up the corresponding credential public key.") {
398368
it("Fails if the credential ID is unknown.") {
399369
val steps = finishAssertion(
400-
credentialRepository = Some(emptyCredentialRepository)
370+
credentialRepository = Some(Helpers.CredentialRepository.empty)
401371
)
402372
val step: steps.Step3 = new steps.Step3(Defaults.username, Defaults.userHandle, Nil.asJava)
403373

@@ -408,7 +378,7 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
408378

409379
it("Succeeds if the credential ID is known.") {
410380
val steps = finishAssertion(
411-
credentialRepository = Some(credRepoWithUser(
381+
credentialRepository = Some(Helpers.CredentialRepository.withUser(
412382
Defaults.user,
413383
RegisteredCredential.builder()
414384
.credentialId(Defaults.credentialId)
@@ -1144,7 +1114,7 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
11441114
describe("17. If the signature counter value authData.signCount is nonzero or the value stored in conjunction with credential’s id attribute is nonzero, then run the following sub-step:") {
11451115
describe("If the signature counter value authData.signCount is") {
11461116
def credentialRepository(signatureCount: Long) =
1147-
credRepoWithUser(
1117+
Helpers.CredentialRepository.withUser(
11481118
Defaults.user,
11491119
RegisteredCredential.builder()
11501120
.credentialId(Defaults.credentialId)
@@ -1304,7 +1274,7 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
13041274
new TypeReference[PublicKeyCredential[AuthenticatorAssertionResponse, ClientAssertionExtensionOutputs]](){}
13051275
)
13061276

1307-
val credRepo = credRepoWithUser(
1277+
val credRepo = Helpers.CredentialRepository.withUser(
13081278
testData.userId,
13091279
RegisteredCredential.builder()
13101280
.credentialId(testData.response.getId)
@@ -1413,7 +1383,7 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
14131383
val credId: ByteArray = credData.getCredentialId
14141384
val publicKeyBytes: ByteArray = credData.getCredentialPublicKey
14151385

1416-
val credRepo = credRepoWithUser(
1386+
val credRepo = Helpers.CredentialRepository.withUser(
14171387
registrationRequest.getUser,
14181388
RegisteredCredential.builder()
14191389
.credentialId(registrationResponse.getId)
@@ -1448,7 +1418,7 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
14481418

14491419
val rp = RelyingParty.builder()
14501420
.identity(RelyingPartyIdentity.builder().id("localhost").name("Test RP").build())
1451-
.credentialRepository(credRepoWithUser(registrationTestData.userId, RegisteredCredential.builder()
1421+
.credentialRepository(Helpers.CredentialRepository.withUser(registrationTestData.userId, RegisteredCredential.builder()
14521422
.credentialId(registrationTestData.response.getId)
14531423
.userHandle(registrationTestData.userId.getId)
14541424
.publicKeyCose(registrationTestData.response.getResponse.getParsedAuthenticatorData.getAttestedCredentialData.get.getCredentialPublicKey)
@@ -1474,7 +1444,7 @@ class RelyingPartyAssertionSpec extends FunSpec with Matchers with GeneratorDriv
14741444

14751445
val rp = RelyingParty.builder()
14761446
.identity(RelyingPartyIdentity.builder().id("localhost").name("Test RP").build())
1477-
.credentialRepository(credRepoWithUser(registrationTestData.userId, RegisteredCredential.builder()
1447+
.credentialRepository(Helpers.CredentialRepository.withUser(registrationTestData.userId, RegisteredCredential.builder()
14781448
.credentialId(registrationTestData.response.getId)
14791449
.userHandle(registrationTestData.userId.getId)
14801450
.publicKeyCose(registrationTestData.response.getResponse.getParsedAuthenticatorData.getAttestedCredentialData.get.getCredentialPublicKey)

webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyCeremoniesSpec.scala

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,11 @@
2424

2525
package com.yubico.webauthn
2626

27-
import java.util.Optional
28-
29-
import com.yubico.internal.util.scala.JavaConverters._
30-
import com.yubico.webauthn.data.ByteArray
3127
import com.yubico.webauthn.data.PublicKeyCredentialCreationOptions
3228
import com.yubico.webauthn.data.PublicKeyCredentialDescriptor
3329
import com.yubico.webauthn.data.PublicKeyCredentialParameters
3430
import com.yubico.webauthn.data.PublicKeyCredentialRequestOptions
31+
import com.yubico.webauthn.test.Helpers
3532
import com.yubico.webauthn.test.RealExamples
3633
import org.junit.runner.RunWith
3734
import org.scalatest.FunSpec
@@ -50,46 +47,11 @@ class RelyingPartyCeremoniesSpec extends FunSpec with Matchers {
5047
.credentialRepository(credentialRepo)
5148
.build()
5249

53-
private val emptyCredentialRepository = new CredentialRepository {
54-
override def getCredentialIdsForUsername(username: String): java.util.Set[PublicKeyCredentialDescriptor] = Set.empty.asJava
55-
override def getUserHandleForUsername(username: String): Optional[ByteArray] = None.asJava
56-
override def getUsernameForUserHandle(userHandle: ByteArray): Optional[String] = None.asJava
57-
override def lookup(credentialId: ByteArray, userHandle: ByteArray): Optional[RegisteredCredential] = None.asJava
58-
override def lookupAll(credentialId: ByteArray): java.util.Set[RegisteredCredential] = Set.empty.asJava
59-
}
60-
61-
private def credentialRepoWithUser(testData: RealExamples.Example, reg: RegistrationResult): CredentialRepository = new CredentialRepository {
62-
override def getCredentialIdsForUsername(username: String): java.util.Set[PublicKeyCredentialDescriptor] =
63-
if (username == testData.user.getName)
64-
Set(PublicKeyCredentialDescriptor.builder().id(reg.getKeyId.getId).build()).asJava
65-
else Set.empty.asJava
66-
override def getUserHandleForUsername(username: String): Optional[ByteArray] =
67-
if (username == testData.user.getName)
68-
Some(testData.user.getId).asJava
69-
else None.asJava
70-
override def getUsernameForUserHandle(userHandle: ByteArray): Optional[String] =
71-
if (userHandle == testData.user.getId)
72-
Some(testData.user.getName).asJava
73-
else None.asJava
74-
override def lookup(credentialId: ByteArray, userHandle: ByteArray): Optional[RegisteredCredential] =
75-
if (credentialId == reg.getKeyId.getId && userHandle == testData.user.getId)
76-
Some(RegisteredCredential.builder()
77-
.credentialId(reg.getKeyId.getId)
78-
.userHandle(testData.user.getId)
79-
.publicKeyCose(reg.getPublicKeyCose)
80-
.build()).asJava
81-
else None.asJava
82-
override def lookupAll(credentialId: ByteArray): java.util.Set[RegisteredCredential] =
83-
if (credentialId == reg.getKeyId.getId)
84-
Set(lookup(credentialId, testData.user.getId).get()).asJava
85-
else Set.empty.asJava
86-
}
87-
8850
describe("The default RelyingParty settings") {
8951

9052
describe("can register and then authenticate") {
9153
def check(testData: RealExamples.Example) {
92-
val registrationRp = newRp(testData, emptyCredentialRepository)
54+
val registrationRp = newRp(testData, Helpers.CredentialRepository.empty)
9355

9456
val registrationResult = registrationRp.finishRegistration(FinishRegistrationOptions.builder()
9557
.request(PublicKeyCredentialCreationOptions.builder()
@@ -105,7 +67,13 @@ class RelyingPartyCeremoniesSpec extends FunSpec with Matchers {
10567
registrationResult.isAttestationTrusted should be (false)
10668
registrationResult.getAttestationMetadata.isPresent should be (false)
10769

108-
val assertionRp = newRp(testData, credentialRepoWithUser(testData, registrationResult))
70+
val assertionRp = newRp(
71+
testData,
72+
Helpers.CredentialRepository.withUser(
73+
testData.user,
74+
Helpers.toRegisteredCredential(testData.user, registrationResult)
75+
)
76+
)
10977

11078
val assertionResult = assertionRp.finishAssertion(FinishAssertionOptions.builder()
11179
.request(AssertionRequest.builder()

0 commit comments

Comments
 (0)