From 8f02e1ec2d8ee395ff7e4ce2ba5463cda0cf5e7f Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 17:53:50 +0100 Subject: [PATCH] Read member edit capabilities and fields in one GUI snapshot --- tools/chatgui/src/memberpropsdialog.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/tools/chatgui/src/memberpropsdialog.cpp b/tools/chatgui/src/memberpropsdialog.cpp index 00aa3ba4..87f5908b 100644 --- a/tools/chatgui/src/memberpropsdialog.cpp +++ b/tools/chatgui/src/memberpropsdialog.cpp @@ -31,15 +31,6 @@ MemberPropsDialog::MemberPropsDialog(DbManager* db, const QString& channelId, setMinimumWidth(340); setModal(true); - /* channel private key (for enabling admin/super checkboxes) */ - auto chs = m_db && m_db->m_db ? m_db->getChannels() : QList(); - for (const auto& ch : chs) { - if (ch.channelId == channelId) { - m_haveAdminKey = ch.ed25519_privkey.size() == 32; - break; - } - } - bool haveKey = m_haveAdminKey; bool isOwn = m_isOwn = m_db && m_nodeId == (uint64_t)m_db->myNodeId(); bool isAdmin = (m_flags & CHAT_MEMBER_FLAG_ADMIN) != 0; @@ -55,11 +46,14 @@ MemberPropsDialog::MemberPropsDialog(DbManager* db, const QString& channelId, if (m_db && m_db->m_db) { QString tbl = m_db->peersTableName(channelId); QByteArray sql = QString( - "SELECT adm_tags, local_nick FROM \"%1\" WHERE node_id=?" + "SELECT p.adm_tags,p.local_nick,length(c.ed25519_privkey) FROM \"%1\" p " + "JOIN channels c ON c.channel_id=? WHERE p.node_id=?" ).arg(tbl).toUtf8(); sqlite3_stmt* st = nullptr; int rc = sqlite3_prepare_v2(m_db->m_db, sql.constData(), -1, &st, nullptr); - if (rc == SQLITE_OK) rc = sqlite3_bind_int64(st, 1, (sqlite3_int64)nodeId); + const QByteArray channel = channelId.toUtf8(); + if (rc == SQLITE_OK) rc = sqlite3_bind_text(st, 1, channel.constData(), channel.size(), SQLITE_STATIC); + if (rc == SQLITE_OK) rc = sqlite3_bind_int64(st, 2, (sqlite3_int64)nodeId); if (rc == SQLITE_OK) rc = sqlite3_step(st); if (rc == SQLITE_ROW) { const QJsonObject tags = QJsonDocument::fromJson(DbManager::colText(st, 0).toUtf8()).object(); @@ -68,6 +62,7 @@ MemberPropsDialog::MemberPropsDialog(DbManager* db, const QString& channelId, curDeleted = tags.value("deleted").toString() == "yes"; curStorage = tags.value("storage").toString() == "yes"; curNick = DbManager::colText(st, 1); + m_haveAdminKey = sqlite3_column_int(st, 2) == 32; } int finish = sqlite3_finalize(st); loaded = rc == SQLITE_ROW && finish == SQLITE_OK; if (!loaded) DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "member properties: read ch=%s node=%016llx rc=%d finalize=%d: %s", @@ -75,6 +70,7 @@ MemberPropsDialog::MemberPropsDialog(DbManager* db, const QString& channelId, } else { DEBUG_WARN(DEBUG_CATEGORY_CHAT_SYNC, "member properties: database unavailable at open"); } + const bool haveKey = m_haveAdminKey; auto* layout = new QVBoxLayout(this); layout->setSpacing(12);