diff --git a/src/chat/db_sync.c b/src/chat/db_sync.c index a94e3980..8a533995 100644 --- a/src/chat/db_sync.c +++ b/src/chat/db_sync.c @@ -531,6 +531,9 @@ static int db_verify_author_sig(struct DB_SYNC_INSTANCE* si, const char* json, size_t jlen, const uint8_t* sig) { + if (!sig || jlen > DB_SYNC_MESSAGE_MAX || (jlen && !json)) { + DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "history: invalid signed body tbl=%s bytes=%zu", SI_TBL(si), jlen); return -1; + } uint8_t pubkey[32]; if (db_get_ed25519_pubkey(si->db_sync, author_node_id, pubkey) != 0) { DEBUG_WARN(DEBUG_CATEGORY_CHAT_SYNC, @@ -638,7 +641,11 @@ static int db_record_insert_cascade(struct DB_SYNC_INSTANCE* si, int ret = db_record_insert(si, rid, rts, rauthor, rdata, rdlen, rsig, local_attrs); if (ret != 0) return ret; - if (si->on_insert) si->on_insert(si, rts, rdata, rdlen, rauthor, initial_sync, si->on_insert_arg); + if (si->on_insert) { + uint8_t message_id[32]; + if (chat_message_id(si->group_id, rts, rsig, message_id) < 0) return -1; + si->on_insert(si, message_id, rts, rdata, rdlen, rauthor, initial_sync, si->on_insert_arg); + } uint8_t pbuf[4096]; uint32_t poff = 1; pbuf[0] = DB_MSG_PUSH; memcpy(pbuf + poff, &rid, 8); poff += 8; diff --git a/src/chat/db_sync.h b/src/chat/db_sync.h index 544af5d2..b8bb0dee 100644 --- a/src/chat/db_sync.h +++ b/src/chat/db_sync.h @@ -30,6 +30,9 @@ struct DB_SYNC_INSTANCE; #define DB_MSG_ERROR 0x08 #define DB_MSG_REQUEST_SYNC 0x09 +/* PUSH имеет фиксированный буфер 4096 байт; 4000 оставляет место заголовку и подписи. */ +#define DB_SYNC_MESSAGE_MAX 4000 + // SEND_DATA want_from sentinel #define DB_WANT_FROM_NONE 0xFFFFFFFF // no request for peer's data @@ -102,6 +105,7 @@ int db_sync_select(struct DB_SYNC_INSTANCE* si, uint32_t offset, uint32_t l // initial_sync = 1 если запись пришла в рамках bulk-обмена SEND_DATA (initial/re-sync), // 0 для live-PUSH и локальных вставок. typedef void (*db_sync_insert_cb)(struct DB_SYNC_INSTANCE* si, + const uint8_t message_id[32], uint64_t record_timestamp, const char* json_data, size_t len, uint64_t author_node_id, int initial_sync, void* arg);