From 8f83167c0f47becb4154b6e39111bdf15d736ab4 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 6 Oct 2026 12:58:00 +0200 Subject: [PATCH] Forward full join profiles and document canonical profile lengths --- doc/member_files.txt | 2 ++ src/chat/chat_join.c | 11 +++++++---- src/chat/member_sync_doc.md | 6 +++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/doc/member_files.txt b/doc/member_files.txt index fba60dbe..0fc12609 100644 --- a/doc/member_files.txt +++ b/doc/member_files.txt @@ -317,6 +317,8 @@ AvatarManager общий для списка участников и сообщ test_avatars проверяет нормализацию, хеш/размеры, очистку temp, настоящее storage в двух каналах, публикацию, сохранение при смене имени, DM-кеш, restart без сети, автоматический download после потери кеша и удаление ссылок. test_member_adapter +Проверяет также max_bytes до открытия local temp и смену аватарки при задержанном +download старой версии: поздний результат не заменяет новый рисунок. проверяет подписанные профили 191/255/256/512/1023/1024 байт вместе с adm_tags до 8192. Категория media=debug показывает discovery, cache hit/eviction, направление, group/owner/server/hash, ошибки проверки и retry; media=info — передачи/публикации. diff --git a/src/chat/chat_join.c b/src/chat/chat_join.c index e67091e8..6f44a967 100644 --- a/src/chat/chat_join.c +++ b/src/chat/chat_join.c @@ -424,7 +424,7 @@ int chat_join_forward_request(struct UTUN_INSTANCE* inst, uint64_t channel_id, const struct join_member_data* m) { if (!inst || !m || inviter_id == 0) return -1; - uint8_t mbuf[512]; size_t mlen = 0; + uint8_t mbuf[MS_USERINFO_MAX + 256]; size_t mlen = 0; if (chat_join_serialize_member(m, mbuf, sizeof(mbuf), &mlen) != 0) { DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: forward serialize failed", CJ_ID); return -1; @@ -432,15 +432,18 @@ int chat_join_forward_request(struct UTUN_INSTANCE* inst, uint64_t channel_id, size_t plen = 1 + 8 + mlen; uint8_t* payload = u_malloc(plen); - if (!payload) return -1; + if (!payload) { DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: forward payload allocation failed bytes=%zu", CJ_ID, plen); return -1; } payload[0] = JOIN_SUBCMD_REQUEST_FWD; memcpy(payload + 1, &join_key, 8); memcpy(payload + 1 + 8, mbuf, mlen); struct ll_entry* entry = queue_entry_new(0); - if (!entry) { u_free(payload); return -1; } + if (!entry) { DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: forward entry allocation failed", CJ_ID); u_free(payload); return -1; } entry->dgram = u_malloc(1 + plen); - if (!entry->dgram) { u_free(payload); queue_entry_free(entry); return -1; } + if (!entry->dgram) { + DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: forward datagram allocation failed bytes=%zu", CJ_ID, plen + 1); + u_free(payload); queue_entry_free(entry); return -1; + } entry->dgram[0] = ETCP_RT_ID_JOIN; memcpy(entry->dgram + 1, payload, plen); entry->len = 1 + (uint16_t)plen; diff --git a/src/chat/member_sync_doc.md b/src/chat/member_sync_doc.md index 55699ea8..65a9876b 100644 --- a/src/chat/member_sync_doc.md +++ b/src/chat/member_sync_doc.md @@ -32,11 +32,11 @@ SHA256 по полям: node_id:8, x25519:32, ed25519:32, join_sig:64, join_ts:8, -update_sig:64, update_ts:8, userinfo_len:1, userinfo, +update_sig:64, update_ts:8, userinfo_len:2, userinfo, adm_tags_len:2, adm_tags, adm_tags_sig:64, signed_by:8, signature:64. Целые big-endian; отсутствующие подписи представлены нулями. -userinfo ограничен 255 байтами, adm_tags — 8192 байтами UTF-8 без NUL. Длина adm_tags — uint16 big-endian. +userinfo ограничен 1024 байтами, adm_tags — 8192 байтами UTF-8 без NUL. Обе длины — uint16 big-endian. Хеш и подпись владельца покрывают весь adm_tags без обрезания. Хеш включает userinfo и дерево приглашений. Формат сообщений, подписываемых моделью, определяется build_join_msg/build_update_msg/build_sign_msg отдельно. @@ -45,7 +45,7 @@ userinfo ограничен 255 байтами, adm_tags — 8192 байтами Начинается с count:2 big-endian. Далее count записей: node_id:8, x25519:32, ed25519:32, flags:1, при HAS_JOIN — join_sig:64 и join_ts:8, -update_sig:64, update_ts:8, userinfo_len:1, userinfo, +update_sig:64, update_ts:8, userinfo_len:2, userinfo, adm_tags_len:2, adm_tags, adm_tags_sig:64, signed_by:8, signature:64. Целые big-endian. Встроенные NUL и хвостовые байты запрещены.