diff --git a/doc/chat_audit_findings.txt b/doc/chat_audit_findings.txt index 2e7ae172..e6a5fa32 100644 --- a/doc/chat_audit_findings.txt +++ b/doc/chat_audit_findings.txt @@ -1388,3 +1388,48 @@ chat_member/radio,avatar,channel/admin/services/member_files network,JOIN, attachment,feedback/poll. Desktop/APK build и JVM155/155 (31 suite) PASS; GUI/Android audio12/12 PASS:/tmp/chat-member-final-{desktop-build,android-build, gui-results}.log. chat_member.h отмечен[V];core/headless и весь chat/ продолжаются. + +JSON-интроспекция — 27.10.2026,после774fb66b + +Точный negative control:/tmp/chat-json-negative.log. Допустимое подписанное +имя канала с ASCII01 возвращалось channels_json без полного escaping: +json_valid=0,ожидаемое падение нового test_chat_json. Старый channels writer +также увеличивал указатель по неограниченному snprintf-return;нулевой/малый +буфер не проверялся. Старые listing игнорировали ряд bind/step/finalize и +могли вернуть успешный префикс при отказе вложенного чтения/последующих строк. + +Channels/members теперь строят checked strbuf с общим полным JSON escaping, +копируют результат после завершения всех SELECT и проверки caller capacity. +Messages проверяет оба bind,step/finalize и арифметику оставшегося буфера; +ошибка очищает prefix. Все API сбрасывают out_len0,очищают допустимый buf, +отклоняют неверный context/канал/offset/размер и не пишут при capacity0. +Профильные TEXT читаются без сужения/потери hidden NUL;неверные key/address +типы/размеры отклоняются. Messages сериализует поля SQLite json_object. +Полные имена/8192-byte adm_tags не обрезаются;IPv6 форматирует inet_ntop, +protocol6 показывается TCP+REALITY. Deleted-member показывается offline. + +После собственного commit канала runtime может быть отложен. Channels_json +проверяет наличие history-таблицы и показывает committed канал с msgs0, +не создавая таблицы во время чтения. Прочие SQL-ошибки count/peers/addresses +возвращаются как ошибки чтения,а не нулевые счётчики. Caller-транзакция не +завершается при успешном/неуспешном listing. Header/CLI контракт уточнён. +Бинарный snapshot member.h явно отделён от расширенной JSON-интроспекции. + +Новый test_chat_json:36 prepare/bind/step/finalize/text/strbuf-отказов с +успешными повторами,включая SQL-ошибку после полностью сериализованной строки; +проверяются out_len0/пустой output и неизменность total_changes. Нулевые, +малые,ровно-недостаточные и ровно-достаточные capacity защищены canaries. +Проверен roundtrip каждого ASCII-control1..31,UTF-8/quotes/backslash, +255-байтового имени с расширением escaping,8192-byte tags,IPv4/IPv6/REALITY. +Hidden NUL,неверные размеры/типы ключей/адресов и неканонический stored ID +отклонены без усечения;caller txn сохраняется. Настоящий отказ u_calloc +db_sync_instance_add после commit оставляет новый канал видимым с msgs0; +ensure_channel_ready повторно активирует runtime. Allocation balance восстановлен. +PASS:/tmp/chat-json-final-unit.log. До расширения matrix native5/5 PASS: +/tmp/chat-json-first-{test,adapter,schema,poll,services}.log. Общая проверка +runtime29e15254/testcb0b71ae выполняется отдельно;весь chat_core/chat/ ещё частичен. + +Чтобы повторные проверки не заполнили tmpfs,завершённые собственные fixture +utun-channel-create/utun-member-sql перенесены в +/home/user/.cache/utun-audit/completed-fixtures;прежние пути сохранены symlink. +Недоступные каталоги root не трогались;чужие артефакты не удалялись. diff --git a/doc/tasks.md b/doc/tasks.md index 72ac1898..279dab17 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,16 @@ ## Текущие задачи +[+] **chat_core JSON: полное escaping и атомарный результат чтения** — 27.10.2026. + Подтверждён невалидный JSON для допустимого подписанного имени с ASCII01. Channels/members используют + checked strbuf и полное escaping;все listing проверяют SQL-этапы,включая bind/finalize/вложенные запросы. + Отказ оставляет out_len=0 и пустой допустимый buffer;нулевой/точный размер не повреждает canaries. + Скрытый NUL/неверный тип/размер полей отклоняются. Committed-канал без history-таблицы виден с msgs=0; + чтение не меняет БД и не завершает транзакцию caller. Новая test_chat_json:36 отказов с повторами, + ошибка после готовой строки,все ASCII controls,UTF-8/длинные имена/8192-byte tags,IPv4/IPv6/REALITY, + повреждённые строки и настоящая deferred activation/retry PASS. Общие результаты — в отчёте. + Подробнее:[chat_audit_findings.txt](chat_audit_findings.txt),«JSON-интроспекция». + [+] **chat_member/status: полный снимок,границы формата и committed mute** — 27.10.2026. Подтверждён ложный успех снимка после finalize error;теперь SQL/память не дают частичный список. Список ограничен65535 записями,сортируется qsort (online,unsigned node_id);строки wire дополняются NUL. diff --git a/tools/chatcli_commands.txt b/tools/chatcli_commands.txt index 66d2e5ff..e0ceba9b 100644 --- a/tools/chatcli_commands.txt +++ b/tools/chatcli_commands.txt @@ -35,12 +35,15 @@ status channels Список всех каналов с метаданными: id, имя, owner, число мемберов, число сообщений, сколько онлайн. + Уже сохранённый канал с отложенной подготовкой истории виден с msgs=0. Пример: chatcli channels members Список участников канала с полным состоянием: node_id, имя, online, connected, публичные ключи (x25519/ed25519 hex), адреса (ip, port, proto, rtt). + proto: UDP, TCP или TCP+REALITY; deleted-участник показывается offline. + Строки возвращаются целиком с JSON escaping;ошибка SQL/размера не даёт частичный успешный список. Пример: chatcli members 12345 messages [count]