From b78fd7a8e662ea329383d4600b2b7cdb779fc919 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 17:57:17 +0100 Subject: [PATCH] Match editable roles to the same owner version read from SQLite --- tools/chatgui/src/memberpropsdialog.cpp | 13 +++++++++---- tools/chatgui/src/memberpropsdialog.h | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/tools/chatgui/src/memberpropsdialog.cpp b/tools/chatgui/src/memberpropsdialog.cpp index 87f5908b..1e18c602 100644 --- a/tools/chatgui/src/memberpropsdialog.cpp +++ b/tools/chatgui/src/memberpropsdialog.cpp @@ -57,6 +57,9 @@ MemberPropsDialog::MemberPropsDialog(DbManager* db, const QString& channelId, if (rc == SQLITE_OK) rc = sqlite3_step(st); if (rc == SQLITE_ROW) { const QJsonObject tags = QJsonDocument::fromJson(DbManager::colText(st, 0).toUtf8()).object(); + const QString adminHistory = tags.value("admin").toString(); + isAdmin = adminHistory.lastIndexOf('e') > adminHistory.lastIndexOf('d'); + isSuper = tags.value("supernode").toString() == "yes"; m_currentVer = tags.value("ver").toString().toInt(); curVerified = tags.value("verified").toString() == "yes"; curDeleted = tags.value("deleted").toString() == "yes"; @@ -163,13 +166,15 @@ MemberPropsDialog::MemberPropsDialog(DbManager* db, const QString& channelId, btnLayout->addWidget(saveBtn); layout->addLayout(btnLayout); + setSaving(false); connect(this, &QDialog::finished, this, [this] { delete m_saveContext; m_saveContext = nullptr; setSaving(false); }); } void MemberPropsDialog::setSaving(bool saving) { - m_saveBtn->setEnabled(m_loaded && !saving); m_nickEdit->setEnabled(!saving && !m_isOwn); - for (auto* box : {m_adminCb, m_superCb, m_storageCb, m_verifiedCb, m_deletedCb}) box->setEnabled(!saving && m_haveAdminKey); - m_transferBtn->setEnabled(!saving && m_haveAdminKey && !m_isOwn); + m_saveBtn->setEnabled(m_loaded && !saving); m_nickEdit->setEnabled(m_loaded && !saving && !m_isOwn); + for (auto* box : {m_adminCb, m_superCb, m_storageCb, m_verifiedCb, m_deletedCb}) + box->setEnabled(m_loaded && !saving && m_haveAdminKey); + m_transferBtn->setEnabled(m_loaded && !saving && m_haveAdminKey && !m_isOwn); } void MemberPropsDialog::finishSave(int result) { @@ -199,7 +204,7 @@ void MemberPropsDialog::onSave() { } void MemberPropsDialog::onTransferAdmin() { - if (!m_haveAdminKey || m_isOwn || m_saveContext) return; + if (!m_loaded || !m_haveAdminKey || m_isOwn || m_saveContext) return; QPointer alive(this); QString name = m_memberName.isEmpty() ? QString("0x%1").arg(m_nodeId, 16, 16, QChar('0')) : m_memberName; diff --git a/tools/chatgui/src/memberpropsdialog.h b/tools/chatgui/src/memberpropsdialog.h index 2a665e7b..98d51d50 100644 --- a/tools/chatgui/src/memberpropsdialog.h +++ b/tools/chatgui/src/memberpropsdialog.h @@ -18,7 +18,7 @@ class MemberPropsDialog : public QDialog { Q_OBJECT public: /* db заимствован через QPointer, parent владеет диалогом; channelId/nodeId фиксируют адресата. - * memberName/flags — начальный снимок отображения, JSON/ver и локальный ник читаются из БД. */ + * memberName/flags — начальный снимок отображения; актуальные права, JSON/ver и локальный ник читаются из БД. */ explicit MemberPropsDialog(DbManager* db, const QString& channelId, uint64_t nodeId, const QString& memberName, uint8_t flags, QWidget* parent = nullptr); @@ -35,7 +35,7 @@ private: uint64_t m_nodeId; // Адресат сохранения/передачи ключа. bool m_haveAdminKey = false; // На момент открытия БД содержала ключ; ядро проверяет полномочия заново. bool m_isOwn = false; // Собственный ник не редактируется, передача ключа себе запрещена. - uint8_t m_flags; // Исходные флаги для admin/super checkboxes. + uint8_t m_flags; // Резервные флаги отображения при неудачном чтении; такую форму сохранять нельзя. int m_currentVer; // Версия owner-блока при открытии: предотвращает перезапись устаревшей формой. QString m_memberName; // Имя в предупреждении о передаче ключа.