fix: TOTP/HOTP の otpauth URI で発行者名・アカウント未入力時の fallback を廃止 - #429
Conversation
旧実装は `issuer.trim() || 'MyApp'` / `accountLabel.trim() || 'user@example.com'` で空入力時に fallback を埋めて URI を完成形で表示していたため、ユーザーが 入力忘れに気付かずコピーすると認証アプリで「MyApp / user@example.com」として 登録される事故が起き得た。 - 両方が入力されるまで URI 生成を抑止し空文字列を返す - 未入力時は OutputField 下に案内テキスト「発行者名とアカウントを両方入力すると otpauth URI が生成されます。」を表示 - E2E 修正: 「発行者名・アカウント両方入力時のみ URI 生成」陰性対照に置き換え、 さらに「fallback で MyApp / user@example.com を埋めない」陽性対照を追加。 旧実装に当てれば fallback 文字列を検知して fail する設計 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
🖼️ Visual Regression Test 結果
|
レビュー — 多角的評価✅ 良い点修正の正しさ
コードドキュメント
テスト
セキュリティ
🟡 改善提案1. ヒントメッセージが誤誘導する条件分岐(中優先度){!otpauthUri && secretBase32.trim() && !issuerHasColon && (
<p className="caption text-muted">
発行者名とアカウントを両方入力すると otpauth URI が生成されます。
</p>
)}
つまり「invalid Base32 を入力した状態で issuer/account も空」のケースで、ユーザーが issuer/account を埋めても URI が生成されず、ヒントメッセージは消えない → 「両方入力したのになぜ?」と詰まる可能性。 修正案(条件を narrowing): {secretBytes && !issuerHasColon && !(mode === 'hotp' && counterError) && (!issuer.trim() || !accountLabel.trim()) && (
<p className="caption text-muted">
発行者名とアカウントを両方入力すると otpauth URI が生成されます。
</p>
)}ポイント:
または 2. SR 通知が無い(低優先度)ヒント <p className="caption text-muted" role="status">
発行者名とアカウントを両方入力すると otpauth URI が生成されます。
</p>ただし入力中も毎 keystroke で発火する懸念があるなら 🟢 任意(スコープ外候補)
CI 状況test ✅ / visual-regression ✅ / cleanup ✅ / e2e ⏳ pending(3 + 1pending) VRT baseline 差分はヒントメッセージ追加に伴う意図的な可視変更で 結論Approve 相当(軽い修正リクエストあり)。bug 修正自体は正しいが、指摘 1(ヒントメッセージの誤誘導条件)は同 PR で巻き取り推奨(条件 1 行の narrowing で fix 可能)。指摘 2 は本 PR か follow-up 化かは判断にお任せ。 |
- 指摘 1: ヒントメッセージ条件を narrowing。旧 `!otpauthUri` 条件だと invalid Base32 入力 / HOTP counter エラー時にも「発行者名とアカウントを両方入力すると」 が出てしまい、user は issuer/account を埋めても URI 生成されず混乱する状態 だった。`secretBytes && !issuerHasColon && !(mode === 'hotp' && counterError) && (issuer 空 || account 空)` で意図ケースのみ表示するよう narrowing - 指摘 2: ヒント <p> に `role="status"` を付与。SR / 音声制御利用者にも 表示・非表示の遷移時に announce される - E2E 陽性対照追加: 無効 Base32 入力時にヒントが表示されないことを assert (旧条件に当てると fail する設計) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
レビューありがとうございます。指摘 1・2 を本 PR で巻き取りました(commit 0a7f054)。任意項目(account の colon 検証)は本 PR スコープ外として見送ります。
陽性対照 E2E も追加: 無効 Base32 入力時にヒントが表示されないことを assert(旧 動作確認
|
再レビュー(commit 0a7f054)両指摘の対応 + 追加陽性対照テストを確認しました。
追加観点
CI 状況test ✅ / e2e ⏳ pending / visual-regression ⏳ pending(1 pass、2 pending) 結論LGTM。指摘事項は全件解消、narrowing の陽性対照まで追加されており質的にむしろ前進。新規懸念なし、CI(e2e / VRT)green 確認後に merge 可能状態です。 |
概要
TOTP/HOTP ツールで発行者名・アカウントが未入力のとき、otpauth URI に
MyApp/user@example.comを fallback で埋めてしまう UX バグを修正します。問題
otpauthUriのuseMemoで:placeholder と同じ文字列が実 URI に書き込まれるため、ユーザーが入力忘れに気付かずコピー → 認証アプリで「
MyApp/user@example.com」として登録されると、複数アカウントを並べたときに本人のどのサービスか判別不能になります。修正
!issuer.trim() || !accountLabel.trim()で early return)テスト
MyApp/user@example.comが含まれない動作確認
node_modules/.bin/astro check— 0 errorsnpm run test:e2e --grep TOTP— 15 passed🤖 Generated with Claude Code