From d66925d6f6b706d4c8f024481953f5e09f8e2b0f Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Wed, 27 Apr 2022 09:24:20 -0700 Subject: Add "cable" support --- packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'packages/browser/src') diff --git a/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts b/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts index 8fad78b..127713a 100644 --- a/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts +++ b/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts @@ -10,5 +10,11 @@ export default function toPublicKeyCredentialDescriptor( return { ...descriptor, id: base64URLStringToBuffer(id), + /** + * `descriptor.transports` is an array of our `AuthenticatorTransport` that includes newer + * transports that TypeScript's DOM lib is ignorant of. Convince TS that our list of transports + * are fine to pass to WebAuthn since browsers will recognize the new value. + */ + transports: descriptor.transports as AuthenticatorTransport[], }; } -- cgit v1.2.3 From a40c03ec385a4cdf63a2c25a60b4ca726a30d301 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Wed, 27 Apr 2022 09:39:44 -0700 Subject: Add tests for new transport --- .../browser/src/methods/startAuthentication.test.ts | 17 +++++++++++++++++ packages/browser/src/methods/startRegistration.test.ts | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) (limited to 'packages/browser/src') diff --git a/packages/browser/src/methods/startAuthentication.test.ts b/packages/browser/src/methods/startAuthentication.test.ts index 725cd4e..658b67c 100644 --- a/packages/browser/src/methods/startAuthentication.test.ts +++ b/packages/browser/src/methods/startAuthentication.test.ts @@ -202,6 +202,23 @@ test('should include extension results when no extensions specified', async () = expect(response.clientExtensionResults).toEqual({}); }); +test('should support "cable" transport', async () => { + const opts: PublicKeyCredentialRequestOptionsJSON = { + ...goodOpts1, + allowCredentials: [ + { + ...goodOpts1.allowCredentials![0], + transports: ["cable"], + }, + ] + }; + + await startAuthentication(opts); + + expect(mockNavigatorGet.mock.calls[0][0].publicKey.allowCredentials[0].transports[0]) + .toEqual("cable"); +}); + describe('WebAuthnError', () => { describe('AbortError', () => { const AbortError = generateCustomError('AbortError'); diff --git a/packages/browser/src/methods/startRegistration.test.ts b/packages/browser/src/methods/startRegistration.test.ts index 360884e..d8d34aa 100644 --- a/packages/browser/src/methods/startRegistration.test.ts +++ b/packages/browser/src/methods/startRegistration.test.ts @@ -176,6 +176,23 @@ test('should include extension results when no extensions specified', async () = expect(response.clientExtensionResults).toEqual({}); }); +test('should support "cable" transport', async () => { + const opts: PublicKeyCredentialCreationOptionsJSON = { + ...goodOpts1, + excludeCredentials: [ + { + ...goodOpts1.excludeCredentials![0], + transports: ["cable"], + }, + ] + }; + + await startRegistration(opts); + + expect(mockNavigatorCreate.mock.calls[0][0].publicKey.excludeCredentials[0].transports[0]) + .toEqual("cable"); +}); + describe('WebAuthnError', () => { describe('AbortError', () => { const AbortError = generateCustomError('AbortError'); -- cgit v1.2.3 From 02396a1789fbcae2145e607d8f808f6268a759a2 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Wed, 27 Apr 2022 22:08:32 -0700 Subject: Add a test for returning "cable" from response --- .../browser/src/methods/startRegistration.test.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'packages/browser/src') diff --git a/packages/browser/src/methods/startRegistration.test.ts b/packages/browser/src/methods/startRegistration.test.ts index d8d34aa..fcd4a2c 100644 --- a/packages/browser/src/methods/startRegistration.test.ts +++ b/packages/browser/src/methods/startRegistration.test.ts @@ -176,7 +176,7 @@ test('should include extension results when no extensions specified', async () = expect(response.clientExtensionResults).toEqual({}); }); -test('should support "cable" transport', async () => { +test('should support "cable" transport in excludeCredentials', async () => { const opts: PublicKeyCredentialCreationOptionsJSON = { ...goodOpts1, excludeCredentials: [ @@ -193,6 +193,24 @@ test('should support "cable" transport', async () => { .toEqual("cable"); }); +test('should return "cable" transport from response', async () => { + mockNavigatorCreate.mockResolvedValue({ + id: 'foobar', + rawId: utf8StringToBuffer('foobar'), + response: { + attestationObject: Buffer.from(mockAttestationObject, 'ascii'), + clientDataJSON: Buffer.from(mockClientDataJSON, 'ascii'), + getTransports: () => (["cable"]), + }, + getClientExtensionResults: () => ({}), + type: 'webauthn.create', + }); + + const response = await startRegistration(goodOpts1); + + expect(response.transports).toEqual(["cable"]); +}); + describe('WebAuthnError', () => { describe('AbortError', () => { const AbortError = generateCustomError('AbortError'); -- cgit v1.2.3