Files
utun2/src/chat/chat_devgroup.h
T

50 lines
4.2 KiB
C

/* chat_devgroup — управление общей группой устройств в потоке uasync.
* Публичная принадлежность живёт в ядре; чат управляет приглашениями и локальными изменениями.
* Все результаты операций 0/-1, события после commit. Аргументы заимствованы до возврата. */
#ifndef CHAT_DEVGROUP_H
#define CHAT_DEVGROUP_H
#include "../routing_layer/devgroup.h"
#ifdef __cplusplus
extern "C" {
#endif
enum chat_devgroup_action { CHAT_DEVGROUP_STATUS, CHAT_DEVGROUP_INVITE, CHAT_DEVGROUP_ACCEPT, CHAT_DEVGROUP_RENAME, CHAT_DEVGROUP_LEAVE };
/* Запрос UI: text=имя/ID приглашения, pin только для ACCEPT; group/peer только для INVITE.
* Все массивы NUL-terminated. Трамплин забирает u_malloc-блок; RESULT=request_id LE8,success1,JSON UTF-8.
* JSON результата INVITE содержит PIN: показывать только локально, не логировать. */
struct chat_devgroup_request {
struct UTUN_INSTANCE* inst;
uint64_t request_id, group, peer;
enum chat_devgroup_action action;
char text[128], pin[5];
};
/* Синхронно в uasync:0/-1, *json caller освобождает u_free; при успехе всегда JSON. */
int chat_devgroup_execute(const struct chat_devgroup_request* req, char** json);
void chat_devgroup_trampoline(void* arg);
/* Сервис приглашений: init0/-1, destroy отменяет ожидания; локальная принадлежность остаётся в ядре. */
int chat_devgroup_init(struct UTUN_INSTANCE* inst);
/* После локального выхода отменить ожидания; уже переданные ключи имеют неизвестный результат. */
void chat_devgroup_cancel_pending(struct UTUN_INSTANCE* inst);
void chat_devgroup_destroy(struct UTUN_INSTANCE* inst);
/* Пригласить известный узел через CHAT-группу; out_id[33] hex, out_pin[5]. 0/-1, PIN только для локального UI. */
int chat_devgroup_invite(struct UTUN_INSTANCE* inst, uint64_t group, uint64_t peer, char out_id[33], char out_pin[5]);
/* Ввести PIN для входящего приглашения; id — 32 hex, pin — ровно четыре цифры. 0/-1. */
int chat_devgroup_accept(struct UTUN_INSTANCE* inst, const char* id, const char* pin);
/* Снимок группы/приглашений в JSON; caller освобождает через u_free. PIN/секретов в снимке нет. */
char* chat_devgroup_status(struct UTUN_INSTANCE* inst);
/* Создать группу либо переименовать свою. Имя UTF-8,1..63 байта; no-op не повышает версию. */
int chat_devgroup_rename(struct UTUN_INSTANCE* inst, const char* name);
/* Выйти: удалить секреты и опубликовать пустой блок в одной транзакции. Повтор допустим. */
int chat_devgroup_leave(struct UTUN_INSTANCE* inst);
/* Принять профиль из nodes и опубликовать только при увеличении версии; секреты не устанавливает. */
int chat_devgroup_refresh(struct UTUN_INSTANCE* inst);
/* Импорт от протокола приглашения: ключи проверяются, смешение разных групп запрещено.
* receipt[16] и peer связывают результат с приглашением; повтор никогда не восстанавливает удалённые ключи. */
int chat_devgroup_import(struct UTUN_INSTANCE* inst, const struct devgroup_record* record,
const uint8_t ed_priv[32], const uint8_t x_priv[32], const uint8_t receipt[16], uint64_t peer);
/* Прочитать сохранённый результат приглашения:1=импорт уже выполнен,0=нет,-1=ошибка/другой peer. */
int chat_devgroup_receipt(struct UTUN_INSTANCE* inst, const uint8_t receipt[16], uint64_t peer);
#ifdef __cplusplus
}
#endif
#endif