mirror of
https://github.com/tnodir/fort
synced 2024-11-15 12:56:16 +00:00
UI: Options: AppGroup: Add "Kill Process" option
This commit is contained in:
parent
59bd6992cd
commit
decfcb2e80
@ -137,6 +137,14 @@ void AppGroup::setName(const QString &name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AppGroup::setKillText(const QString &killText)
|
||||||
|
{
|
||||||
|
if (m_killText != killText) {
|
||||||
|
m_killText = killText;
|
||||||
|
setEdited(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AppGroup::setBlockText(const QString &blockText)
|
void AppGroup::setBlockText(const QString &blockText)
|
||||||
{
|
{
|
||||||
if (m_blockText != blockText) {
|
if (m_blockText != blockText) {
|
||||||
@ -217,6 +225,7 @@ void AppGroup::copy(const AppGroup &o)
|
|||||||
m_id = o.id();
|
m_id = o.id();
|
||||||
m_name = o.name();
|
m_name = o.name();
|
||||||
|
|
||||||
|
m_killText = o.killText();
|
||||||
m_blockText = o.blockText();
|
m_blockText = o.blockText();
|
||||||
m_allowText = o.allowText();
|
m_allowText = o.allowText();
|
||||||
}
|
}
|
||||||
@ -250,6 +259,7 @@ QVariant AppGroup::toVariant() const
|
|||||||
map["id"] = id();
|
map["id"] = id();
|
||||||
map["name"] = name();
|
map["name"] = name();
|
||||||
|
|
||||||
|
map["killText"] = killText();
|
||||||
map["blockText"] = blockText();
|
map["blockText"] = blockText();
|
||||||
map["allowText"] = allowText();
|
map["allowText"] = allowText();
|
||||||
|
|
||||||
@ -285,6 +295,7 @@ void AppGroup::fromVariant(const QVariant &v)
|
|||||||
m_id = map["id"].toLongLong();
|
m_id = map["id"].toLongLong();
|
||||||
m_name = map["name"].toString();
|
m_name = map["name"].toString();
|
||||||
|
|
||||||
|
m_killText = map["killText"].toString();
|
||||||
m_blockText = map["blockText"].toString();
|
m_blockText = map["blockText"].toString();
|
||||||
m_allowText = map["allowText"].toString();
|
m_allowText = map["allowText"].toString();
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,9 @@ public:
|
|||||||
QString name() const { return m_name; }
|
QString name() const { return m_name; }
|
||||||
void setName(const QString &name);
|
void setName(const QString &name);
|
||||||
|
|
||||||
|
QString killText() const { return m_killText; }
|
||||||
|
void setKillText(const QString &killText);
|
||||||
|
|
||||||
QString blockText() const { return m_blockText; }
|
QString blockText() const { return m_blockText; }
|
||||||
void setBlockText(const QString &blockText);
|
void setBlockText(const QString &blockText);
|
||||||
|
|
||||||
@ -117,6 +120,7 @@ private:
|
|||||||
|
|
||||||
QString m_name;
|
QString m_name;
|
||||||
|
|
||||||
|
QString m_killText;
|
||||||
QString m_blockText;
|
QString m_blockText;
|
||||||
QString m_allowText;
|
QString m_allowText;
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ namespace {
|
|||||||
|
|
||||||
const QLoggingCategory LC("conf");
|
const QLoggingCategory LC("conf");
|
||||||
|
|
||||||
constexpr int DATABASE_USER_VERSION = 23;
|
constexpr int DATABASE_USER_VERSION = 24;
|
||||||
|
|
||||||
constexpr int APP_END_TIMER_INTERVAL_MIN = 100;
|
constexpr int APP_END_TIMER_INTERVAL_MIN = 100;
|
||||||
constexpr int APP_END_TIMER_INTERVAL_MAX = 24 * 60 * 60 * 1000; // 1 day
|
constexpr int APP_END_TIMER_INTERVAL_MAX = 24 * 60 * 60 * 1000; // 1 day
|
||||||
@ -54,7 +54,7 @@ const char *const sqlSelectAppGroups = "SELECT app_group_id, enabled, apply_chil
|
|||||||
" speed_limit_in, speed_limit_out,"
|
" speed_limit_in, speed_limit_out,"
|
||||||
" limit_packet_loss, limit_latency,"
|
" limit_packet_loss, limit_latency,"
|
||||||
" limit_bufsize_in, limit_bufsize_out,"
|
" limit_bufsize_in, limit_bufsize_out,"
|
||||||
" name, block_text, allow_text,"
|
" name, kill_text, block_text, allow_text,"
|
||||||
" period_from, period_to"
|
" period_from, period_to"
|
||||||
" FROM app_group"
|
" FROM app_group"
|
||||||
" ORDER BY order_index;";
|
" ORDER BY order_index;";
|
||||||
@ -78,10 +78,10 @@ const char *const sqlInsertAppGroup = "INSERT INTO app_group(app_group_id, order
|
|||||||
" speed_limit_in, speed_limit_out,"
|
" speed_limit_in, speed_limit_out,"
|
||||||
" limit_packet_loss, limit_latency,"
|
" limit_packet_loss, limit_latency,"
|
||||||
" limit_bufsize_in, limit_bufsize_out,"
|
" limit_bufsize_in, limit_bufsize_out,"
|
||||||
" name, block_text, allow_text,"
|
" name, kill_text, block_text, allow_text,"
|
||||||
" period_from, period_to)"
|
" period_from, period_to)"
|
||||||
" VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12,"
|
" VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12,"
|
||||||
" ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21);";
|
" ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22);";
|
||||||
|
|
||||||
const char *const sqlUpdateAppGroup = "UPDATE app_group"
|
const char *const sqlUpdateAppGroup = "UPDATE app_group"
|
||||||
" SET order_index = ?2, enabled = ?3,"
|
" SET order_index = ?2, enabled = ?3,"
|
||||||
@ -91,8 +91,8 @@ const char *const sqlUpdateAppGroup = "UPDATE app_group"
|
|||||||
" speed_limit_in = ?11, speed_limit_out = ?12,"
|
" speed_limit_in = ?11, speed_limit_out = ?12,"
|
||||||
" limit_packet_loss = ?13, limit_latency = ?14,"
|
" limit_packet_loss = ?13, limit_latency = ?14,"
|
||||||
" limit_bufsize_in = ?15, limit_bufsize_out = ?16,"
|
" limit_bufsize_in = ?15, limit_bufsize_out = ?16,"
|
||||||
" name = ?17, block_text = ?18, allow_text = ?19,"
|
" name = ?17, kill_text = ?18, block_text = ?19,"
|
||||||
" period_from = ?20, period_to = ?21"
|
" allow_text = ?20, period_from = ?21, period_to = ?22"
|
||||||
" WHERE app_group_id = ?1;";
|
" WHERE app_group_id = ?1;";
|
||||||
|
|
||||||
const char *const sqlDeleteAppGroup = "DELETE FROM app_group"
|
const char *const sqlDeleteAppGroup = "DELETE FROM app_group"
|
||||||
@ -423,10 +423,11 @@ bool loadAppGroups(SqliteDb *db, FirewallConf &conf)
|
|||||||
appGroup->setLimitBufferSizeIn(quint32(stmt.columnInt(13)));
|
appGroup->setLimitBufferSizeIn(quint32(stmt.columnInt(13)));
|
||||||
appGroup->setLimitBufferSizeOut(quint32(stmt.columnInt(14)));
|
appGroup->setLimitBufferSizeOut(quint32(stmt.columnInt(14)));
|
||||||
appGroup->setName(stmt.columnText(15));
|
appGroup->setName(stmt.columnText(15));
|
||||||
appGroup->setBlockText(stmt.columnText(16));
|
appGroup->setKillText(stmt.columnText(16));
|
||||||
appGroup->setAllowText(stmt.columnText(17));
|
appGroup->setBlockText(stmt.columnText(17));
|
||||||
appGroup->setPeriodFrom(stmt.columnText(18));
|
appGroup->setAllowText(stmt.columnText(18));
|
||||||
appGroup->setPeriodTo(stmt.columnText(19));
|
appGroup->setPeriodFrom(stmt.columnText(19));
|
||||||
|
appGroup->setPeriodTo(stmt.columnText(20));
|
||||||
appGroup->setEdited(false);
|
appGroup->setEdited(false);
|
||||||
|
|
||||||
conf.addAppGroup(appGroup);
|
conf.addAppGroup(appGroup);
|
||||||
@ -448,8 +449,8 @@ bool saveAppGroup(SqliteDb *db, AppGroup *appGroup, int orderIndex)
|
|||||||
<< appGroup->limitOutEnabled() << appGroup->speedLimitIn() << appGroup->speedLimitOut()
|
<< appGroup->limitOutEnabled() << appGroup->speedLimitIn() << appGroup->speedLimitOut()
|
||||||
<< appGroup->limitPacketLoss() << appGroup->limitLatency()
|
<< appGroup->limitPacketLoss() << appGroup->limitLatency()
|
||||||
<< appGroup->limitBufferSizeIn() << appGroup->limitBufferSizeOut() << appGroup->name()
|
<< appGroup->limitBufferSizeIn() << appGroup->limitBufferSizeOut() << appGroup->name()
|
||||||
<< appGroup->blockText() << appGroup->allowText() << appGroup->periodFrom()
|
<< appGroup->killText() << appGroup->blockText() << appGroup->allowText()
|
||||||
<< appGroup->periodTo();
|
<< appGroup->periodFrom() << appGroup->periodTo();
|
||||||
|
|
||||||
const char *sql = rowExists ? sqlUpdateAppGroup : sqlInsertAppGroup;
|
const char *sql = rowExists ? sqlUpdateAppGroup : sqlInsertAppGroup;
|
||||||
|
|
||||||
|
@ -112,6 +112,7 @@ CREATE TABLE app_group(
|
|||||||
limit_bufsize_in INTEGER NOT NULL DEFAULT 150000,
|
limit_bufsize_in INTEGER NOT NULL DEFAULT 150000,
|
||||||
limit_bufsize_out INTEGER NOT NULL DEFAULT 150000,
|
limit_bufsize_out INTEGER NOT NULL DEFAULT 150000,
|
||||||
name TEXT NOT NULL,
|
name TEXT NOT NULL,
|
||||||
|
kill_text TEXT,
|
||||||
block_text TEXT NOT NULL,
|
block_text TEXT NOT NULL,
|
||||||
allow_text TEXT NOT NULL,
|
allow_text TEXT NOT NULL,
|
||||||
period_from TEXT NOT NULL,
|
period_from TEXT NOT NULL,
|
||||||
|
@ -132,12 +132,12 @@ void ApplicationsPage::setAppGroupIndex(int v)
|
|||||||
|
|
||||||
void ApplicationsPage::onSaveWindowState(IniUser *ini)
|
void ApplicationsPage::onSaveWindowState(IniUser *ini)
|
||||||
{
|
{
|
||||||
ini->setOptWindowAppsSplit(m_splitter->saveState());
|
ini->setOptWindowAppsSplit(m_allowSplitter->saveState());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplicationsPage::onRestoreWindowState(IniUser *ini)
|
void ApplicationsPage::onRestoreWindowState(IniUser *ini)
|
||||||
{
|
{
|
||||||
m_splitter->restoreState(ini->optWindowAppsSplit());
|
m_allowSplitter->restoreState(ini->optWindowAppsSplit());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplicationsPage::onRetranslateUi()
|
void ApplicationsPage::onRetranslateUi()
|
||||||
@ -165,10 +165,11 @@ void ApplicationsPage::onRetranslateUi()
|
|||||||
m_cbGroupEnabled->setText(tr("Enabled"));
|
m_cbGroupEnabled->setText(tr("Enabled"));
|
||||||
m_ctpGroupPeriod->checkBox()->setText(tr("time period:"));
|
m_ctpGroupPeriod->checkBox()->setText(tr("time period:"));
|
||||||
|
|
||||||
|
m_killApps->labelTitle()->setText(tr("Kill Process"));
|
||||||
m_blockApps->labelTitle()->setText(tr("Block"));
|
m_blockApps->labelTitle()->setText(tr("Block"));
|
||||||
m_allowApps->labelTitle()->setText(tr("Allow"));
|
m_allowApps->labelTitle()->setText(tr("Allow"));
|
||||||
|
|
||||||
auto splitterHandle = m_splitter->handle();
|
auto splitterHandle = m_allowSplitter->handle();
|
||||||
splitterHandle->btMoveAllFrom1To2()->setToolTip(tr("Move All Lines to 'Allow'"));
|
splitterHandle->btMoveAllFrom1To2()->setToolTip(tr("Move All Lines to 'Allow'"));
|
||||||
splitterHandle->btMoveAllFrom2To1()->setToolTip(tr("Move All Lines to 'Block'"));
|
splitterHandle->btMoveAllFrom2To1()->setToolTip(tr("Move All Lines to 'Block'"));
|
||||||
splitterHandle->btInterchangeAll()->setToolTip(tr("Interchange All Lines"));
|
splitterHandle->btInterchangeAll()->setToolTip(tr("Interchange All Lines"));
|
||||||
@ -225,12 +226,13 @@ void ApplicationsPage::setupUi()
|
|||||||
layout->addLayout(groupHeader);
|
layout->addLayout(groupHeader);
|
||||||
|
|
||||||
// App Columns
|
// App Columns
|
||||||
|
setupKillApps();
|
||||||
setupBlockApps();
|
setupBlockApps();
|
||||||
setupAllowApps();
|
setupAllowApps();
|
||||||
|
|
||||||
// Splitter
|
// Splitter
|
||||||
setupSplitter();
|
setupSplitter();
|
||||||
layout->addWidget(m_splitter, 1);
|
layout->addWidget(m_killSplitter, 1);
|
||||||
|
|
||||||
// Splitter Buttons
|
// Splitter Buttons
|
||||||
setupSplitterButtons();
|
setupSplitterButtons();
|
||||||
@ -513,6 +515,18 @@ void ApplicationsPage::setupGroupLimitBufferSize()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ApplicationsPage::setupKillApps()
|
||||||
|
{
|
||||||
|
m_killApps = new AppsColumn();
|
||||||
|
m_killApps->icon()->setPixmap(IconCache::file(":/icons/scull.png"));
|
||||||
|
|
||||||
|
connect(m_killApps->editText(), &QPlainTextEdit::textChanged, this, [&] {
|
||||||
|
const auto text = m_killApps->editText()->toPlainText();
|
||||||
|
|
||||||
|
pageAppGroupSetText(this, &AppGroup::setKillText, text);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void ApplicationsPage::setupBlockApps()
|
void ApplicationsPage::setupBlockApps()
|
||||||
{
|
{
|
||||||
m_blockApps = new AppsColumn();
|
m_blockApps = new AppsColumn();
|
||||||
@ -541,18 +555,23 @@ void ApplicationsPage::setupAllowApps()
|
|||||||
|
|
||||||
void ApplicationsPage::setupSplitter()
|
void ApplicationsPage::setupSplitter()
|
||||||
{
|
{
|
||||||
m_splitter = new TextArea2Splitter();
|
m_allowSplitter = new TextArea2Splitter();
|
||||||
|
Q_ASSERT(!m_allowSplitter->handle());
|
||||||
|
|
||||||
Q_ASSERT(!m_splitter->handle());
|
m_allowSplitter->addWidget(m_blockApps);
|
||||||
|
m_allowSplitter->addWidget(m_allowApps);
|
||||||
|
|
||||||
m_splitter->addWidget(m_blockApps);
|
auto splitterHandle = m_allowSplitter->handle();
|
||||||
m_splitter->addWidget(m_allowApps);
|
|
||||||
|
|
||||||
auto splitterHandle = m_splitter->handle();
|
|
||||||
Q_ASSERT(splitterHandle);
|
Q_ASSERT(splitterHandle);
|
||||||
|
|
||||||
splitterHandle->setTextArea1(m_blockApps->editText());
|
splitterHandle->setTextArea1(m_blockApps->editText());
|
||||||
splitterHandle->setTextArea2(m_allowApps->editText());
|
splitterHandle->setTextArea2(m_allowApps->editText());
|
||||||
|
|
||||||
|
m_killSplitter = new QSplitter();
|
||||||
|
m_killSplitter->addWidget(m_killApps);
|
||||||
|
m_killSplitter->addWidget(m_allowSplitter);
|
||||||
|
|
||||||
|
m_killSplitter->setSizes({ 0, 1 }); // "Kill Processes" area is always collapsed
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplicationsPage::setupSplitterButtons()
|
void ApplicationsPage::setupSplitterButtons()
|
||||||
@ -562,12 +581,12 @@ void ApplicationsPage::setupSplitterButtons()
|
|||||||
m_btSelectFile->text(), tr("Programs (*.exe);;All files (*.*)"));
|
m_btSelectFile->text(), tr("Programs (*.exe);;All files (*.*)"));
|
||||||
|
|
||||||
if (!filePaths.isEmpty()) {
|
if (!filePaths.isEmpty()) {
|
||||||
auto area = m_splitter->handle()->currentTextArea();
|
auto area = m_allowSplitter->handle()->currentTextArea();
|
||||||
TextAreaUtil::appendText(area, filePaths.join('\n'));
|
TextAreaUtil::appendText(area, filePaths.join('\n'));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const auto layout = m_splitter->handle()->buttonsLayout();
|
const auto layout = m_allowSplitter->handle()->buttonsLayout();
|
||||||
layout->addWidget(m_btSelectFile, 0, Qt::AlignHCenter);
|
layout->addWidget(m_btSelectFile, 0, Qt::AlignHCenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,6 +617,7 @@ void ApplicationsPage::updateGroup()
|
|||||||
m_ctpGroupPeriod->timeEdit1()->setTime(CheckTimePeriod::toTime(appGroup->periodFrom()));
|
m_ctpGroupPeriod->timeEdit1()->setTime(CheckTimePeriod::toTime(appGroup->periodFrom()));
|
||||||
m_ctpGroupPeriod->timeEdit2()->setTime(CheckTimePeriod::toTime(appGroup->periodTo()));
|
m_ctpGroupPeriod->timeEdit2()->setTime(CheckTimePeriod::toTime(appGroup->periodTo()));
|
||||||
|
|
||||||
|
m_killApps->editText()->setText(appGroup->killText());
|
||||||
m_blockApps->editText()->setText(appGroup->blockText());
|
m_blockApps->editText()->setText(appGroup->blockText());
|
||||||
m_allowApps->editText()->setText(appGroup->allowText());
|
m_allowApps->editText()->setText(appGroup->allowText());
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,7 @@ private:
|
|||||||
void setupGroupLimitLatency();
|
void setupGroupLimitLatency();
|
||||||
void setupGroupLimitPacketLoss();
|
void setupGroupLimitPacketLoss();
|
||||||
void setupGroupLimitBufferSize();
|
void setupGroupLimitBufferSize();
|
||||||
|
void setupKillApps();
|
||||||
void setupBlockApps();
|
void setupBlockApps();
|
||||||
void setupAllowApps();
|
void setupAllowApps();
|
||||||
void setupSplitter();
|
void setupSplitter();
|
||||||
@ -87,9 +88,11 @@ private:
|
|||||||
LabelSpin *m_limitBufferSizeOut = nullptr;
|
LabelSpin *m_limitBufferSizeOut = nullptr;
|
||||||
QCheckBox *m_cbLogBlocked = nullptr;
|
QCheckBox *m_cbLogBlocked = nullptr;
|
||||||
QCheckBox *m_cbLogConn = nullptr;
|
QCheckBox *m_cbLogConn = nullptr;
|
||||||
|
AppsColumn *m_killApps = nullptr;
|
||||||
AppsColumn *m_blockApps = nullptr;
|
AppsColumn *m_blockApps = nullptr;
|
||||||
AppsColumn *m_allowApps = nullptr;
|
AppsColumn *m_allowApps = nullptr;
|
||||||
TextArea2Splitter *m_splitter = nullptr;
|
QSplitter *m_killSplitter = nullptr;
|
||||||
|
TextArea2Splitter *m_allowSplitter = nullptr;
|
||||||
QToolButton *m_btSelectFile = nullptr;
|
QToolButton *m_btSelectFile = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -373,10 +373,18 @@ bool ConfUtil::parseAppGroups(EnvManager &envManager, const QList<AppGroup *> &a
|
|||||||
app.logConn = appGroup->logConn();
|
app.logConn = appGroup->logConn();
|
||||||
app.groupIndex = i;
|
app.groupIndex = i;
|
||||||
|
|
||||||
|
const auto killText = envManager.expandString(appGroup->killText());
|
||||||
const auto blockText = envManager.expandString(appGroup->blockText());
|
const auto blockText = envManager.expandString(appGroup->blockText());
|
||||||
const auto allowText = envManager.expandString(appGroup->allowText());
|
const auto allowText = envManager.expandString(appGroup->allowText());
|
||||||
|
|
||||||
app.blocked = true;
|
app.blocked = true;
|
||||||
|
app.killProcess = true;
|
||||||
|
if (!parseAppsText(app, killText, wildAppsMap, prefixAppsMap, exeAppsMap, wildAppsSize,
|
||||||
|
prefixAppsSize, exeAppsSize))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
app.blocked = true;
|
||||||
|
app.killProcess = false;
|
||||||
if (!parseAppsText(app, blockText, wildAppsMap, prefixAppsMap, exeAppsMap, wildAppsSize,
|
if (!parseAppsText(app, blockText, wildAppsMap, prefixAppsMap, exeAppsMap, wildAppsSize,
|
||||||
prefixAppsSize, exeAppsSize))
|
prefixAppsSize, exeAppsSize))
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user