From 0a69864d10b5cb609fe01b5f76fd07616c24546d Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 12:15:17 +0100 Subject: [PATCH] Guard avatar upload controls across nested file and crop dialogs --- tools/chatgui/src/settingsdialog.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/tools/chatgui/src/settingsdialog.cpp b/tools/chatgui/src/settingsdialog.cpp index 6fe9d001..b792d5d2 100644 --- a/tools/chatgui/src/settingsdialog.cpp +++ b/tools/chatgui/src/settingsdialog.cpp @@ -35,6 +35,8 @@ extern "C" { #include #include #include +#include +#include #include #include #include @@ -125,12 +127,19 @@ SettingsDialog::SettingsDialog(const QString& configPath, DbManager* db, UtunNod }; connect(avatars, &AvatarManager::serversChanged, controls, update); connect(avatars, &AvatarManager::statusChanged, status, &QLabel::setText); - connect(upload, &QPushButton::clicked, controls, [avatars, server, controls] { - const QString path = QFileDialog::getOpenFileName(controls, QCoreApplication::translate("ChatGui", "Choose avatar"), {}, - QCoreApplication::translate("ChatGui", "Images (*.png *.jpg *.jpeg *.webp)")); + connect(upload, &QPushButton::clicked, controls, + [manager = QPointer(avatars), owner = QPointer(controls), selection = QPointer(server)] { + if (!manager || !owner || !selection) return; + QPointer chooser = new QFileDialog(owner, QCoreApplication::translate("ChatGui", "Choose avatar")); + auto release = qScopeGuard([&] { delete chooser.data(); }); + chooser->setNameFilter(QCoreApplication::translate("ChatGui", "Images (*.png *.jpg *.jpeg *.webp)")); + chooser->setFileMode(QFileDialog::ExistingFile); + QObject::connect(manager, &QObject::destroyed, chooser, &QDialog::reject); + if (chooser->exec() != QDialog::Accepted || !chooser || !manager || !owner || !selection) return; + const auto files = chooser->selectedFiles(); if (files.isEmpty()) return; + const QString path = files.first(); const quint64 serverId = selection->currentData().toULongLong(); QRectF crop; - if (!path.isEmpty() && selectAvatarCrop(path, crop, controls)) - avatars->uploadDefault(path, server->currentData().toULongLong(), crop); + if (selectAvatarCrop(path, crop, owner) && manager) manager->uploadDefault(path, serverId, crop); }); connect(clear, &QPushButton::clicked, avatars, &AvatarManager::clearDefault); update(); }