diff --git a/src/common/fortconf.c b/src/common/fortconf.c index d4317e92..f15a0eec 100644 --- a/src/common/fortconf.c +++ b/src/common/fortconf.c @@ -1,6 +1,7 @@ /* Fort Firewall Driver Configuration */ #include "fortconf.h" +#include "util.h" #ifndef FORT_DRIVER @@ -104,10 +105,10 @@ static int fort_conf_app_index (const PFORT_CONF conf, UINT32 path_len, const char *path) { - const UINT32 count = conf->apps_n; const char *data; const UINT32 *app_offsets; const char *apps; + const UINT32 count = conf->apps_n; int low, high; if (count == 0) @@ -168,10 +169,52 @@ fort_conf_app_blocked (const PFORT_CONF conf, int app_index) : (app_blocked && !app_allowed)); } -static void -fort_conf_app_perms_mask_init (PFORT_CONF conf) +static UINT16 +fort_conf_app_period_bits (const PFORT_CONF conf, int hour, int *periods_n) +{ + const char *data; + const CHAR *app_periods; + UINT16 group_bits, period_bits; + UINT8 count = conf->app_periods_n; + int n, i; + + if (count == 0) + return 0; + + data = conf->data; + app_periods = (const CHAR *) (data + conf->app_periods_off); + group_bits = (UINT16) conf->flags.group_bits; + period_bits = group_bits; + n = 0; + + for (i = 0; i < FORT_CONF_GROUP_MAX; ++i) { + const UINT16 bit = (1 << i); + const int periodFrom = *app_periods++; + const int periodTo = *app_periods++; + + if ((group_bits & bit) != 0 + && (periodFrom != 0 || periodTo != 0)) { + if (!is_hour_between(hour, periodFrom, periodTo)) { + period_bits ^= bit; + } + + ++n; + + if (--count == 0) + break; + } + } + + if (periods_n != NULL) { + *periods_n = n; + } + + return period_bits; +} + +static void +fort_conf_app_perms_mask_init (PFORT_CONF conf, UINT32 group_bits) { - const UINT32 group_bits = conf->flags.group_bits; UINT32 perms_mask = (group_bits & 0x0001) | ((group_bits & 0x0002) << 1) | ((group_bits & 0x0004) << 2) | ((group_bits & 0x0008) << 3) diff --git a/src/common/fortconf.h b/src/common/fortconf.h index b7d68b82..908ba945 100644 --- a/src/common/fortconf.h +++ b/src/common/fortconf.h @@ -19,7 +19,7 @@ typedef struct fort_conf_flags { UINT32 app_allow_all : 1; UINT32 log_blocked : 1; UINT32 log_stat : 1; - UINT32 _reserved_ : 9; + UINT32 group_bits : 16; } FORT_CONF_FLAGS, *PFORT_CONF_FLAGS; @@ -43,6 +43,7 @@ typedef struct fort_conf { FORT_CONF_FLAGS flags; UINT16 apps_n; + UCHAR app_periods_n; UINT32 app_perms_block_mask; UINT32 app_perms_allow_mask; @@ -51,6 +52,7 @@ typedef struct fort_conf { UINT32 app_groups_off; UINT32 app_perms_off; + UINT32 app_periods_off; UINT32 apps_off; char data[4]; diff --git a/src/common/util.h b/src/common/util.h new file mode 100644 index 00000000..768e556d --- /dev/null +++ b/src/common/util.h @@ -0,0 +1,8 @@ +#ifndef UTIL_H +#define UTIL_H + +#define is_hour_between(hour,from,to) \ + (from <= to ? (hour >= from && hour < to) \ + : (hour >= from || hour < to)) + +#endif UTIL_H diff --git a/src/common/version.h b/src/common/version.h index 2b92b1b6..416d66bc 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -7,6 +7,6 @@ #define APP_UPDATES_URL "https://github.com/tnodir/fort/releases" #define APP_UPDATES_API_URL "https://api.github.com/repos/tnodir/fort/releases/latest" -#define DRIVER_VERSION 7 +#define DRIVER_VERSION 8 #endif // VERSION_H diff --git a/src/driver/fortdrv.c b/src/driver/fortdrv.c index 35ccdad4..79a5cc06 100644 --- a/src/driver/fortdrv.c +++ b/src/driver/fortdrv.c @@ -50,7 +50,8 @@ typedef struct fort_device { FORT_BUFFER buffer; FORT_STAT stat; FORT_DEFER defer; - FORT_TIMER timer; + FORT_TIMER log_timer; + FORT_TIMER app_timer; } FORT_DEVICE, *PFORT_DEVICE; static PFORT_DEVICE g_device = NULL; @@ -160,7 +161,7 @@ fort_conf_ref_flags_set (const PFORT_CONF_FLAGS conf_flags) old_conf_flags = conf->flags; conf->flags = *conf_flags; - fort_conf_app_perms_mask_init(conf); + fort_conf_app_perms_mask_init(conf, conf->flags.group_bits); g_device->prov_boot = conf_flags->prov_boot; @@ -177,6 +178,46 @@ fort_conf_ref_flags_set (const PFORT_CONF_FLAGS conf_flags) return old_conf_flags; } +static BOOL +fort_conf_period_update (void) +{ + PFORT_CONF_REF conf_ref; + int hour; + BOOL res = FALSE; + + /* Get current hour */ + { + TIME_FIELDS tf; + LARGE_INTEGER system_time, local_time; + + KeQuerySystemTime(&system_time); + ExSystemTimeToLocalTime(&system_time, &local_time); + RtlTimeToTimeFields(&local_time, &tf); + + hour = (tf.Hour + (tf.Minute > 58 ? 1 : 0)) % 24; + } + + conf_ref = fort_conf_ref_take(); + + if (conf_ref != NULL) { + PFORT_CONF conf = &conf_ref->conf; + + if (conf->app_periods_n != 0) { + int periods_n = 0; + const UINT16 period_bits = + fort_conf_app_period_bits(conf, hour, &periods_n); + + fort_conf_app_perms_mask_init(conf, period_bits); + + res = (periods_n != 0); + } + + fort_conf_ref_put(conf_ref); + } + + return res; +} + static void fort_callout_classify_block (FWPS_CLASSIFY_OUT0 *classifyOut) { @@ -682,7 +723,8 @@ fort_callout_force_reauth (PDEVICE_OBJECT device, UNUSED(device); - fort_timer_update(&g_device->timer, FALSE); + fort_timer_update(&g_device->log_timer, FALSE); + fort_timer_update(&g_device->app_timer, FALSE); if (old_conf_flags.log_stat != conf_flags.log_stat) { fort_stat_update(stat, conf_flags.log_stat); @@ -724,9 +766,13 @@ fort_callout_force_reauth (PDEVICE_OBJECT device, if ((status = fort_prov_reauth(engine))) goto cleanup; - fort_timer_update(&g_device->timer, + fort_timer_update(&g_device->log_timer, (conf_flags.log_blocked || conf_flags.log_stat)); + if (fort_conf_period_update()) { + fort_timer_update(&g_device->app_timer, TRUE); + } + cleanup: if (NT_SUCCESS(status)) { status = fort_prov_trans_commit(engine); @@ -805,6 +851,12 @@ fort_callout_timer (void) fort_callout_defer_flush(TRUE); } +static void +fort_app_period_timer (void) +{ + fort_conf_period_update(); +} + static NTSTATUS fort_device_create (PDEVICE_OBJECT device, PIRP irp) { @@ -1022,7 +1074,8 @@ fort_driver_unload (PDRIVER_OBJECT driver) if (g_device != NULL) { fort_callout_defer_flush(FALSE); - fort_timer_close(&g_device->timer); + fort_timer_close(&g_device->app_timer); + fort_timer_close(&g_device->log_timer); fort_defer_close(&g_device->defer); fort_stat_close(&g_device->stat); fort_buffer_close(&g_device->buffer); @@ -1102,7 +1155,8 @@ DriverEntry (PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) fort_buffer_open(&g_device->buffer); fort_stat_open(&g_device->stat); fort_defer_open(&g_device->defer); - fort_timer_open(&g_device->timer, &fort_callout_timer); + fort_timer_open(&g_device->log_timer, 500, &fort_callout_timer); + fort_timer_open(&g_device->app_timer, 60000, &fort_app_period_timer); KeInitializeSpinLock(&g_device->conf_lock); diff --git a/src/driver/forttmr.c b/src/driver/forttmr.c index 90418b8f..ea7421e4 100644 --- a/src/driver/forttmr.c +++ b/src/driver/forttmr.c @@ -4,6 +4,7 @@ typedef void (*FORT_TIMER_FUNC) (void); typedef struct fort_timer { UINT32 running : 1; + UINT32 period : 31; /* milliseconds */ FORT_TIMER_FUNC callback; @@ -25,8 +26,9 @@ fort_timer_callback (PKDPC dpc, PFORT_TIMER timer, PVOID arg1, PVOID arg2) } static void -fort_timer_open (PFORT_TIMER timer, FORT_TIMER_FUNC callback) +fort_timer_open (PFORT_TIMER timer, int period, FORT_TIMER_FUNC callback) { + timer->period = period; timer->callback = callback; KeInitializeDpc(&timer->dpc, &fort_timer_callback, timer); @@ -54,9 +56,9 @@ fort_timer_update (PFORT_TIMER timer, BOOL run) timer->running = run; if (run) { - const LONG period = 500; /* 500ms */ + const LONG period = timer->period; LARGE_INTEGER due; - due.QuadPart = period * -10000; /* 500000us */ + due.QuadPart = period * -10000; /* ms -> us */ KeSetTimerEx(&timer->id, due, period, &timer->dpc); } else { diff --git a/src/tests/confutil/test.cpp b/src/tests/confutil/test.cpp index a77a7f49..0cf975b0 100644 --- a/src/tests/confutil/test.cpp +++ b/src/tests/confutil/test.cpp @@ -29,6 +29,9 @@ void Test::confWriteRead() AppGroup *appGroup1 = new AppGroup(); appGroup1->setName("Base"); appGroup1->setEnabled(true); + appGroup1->setPeriodEnabled(true); + appGroup1->setPeriodFrom(0); + appGroup1->setPeriodTo(12); appGroup1->setBlockText( "System" ); @@ -78,6 +81,9 @@ void Test::confWriteRead() data, FortCommon::confAppIndex( data, FileUtil::pathToKernelPath("C:\\Program Files\\Test.exe").toLower()))); + QCOMPARE(FortCommon::confAppPeriodBits(data, 0), 0x01); + QCOMPARE(FortCommon::confAppPeriodBits(data, 12), 0); + const int firefoxIndex = FortCommon::confAppIndex( data, FileUtil::pathToKernelPath("C:\\Utils\\Firefox\\Bin\\firefox.exe").toLower()); QVERIFY(FortCommon::confAppBlocked(data, firefoxIndex)); diff --git a/src/ui/conf/appgroup.cpp b/src/ui/conf/appgroup.cpp index 4fed1761..38aeff85 100644 --- a/src/ui/conf/appgroup.cpp +++ b/src/ui/conf/appgroup.cpp @@ -3,6 +3,9 @@ AppGroup::AppGroup(QObject *parent) : QObject(parent), m_enabled(true), + m_periodEnabled(false), + m_periodFrom(0), + m_periodTo(0), m_limitInEnabled(false), m_limitOutEnabled(false), m_speedLimitIn(0), @@ -18,6 +21,30 @@ void AppGroup::setEnabled(bool enabled) } } +void AppGroup::setPeriodEnabled(bool periodEnabled) +{ + if (bool(m_periodEnabled) != periodEnabled) { + m_periodEnabled = periodEnabled; + emit periodEnabledChanged(); + } +} + +void AppGroup::setPeriodFrom(int periodFrom) +{ + if (m_periodFrom != periodFrom) { + m_periodFrom = periodFrom; + emit periodFromChanged(); + } +} + +void AppGroup::setPeriodTo(int periodTo) +{ + if (m_periodTo != periodTo) { + m_periodTo = periodTo; + emit periodToChanged(); + } +} + void AppGroup::setLimitInEnabled(bool enabled) { if (bool(m_limitInEnabled) != enabled) { @@ -78,6 +105,10 @@ QVariant AppGroup::toVariant() const { QVariantMap map; + map["periodEnabled"] = periodEnabled(); + map["periodFrom"] = periodFrom(); + map["periodTo"] = periodTo(); + map["limitInEnabled"] = limitInEnabled(); map["limitOutEnabled"] = limitOutEnabled(); map["speedLimitIn"] = speedLimitIn(); @@ -94,6 +125,10 @@ void AppGroup::fromVariant(const QVariant &v) { const QVariantMap map = v.toMap(); + m_periodEnabled = map["periodEnabled"].toBool(); + m_periodFrom = map["periodFrom"].toInt(); + m_periodTo = map["periodTo"].toInt(); + m_limitInEnabled = map["limitInEnabled"].toBool(); m_limitOutEnabled = map["limitOutEnabled"].toBool(); m_speedLimitIn = map["speedLimitIn"].toUInt(); diff --git a/src/ui/conf/appgroup.h b/src/ui/conf/appgroup.h index f3c9e4e1..9af246ce 100644 --- a/src/ui/conf/appgroup.h +++ b/src/ui/conf/appgroup.h @@ -8,6 +8,9 @@ class AppGroup : public QObject { Q_OBJECT Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) + Q_PROPERTY(bool periodEnabled READ periodEnabled WRITE setPeriodEnabled NOTIFY periodEnabledChanged) + Q_PROPERTY(int periodFrom READ periodFrom WRITE setPeriodFrom NOTIFY periodFromChanged) + Q_PROPERTY(int periodTo READ periodTo WRITE setPeriodTo NOTIFY periodToChanged) Q_PROPERTY(bool limitInEnabled READ limitInEnabled WRITE setLimitInEnabled NOTIFY limitInEnabledChanged) Q_PROPERTY(bool limitOutEnabled READ limitOutEnabled WRITE setLimitOutEnabled NOTIFY limitOutEnabledChanged) Q_PROPERTY(quint32 speedLimitIn READ speedLimitIn WRITE setSpeedLimitIn NOTIFY speedLimitInChanged) @@ -22,6 +25,15 @@ public: bool enabled() const { return m_enabled; } void setEnabled(bool enabled); + bool periodEnabled() const { return m_periodEnabled; } + void setPeriodEnabled(bool periodEnabled); + + int periodFrom() const { return m_periodFrom; } + void setPeriodFrom(int periodFrom); + + int periodTo() const { return m_periodTo; } + void setPeriodTo(int periodTo); + bool limitInEnabled() const { return m_limitInEnabled; } void setLimitInEnabled(bool enabled); @@ -48,6 +60,9 @@ public: signals: void enabledChanged(); + void periodEnabledChanged(); + void periodFromChanged(); + void periodToChanged(); void limitInEnabledChanged(); void limitOutEnabledChanged(); void speedLimitInChanged(); @@ -60,6 +75,11 @@ public slots: private: uint m_enabled : 1; + + uint m_periodEnabled : 1; + uint m_periodFrom : 5; + uint m_periodTo : 5; + uint m_limitInEnabled : 1; uint m_limitOutEnabled : 1; diff --git a/src/ui/fortcommon.cpp b/src/ui/fortcommon.cpp index 60b4616c..56082881 100644 --- a/src/ui/fortcommon.cpp +++ b/src/ui/fortcommon.cpp @@ -122,7 +122,9 @@ void FortCommon::logStatTrafHeaderRead(const char *input, void FortCommon::confAppPermsMaskInit(void *drvConf) { - fort_conf_app_perms_mask_init((PFORT_CONF) drvConf); + PFORT_CONF conf = (PFORT_CONF) drvConf; + + fort_conf_app_perms_mask_init(conf, conf->flags.group_bits); } bool FortCommon::confIpInRange(const void *drvConf, quint32 ip, @@ -166,6 +168,13 @@ bool FortCommon::confAppBlocked(const void *drvConf, int appIndex) return fort_conf_app_blocked(conf, appIndex); } +quint16 FortCommon::confAppPeriodBits(const void *drvConf, int hour) +{ + const PFORT_CONF conf = (const PFORT_CONF) drvConf; + + return fort_conf_app_period_bits(conf, hour, nullptr); +} + void FortCommon::provUnregister() { fort_prov_unregister(0); diff --git a/src/ui/fortcommon.h b/src/ui/fortcommon.h index 69c50106..fe2617f0 100644 --- a/src/ui/fortcommon.h +++ b/src/ui/fortcommon.h @@ -55,6 +55,7 @@ public: const QString &kernelPath); static quint8 confAppGroupIndex(const void *drvConf, int appIndex); static bool confAppBlocked(const void *drvConf, int appIndex); + static quint16 confAppPeriodBits(const void *drvConf, int hour); static void provUnregister(); }; diff --git a/src/ui/fortmanager.cpp b/src/ui/fortmanager.cpp index 974836ab..328c3d0e 100644 --- a/src/ui/fortmanager.cpp +++ b/src/ui/fortmanager.cpp @@ -87,7 +87,7 @@ FortManager::~FortManager() void FortManager::registerQmlTypes() { qmlRegisterUncreatableType("com.fortfirewall", 1, 0, "DriverManager", - "Singleton"); + "Singleton"); qmlRegisterUncreatableType("com.fortfirewall", 1, 0, "FortSettings", "Singleton"); diff --git a/src/ui/i18n/i18n_ru.qm b/src/ui/i18n/i18n_ru.qm index 0f42b708..1a03f5fc 100644 Binary files a/src/ui/i18n/i18n_ru.qm and b/src/ui/i18n/i18n_ru.qm differ diff --git a/src/ui/i18n/i18n_ru.ts b/src/ui/i18n/i18n_ru.ts index 3ce5e641..53354832 100644 --- a/src/ui/i18n/i18n_ru.ts +++ b/src/ui/i18n/i18n_ru.ts @@ -4,37 +4,37 @@ ConfUtil - + Bad Include IP address: %1 Некорректный IP адрес для включения: %1 - + Bad Exclude IP address: %1 Некорректный IP адрес для исключения: %1 - + Too many IP addresses Слишком много IP адресов - + Too many application paths Слишком много путей приложений - + Number of Application Groups must be < %1 Количество групп приложений должно быть < %1 - + Length of Application Group's Name must be < %1 Длина наименования группы приложения должна быть < %1 - + Length of Application's Path must be < %1 Длина пути приложения должна быть < %1 @@ -310,17 +310,22 @@ Сдвинуть направо - + Enabled Включено - + + period, hours: + период, часы + + + Block Блокировать - + Allow Разрешить diff --git a/src/ui/qml/main.qml b/src/ui/qml/main.qml index d8b4c85b..95bcde1b 100644 --- a/src/ui/qml/main.qml +++ b/src/ui/qml/main.qml @@ -9,7 +9,7 @@ ApplicationWindow { width: 1025 height: 768 - minimumWidth: 800 + minimumWidth: 950 minimumHeight: 600 font.pixelSize: 16 diff --git a/src/ui/qml/pages/apps/AppsColumn.qml b/src/ui/qml/pages/apps/AppsColumn.qml index f3cbad13..92145546 100644 --- a/src/ui/qml/pages/apps/AppsColumn.qml +++ b/src/ui/qml/pages/apps/AppsColumn.qml @@ -42,6 +42,7 @@ ColumnLayout { } CheckBox { + id: cbEnabled text: translationManager.trTrigger && qsTranslate("qml", "Enabled") checked: appGroup.enabled @@ -51,6 +52,54 @@ ColumnLayout { setConfFlagsEdited(); } } + + SpinDoubleRow { + Layout.maximumWidth: implicitWidth + enabled: cbEnabled.checked + + checkBox { + text: translationManager.trTrigger + && qsTranslate("qml", "period, hours:") + checked: appGroup.periodEnabled + onCheckedChanged: { + const value = checkBox.checked; + if (appGroup.periodEnabled == value) + return; + + appGroup.periodEnabled = value; + + setConfEdited(); + } + } + field1 { + from: 0 + to: 24 + value: appGroup.periodFrom + onValueChanged: { + const value = field1.value; + if (appGroup.periodFrom == value) + return; + + appGroup.periodFrom = value; + + setConfEdited(); + } + } + field2 { + from: 0 + to: 24 + value: appGroup.periodTo + onValueChanged: { + const value = field2.value; + if (appGroup.periodTo == value) + return; + + appGroup.periodTo = value; + + setConfEdited(); + } + } + } } RowLayout { diff --git a/src/ui/util/conf/confutil.cpp b/src/ui/util/conf/confutil.cpp index 5412961e..c6a86ef7 100644 --- a/src/ui/util/conf/confutil.cpp +++ b/src/ui/util/conf/confutil.cpp @@ -46,11 +46,13 @@ int ConfUtil::write(const FirewallConf &conf, QByteArray &buf) quint32 appPathsLen = 0; QStringList appPaths; numbers_arr_t appPerms; + quint8 appPeriodsCount = 0; + chars_arr_t appPeriods; appgroups_map_t appGroupIndexes; if (!parseAppGroups(conf.appGroupsList(), - appPaths, appPathsLen, - appPerms, appGroupIndexes)) + appPaths, appPathsLen, appPerms, + appPeriods, appPeriodsCount, appGroupIndexes)) return false; if (appPathsLen > FORT_CONF_APPS_LEN_MAX) { @@ -61,7 +63,8 @@ int ConfUtil::write(const FirewallConf &conf, QByteArray &buf) // Fill the buffer const int confIoSize = FORT_CONF_IO_CONF_OFF + FORT_CONF_DATA_OFF + addressGroupsSize - + FORT_CONF_STR_DATA_SIZE(appGroupIndexes.size()) + + FORT_CONF_STR_DATA_SIZE(appGroupIndexes.size()) // appPerms + + FORT_CONF_STR_DATA_SIZE(conf.appGroupsList().size() * 2) // appPeriods + appPaths.size() * sizeof(quint32) + FORT_CONF_STR_HEADER_SIZE(appPaths.size()) + FORT_CONF_STR_DATA_SIZE(appPathsLen); @@ -70,7 +73,8 @@ int ConfUtil::write(const FirewallConf &conf, QByteArray &buf) writeData(buf.data(), conf, addressRanges, addressGroupOffsets, - appPaths, appPerms, appGroupIndexes); + appPaths, appPerms, + appPeriods, appPeriodsCount, appGroupIndexes); return confIoSize; } @@ -152,6 +156,8 @@ bool ConfUtil::parseAppGroups(const QList &appGroups, QStringList &appPaths, quint32 &appPathsLen, numbers_arr_t &appPerms, + chars_arr_t &appPeriods, + quint8 &appPeriodsCount, appgroups_map_t &appGroupIndexes) { const int groupsCount = appGroups.size(); @@ -178,6 +184,21 @@ bool ConfUtil::parseAppGroups(const QList &appGroups, || !parseApps(appGroup->allowText(), false, appPermsMap, appGroupIndexes, i)) return false; + + // Enabled Period + { + qint8 periodFrom = 0, periodTo = 0; + if (appGroup->enabled() && appGroup->periodEnabled()) { + periodFrom = qint8(appGroup->periodFrom()); + periodTo = qint8(appGroup->periodTo()); + + if (periodFrom != 0 || periodTo != 0) { + ++appPeriodsCount; + } + } + appPeriods.append(periodFrom); + appPeriods.append(periodTo); + } } // Fill app. paths & perms arrays @@ -260,14 +281,16 @@ void ConfUtil::writeData(char *output, const FirewallConf &conf, const numbers_arr_t &addressGroupOffsets, const QStringList &appPaths, const numbers_arr_t &appPerms, + const chars_arr_t &appPeriods, + quint8 appPeriodsCount, const appgroups_map_t &appGroupIndexes) { PFORT_CONF_IO drvConfIo = (PFORT_CONF_IO) output; PFORT_CONF drvConf = &drvConfIo->conf; char *data = drvConf->data; const quint32 appPathsSize = appPaths.size(); - quint32 addrGroupsOff; - quint32 appPathsOff, appPermsOff, appGroupsOff; + quint32 addrGroupsOff, appGroupsOff; + quint32 appPathsOff, appPermsOff, appPeriodsOff; #define CONF_DATA_OFFSET (data - drvConf->data) addrGroupsOff = CONF_DATA_OFFSET; @@ -280,6 +303,9 @@ void ConfUtil::writeData(char *output, const FirewallConf &conf, appPermsOff = CONF_DATA_OFFSET; writeNumbers(&data, appPerms); + appPeriodsOff = CONF_DATA_OFFSET; + writeChars(&data, appPeriods); + appPathsOff = CONF_DATA_OFFSET; writeStrings(&data, appPaths); #undef CONF_DATA_OFFSET @@ -305,11 +331,13 @@ void ConfUtil::writeData(char *output, const FirewallConf &conf, FortCommon::confAppPermsMaskInit(drvConf); drvConf->apps_n = appPathsSize; + drvConf->app_periods_n = appPeriodsCount; drvConf->addr_groups_off = addrGroupsOff; drvConf->app_groups_off = appGroupsOff; drvConf->app_perms_off = appPermsOff; + drvConf->app_periods_off = appPeriodsOff; drvConf->apps_off = appPathsOff; } @@ -368,7 +396,7 @@ void ConfUtil::writeAddressRange(char **data, writeNumbers(data, addressRange.excludeRange().toArray()); } -void ConfUtil::writeNumbers(char **data, const QVector &array) +void ConfUtil::writeNumbers(char **data, const numbers_arr_t &array) { const int arraySize = array.size() * sizeof(quint32); @@ -377,7 +405,7 @@ void ConfUtil::writeNumbers(char **data, const QVector &array) *data += arraySize; } -void ConfUtil::writeChars(char **data, const QVector &array) +void ConfUtil::writeChars(char **data, const chars_arr_t &array) { const int arraySize = array.size(); diff --git a/src/ui/util/conf/confutil.h b/src/ui/util/conf/confutil.h index d889d471..81c2586f 100644 --- a/src/ui/util/conf/confutil.h +++ b/src/ui/util/conf/confutil.h @@ -16,6 +16,7 @@ QT_FORWARD_DECLARE_CLASS(FirewallConf) QT_FORWARD_DECLARE_STRUCT(fort_conf_limit) using numbers_arr_t = QVector; +using chars_arr_t = QVector; using addrranges_arr_t = QVarLengthArray; @@ -52,6 +53,8 @@ private: QStringList &appPaths, quint32 &appPathsLen, numbers_arr_t &appPerms, + chars_arr_t &appPeriods, + quint8 &appPeriodsCount, appgroups_map_t &appGroupIndexes); bool parseApps(const QString &text, bool blocked, @@ -66,6 +69,8 @@ private: const numbers_arr_t &addressGroupOffsets, const QStringList &appPaths, const numbers_arr_t &appPerms, + const chars_arr_t &appPeriods, + quint8 appPeriodsCount, const appgroups_map_t &appGroupIndexes); static quint16 writeLimits(struct fort_conf_limit *limits, @@ -76,8 +81,8 @@ private: static void writeAddressRange(char **data, const AddressRange &addressRange); - static void writeNumbers(char **data, const QVector &array); - static void writeChars(char **data, const QVector &array); + static void writeNumbers(char **data, const numbers_arr_t &array); + static void writeChars(char **data, const chars_arr_t &array); static void writeStrings(char **data, const QStringList &list); private: diff --git a/src/ui/util/dateutil.cpp b/src/ui/util/dateutil.cpp index f2c0dafb..5385d876 100644 --- a/src/ui/util/dateutil.cpp +++ b/src/ui/util/dateutil.cpp @@ -2,6 +2,8 @@ #include +#include "../../common/util.h" + DateUtil::DateUtil(QObject *parent) : QObject(parent) { @@ -86,7 +88,5 @@ bool DateUtil::isHourBetween(qint32 unixHour, qint32 unixDay, { const int hour = unixHour - unixDay; - return fromHour <= toHour - ? (hour >= fromHour && hour < toHour) - : (hour == 0 || hour >= fromHour || hour < toHour); + return is_hour_between(hour, fromHour, toHour); }