50 lines
4.2 KiB
C
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
|