diff --git a/package-lock.json b/package-lock.json index bff40f5f8..4ad715a1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12187,6 +12187,12 @@ "version": "2.0.0", "license": "MIT" }, + "node_modules/detectincognitojs": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/detectincognitojs/-/detectincognitojs-1.3.7.tgz", + "integrity": "sha512-8Z90m1utiUMr0hz0eYqg1x0P5uM6hSqGe0TdLtZGunDEptoaoYmcWKbk2qmAezilErNbY9hmqcdNIYooUc925w==", + "license": "MIT" + }, "node_modules/devtools-protocol": { "version": "0.0.1107588", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz", @@ -26976,7 +26982,7 @@ "version": "0.5.0", "license": "ISC", "dependencies": { - "@corbado/connect-react": "^0.2.4-alpha.0", + "@corbado/connect-react": "^0.8.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -26991,23 +26997,6 @@ "react-i18next": "13.2.2" } }, - "packages/connect-web-js/node_modules/@corbado/connect-react": { - "version": "0.2.4-alpha.0", - "resolved": "https://registry.npmjs.org/@corbado/connect-react/-/connect-react-0.2.4-alpha.0.tgz", - "integrity": "sha512-uLakbrU2sC2EvUz6yCTvqcHZCt6n8kvlH/irJvISIdYRlmGzA80Y4qDLMAWMQw8MZuLg9E2aw3ekicxHDTd83w==", - "license": "ISC", - "dependencies": { - "@corbado/web-core": "^2.13.0", - "date-fns": "^3.6.0", - "i18next": "23.5.1", - "i18next-browser-languagedetector": "7.1.0", - "react-i18next": "13.2.2" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, "packages/react": { "name": "@corbado/react", "version": "2.18.0", @@ -27076,6 +27065,7 @@ "@corbado/webauthn-json": "^2.1.2", "@fingerprintjs/fingerprintjs": "^3.4.2", "axios": "^1.7.4", + "detectincognitojs": "^1.3.7", "loglevel": "^1.8.1", "rxjs": "^7.8.1", "ts-results": "^3.3.0" @@ -27360,6 +27350,126 @@ "devDependencies": { "dotenv-webpack": "^8.0.1" } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", + "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", + "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", + "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", + "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", + "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", + "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", + "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", + "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } } } diff --git a/packages/web-core/openapi/spec_v2.yaml b/packages/web-core/openapi/spec_v2.yaml index d61284b47..2070a34b9 100644 --- a/packages/web-core/openapi/spec_v2.yaml +++ b/packages/web-core/openapi/spec_v2.yaml @@ -1847,6 +1847,8 @@ components: type: boolean webdriver: type: boolean + privateMode: + type: boolean clientCapabilities: type: object diff --git a/packages/web-core/package.json b/packages/web-core/package.json index 78040eefa..6a2619ec8 100644 --- a/packages/web-core/package.json +++ b/packages/web-core/package.json @@ -37,6 +37,7 @@ "@corbado/webauthn-json": "^2.1.2", "@fingerprintjs/fingerprintjs": "^3.4.2", "axios": "^1.7.4", + "detectincognitojs": "^1.3.7", "loglevel": "^1.8.1", "rxjs": "^7.8.1", "ts-results": "^3.3.0" diff --git a/packages/web-core/src/api/v2/api.ts b/packages/web-core/src/api/v2/api.ts index 1dd1b1d4e..d03143340 100644 --- a/packages/web-core/src/api/v2/api.ts +++ b/packages/web-core/src/api/v2/api.ts @@ -240,6 +240,12 @@ export interface ClientInformation { * @memberof ClientInformation */ 'webdriver'?: boolean; + /** + * + * @type {boolean} + * @memberof ClientInformation + */ + 'privateMode'?: boolean; } /** * diff --git a/packages/web-core/src/services/WebAuthnService.ts b/packages/web-core/src/services/WebAuthnService.ts index 95cdc41ba..84edac1ae 100644 --- a/packages/web-core/src/services/WebAuthnService.ts +++ b/packages/web-core/src/services/WebAuthnService.ts @@ -4,6 +4,7 @@ import type { ClientCapabilities } from '@corbado/types'; import type { CredentialRequestOptionsJSON } from '@corbado/webauthn-json'; import { create, get } from '@corbado/webauthn-json'; import FingerprintJS from '@fingerprintjs/fingerprintjs'; +import { detectIncognito } from 'detectincognitojs'; import log from 'loglevel'; import type { Result } from 'ts-results'; import { Err, Ok } from 'ts-results'; @@ -101,6 +102,7 @@ export class WebAuthnService { javaScriptHighEntropy: javaScriptHighEntropy, clientCapabilities, webdriver: WebAuthnService.getWebdriver(), + privateMode: await WebAuthnService.isPrivateMode(), }; } @@ -130,6 +132,15 @@ export class WebAuthnService { } } + static async isPrivateMode(): Promise { + try { + const res = await detectIncognito(); + return res.isPrivate; + } catch (e) { + return; + } + } + static async canUseBluetooth(): Promise { try { return await navigator.bluetooth.getAvailability();