diff --git a/src/chat/chat_core.h b/src/chat/chat_core.h index 5cf5b497..6e7f8a67 100644 --- a/src/chat/chat_core.h +++ b/src/chat/chat_core.h @@ -77,6 +77,8 @@ int chat_core_submit_message(struct UTUN_INSTANCE* inst, struct chat_msg_submit* /* Отправка медиа-сообщения (вложение): src->dest (copy) или видео (transcode). */ void chat_core_submit_media_message(struct UTUN_INSTANCE* inst, struct chat_msg_submit* req); +/* Ручная загрузка вложения; для зашифрованного файла также запрашивает ключ автора. */ +void chat_core_attachment_download(struct UTUN_INSTANCE* inst, const char* channel_id, int64_t msg_id); /* ── DB-операции (оставлены для интроспекции) ── */ diff --git a/tests/test_encrypted_attachment.c b/tests/test_encrypted_attachment.c index 693cd59b..dbf83da8 100644 --- a/tests/test_encrypted_attachment.c +++ b/tests/test_encrypted_attachment.c @@ -166,12 +166,13 @@ static void tick(void* arg) { if (setup(t)) { failure(t, "signed group members"); return; } t->phase++; } /* UTUN routes precede CHAT routes; setup once physical links are UP. */ - else if (t->ticks == 20 && instance_find_conn(a, t->ids[S]) && instance_find_conn(b, t->ids[S]) && instance_find_conn(c, t->ids[S])) { + else if (t->ticks >= 20 && instance_find_conn(a, t->ids[S]) && instance_find_conn(b, t->ids[S]) && instance_find_conn(c, t->ids[S])) { if (setup(t)) { failure(t, "signed group members"); return; } t->phase++; } break; case 1: if (live(a, t->ids[B]) && live(a, t->ids[M])) { + if (chat_setting_set(s, "storage_autoload", "1")) { failure(t, "storage autoload setting"); return; } struct attachment_send_req* req = u_calloc(1, sizeof(*req)); if (!req) { failure(t, "send allocation"); return; } req->inst = a; req->encrypted = 1; req->info.kind = ATTACHMENT_FILE; @@ -187,7 +188,7 @@ static void tick(void* arg) { if (value(b, "SELECT count(*) FROM msg_" CHANNEL " WHERE instr(CAST(data AS TEXT),'private-name.bin')>0") != 0) { failure(t, "plaintext filename leaked into group history"); return; } - download(t, S); t->phase++; + t->phase++; } break; case 3: