Add specific dialog and setting for high privilege warning

This commit is contained in:
AdenKoperczak 2024-12-19 17:08:46 -05:00
parent 71f967d536
commit 923dad4e2e
7 changed files with 274 additions and 18 deletions

View file

@ -260,6 +260,7 @@ set(HDR_UI source/scwx/qt/ui/about_dialog.hpp
source/scwx/qt/ui/edit_marker_dialog.hpp
source/scwx/qt/ui/flow_layout.hpp
source/scwx/qt/ui/gps_info_dialog.hpp
source/scwx/qt/ui/high_privilege_dialog.hpp
source/scwx/qt/ui/hotkey_edit.hpp
source/scwx/qt/ui/imgui_debug_dialog.hpp
source/scwx/qt/ui/imgui_debug_widget.hpp
@ -291,6 +292,7 @@ set(SRC_UI source/scwx/qt/ui/about_dialog.cpp
source/scwx/qt/ui/edit_marker_dialog.cpp
source/scwx/qt/ui/flow_layout.cpp
source/scwx/qt/ui/gps_info_dialog.cpp
source/scwx/qt/ui/high_privilege_dialog.cpp
source/scwx/qt/ui/hotkey_edit.cpp
source/scwx/qt/ui/imgui_debug_dialog.cpp
source/scwx/qt/ui/imgui_debug_widget.cpp
@ -320,6 +322,7 @@ set(UI_UI source/scwx/qt/ui/about_dialog.ui
source/scwx/qt/ui/edit_line_dialog.ui
source/scwx/qt/ui/edit_marker_dialog.ui
source/scwx/qt/ui/gps_info_dialog.ui
source/scwx/qt/ui/high_privilege_dialog.ui
source/scwx/qt/ui/imgui_debug_dialog.ui
source/scwx/qt/ui/layer_dialog.ui
source/scwx/qt/ui/open_url_dialog.ui

View file

@ -12,6 +12,7 @@
#include <scwx/qt/manager/thread_manager.hpp>
#include <scwx/qt/settings/general_settings.hpp>
#include <scwx/qt/types/qt_types.hpp>
#include <scwx/qt/ui/high_privilege_dialog.hpp>
#include <scwx/qt/ui/setup/setup_wizard.hpp>
#include <scwx/qt/util/check_privilege.hpp>
#include <scwx/network/cpr.hpp>
@ -21,6 +22,7 @@
#include <string>
#include <vector>
#include <filesystem>
#include <aws/core/Aws.h>
#include <boost/asio.hpp>
@ -32,8 +34,6 @@
#include <QPalette>
#include <QStyle>
#include <QMessageBox>
#define QT6CT_LIBRARY
#include <qt6ct-common/qt6ct.h>
#undef QT6CT_LIBRARY
@ -46,6 +46,9 @@ static void OverrideDefaultStyle(const std::vector<std::string>& args);
int main(int argc, char* argv[])
{
bool disableHighPrivilegeWarning = false;
bool highPrivilegeChecked = false;
// Store arguments
std::vector<std::string> args {};
for (int i = 0; i < argc; ++i)
@ -76,25 +79,35 @@ int main(int argc, char* argv[])
QCoreApplication::installTranslator(&translator);
}
// Test to see if scwx was run with high privilege
if (scwx::qt::util::is_high_privilege())
{
QMessageBox::StandardButton pressed = QMessageBox::warning(
nullptr,
"Warning: Running with High Privileges",
"Although Supercell-Wx can be run with high privileges, "
"it is not recommended",
QMessageBox::Ok | QMessageBox::Close);
if (pressed & QMessageBox::Ok) {
return 0;
}
}
if (!scwx::util::GetEnvironment("SCWX_TEST").empty())
{
QStandardPaths::setTestModeEnabled(true);
}
// Test to see if scwx was run with high privilege
std::string appDataPath {
QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)
.toStdString()};
// Check if high privilege before writing settings, assuming no settings
// have been written
if (!std::filesystem::exists(appDataPath) &&
scwx::qt::util::is_high_privilege())
{
auto dialog =
scwx::qt::ui::HighPrivilegeDialog(); // TODO does this need cleaned up?
const int result = dialog.exec();
disableHighPrivilegeWarning = dialog.disable_high_privilege_message();
highPrivilegeChecked = true;
if (result == QDialog::Rejected)
{
// TODO any other cleanup needed here?
return 0;
}
}
// Start the io_context main loop
boost::asio::io_context& ioContext = scwx::util::io_context();
auto work = boost::asio::make_work_guard(ioContext);
@ -133,6 +146,46 @@ int main(int argc, char* argv[])
// Check process modules for compatibility
scwx::qt::main::CheckProcessModules();
auto& generalSettings = scwx::qt::settings::GeneralSettings::Instance();
if (!highPrivilegeChecked &&
generalSettings.high_privilege_warning_enabled().GetValue() &&
scwx::qt::util::is_high_privilege())
{
auto dialog =
scwx::qt::ui::HighPrivilegeDialog(); // TODO does this need cleaned up?
const int result = dialog.exec();
disableHighPrivilegeWarning = dialog.disable_high_privilege_message();
if (result == QDialog::Rejected)
{
// Deinitialize application
scwx::qt::manager::RadarProductManager::Cleanup();
// Stop Qt Threads
scwx::qt::manager::ThreadManager::Instance().StopThreads();
// Gracefully stop the io_context main loop
work.reset();
threadPool.join();
// Shutdown application
scwx::qt::manager::ResourceManager::Shutdown();
scwx::qt::manager::SettingsManager::Instance().Shutdown();
// Shutdown AWS SDK
Aws::ShutdownAPI(awsSdkOptions);
return 0;
}
}
// Save high privilege settings
if (disableHighPrivilegeWarning)
{
generalSettings.high_privilege_warning_enabled().SetValue(false);
scwx::qt::manager::SettingsManager::Instance().SaveSettings();
}
// Run initial setup if required
if (scwx::qt::ui::setup::SetupWizard::IsSetupRequired())

View file

@ -80,6 +80,7 @@ public:
warningsProvider_.SetDefault(defaultWarningsProviderValue);
cursorIconAlwaysOn_.SetDefault(false);
radarSiteThreshold_.SetDefault(0.0);
highPrivilegeWarningEnabled_.SetDefault(true);
fontSizes_.SetElementMinimum(1);
fontSizes_.SetElementMaximum(72);
@ -175,6 +176,8 @@ public:
SettingsVariable<std::string> warningsProvider_ {"warnings_provider"};
SettingsVariable<bool> cursorIconAlwaysOn_ {"cursor_icon_always_on"};
SettingsVariable<double> radarSiteThreshold_ {"radar_site_threshold"};
SettingsVariable<bool> highPrivilegeWarningEnabled_ {
"high_privilege_warning_enabled"};
};
GeneralSettings::GeneralSettings() :
@ -210,7 +213,8 @@ GeneralSettings::GeneralSettings() :
&p->updateNotificationsEnabled_,
&p->warningsProvider_,
&p->cursorIconAlwaysOn_,
&p->radarSiteThreshold_});
&p->radarSiteThreshold_,
&p->highPrivilegeWarningEnabled_});
SetDefaults();
}
GeneralSettings::~GeneralSettings() = default;
@ -375,6 +379,11 @@ SettingsVariable<double>& GeneralSettings::radar_site_threshold() const
return p->radarSiteThreshold_;
}
SettingsVariable<bool>& GeneralSettings::high_privilege_warning_enabled() const
{
return p->highPrivilegeWarningEnabled_;
}
bool GeneralSettings::Shutdown()
{
bool dataChanged = false;
@ -429,7 +438,9 @@ bool operator==(const GeneralSettings& lhs, const GeneralSettings& rhs)
rhs.p->updateNotificationsEnabled_ &&
lhs.p->warningsProvider_ == rhs.p->warningsProvider_ &&
lhs.p->cursorIconAlwaysOn_ == rhs.p->cursorIconAlwaysOn_ &&
lhs.p->radarSiteThreshold_ == rhs.p->radarSiteThreshold_);
lhs.p->radarSiteThreshold_ == rhs.p->radarSiteThreshold_ &&
lhs.p->highPrivilegeWarningEnabled_ ==
rhs.p->highPrivilegeWarningEnabled_);
}
} // namespace settings

View file

@ -56,6 +56,7 @@ public:
SettingsVariable<std::string>& warnings_provider() const;
SettingsVariable<bool>& cursor_icon_always_on() const;
SettingsVariable<double>& radar_site_threshold() const;
SettingsVariable<bool>& high_privilege_warning_enabled() const;
static GeneralSettings& Instance();

View file

@ -0,0 +1,47 @@
#include "high_privilege_dialog.hpp"
#include "ui_high_privilege_dialog.h"
#include <scwx/util/logger.hpp>
#include <QPushButton>
namespace scwx
{
namespace qt
{
namespace ui
{
static const std::string logPrefix_ = "scwx::qt::ui::high_privilege_dialog";
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
class HighPrivilegeDialogImpl
{
public:
explicit HighPrivilegeDialogImpl(HighPrivilegeDialog* self) :
self_ {self} {};
~HighPrivilegeDialogImpl() = default;
HighPrivilegeDialog* self_;
};
HighPrivilegeDialog::HighPrivilegeDialog(QWidget* parent) :
QDialog(parent),
p {std::make_unique<HighPrivilegeDialogImpl>(this)},
ui(new Ui::HighPrivilegeDialog)
{
ui->setupUi(this);
}
bool HighPrivilegeDialog::disable_high_privilege_message() {
return ui->highPrivilegeCheckBox->isChecked();
}
HighPrivilegeDialog::~HighPrivilegeDialog()
{
delete ui;
}
} // namespace ui
} // namespace qt
} // namespace scwx

