From 48761ff473d1a551efcf2fcf64f0fc8c0b2db78c Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 3 Nov 2026 16:25:30 +0100 Subject: [PATCH] Publish co-owner invite role and validate policy command arguments --- src/chat/chat_admin.c | 6 ++++++ src/chat/chat_headless_control.c | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/chat/chat_admin.c b/src/chat/chat_admin.c index 998142fa6..a6d84deef 100644 --- a/src/chat/chat_admin.c +++ b/src/chat/chat_admin.c @@ -106,6 +106,12 @@ static void admin_key_recv_cb(struct ETCP_CONN* conn, struct ll_entry* entry) { DEBUG_INFO(DEBUG_CATEGORY_CHAT_SYNC, "%s: received admin key ch=%s from 0x%016llx — imported, now co-owner", CA_ID, ch_id, (unsigned long long)from_node); + /* Другие узлы проверяют право приглашать по подписанной роли, а не по наличию нашего приватного ключа. */ + struct chat_member_tags* tags = chat_member_tags_load(inst, ch_id, inst->node_id); + if (!tags || chat_member_tags_set(tags, "admin", "yes") || chat_member_tags_commit(inst, tags)) + DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: co-owner key imported, publishing admin role failed ch=%s", CA_ID, ch_id); + chat_member_tags_free(tags); + uint8_t evt[72]; uint8_t cl = (uint8_t)strlen(ch_id); evt[0] = cl; memcpy(evt + 1, ch_id, cl); diff --git a/src/chat/chat_headless_control.c b/src/chat/chat_headless_control.c index 481b158c7..23a235c20 100644 --- a/src/chat/chat_headless_control.c +++ b/src/chat/chat_headless_control.c @@ -1098,8 +1098,16 @@ static void hc_handle_command(struct headless_client* cli, const char* json) { if (!strcmp(cmd, "group_policy")) { char channel[21], token[65], keep[RECV_BUF_SIZE]; char* result = NULL; if (json_get_str(cli, "ch", channel, sizeof(channel))) { send_response(cli, id, NULL, "missing channel"); goto done; } - json_get_str(cli, "token", token, sizeof(token)); - if (json_get_str(cli, "keep", keep, sizeof(keep))) strcpy(keep, "[]"); + token[0] = 0; strcpy(keep, "[]"); + for (unsigned i = 0; i < request.count; i++) { + const char* key = request.fields[i].key; + if ((!strcmp(key, "token") && (json_get_str(cli, key, token, sizeof(token)) || strlen(token) != 64)) || + (!strcmp(key, "keep") && json_get_str(cli, key, keep, sizeof(keep))) || + (!strcmp(key, "all_members") && request.fields[i].kind != 2)) { + DEBUG_WARN(DEBUG_CATEGORY_HEADLESS, "headless: invalid group policy parameter key=%s", key); + send_response(cli, id, NULL, "invalid group policy parameter"); goto done; + } + } group_policy_command(cli->hc->inst, channel, json_get_int(cli, "all_members", 0), token[0] ? token : NULL, keep, &result); send_response(cli, id, result, result ? NULL : "group policy unavailable"); u_free(result); goto done; }