Repository navigation
fix(approver): фраза підтвердження Touch ID читається з /dev/tty без EAGAIN - #67
Merged
Merged
Conversation
… not from stdin Node's stdin tty stream reopens fd 0 non-blocking, so readSync(process.stdin.fd) failed with EAGAIN before the person typed "add touchid" / "remove touchid". The phrase is now read from a fresh /dev/tty open (its own blocking file description); process.stdin is never touched. The TTY check stays and uses tty.isatty(0) and tty.isatty(1); a missing controlling terminal is refused as HUMAN_CONFIRMATION_REQUIRED. Exact phrase match and the 64-character bound are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…; correct phrase at end of input still confirms Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Що змінилося
Після цієї зміни фразу підтвердження
add touchid/remove touchidможна ввести в інтерактивному терміналі. Раніше команда падала ще до того, як людина встигала щось надрукувати.Причина.
confirmRegistrationуsrc/approver-setup.mjsчитала фразу черезreadSync(process.stdin.fd). Коли код звертається доprocess.stdin, Node створює tty-потік: libuv заново відкриває термінал на дескрипторі 0 у неблокуючому режимі. Через цеreadSyncодразу кидавEAGAIN(відтворено на Node 22.14 у трьох терміналах, зокрема в Terminal.app).Виправлення.
/dev/tty. Його відкриваєguardedOpenSync('/dev/tty', 'r'), тобто через ту саму межуpersistence.mjs, яку перевіряєcheck:persistence-writes.process.stdinкод більше не чіпає.EAGAINчерезAtomics.wait: такий варіант і далі читав би спільний із Node дескриптор 0 і опитував би його в циклі. Причина залишилася б, змінився б лише симптом.Межі не послаблені.
tty.isatty(0) && tty.isatty(1). Це номери дескрипторів, тому неблокуючий потік не вмикається./dev/ttyне відкривається), команда відмовляє з тим самим кодомHUMAN_CONFIRMATION_REQUIRED.isatty. Після читання він закривається уfinally.\r. Як і раніше, точна фраза, після якої введення закінчується без переводу рядка, вважається підтвердженням. Це зафіксовано тестом як незмінна поведінка./dev/tty), а не з того термінала, яким є дескриптор 0. В обох випадках це термінал, де сидить людина, і зміна в межах моделі загроз D-0392.script,expectчи підстановок pty.Окремим комітом перезакріплено артефакт Core у реєстрі (
registry/catalog.source.json,catalog.json,SHA256SUMS). Без цього не проходить перевірка закріпленого артефакту: зараз вона червона і наmain(«Core artifact does not match catalog pin»).Тести
readSyncна дескрипторі 0 кидаєEAGAIN, а фраза приходить через/dev/tty. Тест перевіряє, що підтвердження проходить,stdinне читається жодного разу, а дескриптор термінала закривається.src/approver-setup.mjsізmain: 13 з 14 падають зEAGAINабо на новій перевірці відсутнього/dev/tty. Тобто вони справді ловлять цю помилку.remove:yes, порожнє введення, пробіл у кінці, пробіл на початку, інший регістр, фраза іншої операції (add touchid), задовга фраза, правильна фраза після 65 символів сміття. Усі варіанти відмовляють, допоміжна програма не викликається, дескриптор термінала закривається.isattyповертає false для stdin або лише для stdout, команда відмовляє, а/dev/ttyнавіть не відкривається. Спроба передати фразу через pipe у CLI так само відмовляє.ENXIO) даєHUMAN_CONFIRMATION_REQUIRED.check:persistence-writesіnpm run test:package, включно з точним закріпленням артефакту.Ручна перевірка в справжньому псевдотерміналі (лише локально, не в продукті)
pty.fork.confirmRegistration.process.stdin.fd, щоб відтворити умову помилки.add touchid\nEAGAINдо введенняyes\nHUMAN_CONFIRMATION_REQUIRED(не підтверджено)HUMAN_CONFIRMATION_REQUIREDecho add touchid |(без TTY)HUMAN_CONFIRMATION_REQUIRED(потрібен інтерактивний TTY)Справжній Touch ID не викликався, у
~/.q-coreнічого не реєструвалося: до і після перевірки цієї теки не існувало.removeчерез псевдотермінал не запускався, його покривають модульні тести.🤖 Generated with Claude Code