Skip to content

Commit 4822f5a

Browse files
committed
fix: add wasm-unsafe-eval to CSP for cap-widget WebAssembly, handle passkey autofill without sessionToken
1 parent 6d22f87 commit 4822f5a

2 files changed

Lines changed: 25 additions & 9 deletions

File tree

routes/passkeys.js

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -225,17 +225,33 @@ router.post('/passkeys/login/complete', passkeyLoginLimiter, async (req, res) =>
225225
if (!response) {
226226
return res.status(400).json({ error: 'Response is required' });
227227
}
228-
if (!sessionToken) {
229-
return res.status(400).json({ error: 'Session token is required' });
230-
}
231228

232-
const stored = challengeMap.get(`login:${sessionToken}`);
233-
if (!stored) {
234-
return res.status(400).json({ error: 'No login in progress. Please try again.' });
229+
let stored;
230+
if (sessionToken) {
231+
stored = challengeMap.get(`login:${sessionToken}`);
232+
if (!stored) {
233+
return res.status(400).json({ error: 'No login in progress. Please try again.' });
234+
}
235+
challengeMap.delete(`login:${sessionToken}`);
236+
} else {
237+
// Autofill / conditional mediation flow: look up challenge from clientDataJSON
238+
try {
239+
const challengeFromResponse = JSON.parse(isoBase64URL.toUTF8String(response.response.clientDataJSON)).challenge;
240+
for (const [key, entry] of challengeMap) {
241+
if (key.startsWith('login:') && entry.challenge === challengeFromResponse) {
242+
stored = entry;
243+
challengeMap.delete(key);
244+
break;
245+
}
246+
}
247+
} catch {
248+
return res.status(400).json({ error: 'No login in progress. Please try again.' });
249+
}
250+
if (!stored) {
251+
return res.status(400).json({ error: 'No login in progress. Please try again.' });
252+
}
235253
}
236254

237-
challengeMap.delete(`login:${sessionToken}`);
238-
239255
const passkeys = await query(
240256
'SELECT id, credential_id, public_key, counter, transports, user_id FROM passkeys WHERE credential_id = ?',
241257
[response.id]

server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ app.use(helmet({
9090
contentSecurityPolicy: {
9191
directives: {
9292
defaultSrc: ["'self'"],
93-
scriptSrc: ["'self'", "'unsafe-inline'", "https://cdn.jsdelivr.net", "https://unpkg.com", "https://static.cloudflareinsights.com"],
93+
scriptSrc: ["'self'", "'unsafe-inline'", "'wasm-unsafe-eval'", "https://cdn.jsdelivr.net", "https://unpkg.com", "https://static.cloudflareinsights.com"],
9494
scriptSrcAttr: ["'unsafe-inline'"],
9595
styleSrc: ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com", "https://cdn.jsdelivr.net"],
9696
fontSrc: ["'self'", "https://fonts.gstatic.com", "https://cdn.jsdelivr.net"],

0 commit comments

Comments
 (0)