Match editable roles to the same owner version read from SQLite

This commit is contained in:
evgeny committed 2026-10-28 00:58:59 +01:00
1 parent bc5e6aa5a5
commit b78fd7a8e6
2 files changed
+11 -6

No files matched your search

+9 -4
View File
@@ -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<MemberPropsDialog> alive(this);
QString name = m_memberName.isEmpty() ? QString("0x%1").arg(m_nodeId, 16, 16, QChar('0')) : m_memberName;
+2 -2
View File
@@ -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; // Имя в предупреждении о передаче ключа.