diff --git a/src/dm/dm_core.c b/src/dm/dm_core.c index 6dd777085..94e9f678d 100644 --- a/src/dm/dm_core.c +++ b/src/dm/dm_core.c @@ -636,10 +636,9 @@ int dm_accept_message(struct UTUN_INSTANCE* inst, const uint8_t* msg, size_t len snprintf(c.conv_id, sizeof(c.conv_id), "%s", conv_id); c.mode = message.mode; c.peer_node_id = author; - if (!dm_shared_group_id(dm, author, &c.group_id)) { - DEBUG_WARN(DEBUG_CATEGORY_DM, "%s: unknown correspondent peer=%llu", DM_ID, (unsigned long long)author); - return -1; - } + /* Автор/адресат уже проверены по подписанному телу. Доставка через S не требует общей группы A/B. */ + if (!dm_shared_group_id(dm, author, &c.group_id)) DEBUG_DEBUG(DEBUG_CATEGORY_DM, + "%s: incoming conversation without direct group peer=%llu conv=%s", DM_ID, (unsigned long long)author, conv_id); if (c.mode == DM_MODE_GROUPS) { c.parties[0] = message.parties[side]; c.parties[1] = message.parties[1 - side]; if (!side) { diff --git a/src/dm/dm_core.h b/src/dm/dm_core.h index 340d00f46..59fe66ef2 100644 --- a/src/dm/dm_core.h +++ b/src/dm/dm_core.h @@ -72,6 +72,8 @@ int dm_peer_role(struct UTUN_INSTANCE* inst, uint64_t peer, const char* role); * Не расшифровывает тело и не проверяет членство/роль router-отправителя: это обязанность вызывающего. */ int dm_verify_message(struct UTUN_INSTANCE* inst, uint64_t recipient, const uint8_t* msg, size_t len); /* Проверить и расшифровать входящее тело для локального узла, атомарно сохранить историю/беседу/media. + * Вызывающий проверяет сетевого отправителя/посредника. Общая группа автора и адресата не требуется; + * личность автора, адресат и закреплённые стороны определяются подписанным телом и проверенными ключами. * 0 и receipt после commit либо точного повтора; -1 при отказе. Для file нужен живой dm_media. * Точный удалённый повтор подтверждается по отпечатку без восстановления истории; конфликт отклоняется. * receipt — обязательные 136 байт; при -1 буфер не использовать. Ошибка подписи квитанции возможна после commit. */