Sandboxie/SandboxiePlus/SandMan/Windows/SettingsWindow.cpp

1531 lines
52 KiB
C++
Raw Normal View History

2021-10-16 16:19:51 +01:00
#include "stdafx.h"
#include "SettingsWindow.h"
#include "SandMan.h"
#include "../MiscHelpers/Common/Settings.h"
#include "../MiscHelpers/Common/Common.h"
2022-11-20 16:23:15 +00:00
#include "../MiscHelpers/Common/OtherFunctions.h"
2021-10-16 16:19:51 +01:00
#include "Helpers/WinAdmin.h"
#include "../QSbieAPI/Sandboxie/SbieTemplates.h"
#include "../QSbieAPI/SbieUtils.h"
2022-05-29 07:07:17 +01:00
#include "OptionsWindow.h"
2022-08-11 23:09:35 +01:00
#include "../OnlineUpdater.h"
2022-11-20 16:23:15 +00:00
#include "../MiscHelpers/Archive/ArchiveFS.h"
#include <QJsonDocument>
2021-10-16 16:19:51 +01:00
2022-09-29 17:28:48 +01:00
#include <windows.h>
#include <shellapi.h>
2021-10-16 16:19:51 +01:00
QSize CustomTabStyle::sizeFromContents(ContentsType type, const QStyleOption* option, const QSize& size, const QWidget* widget) const {
QSize s = QProxyStyle::sizeFromContents(type, option, size, widget);
2022-08-20 13:48:18 +01:00
if (type == QStyle::CT_TabBarTab && widget->property("isSidebar").toBool()) {
2021-10-16 16:19:51 +01:00
s.transpose();
2022-08-10 19:14:37 +01:00
if(theGUI->m_FusionTheme)
2021-10-16 16:19:51 +01:00
s.setHeight(s.height() * 13 / 10);
else
s.setHeight(s.height() * 15 / 10);
s.setWidth(s.width() * 11 / 10); // for the the icon
}
return s;
}
void CustomTabStyle::drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const {
2022-08-20 13:48:18 +01:00
if (element == CE_TabBarTabLabel && widget->property("isSidebar").toBool()) {
2021-10-16 16:19:51 +01:00
if (const QStyleOptionTab* tab = qstyleoption_cast<const QStyleOptionTab*>(option)) {
QStyleOptionTab opt(*tab);
opt.shape = QTabBar::RoundedNorth;
//opt.iconSize = QSize(32, 32);
opt.iconSize = QSize(24, 24);
QProxyStyle::drawControl(element, &opt, painter, widget);
return;
}
}
QProxyStyle::drawControl(element, option, painter, widget);
}
2022-08-10 19:14:37 +01:00
void FixTriStateBoxPallete(QWidget* pWidget)
{
if (QApplication::style()->objectName() == "windows") {
//
2022-12-07 16:32:40 +00:00
// the built in "windows" theme of Qt does not properly rendered PartiallyChecked
2022-08-10 19:14:37 +01:00
// checkboxes, to remedi this issue we connect to the stateChanged slot
// and change the pattern to improve the rendering.
//
foreach(QCheckBox* pCheck, pWidget->findChildren<QCheckBox*>()) {
QObject::connect(pCheck, &QCheckBox::stateChanged, [pCheck](int state) {
if (pCheck->isTristate()) {
QPalette palette = QApplication::palette();
if (state == Qt::PartiallyChecked)
palette.setColor(QPalette::Base, Qt::darkGray);
pCheck->setPalette(palette);
}
});
}
}
}
2022-09-29 17:28:48 +01:00
void AddIconToLabel(QLabel* pLabel, const QPixmap& Pixmap)
{
QWidget* pParent = pLabel->parentWidget();
QWidget* pWidget = new QWidget(pParent);
pParent->layout()->replaceWidget(pLabel, pWidget);
QHBoxLayout* pLayout = new QHBoxLayout(pWidget);
pLayout->setContentsMargins(0, 0, 0, 0);
pLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
pLayout->setSpacing(1);
QLabel* pIcon = new QLabel();
pIcon = new QLabel();
pIcon->setPixmap(Pixmap);
pLayout->addWidget(pIcon);
pLayout->addWidget(pLabel);
}
2021-10-16 16:19:51 +01:00
int CSettingsWindow__Chk2Int(Qt::CheckState state)
{
switch (state) {
case Qt::Unchecked: return 0;
case Qt::Checked: return 1;
default:
case Qt::PartiallyChecked: return 2;
}
}
Qt::CheckState CSettingsWindow__Int2Chk(int state)
{
switch (state) {
case 0: return Qt::Unchecked;
case 1: return Qt::Checked;
default:
case 2: return Qt::PartiallyChecked;
}
}
quint32 g_FeatureFlags = 0;
2022-01-13 22:52:58 +00:00
QByteArray g_Certificate;
SCertInfo g_CertInfo = { 0 };
2022-08-15 12:18:26 +01:00
CSettingsWindow::CSettingsWindow(QWidget* parent)
: CConfigDialog(parent)
2021-10-16 16:19:51 +01:00
{
Qt::WindowFlags flags = windowFlags();
flags |= Qt::CustomizeWindowHint;
//flags &= ~Qt::WindowContextHelpButtonHint;
//flags &= ~Qt::WindowSystemMenuHint;
//flags &= ~Qt::WindowMinMaxButtonsHint;
flags |= Qt::WindowMinimizeButtonHint;
//flags &= ~Qt::WindowCloseButtonHint;
setWindowFlags(flags);
bool bAlwaysOnTop = theConf->GetBool("Options/AlwaysOnTop", false);
this->setWindowFlag(Qt::WindowStaysOnTopHint, bAlwaysOnTop);
2022-07-29 09:24:32 +01:00
ui.setupUi(this);
this->setWindowTitle(tr("Sandboxie Plus - Global Settings"));
2022-07-29 09:24:32 +01:00
if (theConf->GetBool("Options/AltRowColors", false)) {
ui.treeWarnProgs->setAlternatingRowColors(true);
ui.treeCompat->setAlternatingRowColors(true);
}
2021-10-16 16:19:51 +01:00
2022-08-10 19:14:37 +01:00
FixTriStateBoxPallete(this);
2021-10-16 16:19:51 +01:00
ui.tabs->setTabPosition(QTabWidget::West);
ui.tabs->tabBar()->setStyle(new CustomTabStyle(ui.tabs->tabBar()->style()));
2022-08-20 13:48:18 +01:00
ui.tabs->tabBar()->setProperty("isSidebar", true);
2021-10-16 16:19:51 +01:00
2022-09-29 17:28:48 +01:00
ui.tabs->setTabIcon(0, CSandMan::GetIcon("Config"));
ui.tabs->setTabIcon(1, CSandMan::GetIcon("Shell"));
2022-11-29 17:26:51 +00:00
ui.tabs->setTabIcon(2, CSandMan::GetIcon("Design"));
2022-09-29 17:28:48 +01:00
ui.tabs->setTabIcon(3, CSandMan::GetIcon("Advanced"));
ui.tabs->setTabIcon(4, CSandMan::GetIcon("Alarm"));
2022-12-03 19:25:04 +00:00
ui.tabs->setTabIcon(5, CSandMan::GetIcon("Compatibility"));
2022-12-15 13:45:37 +00:00
ui.tabs->setTabIcon(6, CSandMan::GetIcon("Editor"));
2022-12-03 19:25:04 +00:00
ui.tabs->setTabIcon(7, CSandMan::GetIcon("Support"));
2022-09-29 17:28:48 +01:00
2022-12-15 13:45:37 +00:00
ui.tabsGUI->setTabIcon(0, CSandMan::GetIcon("GUI"));
2022-11-29 17:26:51 +00:00
ui.tabsGUI->setTabIcon(1, CSandMan::GetIcon("Run"));
ui.tabsAdvanced->setTabIcon(0, CSandMan::GetIcon("Options"));
2022-12-15 13:45:37 +00:00
ui.tabsAdvanced->setTabIcon(1, CSandMan::GetIcon("EditIni"));
2022-11-29 17:26:51 +00:00
2022-09-29 17:28:48 +01:00
int size = 16.0;
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
size *= (QApplication::desktop()->logicalDpiX() / 96.0); // todo Qt6
#endif
AddIconToLabel(ui.lblGeneral, CSandMan::GetIcon("Options").pixmap(size,size));
AddIconToLabel(ui.lblRecovery, CSandMan::GetIcon("Recover").pixmap(size,size));
AddIconToLabel(ui.lblStartUp, CSandMan::GetIcon("Start").pixmap(size,size));
AddIconToLabel(ui.lblRunBoxed, CSandMan::GetIcon("Run").pixmap(size,size));
AddIconToLabel(ui.lblStartMenu, CSandMan::GetIcon("StartMenu").pixmap(size,size));
AddIconToLabel(ui.lblSysTray, CSandMan::GetIcon("Maintenance").pixmap(size,size));
AddIconToLabel(ui.lblInterface, CSandMan::GetIcon("GUI").pixmap(size,size));
AddIconToLabel(ui.lblBoxRoot, CSandMan::GetIcon("Sandbox").pixmap(size,size));
AddIconToLabel(ui.lblBoxFeatures, CSandMan::GetIcon("Miscellaneous").pixmap(size,size));
2021-10-16 16:19:51 +01:00
2022-09-29 17:28:48 +01:00
AddIconToLabel(ui.lblProtection, CSandMan::GetIcon("Lock").pixmap(size,size));
AddIconToLabel(ui.lblUpdates, CSandMan::GetIcon("Update").pixmap(size,size));
int iViewMode = theConf->GetInt("Options/ViewMode", 1);
/*if (iViewMode == 0)
{
if (iOptionLayout == 1)
ui.tabs->removeTab(6); // ini edit
else
ui.tabs->removeTab(7); // ini edit
}*/
2021-10-16 16:19:51 +01:00
ui.tabs->setCurrentIndex(0);
{
2022-11-20 16:23:15 +00:00
ui.uiLang->addItem(tr("Auto Detection"), "");
ui.uiLang->addItem(tr("No Translation"), "native");
C7zFileEngineHandler LangFS(QApplication::applicationDirPath() + "/translations.7z", "lang", this);
QString langDir;
if (LangFS.IsOpen())
langDir = LangFS.Prefix() + "/";
else
langDir = QApplication::applicationDirPath() + "/translations/";
foreach(const QString & langFile, QDir(langDir).entryList(QStringList("sandman_*.qm"), QDir::Files))
{
QString Code = langFile.mid(8, langFile.length() - 8 - 3);
QLocale Locale(Code);
QString Lang = Locale.nativeLanguageName();
ui.uiLang->addItem(Lang, Code);
}
ui.uiLang->setCurrentIndex(ui.uiLang->findData(theConf->GetString("Options/UiLanguage")));
2021-10-16 16:19:51 +01:00
}
2022-09-29 17:28:48 +01:00
ui.cmbIntegrateMenu->addItem(tr("Don't integrate links"));
ui.cmbIntegrateMenu->addItem(tr("As sub group"));
ui.cmbIntegrateMenu->addItem(tr("Fully integrate"));
2021-10-16 16:19:51 +01:00
ui.cmbSysTray->addItem(tr("Don't show any icon"));
ui.cmbSysTray->addItem(tr("Show Plus icon"));
ui.cmbSysTray->addItem(tr("Show Classic icon"));
2022-02-05 14:09:53 +00:00
ui.cmbTrayBoxes->addItem(tr("All Boxes"));
ui.cmbTrayBoxes->addItem(tr("Active + Pinned"));
ui.cmbTrayBoxes->addItem(tr("Pinned Only"));
2022-07-09 10:46:07 +01:00
ui.cmbDPI->addItem(tr("None"), 0);
ui.cmbDPI->addItem(tr("Native"), 1);
ui.cmbDPI->addItem(tr("Qt"), 2);
2022-12-03 19:25:04 +00:00
ui.cmbUpdate->addItem(tr("Ignore"), "ignore");
2022-11-27 10:29:36 +00:00
ui.cmbUpdate->addItem(tr("Notify"), "notify");
ui.cmbUpdate->addItem(tr("Download & Notify"), "download");
ui.cmbUpdate->addItem(tr("Download & Install"), "install");
2022-12-03 19:25:04 +00:00
//ui.cmbRelease->addItem(tr("Ignore"), "ignore");
2022-11-27 10:29:36 +00:00
ui.cmbRelease->addItem(tr("Notify"), "notify");
ui.cmbRelease->addItem(tr("Download & Notify"), "download");
ui.cmbRelease->addItem(tr("Download & Install"), "install");
2022-07-09 10:46:07 +01:00
int FontScales[] = { 75,100,125,150,175,200,225,250,275,300,350,400, 0 };
2022-09-29 17:28:48 +01:00
for (int* pFontScales = FontScales; *pFontScales != 0; pFontScales++)
2022-07-20 19:54:09 +01:00
ui.cmbFontScale->addItem(tr("%1").arg(*pFontScales), *pFontScales);
2021-10-16 16:19:51 +01:00
2022-09-29 17:28:48 +01:00
QSettings CurrentVersion("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", QSettings::NativeFormat);
if (CurrentVersion.value("CurrentBuild").toInt() >= 22000) { // Windows 11
2022-07-01 07:19:30 +01:00
QCheckBox* SecretCheckBox = new CSecretCheckBox(ui.chkShellMenu->text());
((QGridLayout*)((QWidget*)ui.chkShellMenu->parent())->layout())->replaceWidget(ui.chkShellMenu, SecretCheckBox);
ui.chkShellMenu->deleteLater();
ui.chkShellMenu = SecretCheckBox;
}
2021-10-16 16:19:51 +01:00
LoadSettings();
2022-07-01 07:19:30 +01:00
2022-07-09 10:46:07 +01:00
connect(ui.uiLang, SIGNAL(currentIndexChanged(int)), this, SLOT(OnChangeGUI()));
connect(ui.cmbDPI, SIGNAL(currentIndexChanged(int)), this, SLOT(OnChangeGUI()));
connect(ui.chkDarkTheme, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
2022-08-10 19:14:37 +01:00
connect(ui.chkFusionTheme, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
2022-07-29 09:24:32 +01:00
connect(ui.chkAltRows, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
2022-07-09 10:46:07 +01:00
connect(ui.chkBackground, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
connect(ui.chkLargeIcons, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
connect(ui.chkNoIcons, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
2022-07-09 23:06:11 +01:00
//connect(ui.chkOptTree, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
2022-09-29 17:28:48 +01:00
//connect(ui.chkNewLayout, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
2022-07-10 17:28:10 +01:00
connect(ui.chkColorIcons, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
2022-07-09 10:46:07 +01:00
connect(ui.cmbFontScale, SIGNAL(currentIndexChanged(int)), this, SLOT(OnChangeGUI()));
2022-07-20 19:54:09 +01:00
connect(ui.cmbFontScale, SIGNAL(currentTextChanged(const QString&)), this, SLOT(OnChangeGUI()));
2022-07-09 10:46:07 +01:00
m_bRebuildUI = false;
2022-07-01 07:19:30 +01:00
2022-09-29 17:28:48 +01:00
connect(ui.chkScanMenu, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
2021-10-16 16:19:51 +01:00
connect(ui.cmbSysTray, SIGNAL(currentIndexChanged(int)), this, SLOT(OnChange()));
2022-02-05 14:09:53 +00:00
connect(ui.cmbTrayBoxes, SIGNAL(currentIndexChanged(int)), this, SLOT(OnChange()));
2022-07-10 17:28:10 +01:00
connect(ui.chkCompactTray, SIGNAL(stateChanged(int)), this, SLOT(OnChangeGUI()));
2021-10-16 16:19:51 +01:00
2022-11-29 17:26:51 +00:00
connect(ui.btnAddCmd, SIGNAL(clicked(bool)), this, SLOT(OnAddCommand()));
QMenu* pRunBtnMenu = new QMenu(ui.btnAddCmd);
pRunBtnMenu->addAction(tr("Browse for Program"), this, SLOT(OnBrowsePath()));
ui.btnAddCmd->setPopupMode(QToolButton::MenuButtonPopup);
ui.btnAddCmd->setMenu(pRunBtnMenu);
connect(ui.btnDelCmd, SIGNAL(clicked(bool)), this, SLOT(OnDelCommand()));
connect(ui.treeRun, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(OnRunChanged()));
2021-10-16 16:19:51 +01:00
m_FeaturesChanged = false;
connect(ui.chkWFP, SIGNAL(stateChanged(int)), this, SLOT(OnFeaturesChanged()));
2021-11-13 08:28:32 +00:00
connect(ui.chkObjCb, SIGNAL(stateChanged(int)), this, SLOT(OnFeaturesChanged()));
2022-02-13 11:55:52 +00:00
//connect(ui.chkWin32k, SIGNAL(stateChanged(int)), this, SLOT(OnFeaturesChanged()));
2022-08-15 12:18:26 +01:00
2022-09-29 17:28:48 +01:00
if (CurrentVersion.value("CurrentBuild").toInt() < 14393) // Windows 10 RS1 and later
2022-08-15 12:18:26 +01:00
ui.chkWin32k->setEnabled(false);
2021-10-16 16:19:51 +01:00
m_WarnProgsChanged = false;
connect(ui.chkPassRequired, SIGNAL(stateChanged(int)), this, SLOT(OnChange()));
connect(ui.btnSetPassword, SIGNAL(clicked(bool)), this, SLOT(OnSetPassword()));
connect(ui.chkStartBlock, SIGNAL(stateChanged(int)), this, SLOT(OnWarnChanged()));
connect(ui.chkStartBlockMsg, SIGNAL(stateChanged(int)), this, SLOT(OnWarnChanged()));
2022-09-29 17:28:48 +01:00
connect(ui.chkNotForcedMsg, SIGNAL(stateChanged(int)), this, SLOT(OnWarnChanged()));
2021-10-16 16:19:51 +01:00
connect(ui.btnAddWarnProg, SIGNAL(clicked(bool)), this, SLOT(OnAddWarnProg()));
connect(ui.btnAddWarnFolder, SIGNAL(clicked(bool)), this, SLOT(OnAddWarnFolder()));
connect(ui.btnDelWarnProg, SIGNAL(clicked(bool)), this, SLOT(OnDelWarnProg()));
connect(ui.btnBrowse, SIGNAL(clicked(bool)), this, SLOT(OnBrowse()));
connect(ui.chkAutoRoot, SIGNAL(stateChanged(int)), this, SLOT(OnChange()));
connect(ui.btnAddCompat, SIGNAL(clicked(bool)), this, SLOT(OnAddCompat()));
connect(ui.btnDelCompat, SIGNAL(clicked(bool)), this, SLOT(OnDelCompat()));
m_CompatLoaded = 0;
m_CompatChanged = false;
ui.chkNoCompat->setChecked(!theConf->GetBool("Options/AutoRunSoftCompat", true));
2021-10-16 16:19:51 +01:00
connect(ui.treeCompat, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(OnTemplateClicked(QTreeWidgetItem*, int)));
2022-05-29 07:07:17 +01:00
connect(ui.treeCompat, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(OnTemplateDoubleClicked(QTreeWidgetItem*, int)));
2021-10-16 16:19:51 +01:00
connect(ui.lblSupport, SIGNAL(linkActivated(const QString&)), theGUI, SLOT(OpenUrl(const QString&)));
connect(ui.lblSupportCert, SIGNAL(linkActivated(const QString&)), theGUI, SLOT(OpenUrl(const QString&)));
2022-01-13 22:52:58 +00:00
connect(ui.lblCertExp, SIGNAL(linkActivated(const QString&)), theGUI, SLOT(OpenUrl(const QString&)));
2021-10-16 16:19:51 +01:00
m_CertChanged = false;
connect(ui.txtCertificate, SIGNAL(textChanged()), this, SLOT(CertChanged()));
2022-01-13 22:52:58 +00:00
connect(theGUI, SIGNAL(CertUpdated()), this, SLOT(UpdateCert()));
2021-10-16 16:19:51 +01:00
2022-05-08 13:41:49 +01:00
ui.txtCertificate->setPlaceholderText(
"NAME: User Name\n"
"LEVEL: ULTIMATE\n"
"DATE: dd.mm.yyyy\n"
"UPDATEKEY: 00000000000000000000000000000000\n"
"SIGNATURE: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
);
2022-08-11 23:09:35 +01:00
connect(ui.lblCurrent, SIGNAL(linkActivated(const QString&)), this, SLOT(OnUpdate(const QString&)));
2022-11-20 16:23:15 +00:00
connect(ui.lblStable, SIGNAL(linkActivated(const QString&)), this, SLOT(OnUpdate(const QString&)));
2022-08-11 23:09:35 +01:00
connect(ui.lblPreview, SIGNAL(linkActivated(const QString&)), this, SLOT(OnUpdate(const QString&)));
2022-12-03 19:25:04 +00:00
//connect(ui.lblLive, SIGNAL(linkActivated(const QString&)), this, SLOT(OnUpdate(const QString&)));
2022-11-20 16:23:15 +00:00
connect(ui.chkAutoUpdate, SIGNAL(toggled(bool)), this, SLOT(UpdateUpdater()));
connect(ui.radStable, SIGNAL(toggled(bool)), this, SLOT(UpdateUpdater()));
connect(ui.radPreview, SIGNAL(toggled(bool)), this, SLOT(UpdateUpdater()));
2022-12-03 19:25:04 +00:00
//connect(ui.radLive, SIGNAL(toggled(bool)), this, SLOT(UpdateUpdater()));
2022-08-11 23:09:35 +01:00
2021-10-16 16:19:51 +01:00
connect(ui.tabs, SIGNAL(currentChanged(int)), this, SLOT(OnTab()));
2022-01-13 22:52:58 +00:00
// edit
connect(ui.btnEditIni, SIGNAL(clicked(bool)), this, SLOT(OnEditIni()));
connect(ui.btnSaveIni, SIGNAL(clicked(bool)), this, SLOT(OnSaveIni()));
connect(ui.btnCancelEdit, SIGNAL(clicked(bool)), this, SLOT(OnCancelEdit()));
//connect(ui.txtIniSection, SIGNAL(textChanged()), this, SLOT(OnOptChanged()));
2021-10-16 16:19:51 +01:00
connect(ui.buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), this, SLOT(ok()));
connect(ui.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked(bool)), this, SLOT(apply()));
connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
2022-08-15 12:18:26 +01:00
this->installEventFilter(this); // prevent enter from closing the dialog
2021-10-16 16:19:51 +01:00
restoreGeometry(theConf->GetBlob("SettingsWindow/Window_Geometry"));
2022-08-15 12:18:26 +01:00
int iOptionTree = theConf->GetInt("Options/OptionTree", 2);
if (iOptionTree == 2)
iOptionTree = iViewMode == 2 ? 1 : 0;
if (iOptionTree)
OnSetTree();
else {
2022-08-15 18:32:38 +01:00
QWidget* pSearch = AddConfigSearch(ui.tabs);
ui.horizontalLayout->insertWidget(0, pSearch);
QTimer::singleShot(0, [this]() {
m_pSearch->setMaximumWidth(m_pTabs->tabBar()->width());
});
2022-09-29 17:28:48 +01:00
QAction* pSetTree = new QAction();
connect(pSetTree, SIGNAL(triggered()), this, SLOT(OnSetTree()));
pSetTree->setShortcut(QKeySequence("Ctrl+Alt+T"));
pSetTree->setShortcutContext(Qt::WidgetWithChildrenShortcut);
this->addAction(pSetTree);
2022-08-15 12:18:26 +01:00
}
2022-08-20 19:11:27 +01:00
m_pSearch->setPlaceholderText(tr("Search for settings"));
2022-08-15 12:18:26 +01:00
}
void CSettingsWindow::OnSetTree()
{
if (!ui.tabs) return;
QWidget* pAltView = ConvertToTree(ui.tabs);
ui.verticalLayout->replaceWidget(ui.tabs, pAltView);
ui.tabs->deleteLater();
ui.tabs = NULL;
2021-10-16 16:19:51 +01:00
}
CSettingsWindow::~CSettingsWindow()
{
theConf->SetBlob("SettingsWindow/Window_Geometry",saveGeometry());
}
2022-07-10 17:28:10 +01:00
void CSettingsWindow::showTab(int Tab, bool bExclusive)
2021-10-16 16:19:51 +01:00
{
2022-09-29 17:28:48 +01:00
QWidget* pWidget = NULL;
switch (Tab)
{
case eOptions: pWidget = ui.tabGeneral; break;
case eShell: pWidget = ui.tabShell; break;
case eGuiConfig: pWidget = ui.tabGUI; break;
2022-11-29 17:26:51 +00:00
case eAdvanced: pWidget = ui.tabSandbox; break;
2022-09-29 17:28:48 +01:00
case eProgCtrl: pWidget = ui.tabAlerts; break;
case eConfigLock: pWidget = ui.tabLock; break;
case eSoftCompat: pWidget = ui.tabCompat; break;
case eEditIni: pWidget = ui.tabEdit; break;
case eSupport: pWidget = ui.tabSupport; break;
2022-08-15 12:18:26 +01:00
}
2022-08-15 10:58:39 +01:00
2022-09-29 17:28:48 +01:00
if (ui.tabs)
ui.tabs->setCurrentWidget(pWidget);
else
m_pStack->setCurrentWidget(pWidget);
2022-08-15 12:18:26 +01:00
if(pWidget == ui.tabCompat)
2022-07-09 10:46:07 +01:00
m_CompatLoaded = 2;
2022-08-15 12:18:26 +01:00
if(pWidget == ui.tabSupport)
2022-07-09 10:46:07 +01:00
ui.chkNoCheck->setVisible(true);
2021-10-16 16:19:51 +01:00
2022-08-15 12:18:26 +01:00
if (bExclusive) {
if (ui.tabs)
ui.tabs->tabBar()->setVisible(false);
else {
m_pTree->setVisible(false);
m_pSearch->setVisible(false);
}
}
2022-07-10 17:28:10 +01:00
2022-01-14 13:06:01 +00:00
SafeShow(this);
2022-01-13 22:52:58 +00:00
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow::closeEvent(QCloseEvent *e)
{
emit Closed();
this->deleteLater();
}
2022-08-15 12:18:26 +01:00
bool CSettingsWindow::eventFilter(QObject *source, QEvent *event)
{
2022-08-20 21:32:51 +01:00
//if (event->type() == QEvent::KeyPress && ((QKeyEvent*)event)->key() == Qt::Key_Escape
// && ((QKeyEvent*)event)->modifiers() == Qt::NoModifier)
//{
// return true; // cancel event
//}
2022-08-15 12:18:26 +01:00
if (event->type() == QEvent::KeyPress && (((QKeyEvent*)event)->key() == Qt::Key_Enter || ((QKeyEvent*)event)->key() == Qt::Key_Return)
2022-08-20 21:32:51 +01:00
&& (((QKeyEvent*)event)->modifiers() == Qt::NoModifier || ((QKeyEvent*)event)->modifiers() == Qt::KeypadModifier))
2022-08-15 12:18:26 +01:00
{
return true; // cancel event
}
return QDialog::eventFilter(source, event);
}
2022-11-29 17:26:51 +00:00
void CSettingsWindow::OnBrowsePath()
{
QString Value = QFileDialog::getOpenFileName(this, tr("Select Program"), "", tr("Executables (*.exe *.cmd)")).replace("/", "\\");
if (Value.isEmpty())
return;
QString Name = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter a menu title"), QLineEdit::Normal);
if (Name.isEmpty())
return;
AddRunItem(Name, Value);
}
void CSettingsWindow::OnAddCommand()
{
QString Value = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter a command"), QLineEdit::Normal);
if (Value.isEmpty())
return;
QString Name = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter a menu title"), QLineEdit::Normal);
if (Name.isEmpty())
return;
AddRunItem(Name, Value);
}
void CSettingsWindow::AddRunItem(const QString& Name, const QString& Command)
{
QTreeWidgetItem* pItem = new QTreeWidgetItem();
pItem->setText(0, Name);
pItem->setText(1, Command);
pItem->setFlags(pItem->flags() | Qt::ItemIsEditable);
ui.treeRun->addTopLevelItem(pItem);
}
void CSettingsWindow::OnDelCommand()
{
QTreeWidgetItem* pItem = ui.treeRun->currentItem();
if (!pItem)
return;
delete pItem;
}
2021-10-16 16:19:51 +01:00
Qt::CheckState CSettingsWindow__IsContextMenu()
{
2022-09-22 15:53:13 +01:00
//QSettings Package("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\PackagedCom\\Package", QSettings::NativeFormat);
QSettings Package("HKEY_CURRENT_USER\\Software\\Classes\\PackagedCom\\Package", QSettings::NativeFormat);
foreach(const QString & Key, Package.childGroups()) {
2022-05-15 12:26:22 +01:00
if (Key.indexOf("SandboxieShell") == 0)
return Qt::Checked;
}
2021-10-16 16:19:51 +01:00
QString cmd = CSbieUtils::GetContextMenuStartCmd();
2022-02-04 21:08:25 +00:00
if (cmd.contains("SandMan.exe", Qt::CaseInsensitive))
2021-10-16 16:19:51 +01:00
return Qt::Checked; // set up and sandman
if (!cmd.isEmpty()) // ... probably sbiectrl.exe
return Qt::PartiallyChecked;
return Qt::Unchecked; // not set up
}
2022-07-01 07:19:30 +01:00
void CSettingsWindow__AddContextMenu(bool bAlwaysClassic)
2022-02-04 21:08:25 +00:00
{
2022-09-22 15:53:13 +01:00
QSettings CurrentVersion("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", QSettings::NativeFormat);
if (CurrentVersion.value("CurrentBuild").toInt() >= 22000 && !bAlwaysClassic) // Windows 11
2022-05-15 12:26:22 +01:00
{
2022-09-22 15:53:13 +01:00
QSettings MyReg("HKEY_CURRENT_USER\\SOFTWARE\\Xanasoft\\Sandboxie-Plus\\SbieShellExt\\Lang", QSettings::NativeFormat);
2022-09-22 16:56:24 +01:00
MyReg.setValue("Open Sandboxed", CSettingsWindow::tr("Run &Sandboxed"));
MyReg.setValue("Explore Sandboxed", CSettingsWindow::tr("Run &Sandboxed"));
2022-09-22 15:53:13 +01:00
QDir::setCurrent(QCoreApplication::applicationDirPath());
2022-05-15 12:26:22 +01:00
QProcess Proc;
2022-08-10 19:14:37 +01:00
Proc.execute("rundll32.exe", QStringList() << "SbieShellExt.dll,RegisterPackage");
2022-05-15 12:26:22 +01:00
Proc.waitForFinished();
return;
}
2022-02-04 21:08:25 +00:00
CSbieUtils::AddContextMenu(QApplication::applicationDirPath().replace("/", "\\") + "\\SandMan.exe",
2022-02-13 12:24:16 +00:00
CSettingsWindow::tr("Run &Sandboxed"), //CSettingsWindow::tr("Explore &Sandboxed"),
2022-02-04 21:08:25 +00:00
QApplication::applicationDirPath().replace("/", "\\") + "\\Start.exe");
}
2022-05-15 12:26:22 +01:00
void CSettingsWindow__RemoveContextMenu()
{
2022-09-22 15:53:13 +01:00
QSettings CurrentVersion("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", QSettings::NativeFormat);
if (CurrentVersion.value("CurrentBuild").toInt() >= 22000) // Windows 11
2022-05-15 12:26:22 +01:00
{
2022-09-22 15:53:13 +01:00
QDir::setCurrent(QCoreApplication::applicationDirPath());
2022-05-15 12:26:22 +01:00
QProcess Proc;
2022-08-10 19:14:37 +01:00
Proc.execute("rundll32.exe", QStringList() << "SbieShellExt.dll,RemovePackage");
2022-05-15 12:26:22 +01:00
Proc.waitForFinished();
}
CSbieUtils::RemoveContextMenu();
}
void CSettingsWindow__AddBrowserIcon()
{
QString Path = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).replace("/", "\\");
Path += "\\" + CSettingsWindow::tr("Sandboxed Web Browser") + ".lnk";
CSbieUtils::CreateShortcut(theAPI, Path, "", "", "default_browser");
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow::LoadSettings()
{
ui.uiLang->setCurrentIndex(ui.uiLang->findData(theConf->GetString("Options/UiLanguage")));
ui.chkAutoStart->setChecked(IsAutorunEnabled());
2022-01-14 17:58:25 +00:00
if (theAPI->IsConnected()) {
if (theAPI->GetUserSettings()->GetBool("SbieCtrl_EnableAutoStart", true)) {
if (theAPI->GetUserSettings()->GetText("SbieCtrl_AutoStartAgent", "") != "SandMan.exe")
ui.chkSvcStart->setCheckState(Qt::PartiallyChecked);
else
ui.chkSvcStart->setChecked(true);
}
2021-10-16 16:19:51 +01:00
else
2022-01-14 17:58:25 +00:00
ui.chkSvcStart->setChecked(false);
}
else {
ui.chkSvcStart->setEnabled(false);
}
2021-10-16 16:19:51 +01:00
ui.chkShellMenu->setCheckState(CSettingsWindow__IsContextMenu());
2022-02-04 21:08:25 +00:00
ui.chkShellMenu2->setChecked(CSbieUtils::HasContextMenu2());
2021-10-16 16:19:51 +01:00
ui.chkAlwaysDefault->setChecked(theConf->GetBool("Options/RunInDefaultBox", false));
2022-07-09 10:46:07 +01:00
ui.cmbDPI->setCurrentIndex(theConf->GetInt("Options/DPIScaling", 1));
2021-10-16 16:19:51 +01:00
ui.chkDarkTheme->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/UseDarkTheme", 2)));
2022-08-10 19:14:37 +01:00
ui.chkFusionTheme->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/UseFusionTheme", 2)));
2022-07-29 09:24:32 +01:00
ui.chkAltRows->setChecked(theConf->GetBool("Options/AltRowColors", false));
2022-07-09 10:46:07 +01:00
ui.chkBackground->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/UseBackground", 2)));
ui.chkLargeIcons->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/LargeIcons", 2)));
ui.chkNoIcons->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/NoIcons", 2)));
2022-07-09 23:06:11 +01:00
ui.chkOptTree->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/OptionTree", 2)));
2022-09-29 17:28:48 +01:00
ui.chkNewLayout->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/NewConfigLayout", 2)));
2022-07-10 17:28:10 +01:00
ui.chkColorIcons->setChecked(theConf->GetBool("Options/ColorBoxIcons", false));
2022-07-09 10:46:07 +01:00
2022-07-20 19:54:09 +01:00
//ui.cmbFontScale->setCurrentIndex(ui.cmbFontScale->findData(theConf->GetInt("Options/FontScaling", 100)));
ui.cmbFontScale->setCurrentText(QString::number(theConf->GetInt("Options/FontScaling", 100)));
2021-10-16 16:19:51 +01:00
2022-12-15 13:06:58 +00:00
ui.chkSilentMode->setChecked(theConf->GetBool("Options/CheckSilentMode", true));
2021-10-16 16:19:51 +01:00
ui.chkNotifications->setChecked(theConf->GetBool("Options/ShowNotifications", true));
ui.chkSandboxUrls->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/OpenUrlsSandboxed", 2)));
ui.chkShowRecovery->setChecked(theConf->GetBool("Options/ShowRecovery", false));
ui.chkNotifyRecovery->setChecked(!theConf->GetBool("Options/InstantRecovery", true));
2022-07-29 09:24:32 +01:00
ui.chkRecoveryTop->setChecked(theConf->GetBool("Options/RecoveryOnTop", true));
2022-02-13 11:55:52 +00:00
ui.chkAsyncBoxOps->setChecked(theConf->GetBool("Options/UseAsyncBoxOps", false));
2021-10-16 16:19:51 +01:00
ui.chkPanic->setChecked(theConf->GetBool("Options/EnablePanicKey", false));
2021-11-13 12:09:32 +00:00
ui.keyPanic->setKeySequence(QKeySequence(theConf->GetString("Options/PanicKeySequence", "Shift+Pause")));
2021-10-16 16:19:51 +01:00
2022-05-16 20:30:40 +01:00
ui.chkMonitorSize->setChecked(theConf->GetBool("Options/WatchBoxSize", false));
2021-10-16 16:19:51 +01:00
ui.chkWatchConfig->setChecked(theConf->GetBool("Options/WatchIni", true));
2022-09-29 17:28:48 +01:00
ui.chkScanMenu->setChecked(theConf->GetBool("Options/ScanStartMenu", true));
ui.cmbIntegrateMenu->setCurrentIndex(theConf->GetInt("Options/IntegrateStartMenu", 0));
2021-10-16 16:19:51 +01:00
ui.cmbSysTray->setCurrentIndex(theConf->GetInt("Options/SysTrayIcon", 1));
2022-02-05 14:09:53 +00:00
ui.cmbTrayBoxes->setCurrentIndex(theConf->GetInt("Options/SysTrayFilter", 0));
2022-07-10 17:28:10 +01:00
ui.chkCompactTray->setChecked(theConf->GetBool("Options/CompactTray", false));
2022-02-13 11:55:52 +00:00
ui.chkBoxOpsNotify->setChecked(theConf->GetBool("Options/AutoBoxOpsNotify", false));
2021-10-16 16:19:51 +01:00
if (theAPI->IsConnected())
{
2022-11-29 17:26:51 +00:00
ui.treeRun->clear();
foreach(const QString& Value, theAPI->GetGlobalSettings()->GetTextList("RunCommand", false))
{
StrPair NameCmd = Split2(Value, "|");
QTreeWidgetItem* pItem = new QTreeWidgetItem();
AddRunItem(NameCmd.first, NameCmd.second);
}
2022-12-23 06:29:35 +00:00
ui.cmbDefault->clear();
foreach(const CSandBoxPtr & pBox, theAPI->GetAllBoxes())
ui.cmbDefault->addItem(pBox->GetName().replace("_", " "), pBox->GetName());
2022-12-07 10:50:33 +00:00
int pos = ui.cmbDefault->findData(theAPI->GetGlobalSettings()->GetText("DefaultBox", "DefaultBox"));
if(pos == -1)
pos = ui.cmbDefault->findData("DefaultBox");
ui.cmbDefault->setCurrentIndex(pos);
2021-10-16 16:19:51 +01:00
QString FileRootPath_Default = "\\??\\%SystemDrive%\\Sandbox\\%USER%\\%SANDBOX%";
QString KeyRootPath_Default = "\\REGISTRY\\USER\\Sandbox_%USER%_%SANDBOX%";
QString IpcRootPath_Default = "\\Sandbox\\%USER%\\%SANDBOX%\\Session_%SESSION%";
ui.fileRoot->setText(theAPI->GetGlobalSettings()->GetText("FileRootPath", FileRootPath_Default));
ui.chkSeparateUserFolders->setChecked(theAPI->GetGlobalSettings()->GetBool("SeparateUserFolders", true));
ui.regRoot->setText(theAPI->GetGlobalSettings()->GetText("KeyRootPath", KeyRootPath_Default));
ui.ipcRoot->setText(theAPI->GetGlobalSettings()->GetText("IpcRootPath", IpcRootPath_Default));
ui.chkWFP->setChecked(theAPI->GetGlobalSettings()->GetBool("NetworkEnableWFP", false));
2022-02-13 11:55:52 +00:00
ui.chkObjCb->setChecked(theAPI->GetGlobalSettings()->GetBool("EnableObjectFiltering", true));
2021-12-21 13:57:27 +00:00
ui.chkWin32k->setChecked(theAPI->GetGlobalSettings()->GetBool("EnableWin32kHooks", true));
2022-07-28 07:40:57 +01:00
ui.chkSbieLogon->setChecked(theAPI->GetGlobalSettings()->GetBool("SandboxieLogon", false));
2021-10-16 16:19:51 +01:00
ui.chkAdminOnly->setChecked(theAPI->GetGlobalSettings()->GetBool("EditAdminOnly", false));
2022-09-02 10:04:49 +01:00
ui.chkAdminOnly->setEnabled(IsAdminUser());
2021-10-16 16:19:51 +01:00
ui.chkPassRequired->setChecked(!theAPI->GetGlobalSettings()->GetText("EditPassword", "").isEmpty());
ui.chkAdminOnlyFP->setChecked(theAPI->GetGlobalSettings()->GetBool("ForceDisableAdminOnly", false));
ui.chkClearPass->setChecked(theAPI->GetGlobalSettings()->GetBool("ForgetPassword", false));
ui.chkStartBlock->setChecked(theAPI->GetGlobalSettings()->GetBool("StartRunAlertDenied", false));
2022-11-20 16:23:15 +00:00
ui.chkStartBlockMsg->setChecked(theAPI->GetGlobalSettings()->GetBool("AlertStartRunAccessDenied", true));
2022-09-29 17:28:48 +01:00
ui.chkNotForcedMsg->setChecked(theAPI->GetGlobalSettings()->GetBool("NotifyForceProcessDisabled", false));
2021-10-16 16:19:51 +01:00
ui.treeWarnProgs->clear();
foreach(const QString& Value, theAPI->GetGlobalSettings()->GetTextList("AlertProcess", false))
AddWarnEntry(Value, 1);
foreach(const QString& Value, theAPI->GetGlobalSettings()->GetTextList("AlertFolder", false))
AddWarnEntry(Value, 2);
}
2022-09-02 10:04:49 +01:00
if(!theAPI->IsConnected() || (theAPI->GetGlobalSettings()->GetBool("EditAdminOnly", false) && !IsAdminUser()))
2021-10-16 16:19:51 +01:00
{
2022-12-07 10:50:33 +00:00
ui.cmbDefault->setEnabled(false);
2021-10-16 16:19:51 +01:00
ui.fileRoot->setEnabled(false);
ui.chkSeparateUserFolders->setEnabled(false);
2022-01-14 17:58:25 +00:00
ui.chkAutoRoot->setEnabled(false);
2021-10-16 16:19:51 +01:00
ui.chkWFP->setEnabled(false);
2021-11-13 08:28:32 +00:00
ui.chkObjCb->setEnabled(false);
2021-12-10 21:59:19 +00:00
ui.chkWin32k->setEnabled(false);
2022-07-09 10:46:07 +01:00
ui.chkSbieLogon->setEnabled(false);
2021-10-16 16:19:51 +01:00
ui.regRoot->setEnabled(false);
ui.ipcRoot->setEnabled(false);
ui.chkAdminOnly->setEnabled(false);
ui.chkPassRequired->setEnabled(false);
ui.chkAdminOnlyFP->setEnabled(false);
ui.chkClearPass->setEnabled(false);
ui.btnSetPassword->setEnabled(false);
ui.treeWarnProgs->setEnabled(false);
ui.btnAddWarnProg->setEnabled(false);
ui.btnDelWarnProg->setEnabled(false);
ui.treeCompat->setEnabled(false);
ui.btnAddCompat->setEnabled(false);
ui.btnDelCompat->setEnabled(false);
2022-09-02 10:04:49 +01:00
ui.btnEditIni->setEnabled(false);
2021-10-16 16:19:51 +01:00
}
2022-01-14 13:06:01 +00:00
if (theGUI->IsFullyPortable())
ui.chkAutoRoot->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/PortableRootDir", 2)));
2021-10-16 16:19:51 +01:00
else
ui.chkAutoRoot->setVisible(false);
2022-01-13 22:52:58 +00:00
UpdateCert();
ui.chkAutoUpdate->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/CheckForUpdates", 2)));
2022-11-20 16:23:15 +00:00
//ui.chkAutoDownload->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/DownloadUpdates", 0)));
2022-05-14 09:34:44 +01:00
//ui.chkAutoInstall->setCheckState(CSettingsWindow__Int2Chk(theConf->GetInt("Options/InstallUpdates", 0)));
2022-01-13 22:52:58 +00:00
2022-11-20 16:23:15 +00:00
QString ReleaseChannel = theConf->GetString("Options/ReleaseChannel", "stable");
ui.radStable->setChecked(ReleaseChannel == "stable");
ui.radPreview->setChecked(ReleaseChannel == "preview");
2022-12-03 19:25:04 +00:00
//ui.radLive->setChecked(ReleaseChannel == "live");
2022-11-20 16:23:15 +00:00
UpdateUpdater();
2022-12-03 19:25:04 +00:00
ui.cmbUpdate->setCurrentIndex(ui.cmbUpdate->findData(theConf->GetString("Options/OnNewUpdate", "ignore")));
2022-11-20 16:23:15 +00:00
ui.cmbRelease->setCurrentIndex(ui.cmbRelease->findData(theConf->GetString("Options/OnNewRelease", "download")));
2022-08-09 17:19:46 +01:00
2022-01-13 22:52:58 +00:00
ui.chkNoCheck->setChecked(theConf->GetBool("Options/NoSupportCheck", false));
if(ui.chkNoCheck->isCheckable() && !g_CertInfo.expired)
ui.chkNoCheck->setVisible(false); // hide if not relevant
OnChange();
}
void CSettingsWindow::UpdateCert()
{
2021-10-16 16:19:51 +01:00
ui.lblCertExp->setVisible(false);
if (!g_Certificate.isEmpty())
{
ui.txtCertificate->setPlainText(g_Certificate);
//ui.lblSupport->setVisible(false);
QPalette palette = QApplication::palette();
if (theGUI->m_DarkTheme)
palette.setColor(QPalette::Text, Qt::black);
2022-09-29 17:28:48 +01:00
if (g_CertInfo.expired
#ifdef _DEBUG
|| (GetKeyState(VK_CONTROL) & 0x8000) != 0
#endif
) {
2021-11-13 08:28:32 +00:00
palette.setColor(QPalette::Base, QColor(255, 255, 192));
2022-01-13 22:52:58 +00:00
ui.lblCertExp->setText(tr("This supporter certificate has expired, please <a href=\"sbie://update/cert\">get an updated certificate</a>."));
2021-11-13 08:28:32 +00:00
ui.lblCertExp->setVisible(true);
}
else {
2022-01-13 22:52:58 +00:00
if (g_CertInfo.about_to_expire) {
ui.lblCertExp->setText(tr("This supporter certificate will <font color='red'>expire in %1 days</font>, please <a href=\"sbie://update/cert\">get an updated certificate</a>.").arg(g_CertInfo.expirers_in_sec / (60*60*24)));
ui.lblCertExp->setVisible(true);
}
2022-08-09 17:19:46 +01:00
/*#ifdef _DEBUG
else {
ui.lblCertExp->setText(tr("This supporter certificate is valid, <a href=\"sbie://update/cert\">check for an updated certificate</a>."));
ui.lblCertExp->setVisible(true);
}
#endif*/
2021-11-13 08:28:32 +00:00
palette.setColor(QPalette::Base, QColor(192, 255, 192));
}
2021-10-16 16:19:51 +01:00
ui.txtCertificate->setPalette(palette);
}
}
2022-11-20 16:23:15 +00:00
void CSettingsWindow::UpdateUpdater()
{
2022-12-03 19:25:04 +00:00
//ui.radLive->setEnabled(false);
2022-11-20 16:23:15 +00:00
if (!ui.chkAutoUpdate->isChecked()) {
ui.cmbUpdate->setEnabled(false);
ui.cmbRelease->setEnabled(false);
ui.lblRevision->setText(QString());
}
else {
2022-12-03 19:25:04 +00:00
if (ui.radStable->isChecked() && (!g_CertInfo.valid
2022-11-20 16:23:15 +00:00
#ifdef _DEBUG
|| (GetKeyState(VK_CONTROL) & 0x8000) != 0
#endif
2022-12-03 19:25:04 +00:00
)) {
2022-11-20 16:23:15 +00:00
ui.cmbUpdate->setEnabled(false);
2022-12-03 19:25:04 +00:00
ui.cmbUpdate->setCurrentIndex(ui.cmbUpdate->findData("ignore"));
2022-11-21 18:22:33 +00:00
ui.lblRevision->setText(tr("Supporter certificate required"));
2022-12-03 19:25:04 +00:00
}
2022-11-20 16:23:15 +00:00
else {
ui.cmbUpdate->setEnabled(true);
ui.lblRevision->setText(QString());
}
2022-12-03 19:25:04 +00:00
ui.cmbRelease->setEnabled(true);
2022-11-20 16:23:15 +00:00
}
}
2022-07-24 14:30:54 +01:00
void CSettingsWindow::WriteAdvancedCheck(QCheckBox* pCheck, const QString& Name, const QString& OnValue, const QString& OffValue)
{
//if (pCheck->checkState() == Qt::PartiallyChecked)
// return;
if (!pCheck->isEnabled())
return;
SB_STATUS Status;
if (pCheck->checkState() == Qt::Checked)
{
if(!OnValue.isEmpty())
Status = theAPI->GetGlobalSettings()->SetText(Name, OnValue);
else
Status = theAPI->GetGlobalSettings()->DelValue(Name);
}
else if (pCheck->checkState() == Qt::Unchecked)
{
if (!OffValue.isEmpty())
Status = theAPI->GetGlobalSettings()->SetText(Name, OffValue);
else
Status = theAPI->GetGlobalSettings()->DelValue(Name);
}
if (!Status)
throw Status;
}
void CSettingsWindow::WriteText(const QString& Name, const QString& Value)
{
SB_STATUS Status;
if(Value.isEmpty())
Status = theAPI->GetGlobalSettings()->DelValue(Name);
else
Status = theAPI->GetGlobalSettings()->SetText(Name, Value);
if (!Status)
throw Status;
}
void CSettingsWindow::WriteTextList(const QString& Setting, const QStringList& List)
{
SB_STATUS Status = theAPI->GetGlobalSettings()->UpdateTextList(Setting, List, false);
if (!Status)
throw Status;
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow::SaveSettings()
{
theConf->SetValue("Options/UiLanguage", ui.uiLang->currentData());
2022-07-09 10:46:07 +01:00
theConf->SetValue("Options/DPIScaling", ui.cmbDPI->currentData());
2021-10-16 16:19:51 +01:00
theConf->SetValue("Options/UseDarkTheme", CSettingsWindow__Chk2Int(ui.chkDarkTheme->checkState()));
2022-08-10 19:14:37 +01:00
theConf->SetValue("Options/UseFusionTheme", CSettingsWindow__Chk2Int(ui.chkFusionTheme->checkState()));
2022-07-29 09:24:32 +01:00
theConf->SetValue("Options/AltRowColors", ui.chkAltRows->isChecked());
2022-07-09 10:46:07 +01:00
theConf->SetValue("Options/UseBackground", CSettingsWindow__Chk2Int(ui.chkBackground->checkState()));
theConf->SetValue("Options/LargeIcons", CSettingsWindow__Chk2Int(ui.chkLargeIcons->checkState()));
theConf->SetValue("Options/NoIcons", CSettingsWindow__Chk2Int(ui.chkNoIcons->checkState()));
2022-07-09 23:06:11 +01:00
theConf->SetValue("Options/OptionTree", CSettingsWindow__Chk2Int(ui.chkOptTree->checkState()));
2022-09-29 17:28:48 +01:00
theConf->SetValue("Options/NewConfigLayout", CSettingsWindow__Chk2Int(ui.chkNewLayout->checkState()));
2022-07-10 17:28:10 +01:00
theConf->SetValue("Options/ColorBoxIcons", ui.chkColorIcons->isChecked());
2022-07-09 10:46:07 +01:00
2022-07-20 19:54:09 +01:00
int Scaling = ui.cmbFontScale->currentText().toInt();
if (Scaling < 75)
Scaling = 75;
else if (Scaling > 500)
Scaling = 500;
theConf->SetValue("Options/FontScaling", Scaling);
2021-10-16 16:19:51 +01:00
AutorunEnable(ui.chkAutoStart->isChecked());
2022-01-14 17:58:25 +00:00
if (theAPI->IsConnected()) {
if (ui.chkSvcStart->checkState() == Qt::Checked) {
theAPI->GetUserSettings()->SetBool("SbieCtrl_EnableAutoStart", true);
theAPI->GetUserSettings()->SetText("SbieCtrl_AutoStartAgent", "SandMan.exe");
}
else if (ui.chkSvcStart->checkState() == Qt::Unchecked)
theAPI->GetUserSettings()->SetBool("SbieCtrl_EnableAutoStart", false);
}
2021-10-16 16:19:51 +01:00
if (ui.chkShellMenu->checkState() != CSettingsWindow__IsContextMenu())
{
2022-07-09 10:46:07 +01:00
if (ui.chkShellMenu->isChecked()) {
CSecretCheckBox* SecretCheckBox = qobject_cast<CSecretCheckBox*>(ui.chkShellMenu);
CSettingsWindow__AddContextMenu(SecretCheckBox && SecretCheckBox->IsSecretSet());
}
2022-02-04 21:08:25 +00:00
else
2022-05-15 12:26:22 +01:00
CSettingsWindow__RemoveContextMenu();
2022-02-04 21:08:25 +00:00
}
if (ui.chkShellMenu2->isChecked() != CSbieUtils::HasContextMenu2()) {
if (ui.chkShellMenu2->isChecked()) {
CSbieUtils::AddContextMenu2(QApplication::applicationDirPath().replace("/", "\\") + "\\Start.exe",
tr("Run &Un-Sandboxed"),
2021-10-16 16:19:51 +01:00
QApplication::applicationDirPath().replace("/", "\\") + "\\Start.exe");
} else
2022-02-04 21:08:25 +00:00
CSbieUtils::RemoveContextMenu2();
2021-10-16 16:19:51 +01:00
}
2022-02-04 21:08:25 +00:00
2021-10-16 16:19:51 +01:00
theConf->SetValue("Options/RunInDefaultBox", ui.chkAlwaysDefault->isChecked());
2022-12-15 13:06:58 +00:00
theConf->SetValue("Options/CheckSilentMode", ui.chkSilentMode->isChecked());
2021-10-16 16:19:51 +01:00
theConf->SetValue("Options/ShowNotifications", ui.chkNotifications->isChecked());
theConf->SetValue("Options/OpenUrlsSandboxed", CSettingsWindow__Chk2Int(ui.chkSandboxUrls->checkState()));
theConf->SetValue("Options/ShowRecovery", ui.chkShowRecovery->isChecked());
theConf->SetValue("Options/InstantRecovery", !ui.chkNotifyRecovery->isChecked());
2022-07-29 09:24:32 +01:00
theConf->SetValue("Options/RecoveryOnTop", ui.chkRecoveryTop->isChecked());
2022-02-13 11:55:52 +00:00
theConf->SetValue("Options/UseAsyncBoxOps", ui.chkAsyncBoxOps->isChecked());
2021-10-16 16:19:51 +01:00
theConf->SetValue("Options/EnablePanicKey", ui.chkPanic->isChecked());
theConf->SetValue("Options/PanicKeySequence", ui.keyPanic->keySequence().toString());
2022-05-16 20:30:40 +01:00
theConf->SetValue("Options/WatchBoxSize", ui.chkMonitorSize->isChecked());
2021-10-16 16:19:51 +01:00
theConf->SetValue("Options/WatchIni", ui.chkWatchConfig->isChecked());
2022-09-29 17:28:48 +01:00
theConf->SetValue("Options/ScanStartMenu", ui.chkScanMenu->isChecked());
int OldIntegrateStartMenu = theConf->GetInt("Options/IntegrateStartMenu", 0);
theConf->SetValue("Options/IntegrateStartMenu", ui.cmbIntegrateMenu->currentIndex());
if (ui.cmbIntegrateMenu->currentIndex() != OldIntegrateStartMenu) {
if (ui.cmbIntegrateMenu->currentIndex() == 0)
theGUI->ClearStartMenu();
else
theGUI->SyncStartMenu();
}
2021-10-16 16:19:51 +01:00
theConf->SetValue("Options/SysTrayIcon", ui.cmbSysTray->currentIndex());
2022-02-05 14:09:53 +00:00
theConf->SetValue("Options/SysTrayFilter", ui.cmbTrayBoxes->currentIndex());
2022-07-10 17:28:10 +01:00
theConf->SetValue("Options/CompactTray", ui.chkCompactTray->isChecked());
2022-02-13 11:55:52 +00:00
theConf->SetValue("Options/AutoBoxOpsNotify", ui.chkBoxOpsNotify->isChecked());
2021-10-16 16:19:51 +01:00
if (theAPI->IsConnected())
{
2022-07-24 14:30:54 +01:00
try
2021-10-16 16:19:51 +01:00
{
2022-11-29 17:26:51 +00:00
QStringList RunCommands;
for (int i = 0; i < ui.treeRun->topLevelItemCount(); i++) {
QTreeWidgetItem* pItem = ui.treeRun->topLevelItem(i);
RunCommands.append(pItem->text(0) + "|" + pItem->text(1));
}
WriteTextList("RunCommand", RunCommands);
2022-12-07 10:50:33 +00:00
WriteText("DefaultBox", ui.cmbDefault->currentData().toString());
2022-07-24 14:30:54 +01:00
WriteText("FileRootPath", ui.fileRoot->text()); //ui.fileRoot->setText("\\??\\%SystemDrive%\\Sandbox\\%USER%\\%SANDBOX%");
WriteAdvancedCheck(ui.chkSeparateUserFolders, "SeparateUserFolders", "", "n");
WriteText("KeyRootPath", ui.regRoot->text()); //ui.regRoot->setText("\\REGISTRY\\USER\\Sandbox_%USER%_%SANDBOX%");
WriteText("IpcRootPath", ui.ipcRoot->text()); //ui.ipcRoot->setText("\\Sandbox\\%USER%\\%SANDBOX%\\Session_%SESSION%");
WriteAdvancedCheck(ui.chkWFP, "NetworkEnableWFP", "y", "");
WriteAdvancedCheck(ui.chkObjCb, "EnableObjectFiltering", "", "n");
WriteAdvancedCheck(ui.chkWin32k, "EnableWin32kHooks", "", "n");
2022-07-28 07:40:57 +01:00
WriteAdvancedCheck(ui.chkSbieLogon, "SandboxieLogon", "y", "");
2022-07-24 14:30:54 +01:00
if (m_FeaturesChanged) {
m_FeaturesChanged = false;
theAPI->ReloadConfig(true);
2021-10-16 16:19:51 +01:00
}
2022-07-24 14:30:54 +01:00
WriteAdvancedCheck(ui.chkAdminOnly, "EditAdminOnly", "y", "");
2021-10-16 16:19:51 +01:00
2022-07-24 14:30:54 +01:00
bool isPassSet = !theAPI->GetGlobalSettings()->GetText("EditPassword", "").isEmpty();
if (ui.chkPassRequired->isChecked())
2021-10-16 16:19:51 +01:00
{
2022-07-24 14:30:54 +01:00
if (!isPassSet && m_NewPassword.isEmpty())
OnSetPassword(); // request password entry if it wasn't entered already
if (!m_NewPassword.isEmpty()) {
theAPI->LockConfig(m_NewPassword); // set new/changed password
m_NewPassword.clear();
2021-10-16 16:19:51 +01:00
}
}
2022-07-24 14:30:54 +01:00
else if (isPassSet)
theAPI->LockConfig(QString()); // clear password
2021-10-16 16:19:51 +01:00
2022-07-24 14:30:54 +01:00
WriteAdvancedCheck(ui.chkAdminOnlyFP, "ForceDisableAdminOnly", "y", "");
WriteAdvancedCheck(ui.chkClearPass, "ForgetPassword", "y", "");
2021-10-16 16:19:51 +01:00
2022-07-24 14:30:54 +01:00
if (m_WarnProgsChanged)
{
WriteAdvancedCheck(ui.chkStartBlock, "StartRunAlertDenied", "y", "");
2022-11-20 16:23:15 +00:00
WriteAdvancedCheck(ui.chkStartBlockMsg, "AlertStartRunAccessDenied", "", "n");
2022-09-29 17:28:48 +01:00
WriteAdvancedCheck(ui.chkNotForcedMsg, "NotifyForceProcessDisabled", "y", "");
2021-10-16 16:19:51 +01:00
2022-07-24 14:30:54 +01:00
QStringList AlertProcess;
QStringList AlertFolder;
for (int i = 0; i < ui.treeWarnProgs->topLevelItemCount(); i++)
{
QTreeWidgetItem* pItem = ui.treeWarnProgs->topLevelItem(i);
int Type = pItem->data(0, Qt::UserRole).toInt();
switch (Type)
{
case 1: AlertProcess.append(pItem->data(1, Qt::UserRole).toString()); break;
case 2: AlertFolder.append(pItem->data(1, Qt::UserRole).toString()); break;
}
2021-10-16 16:19:51 +01:00
}
2022-07-24 14:30:54 +01:00
WriteTextList("AlertProcess", AlertProcess);
WriteTextList("AlertFolder", AlertFolder);
m_WarnProgsChanged = false;
2021-10-16 16:19:51 +01:00
}
2022-07-24 14:30:54 +01:00
if (m_CompatChanged)
{
QStringList Used;
QStringList Rejected;
for (int i = 0; i < ui.treeCompat->topLevelItemCount(); i++) {
QTreeWidgetItem* pItem = ui.treeCompat->topLevelItem(i);
if (pItem->checkState(0) == Qt::Unchecked)
Rejected.append(pItem->data(0, Qt::UserRole).toString());
else
Used.append(pItem->data(0, Qt::UserRole).toString());
}
// retain local templates
foreach(const QString& Template, theAPI->GetGlobalSettings()->GetTextList("Template", false)) {
if (Template.left(6) == "Local_") {
Used.append(Template);
}
}
WriteTextList("Template", Used);
WriteTextList("TemplateReject", Rejected);
m_CompatChanged = false;
}
}
catch (SB_STATUS Status)
{
theGUI->CheckResults(QList<SB_STATUS>() << Status);
2021-10-16 16:19:51 +01:00
}
}
if (ui.chkAutoRoot->isVisible())
2022-01-14 13:06:01 +00:00
theConf->SetValue("Options/PortableRootDir", CSettingsWindow__Chk2Int(ui.chkAutoRoot->checkState()));
2021-10-16 16:19:51 +01:00
theConf->SetValue("Options/AutoRunSoftCompat", !ui.chkNoCompat->isChecked());
2022-01-14 17:58:25 +00:00
if (m_CertChanged && theAPI->IsConnected())
2021-10-16 16:19:51 +01:00
{
QByteArray Certificate = ui.txtCertificate->toPlainText().toUtf8();
if (g_Certificate != Certificate) {
2022-02-19 20:17:30 +00:00
2022-05-15 14:02:58 +01:00
QPalette palette = QApplication::palette();
2021-10-16 16:19:51 +01:00
if (theGUI->m_DarkTheme)
palette.setColor(QPalette::Text, Qt::black);
2021-11-13 08:28:32 +00:00
ui.lblCertExp->setVisible(false);
2022-05-15 14:02:58 +01:00
bool bRet = ApplyCertificate(Certificate, this);
2021-10-16 16:19:51 +01:00
if (Certificate.isEmpty())
palette.setColor(QPalette::Base, Qt::white);
2022-05-15 14:02:58 +01:00
else if (!bRet)
2021-10-16 16:19:51 +01:00
palette.setColor(QPalette::Base, QColor(255, 192, 192));
2022-05-15 14:02:58 +01:00
else if (g_CertInfo.expired || g_CertInfo.outdated) {
palette.setColor(QPalette::Base, QColor(255, 255, 192));
ui.lblCertExp->setVisible(true);
2021-10-16 16:19:51 +01:00
}
2022-05-15 14:02:58 +01:00
else
palette.setColor(QPalette::Base, QColor(192, 255, 192));
2021-10-16 16:19:51 +01:00
ui.txtCertificate->setPalette(palette);
}
m_CertChanged = false;
}
theConf->SetValue("Options/CheckForUpdates", CSettingsWindow__Chk2Int(ui.chkAutoUpdate->checkState()));
2022-11-20 16:23:15 +00:00
//theConf->SetValue("Options/DownloadUpdates", CSettingsWindow__Chk2Int(ui.chkAutoDownload->checkState()));
2022-05-14 09:34:44 +01:00
//theConf->SetValue("Options/InstallUpdates", CSettingsWindow__Chk2Int(ui.chkAutoInstall->checkState()));
2021-10-16 16:19:51 +01:00
2022-11-20 16:23:15 +00:00
QString ReleaseChannel;
if (ui.radStable->isChecked())
ReleaseChannel = "stable";
else if (ui.radPreview->isChecked())
ReleaseChannel = "preview";
2022-12-03 19:25:04 +00:00
//else if (ui.radLive->isChecked())
// ReleaseChannel = "live";
2022-11-20 16:23:15 +00:00
if(!ReleaseChannel.isEmpty()) theConf->SetValue("Options/ReleaseChannel", ReleaseChannel);
theConf->SetValue("Options/OnNewUpdate", ui.cmbUpdate->currentData());
theConf->SetValue("Options/OnNewRelease", ui.cmbRelease->currentData());
2022-08-09 17:19:46 +01:00
2022-01-13 22:52:58 +00:00
theConf->SetValue("Options/NoSupportCheck", ui.chkNoCheck->isChecked());
2022-07-09 10:46:07 +01:00
emit OptionsChanged(m_bRebuildUI);
2021-10-16 16:19:51 +01:00
}
2022-05-15 14:02:58 +01:00
bool CSettingsWindow::ApplyCertificate(const QByteArray &Certificate, QWidget* widget)
{
QString CertPath = theAPI->GetSbiePath() + "\\Certificate.dat";
if (!Certificate.isEmpty()) {
auto Args = GetArguments(Certificate, L'\n', L':');
bool bLooksOk = true;
if (Args.value("NAME").isEmpty()) // mandatory
bLooksOk = false;
//if (Args.value("UPDATEKEY").isEmpty())
// bLooksOk = false;
if (Args.value("SIGNATURE").isEmpty()) // absolutely mandatory
bLooksOk = false;
if (bLooksOk) {
QString TempPath = QDir::tempPath() + "/Sbie+Certificate.dat";
QFile CertFile(TempPath);
if (CertFile.open(QFile::WriteOnly)) {
CertFile.write(Certificate);
CertFile.close();
}
WindowsMoveFile(TempPath.replace("/", "\\"), CertPath.replace("/", "\\"));
}
else {
2022-05-24 00:02:29 +01:00
QMessageBox::critical(widget, "Sandboxie-Plus", tr("This does not look like a certificate. Please enter the entire certificate, not just a portion of it."));
2022-05-15 14:02:58 +01:00
return false;
}
}
else if(!g_Certificate.isEmpty()){
WindowsMoveFile(CertPath.replace("/", "\\"), "");
}
if (Certificate.isEmpty())
return false;
if (!theAPI->ReloadCert().IsError())
{
g_FeatureFlags = theAPI->GetFeatureFlags();
theGUI->UpdateCertState();
if (g_CertInfo.expired || g_CertInfo.outdated) {
if(g_CertInfo.expired)
QMessageBox::information(widget, "Sandboxie-Plus", tr("This certificate is unfortunately expired."));
else
QMessageBox::information(widget, "Sandboxie-Plus", tr("This certificate is unfortunately outdated."));
}
else {
QMessageBox::information(widget, "Sandboxie-Plus", tr("Thank you for supporting the development of Sandboxie-Plus."));
}
g_Certificate = Certificate;
return true;
}
else
{
QMessageBox::critical(widget, "Sandboxie-Plus", tr("This support certificate is not valid."));
g_CertInfo.State = 0;
g_Certificate.clear();
return false;
}
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow::apply()
{
2022-01-13 22:52:58 +00:00
if (!ui.btnEditIni->isEnabled())
SaveIniSection();
else
SaveSettings();
2021-10-16 16:19:51 +01:00
LoadSettings();
}
void CSettingsWindow::ok()
{
2022-07-24 14:30:54 +01:00
apply();
2021-10-16 16:19:51 +01:00
this->close();
}
void CSettingsWindow::reject()
{
this->close();
}
void CSettingsWindow::OnBrowse()
{
QString Value = QFileDialog::getExistingDirectory(this, tr("Select Directory")).replace("/", "\\");
if (Value.isEmpty())
return;
ui.fileRoot->setText(Value + "\\%SANDBOX%");
}
void CSettingsWindow::OnChange()
{
2022-01-14 13:06:01 +00:00
if (ui.chkAutoRoot->isVisible())
2021-10-16 16:19:51 +01:00
ui.fileRoot->setEnabled(ui.chkAutoRoot->checkState() != Qt::Checked);
ui.btnSetPassword->setEnabled(ui.chkPassRequired->isChecked());
}
void CSettingsWindow::OnTab()
{
2022-09-29 17:28:48 +01:00
OnTab(ui.tabs->currentWidget());
2022-08-15 12:18:26 +01:00
}
2022-09-29 17:28:48 +01:00
void CSettingsWindow::OnTab(QWidget* pTab)
2022-08-15 12:18:26 +01:00
{
2022-09-29 17:28:48 +01:00
m_pCurrentTab = pTab;
if (pTab == ui.tabSupport)
2022-08-11 23:09:35 +01:00
{
if (ui.lblCurrent->text().isEmpty()) {
if (ui.chkAutoUpdate->checkState())
GetUpdates();
else
ui.lblCurrent->setText(tr("<a href=\"check\">Check Now</a>"));
}
}
2022-09-29 17:28:48 +01:00
else if (pTab == ui.tabEdit)
2022-01-13 22:52:58 +00:00
{
LoadIniSection();
ui.txtIniSection->setReadOnly(true);
}
2022-09-29 17:28:48 +01:00
else if (pTab == ui.tabCompat && m_CompatLoaded != 1 && theAPI->IsConnected())
2021-10-16 16:19:51 +01:00
{
if(m_CompatLoaded == 0)
theGUI->GetCompat()->RunCheck();
ui.treeCompat->clear();
QMap<QString, int> Templates = theGUI->GetCompat()->GetTemplates();
for (QMap<QString, int>::iterator I = Templates.begin(); I != Templates.end(); ++I)
{
if (I.value() == CSbieTemplates::eNone)
continue;
QSharedPointer<CSbieIni> pTemplate = QSharedPointer<CSbieIni>(new CSbieIni("Template_" + I.key(), theAPI));
2022-06-29 07:40:58 +01:00
QString Title = pTemplate->GetText("Tmpl.Title", "", false, true, true);
2021-10-16 16:19:51 +01:00
if (Title.left(1) == "#")
{
int End = Title.mid(1).indexOf(",");
if (End == -1) End = Title.length() - 1;
int MsgNum = Title.mid(1, End).toInt();
Title = theAPI->GetSbieMsgStr(MsgNum, theGUI->m_LanguageId).arg(Title.mid(End + 2)).arg("");
}
//if (Title.isEmpty()) Title = Name;
QTreeWidgetItem* pItem = new QTreeWidgetItem();
pItem->setText(0, Title);
pItem->setData(0, Qt::UserRole, I.key());
if((I.value() & CSbieTemplates::eDisabled) != 0)
pItem->setCheckState(0, Qt::Unchecked);
else if((I.value() & CSbieTemplates::eEnabled) != 0)
pItem->setCheckState(0, Qt::Checked);
else
pItem->setCheckState(0, Qt::PartiallyChecked);
ui.treeCompat->addTopLevelItem(pItem);
}
m_CompatLoaded = 1;
m_CompatChanged = true;
}
}
void CSettingsWindow::OnSetPassword()
{
retry:
QString Value1 = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter the new configuration password."), QLineEdit::Password);
if (Value1.isEmpty())
return;
QString Value2 = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please re-enter the new configuration password."), QLineEdit::Password);
if (Value2.isEmpty())
return;
if (Value1 != Value2) {
QMessageBox::warning(this, "Sandboxie-Plus", tr("Passwords did not match, please retry."));
goto retry;
}
m_NewPassword = Value1;
}
void CSettingsWindow::AddWarnEntry(const QString& Name, int type)
{
QTreeWidgetItem* pItem = new QTreeWidgetItem();
pItem->setText(0, (type == 1 ? tr("Process") : tr("Folder")));
pItem->setData(0, Qt::UserRole, type);
pItem->setData(1, Qt::UserRole, Name);
pItem->setText(1, Name);
ui.treeWarnProgs->addTopLevelItem(pItem);
}
void CSettingsWindow::OnAddWarnProg()
{
QString Value = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter a program file name"));
if (Value.isEmpty())
return;
AddWarnEntry(Value, 1);
m_WarnProgsChanged = true;
}
void CSettingsWindow::OnAddWarnFolder()
{
QString Value = QFileDialog::getExistingDirectory(this, tr("Select Directory")).replace("/", "\\");
if (Value.isEmpty())
return;
AddWarnEntry(Value, 2);
m_WarnProgsChanged = true;
}
void CSettingsWindow::OnDelWarnProg()
{
QTreeWidgetItem* pItem = ui.treeWarnProgs->currentItem();
if (!pItem)
return;
delete pItem;
m_WarnProgsChanged = true;
}
void CSettingsWindow::OnTemplateClicked(QTreeWidgetItem* pItem, int Column)
{
// todo: check if really changed
m_CompatChanged = true;
}
2022-05-29 07:07:17 +01:00
void CSettingsWindow::OnTemplateDoubleClicked(QTreeWidgetItem* pItem, int Column)
{
QSharedPointer<CSbieIni> pTemplate = QSharedPointer<CSbieIni>(new CSbieIni("Template_" + pItem->data(0, Qt::UserRole).toString(), theAPI));
COptionsWindow OptionsWindow(pTemplate, pItem->text(1));
OptionsWindow.exec();
}
2021-10-16 16:19:51 +01:00
void CSettingsWindow::OnAddCompat()
{
QTreeWidgetItem* pItem = ui.treeCompat->currentItem();
if (!pItem)
return;
pItem->setCheckState(0, Qt::Checked);
m_CompatChanged = true;
}
void CSettingsWindow::OnDelCompat()
{
QTreeWidgetItem* pItem = ui.treeCompat->currentItem();
if (!pItem)
return;
pItem->setCheckState(0, Qt::Unchecked);
m_CompatChanged = true;
}
2022-01-13 22:52:58 +00:00
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2022-01-14 21:28:44 +00:00
// Raw section ini Editor
2022-01-13 22:52:58 +00:00
//
void CSettingsWindow::SetIniEdit(bool bEnable)
{
2022-08-15 12:18:26 +01:00
if (m_pTree) {
m_pTree->setEnabled(!bEnable);
}
else {
for (int i = 0; i < ui.tabs->count() - 2; i++) {
bool Enabled = ui.tabs->widget(i)->isEnabled();
ui.tabs->setTabEnabled(i, !bEnable && Enabled);
ui.tabs->widget(i)->setEnabled(Enabled);
}
2022-01-13 22:52:58 +00:00
}
ui.btnSaveIni->setEnabled(bEnable);
ui.btnCancelEdit->setEnabled(bEnable);
ui.txtIniSection->setReadOnly(!bEnable);
ui.btnEditIni->setEnabled(!bEnable);
}
void CSettingsWindow::OnEditIni()
{
SetIniEdit(true);
}
void CSettingsWindow::OnSaveIni()
{
SaveIniSection();
SetIniEdit(false);
LoadSettings();
}
void CSettingsWindow::OnCancelEdit()
{
SetIniEdit(false);
}
void CSettingsWindow::LoadIniSection()
{
QString Section;
2022-01-14 17:58:25 +00:00
if(theAPI->IsConnected())
Section = theAPI->SbieIniGetEx("GlobalSettings", "");
2022-01-13 22:52:58 +00:00
ui.txtIniSection->setPlainText(Section);
}
void CSettingsWindow::SaveIniSection()
{
2022-01-14 17:58:25 +00:00
if(theAPI->IsConnected())
theAPI->SbieIniSet("GlobalSettings", "", ui.txtIniSection->toPlainText());
2022-01-13 22:52:58 +00:00
LoadIniSection();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2022-08-11 23:09:35 +01:00
// Update
//
void CSettingsWindow::GetUpdates()
{
QVariantMap Params;
Params["channel"] = "all";
2022-11-20 16:23:15 +00:00
theGUI->m_pUpdater->GetUpdates(this, SLOT(OnUpdateData(const QVariantMap&, const QVariantMap&)), Params);
}
QString CSettingsWindow__MkVersion(const QString& Name, const QVariantMap& Releases)
{
QVariantMap Release = Releases[Name].toMap();
QString Version = Release.value("version").toString();
//if (Release["build"].type() != QVariant::Invalid)
2022-12-07 15:45:38 +00:00
int iUpdate = Release["update"].toInt();
2022-11-20 17:16:13 +00:00
if(iUpdate) Version += QChar('a' + (iUpdate - 1));
2022-11-20 16:23:15 +00:00
return QString("<a href=\"%1\">%2</a>").arg(Name, Version);
2022-08-11 23:09:35 +01:00
}
void CSettingsWindow::OnUpdateData(const QVariantMap& Data, const QVariantMap& Params)
{
if (Data.isEmpty() || Data["error"].toBool())
return;
2022-11-20 16:23:15 +00:00
QString Version = QString::number(VERSION_MJR) + "." + QString::number(VERSION_MIN) + "." + QString::number(VERSION_REV);
int iUpdate = COnlineUpdater::GetCurrentUpdate();
if(iUpdate)
2022-11-20 17:16:13 +00:00
Version += QChar('a' + (iUpdate - 1));
2022-11-20 16:23:15 +00:00
2022-08-11 23:09:35 +01:00
m_UpdateData = Data;
2022-11-20 16:23:15 +00:00
QVariantMap Releases = m_UpdateData["releases"].toMap();
ui.lblCurrent->setText(tr("%1 (Current)").arg(Version));
ui.lblStable->setText(CSettingsWindow__MkVersion("stable", Releases));
ui.lblPreview->setText(CSettingsWindow__MkVersion("preview", Releases));
2022-12-03 19:25:04 +00:00
//ui.lblLive->setText(CSettingsWindow__MkVersion("live", Releases));
2022-08-11 23:09:35 +01:00
}
void CSettingsWindow::OnUpdate(const QString& Channel)
{
2022-11-20 16:23:15 +00:00
if (Channel == "check") {
2022-08-11 23:09:35 +01:00
GetUpdates();
2022-11-20 16:23:15 +00:00
return;
}
QVariantMap Releases = m_UpdateData["releases"].toMap();
QVariantMap Release = Releases[Channel].toMap();
2022-08-11 23:09:35 +01:00
2022-11-20 16:23:15 +00:00
QString VersionStr = Release["version"].toString();
if (VersionStr.isEmpty())
return;
2022-08-11 23:09:35 +01:00
2022-11-20 16:23:15 +00:00
QVariantMap Installer = Releases["installer"].toMap();
QString DownloadUrl = Installer["downloadUrl"].toString();
//QString DownloadSig = Installer["signature"].toString();
// todo xxx
//if (!DownloadUrl.isEmpty() /*&& !DownloadSig.isEmpty()*/)
//{
// // todo: signature
// if (QMessageBox("Sandboxie-Plus", tr("Do you want to download the installer for v%1?").arg(VersionStr), QMessageBox::Question, QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape, QMessageBox::NoButton, this).exec() == QMessageBox::Yes)
// COnlineUpdater::Instance()->DownloadInstaller(DownloadUrl, true);
//}
//else
{
QString InfoUrl = Release["infoUrl"].toString();
if (InfoUrl.isEmpty())
InfoUrl = "https://sandboxie-plus.com/go.php?to=sbie-get";
QDesktopServices::openUrl(InfoUrl);
2022-08-11 23:09:35 +01:00
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2022-01-13 22:52:58 +00:00
// Support
//
2021-10-16 16:19:51 +01:00
void CSettingsWindow::CertChanged()
{
m_CertChanged = true;
QPalette palette = QApplication::palette();
ui.txtCertificate->setPalette(palette);
}
2022-07-09 10:46:07 +01:00
void CSettingsWindow::LoadCertificate(QString CertPath)
2021-10-16 16:19:51 +01:00
{
2022-09-29 17:28:48 +01:00
#ifdef _DEBUG
if (GetKeyState(VK_CONTROL) & 0x8000) {
g_Certificate.clear();
return;
}
#endif
2022-01-30 14:53:37 +00:00
if (theAPI && theAPI->IsConnected())
2021-10-16 16:19:51 +01:00
CertPath = theAPI->GetSbiePath() + "\\Certificate.dat";
QFile CertFile(CertPath);
if (CertFile.open(QFile::ReadOnly)) {
g_Certificate = CertFile.readAll();
CertFile.close();
}
}
void WindowsMoveFile(const QString& From, const QString& To)
{
2022-09-29 17:28:48 +01:00
std::wstring from = From.toStdWString();
2021-10-16 16:19:51 +01:00
from.append(L"\0", 1);
2022-09-29 17:28:48 +01:00
std::wstring to = To.toStdWString();
2021-10-16 16:19:51 +01:00
to.append(L"\0", 1);
SHFILEOPSTRUCT SHFileOp;
memset(&SHFileOp, 0, sizeof(SHFILEOPSTRUCT));
SHFileOp.hwnd = NULL;
SHFileOp.wFunc = To.isEmpty() ? FO_DELETE : FO_MOVE;
SHFileOp.pFrom = from.c_str();
SHFileOp.pTo = to.c_str();
SHFileOp.fFlags = NULL;
//The Copying Function
SHFileOperation(&SHFileOp);
}