Browse Source

Define member avatar references as manifest objects

master
evgeny 7 days ago
parent
commit
c80e82d104
  1. 4
      src/chat/chat_core.h
  2. 12
      src/chat/chat_member.c
  3. 10
      src/chat/chat_member.h

4
src/chat/chat_core.h

@ -239,7 +239,7 @@ int chat_core_get_members_json(struct UTUN_INSTANCE* inst, const char* ch_id, ch
/* Имя узла из таблицы nodes */ /* Имя узла из таблицы nodes */
int chat_core_get_node_name(struct UTUN_INSTANCE* inst, uint64_t node_id, char* out, size_t sz); int chat_core_get_node_name(struct UTUN_INSTANCE* inst, uint64_t node_id, char* out, size_t sz);
/* Аватарка лежит в avatars/<sha256>.png внутри дерева своего UID/канала. server=0 удаляет ссылку. */ /* Ссылка на описание avatars/<sha256>.json внутри дерева своего UID/канала. server=0 удаляет ссылку. */
int chat_core_set_my_avatar(struct UTUN_INSTANCE* inst, const char* ch_id, uint64_t server, const char* file); int chat_core_set_my_avatar(struct UTUN_INSTANCE* inst, const char* ch_id, uint64_t server, const char* file);
int chat_core_name_userinfo(const char* name, char* out, size_t capacity); int chat_core_name_userinfo(const char* name, char* out, size_t capacity);
int chat_core_get_my_profile(struct UTUN_INSTANCE* inst, const char* channel, char* out, size_t capacity, int chat_core_get_my_profile(struct UTUN_INSTANCE* inst, const char* channel, char* out, size_t capacity,
@ -247,7 +247,7 @@ int chat_core_get_my_profile(struct UTUN_INSTANCE* inst, const char* channel, ch
struct chat_avatar_req { struct chat_avatar_req {
struct UTUN_INSTANCE* inst; struct UTUN_INSTANCE* inst;
uint64_t id, group, server; uint64_t id, group, server;
char file[69]; char file[70];
}; };
void chat_core_set_my_avatar_trampoline(void* arg); void chat_core_set_my_avatar_trampoline(void* arg);

12
src/chat/chat_member.c

@ -86,8 +86,8 @@ void chat_core_serialize_member(const struct chat_member_display* src, uint8_t*
dst[14] = src->storage; dst[14] = src->storage;
memcpy(dst + 15, src->name, 64); memcpy(dst + 15, src->name, 64);
mf_put64(dst + 79, src->avatar_server); mf_put64(dst + 79, src->avatar_server);
memcpy(dst + 87, src->avatar_file, 69); memcpy(dst + 87, src->avatar_file, 70);
dst[156] = src->storage_role; dst[157] = src->storage_role;
} }
int chat_core_deserialize_member(const uint8_t* src, struct chat_member_display* dst) { int chat_core_deserialize_member(const uint8_t* src, struct chat_member_display* dst) {
@ -102,8 +102,8 @@ int chat_core_deserialize_member(const uint8_t* src, struct chat_member_display*
memcpy(dst->name, src + 15, 64); memcpy(dst->name, src + 15, 64);
dst->name[63] = '\0'; dst->name[63] = '\0';
dst->avatar_server = mf_get64(src + 79); dst->avatar_server = mf_get64(src + 79);
memcpy(dst->avatar_file, src + 87, 69); dst->avatar_file[68] = 0; memcpy(dst->avatar_file, src + 87, 70); dst->avatar_file[69] = 0;
dst->storage_role = src[156]; dst->storage_role = src[157];
return 0; return 0;
} }
@ -112,14 +112,14 @@ static void member_avatar(struct chat_member_display* m, const char* userinfo) {
char server[MS_USERINFO_MAX + 1], file[MS_USERINFO_MAX + 1]; char server[MS_USERINFO_MAX + 1], file[MS_USERINFO_MAX + 1];
if (!userinfo || json_flat_get(userinfo, "avatar_server", server, sizeof(server)) < 0 || if (!userinfo || json_flat_get(userinfo, "avatar_server", server, sizeof(server)) < 0 ||
json_flat_get(userinfo, "avatar_file", file, sizeof(file)) < 0) return; json_flat_get(userinfo, "avatar_file", file, sizeof(file)) < 0) return;
if (strlen(server) != 16 || !mf_avatar_file_valid(file)) { if (strlen(server) != 16 || !mf_avatar_manifest_valid(file)) {
DEBUG_WARN(DEBUG_CATEGORY_CHAT, "avatar: invalid profile reference node=%016llx", (unsigned long long)m->node_id); return; DEBUG_WARN(DEBUG_CATEGORY_CHAT, "avatar: invalid profile reference node=%016llx", (unsigned long long)m->node_id); return;
} }
for (int i = 0; i < 16; i++) if (!((server[i] >= '0' && server[i] <= '9') || (server[i] >= 'a' && server[i] <= 'f'))) { for (int i = 0; i < 16; i++) if (!((server[i] >= '0' && server[i] <= '9') || (server[i] >= 'a' && server[i] <= 'f'))) {
DEBUG_WARN(DEBUG_CATEGORY_CHAT, "avatar: invalid server ID node=%016llx", (unsigned long long)m->node_id); return; DEBUG_WARN(DEBUG_CATEGORY_CHAT, "avatar: invalid server ID node=%016llx", (unsigned long long)m->node_id); return;
} }
m->avatar_server = strtoull(server, NULL, 16); m->avatar_server = strtoull(server, NULL, 16);
if (m->avatar_server) memcpy(m->avatar_file, file, 69); if (m->avatar_server) memcpy(m->avatar_file, file, 70);
} }
static int member_storage_role(const char* tags, sqlite3_stmt* st, int source, int signature, int deleted) { static int member_storage_role(const char* tags, sqlite3_stmt* st, int source, int signature, int deleted) {

10
src/chat/chat_member.h

@ -5,7 +5,7 @@
* Live-снимки для всех потребителей формирует chat_core_get_member_list() в uasync-потоке. * Live-снимки для всех потребителей формирует chat_core_get_member_list() в uasync-потоке.
* Android дополняет ими свой JSON-список с расширенными свойствами участников. * Android дополняет ими свой JSON-список с расширенными свойствами участников.
* *
* Формат на проводе (ручная сериализация, фиксированный размер 157 байт): * Формат на проводе (ручная сериализация, фиксированный размер 158 байт):
* [0-7] node_id uint64_t LE * [0-7] node_id uint64_t LE
* [8] online uint8_t * [8] online uint8_t
* [9] is_self uint8_t * [9] is_self uint8_t
@ -15,8 +15,8 @@
* [14] storage uint8_t * [14] storage uint8_t
* [15-78] name char[64] local_nick если задан, иначе node name. \0-padded * [15-78] name char[64] local_nick если задан, иначе node name. \0-padded
* [79-86] avatar_server uint64_t LE; 0 = нет аватарки * [79-86] avatar_server uint64_t LE; 0 = нет аватарки
* [87-155] avatar_file char[69], sha256.png с NUL * [87-156] avatar_file char[70], sha256.json с NUL
* [156] storage_role uint8_t, подписанная роль, независимо от сетевого приоритета storage * [157] storage_role uint8_t, подписанная роль, независимо от сетевого приоритета storage
*/ */
#ifndef CHAT_MEMBER_H #ifndef CHAT_MEMBER_H
@ -35,7 +35,7 @@ extern "C" {
#define CHAT_MEMBER_FLAG_DELETED 0x08 #define CHAT_MEMBER_FLAG_DELETED 0x08
#define CHAT_MEMBER_FLAG_RADIO 0x10 #define CHAT_MEMBER_FLAG_RADIO 0x10
#define CHAT_MEMBER_DISPLAY_SIZE 157 #define CHAT_MEMBER_DISPLAY_SIZE 158
/* Получить всех мемберов канала. out = u_malloc-массив, count = количество. */ /* Получить всех мемберов канала. out = u_malloc-массив, count = количество. */
int chat_core_get_member_list(struct UTUN_INSTANCE* inst, const char* ch_id, uint8_t** out, int* count); int chat_core_get_member_list(struct UTUN_INSTANCE* inst, const char* ch_id, uint8_t** out, int* count);
@ -58,7 +58,7 @@ struct chat_member_display {
uint8_t storage; uint8_t storage;
char name[64]; char name[64];
uint64_t avatar_server; uint64_t avatar_server;
char avatar_file[69]; char avatar_file[70];
uint8_t storage_role; uint8_t storage_role;
}; };

Loading…
Cancel
Save