Browse Source

Forward full join profiles and document canonical profile lengths

master
evgeny 6 days ago
parent
commit
8f83167c0f
  1. 2
      doc/member_files.txt
  2. 11
      src/chat/chat_join.c
  3. 6
      src/chat/member_sync_doc.md

2
doc/member_files.txt

@ -317,6 +317,8 @@ AvatarManager общий для списка участников и сообщ
test_avatars проверяет нормализацию, хеш/размеры, очистку temp, настоящее storage test_avatars проверяет нормализацию, хеш/размеры, очистку temp, настоящее storage
в двух каналах, публикацию, сохранение при смене имени, DM-кеш, restart без сети, в двух каналах, публикацию, сохранение при смене имени, DM-кеш, restart без сети,
автоматический download после потери кеша и удаление ссылок. test_member_adapter автоматический download после потери кеша и удаление ссылок. test_member_adapter
Проверяет также max_bytes до открытия local temp и смену аватарки при задержанном
download старой версии: поздний результат не заменяет новый рисунок.
проверяет подписанные профили 191/255/256/512/1023/1024 байт вместе с adm_tags до 8192. проверяет подписанные профили 191/255/256/512/1023/1024 байт вместе с adm_tags до 8192.
Категория media=debug показывает discovery, cache hit/eviction, направление, Категория media=debug показывает discovery, cache hit/eviction, направление,
group/owner/server/hash, ошибки проверки и retry; media=info — передачи/публикации. group/owner/server/hash, ошибки проверки и retry; media=info — передачи/публикации.

11
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) { const struct join_member_data* m) {
if (!inst || !m || inviter_id == 0) return -1; 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) { if (chat_join_serialize_member(m, mbuf, sizeof(mbuf), &mlen) != 0) {
DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: forward serialize failed", CJ_ID); DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: forward serialize failed", CJ_ID);
return -1; 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; size_t plen = 1 + 8 + mlen;
uint8_t* payload = u_malloc(plen); 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; payload[0] = JOIN_SUBCMD_REQUEST_FWD;
memcpy(payload + 1, &join_key, 8); memcpy(payload + 1, &join_key, 8);
memcpy(payload + 1 + 8, mbuf, mlen); memcpy(payload + 1 + 8, mbuf, mlen);
struct ll_entry* entry = queue_entry_new(0); 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); 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; entry->dgram[0] = ETCP_RT_ID_JOIN;
memcpy(entry->dgram + 1, payload, plen); memcpy(entry->dgram + 1, payload, plen);
entry->len = 1 + (uint16_t)plen; entry->len = 1 + (uint16_t)plen;

6
src/chat/member_sync_doc.md

@ -32,11 +32,11 @@
SHA256 по полям: SHA256 по полям:
node_id:8, x25519:32, ed25519:32, join_sig:64, join_ts:8, 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. adm_tags_len:2, adm_tags, adm_tags_sig:64, signed_by:8, signature:64.
Целые big-endian; отсутствующие подписи представлены нулями. Целые 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 и дерево приглашений. Хеш и подпись владельца покрывают весь adm_tags без обрезания. Хеш включает userinfo и дерево приглашений.
Формат сообщений, подписываемых моделью, определяется build_join_msg/build_update_msg/build_sign_msg отдельно. Формат сообщений, подписываемых моделью, определяется build_join_msg/build_update_msg/build_sign_msg отдельно.
@ -45,7 +45,7 @@ userinfo ограничен 255 байтами, adm_tags — 8192 байтами
Начинается с count:2 big-endian. Далее count записей: Начинается с count:2 big-endian. Далее count записей:
node_id:8, x25519:32, ed25519:32, flags:1, node_id:8, x25519:32, ed25519:32, flags:1,
при HAS_JOIN — join_sig:64 и join_ts:8, при 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. adm_tags_len:2, adm_tags, adm_tags_sig:64, signed_by:8, signature:64.
Целые big-endian. Встроенные NUL и хвостовые байты запрещены. Целые big-endian. Встроенные NUL и хвостовые байты запрещены.

Loading…
Cancel
Save