diff --git a/src/dm/dm_mailbox_media.h b/src/dm/dm_mailbox_media.h new file mode 100644 index 00000000..231c1d6f --- /dev/null +++ b/src/dm/dm_mailbox_media.h @@ -0,0 +1,23 @@ +/* dm_mailbox_media — durable задания суперузла: размещение на M, доставка + * метаданных получателю и удаление всех выданных копий до DELETE_ACK. + * Жизненный цикл принадлежит dm_mailbox, control принимает dm_media. + */ +#ifndef DM_MAILBOX_MEDIA_H +#define DM_MAILBOX_MEDIA_H + +#include +#include +struct UTUN_INSTANCE; +struct dm_mb_media; + +struct dm_mb_media* dm_mailbox_media_create(struct UTUN_INSTANCE* inst); +void dm_mailbox_media_destroy(struct dm_mb_media* media); +/* Вызвать в транзакции PUT после проверки роли S и подписи сообщения. */ +int dm_mailbox_media_register(struct dm_mb_media* media, uint64_t group, uint64_t recipient, + const uint8_t* msg, size_t len); +void dm_mailbox_media_recv(struct dm_mb_media* media, uint64_t group, uint64_t source, + uint8_t cmd, const uint8_t* body, size_t len); +/* Отправить квитанцию всем доступным S общей группы, включая поздние копии. */ +void dm_mailbox_media_receipt(struct UTUN_INSTANCE* inst, const uint8_t* receipt); + +#endif diff --git a/src/dm/dm_media.h b/src/dm/dm_media.h new file mode 100644 index 00000000..d225eae7 --- /dev/null +++ b/src/dm/dm_media.h @@ -0,0 +1,57 @@ +/* dm_media — файлы личных бесед и ограниченное ciphertext-хранилище M. + * Шифрование/проверка в media_async, БД/сеть/публикация в uasync. + * dm_core вызывает track внутри своей транзакции. Квитанция файла независима + * от квитанции сообщения; создаётся после проверки, публикации и commit. + * Суперузлом и заданиями удаления владеет dm_mailbox_media. + */ +#ifndef DM_MEDIA_H +#define DM_MEDIA_H + +#include +#include + +struct UTUN_INSTANCE; + +#define DM_MEDIA_DESC_SIZE 56 /* UUID:16, plaintext_size:8, SHA256(ciphertext):32 */ +#define DM_MEDIA_RECEIPT_SIZE 152 +#define DM_MEDIA_MAX_SIZE (1024ULL * 1024 * 1024) + +#define DM_MEDIA_OFFER 1 +#define DM_MEDIA_STORE 2 +#define DM_MEDIA_STORED 3 +#define DM_MEDIA_RECEIPT 4 +#define DM_MEDIA_DELETE 5 +#define DM_MEDIA_DELETE_ACK 6 +#define DM_MEDIA_EXPIRED 7 +#define DM_MEDIA_REJECT 8 + +int dm_media_init(struct UTUN_INSTANCE* inst); +/* quiesce до media_async_destroy; destroy после workers, до групп/core/mailbox. */ +void dm_media_quiesce(struct UTUN_INSTANCE* inst); +void dm_media_destroy(struct UTUN_INSTANCE* inst); + +/* Подготовить копию и enqueue file-сообщение асинхронно. 0=задача принята. */ +int dm_send_file(struct UTUN_INSTANCE* inst, const char* conv, const char* path, const char* display_name); +struct dm_file_req { + struct UTUN_INSTANCE* inst; + char conv[64]; + char path[1024]; + char name[256]; +}; +void dm_send_file_trampoline(void* arg); + +/* Внутри транзакции dm_core, 0=записано/точный повтор. Для text — пустая операция. */ +int dm_media_track(struct UTUN_INSTANCE* inst, int dir, const uint8_t* msg, size_t len); +const uint8_t* dm_message_media(const uint8_t* msg, size_t len); +uint64_t dm_media_cipher_size(uint64_t plain_size); +int dm_media_verify_receipt(struct UTUN_INSTANCE* inst, const uint8_t* receipt, const uint8_t* msg, size_t len); +int dm_media_accept_receipt(struct UTUN_INSTANCE* inst, const uint8_t* receipt); + +/* Общие операции control для endpoint/M и mailbox/S. Все пакеты подписаны. */ +int dm_media_send(struct UTUN_INSTANCE* inst, uint64_t group, uint64_t peer, + uint8_t cmd, const uint8_t* body, size_t len); +int dm_media_scope(struct UTUN_INSTANCE* inst, uint64_t group, uint64_t node, + const char* role, uint64_t author, uint64_t recipient); +void dm_media_notify(struct UTUN_INSTANCE* inst, uint64_t conv); + +#endif