View file

@ -0,0 +1,40 @@
#pragma once
#include <QDialog>
namespace Ui
{
class HighPrivilegeDialog;
}
namespace scwx
{
namespace qt
{
namespace ui
{
class HighPrivilegeDialogImpl;
class HighPrivilegeDialog : public QDialog
{
Q_OBJECT
private:
Q_DISABLE_COPY(HighPrivilegeDialog)
public:
explicit HighPrivilegeDialog(QWidget* parent = nullptr);
~HighPrivilegeDialog();
bool disable_high_privilege_message();
private:
friend HighPrivilegeDialogImpl;
std::unique_ptr<HighPrivilegeDialogImpl> p;
Ui::HighPrivilegeDialog* ui;
};
} // namespace ui
} // namespace qt
} // namespace scwx

View file

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>HighPrivilegeDialog</class>
<widget class="QDialog" name="HighPrivilegeDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>301</width>
<height>269</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Warning: High Privilege</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;h1 align=&quot;center&quot; style=&quot; margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:xx-large; font-weight:700; color:#ff0000;&quot;&gt;Warning: Run Supercell Wx with Low Privileges.&lt;/span&gt;&lt;/h1&gt;&lt;p align=&quot;center&quot;&gt;Please run Supercell Wx without admin or root permissions. Supercell Wx should not need such permissions to run. If you do not want to run Supercell Wx with high privilege, click &amp;quot;Close&amp;quot;, and relaunch with lower permissions. Otherwise, click &amp;quot;Ignore&amp;quot;. You may disable this warning with the checkbox below.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::TextFormat::RichText</enum>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="highPrivilegeCheckBox">
<property name="text">
<string>Disable High Privilege Warning</string>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Close|QDialogButtonBox::StandardButton::Ignore</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../../../../scwx-qt.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>HighPrivilegeDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>HighPrivilegeDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>