mirror of
https://github.com/tnodir/fort
synced 2024-11-15 10:35:10 +00:00
UI: ApplicationsPage: Add hour period to enabled state.
This commit is contained in:
parent
a110498d32
commit
c606225c35
@ -1,6 +1,7 @@
|
|||||||
/* Fort Firewall Driver Configuration */
|
/* Fort Firewall Driver Configuration */
|
||||||
|
|
||||||
#include "fortconf.h"
|
#include "fortconf.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
#ifndef FORT_DRIVER
|
#ifndef FORT_DRIVER
|
||||||
@ -104,10 +105,10 @@ static int
|
|||||||
fort_conf_app_index (const PFORT_CONF conf,
|
fort_conf_app_index (const PFORT_CONF conf,
|
||||||
UINT32 path_len, const char *path)
|
UINT32 path_len, const char *path)
|
||||||
{
|
{
|
||||||
const UINT32 count = conf->apps_n;
|
|
||||||
const char *data;
|
const char *data;
|
||||||
const UINT32 *app_offsets;
|
const UINT32 *app_offsets;
|
||||||
const char *apps;
|
const char *apps;
|
||||||
|
const UINT32 count = conf->apps_n;
|
||||||
int low, high;
|
int low, high;
|
||||||
|
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
@ -168,10 +169,52 @@ fort_conf_app_blocked (const PFORT_CONF conf, int app_index)
|
|||||||
: (app_blocked && !app_allowed));
|
: (app_blocked && !app_allowed));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static UINT16
|
||||||
fort_conf_app_perms_mask_init (PFORT_CONF conf)
|
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 =
|
UINT32 perms_mask =
|
||||||
(group_bits & 0x0001) | ((group_bits & 0x0002) << 1)
|
(group_bits & 0x0001) | ((group_bits & 0x0002) << 1)
|
||||||
| ((group_bits & 0x0004) << 2) | ((group_bits & 0x0008) << 3)
|
| ((group_bits & 0x0004) << 2) | ((group_bits & 0x0008) << 3)
|
||||||
|
@ -19,7 +19,7 @@ typedef struct fort_conf_flags {
|
|||||||
UINT32 app_allow_all : 1;
|
UINT32 app_allow_all : 1;
|
||||||
UINT32 log_blocked : 1;
|
UINT32 log_blocked : 1;
|
||||||
UINT32 log_stat : 1;
|
UINT32 log_stat : 1;
|
||||||
UINT32 _reserved_ : 9;
|
|
||||||
UINT32 group_bits : 16;
|
UINT32 group_bits : 16;
|
||||||
} FORT_CONF_FLAGS, *PFORT_CONF_FLAGS;
|
} FORT_CONF_FLAGS, *PFORT_CONF_FLAGS;
|
||||||
|
|
||||||
@ -43,6 +43,7 @@ typedef struct fort_conf {
|
|||||||
FORT_CONF_FLAGS flags;
|
FORT_CONF_FLAGS flags;
|
||||||
|
|
||||||
UINT16 apps_n;
|
UINT16 apps_n;
|
||||||
|
UCHAR app_periods_n;
|
||||||
|
|
||||||
UINT32 app_perms_block_mask;
|
UINT32 app_perms_block_mask;
|
||||||
UINT32 app_perms_allow_mask;
|
UINT32 app_perms_allow_mask;
|
||||||
@ -51,6 +52,7 @@ typedef struct fort_conf {
|
|||||||
|
|
||||||
UINT32 app_groups_off;
|
UINT32 app_groups_off;
|
||||||
UINT32 app_perms_off;
|
UINT32 app_perms_off;
|
||||||
|
UINT32 app_periods_off;
|
||||||
UINT32 apps_off;
|
UINT32 apps_off;
|
||||||
|
|
||||||
char data[4];
|
char data[4];
|
||||||
|
8
src/common/util.h
Normal file
8
src/common/util.h
Normal file
@ -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
|
@ -7,6 +7,6 @@
|
|||||||
#define APP_UPDATES_URL "https://github.com/tnodir/fort/releases"
|
#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 APP_UPDATES_API_URL "https://api.github.com/repos/tnodir/fort/releases/latest"
|
||||||
|
|
||||||
#define DRIVER_VERSION 7
|
#define DRIVER_VERSION 8
|
||||||
|
|
||||||
#endif // VERSION_H
|
#endif // VERSION_H
|
||||||
|
@ -50,7 +50,8 @@ typedef struct fort_device {
|
|||||||
FORT_BUFFER buffer;
|
FORT_BUFFER buffer;
|
||||||
FORT_STAT stat;
|
FORT_STAT stat;
|
||||||
FORT_DEFER defer;
|
FORT_DEFER defer;
|
||||||
FORT_TIMER timer;
|
FORT_TIMER log_timer;
|
||||||
|
FORT_TIMER app_timer;
|
||||||
} FORT_DEVICE, *PFORT_DEVICE;
|
} FORT_DEVICE, *PFORT_DEVICE;
|
||||||
|
|
||||||
static PFORT_DEVICE g_device = NULL;
|
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;
|
old_conf_flags = conf->flags;
|
||||||
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;
|
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;
|
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
|
static void
|
||||||
fort_callout_classify_block (FWPS_CLASSIFY_OUT0 *classifyOut)
|
fort_callout_classify_block (FWPS_CLASSIFY_OUT0 *classifyOut)
|
||||||
{
|
{
|
||||||
@ -682,7 +723,8 @@ fort_callout_force_reauth (PDEVICE_OBJECT device,
|
|||||||
|
|
||||||
UNUSED(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) {
|
if (old_conf_flags.log_stat != conf_flags.log_stat) {
|
||||||
fort_stat_update(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)))
|
if ((status = fort_prov_reauth(engine)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
fort_timer_update(&g_device->timer,
|
fort_timer_update(&g_device->log_timer,
|
||||||
(conf_flags.log_blocked || conf_flags.log_stat));
|
(conf_flags.log_blocked || conf_flags.log_stat));
|
||||||
|
|
||||||
|
if (fort_conf_period_update()) {
|
||||||
|
fort_timer_update(&g_device->app_timer, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (NT_SUCCESS(status)) {
|
if (NT_SUCCESS(status)) {
|
||||||
status = fort_prov_trans_commit(engine);
|
status = fort_prov_trans_commit(engine);
|
||||||
@ -805,6 +851,12 @@ fort_callout_timer (void)
|
|||||||
fort_callout_defer_flush(TRUE);
|
fort_callout_defer_flush(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fort_app_period_timer (void)
|
||||||
|
{
|
||||||
|
fort_conf_period_update();
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
fort_device_create (PDEVICE_OBJECT device, PIRP irp)
|
fort_device_create (PDEVICE_OBJECT device, PIRP irp)
|
||||||
{
|
{
|
||||||
@ -1022,7 +1074,8 @@ fort_driver_unload (PDRIVER_OBJECT driver)
|
|||||||
if (g_device != NULL) {
|
if (g_device != NULL) {
|
||||||
fort_callout_defer_flush(FALSE);
|
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_defer_close(&g_device->defer);
|
||||||
fort_stat_close(&g_device->stat);
|
fort_stat_close(&g_device->stat);
|
||||||
fort_buffer_close(&g_device->buffer);
|
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_buffer_open(&g_device->buffer);
|
||||||
fort_stat_open(&g_device->stat);
|
fort_stat_open(&g_device->stat);
|
||||||
fort_defer_open(&g_device->defer);
|
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);
|
KeInitializeSpinLock(&g_device->conf_lock);
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ typedef void (*FORT_TIMER_FUNC) (void);
|
|||||||
|
|
||||||
typedef struct fort_timer {
|
typedef struct fort_timer {
|
||||||
UINT32 running : 1;
|
UINT32 running : 1;
|
||||||
|
UINT32 period : 31; /* milliseconds */
|
||||||
|
|
||||||
FORT_TIMER_FUNC callback;
|
FORT_TIMER_FUNC callback;
|
||||||
|
|
||||||
@ -25,8 +26,9 @@ fort_timer_callback (PKDPC dpc, PFORT_TIMER timer, PVOID arg1, PVOID arg2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
timer->callback = callback;
|
||||||
|
|
||||||
KeInitializeDpc(&timer->dpc, &fort_timer_callback, timer);
|
KeInitializeDpc(&timer->dpc, &fort_timer_callback, timer);
|
||||||
@ -54,9 +56,9 @@ fort_timer_update (PFORT_TIMER timer, BOOL run)
|
|||||||
timer->running = run;
|
timer->running = run;
|
||||||
|
|
||||||
if (run) {
|
if (run) {
|
||||||
const LONG period = 500; /* 500ms */
|
const LONG period = timer->period;
|
||||||
LARGE_INTEGER due;
|
LARGE_INTEGER due;
|
||||||
due.QuadPart = period * -10000; /* 500000us */
|
due.QuadPart = period * -10000; /* ms -> us */
|
||||||
|
|
||||||
KeSetTimerEx(&timer->id, due, period, &timer->dpc);
|
KeSetTimerEx(&timer->id, due, period, &timer->dpc);
|
||||||
} else {
|
} else {
|
||||||
|
@ -29,6 +29,9 @@ void Test::confWriteRead()
|
|||||||
AppGroup *appGroup1 = new AppGroup();
|
AppGroup *appGroup1 = new AppGroup();
|
||||||
appGroup1->setName("Base");
|
appGroup1->setName("Base");
|
||||||
appGroup1->setEnabled(true);
|
appGroup1->setEnabled(true);
|
||||||
|
appGroup1->setPeriodEnabled(true);
|
||||||
|
appGroup1->setPeriodFrom(0);
|
||||||
|
appGroup1->setPeriodTo(12);
|
||||||
appGroup1->setBlockText(
|
appGroup1->setBlockText(
|
||||||
"System"
|
"System"
|
||||||
);
|
);
|
||||||
@ -78,6 +81,9 @@ void Test::confWriteRead()
|
|||||||
data, FortCommon::confAppIndex(
|
data, FortCommon::confAppIndex(
|
||||||
data, FileUtil::pathToKernelPath("C:\\Program Files\\Test.exe").toLower())));
|
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(
|
const int firefoxIndex = FortCommon::confAppIndex(
|
||||||
data, FileUtil::pathToKernelPath("C:\\Utils\\Firefox\\Bin\\firefox.exe").toLower());
|
data, FileUtil::pathToKernelPath("C:\\Utils\\Firefox\\Bin\\firefox.exe").toLower());
|
||||||
QVERIFY(FortCommon::confAppBlocked(data, firefoxIndex));
|
QVERIFY(FortCommon::confAppBlocked(data, firefoxIndex));
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
AppGroup::AppGroup(QObject *parent) :
|
AppGroup::AppGroup(QObject *parent) :
|
||||||
QObject(parent),
|
QObject(parent),
|
||||||
m_enabled(true),
|
m_enabled(true),
|
||||||
|
m_periodEnabled(false),
|
||||||
|
m_periodFrom(0),
|
||||||
|
m_periodTo(0),
|
||||||
m_limitInEnabled(false),
|
m_limitInEnabled(false),
|
||||||
m_limitOutEnabled(false),
|
m_limitOutEnabled(false),
|
||||||
m_speedLimitIn(0),
|
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)
|
void AppGroup::setLimitInEnabled(bool enabled)
|
||||||
{
|
{
|
||||||
if (bool(m_limitInEnabled) != enabled) {
|
if (bool(m_limitInEnabled) != enabled) {
|
||||||
@ -78,6 +105,10 @@ QVariant AppGroup::toVariant() const
|
|||||||
{
|
{
|
||||||
QVariantMap map;
|
QVariantMap map;
|
||||||
|
|
||||||
|
map["periodEnabled"] = periodEnabled();
|
||||||
|
map["periodFrom"] = periodFrom();
|
||||||
|
map["periodTo"] = periodTo();
|
||||||
|
|
||||||
map["limitInEnabled"] = limitInEnabled();
|
map["limitInEnabled"] = limitInEnabled();
|
||||||
map["limitOutEnabled"] = limitOutEnabled();
|
map["limitOutEnabled"] = limitOutEnabled();
|
||||||
map["speedLimitIn"] = speedLimitIn();
|
map["speedLimitIn"] = speedLimitIn();
|
||||||
@ -94,6 +125,10 @@ void AppGroup::fromVariant(const QVariant &v)
|
|||||||
{
|
{
|
||||||
const QVariantMap map = v.toMap();
|
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_limitInEnabled = map["limitInEnabled"].toBool();
|
||||||
m_limitOutEnabled = map["limitOutEnabled"].toBool();
|
m_limitOutEnabled = map["limitOutEnabled"].toBool();
|
||||||
m_speedLimitIn = map["speedLimitIn"].toUInt();
|
m_speedLimitIn = map["speedLimitIn"].toUInt();
|
||||||
|
@ -8,6 +8,9 @@ class AppGroup : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
|
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 limitInEnabled READ limitInEnabled WRITE setLimitInEnabled NOTIFY limitInEnabledChanged)
|
||||||
Q_PROPERTY(bool limitOutEnabled READ limitOutEnabled WRITE setLimitOutEnabled NOTIFY limitOutEnabledChanged)
|
Q_PROPERTY(bool limitOutEnabled READ limitOutEnabled WRITE setLimitOutEnabled NOTIFY limitOutEnabledChanged)
|
||||||
Q_PROPERTY(quint32 speedLimitIn READ speedLimitIn WRITE setSpeedLimitIn NOTIFY speedLimitInChanged)
|
Q_PROPERTY(quint32 speedLimitIn READ speedLimitIn WRITE setSpeedLimitIn NOTIFY speedLimitInChanged)
|
||||||
@ -22,6 +25,15 @@ public:
|
|||||||
bool enabled() const { return m_enabled; }
|
bool enabled() const { return m_enabled; }
|
||||||
void setEnabled(bool 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; }
|
bool limitInEnabled() const { return m_limitInEnabled; }
|
||||||
void setLimitInEnabled(bool enabled);
|
void setLimitInEnabled(bool enabled);
|
||||||
|
|
||||||
@ -48,6 +60,9 @@ public:
|
|||||||
|
|
||||||
signals:
|
signals:
|
||||||
void enabledChanged();
|
void enabledChanged();
|
||||||
|
void periodEnabledChanged();
|
||||||
|
void periodFromChanged();
|
||||||
|
void periodToChanged();
|
||||||
void limitInEnabledChanged();
|
void limitInEnabledChanged();
|
||||||
void limitOutEnabledChanged();
|
void limitOutEnabledChanged();
|
||||||
void speedLimitInChanged();
|
void speedLimitInChanged();
|
||||||
@ -60,6 +75,11 @@ public slots:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
uint m_enabled : 1;
|
uint m_enabled : 1;
|
||||||
|
|
||||||
|
uint m_periodEnabled : 1;
|
||||||
|
uint m_periodFrom : 5;
|
||||||
|
uint m_periodTo : 5;
|
||||||
|
|
||||||
uint m_limitInEnabled : 1;
|
uint m_limitInEnabled : 1;
|
||||||
uint m_limitOutEnabled : 1;
|
uint m_limitOutEnabled : 1;
|
||||||
|
|
||||||
|
@ -122,7 +122,9 @@ void FortCommon::logStatTrafHeaderRead(const char *input,
|
|||||||
|
|
||||||
void FortCommon::confAppPermsMaskInit(void *drvConf)
|
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,
|
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);
|
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()
|
void FortCommon::provUnregister()
|
||||||
{
|
{
|
||||||
fort_prov_unregister(0);
|
fort_prov_unregister(0);
|
||||||
|
@ -55,6 +55,7 @@ public:
|
|||||||
const QString &kernelPath);
|
const QString &kernelPath);
|
||||||
static quint8 confAppGroupIndex(const void *drvConf, int appIndex);
|
static quint8 confAppGroupIndex(const void *drvConf, int appIndex);
|
||||||
static bool confAppBlocked(const void *drvConf, int appIndex);
|
static bool confAppBlocked(const void *drvConf, int appIndex);
|
||||||
|
static quint16 confAppPeriodBits(const void *drvConf, int hour);
|
||||||
|
|
||||||
static void provUnregister();
|
static void provUnregister();
|
||||||
};
|
};
|
||||||
|
Binary file not shown.
@ -4,37 +4,37 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>ConfUtil</name>
|
<name>ConfUtil</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../util/conf/confutil.cpp" line="118"/>
|
<location filename="../util/conf/confutil.cpp" line="122"/>
|
||||||
<source>Bad Include IP address: %1</source>
|
<source>Bad Include IP address: %1</source>
|
||||||
<translation>Некорректный IP адрес для включения: %1</translation>
|
<translation>Некорректный IP адрес для включения: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../util/conf/confutil.cpp" line="126"/>
|
<location filename="../util/conf/confutil.cpp" line="130"/>
|
||||||
<source>Bad Exclude IP address: %1</source>
|
<source>Bad Exclude IP address: %1</source>
|
||||||
<translation>Некорректный IP адрес для исключения: %1</translation>
|
<translation>Некорректный IP адрес для исключения: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../util/conf/confutil.cpp" line="137"/>
|
<location filename="../util/conf/confutil.cpp" line="141"/>
|
||||||
<source>Too many IP addresses</source>
|
<source>Too many IP addresses</source>
|
||||||
<translation>Слишком много IP адресов</translation>
|
<translation>Слишком много IP адресов</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../util/conf/confutil.cpp" line="57"/>
|
<location filename="../util/conf/confutil.cpp" line="59"/>
|
||||||
<source>Too many application paths</source>
|
<source>Too many application paths</source>
|
||||||
<translation>Слишком много путей приложений</translation>
|
<translation>Слишком много путей приложений</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../util/conf/confutil.cpp" line="159"/>
|
<location filename="../util/conf/confutil.cpp" line="165"/>
|
||||||
<source>Number of Application Groups must be < %1</source>
|
<source>Number of Application Groups must be < %1</source>
|
||||||
<translation>Количество групп приложений должно быть < %1</translation>
|
<translation>Количество групп приложений должно быть < %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../util/conf/confutil.cpp" line="171"/>
|
<location filename="../util/conf/confutil.cpp" line="177"/>
|
||||||
<source>Length of Application Group's Name must be < %1</source>
|
<source>Length of Application Group's Name must be < %1</source>
|
||||||
<translation>Длина наименования группы приложения должна быть < %1</translation>
|
<translation>Длина наименования группы приложения должна быть < %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../util/conf/confutil.cpp" line="219"/>
|
<location filename="../util/conf/confutil.cpp" line="240"/>
|
||||||
<source>Length of Application's Path must be < %1</source>
|
<source>Length of Application's Path must be < %1</source>
|
||||||
<translation>Длина пути приложения должна быть < %1</translation>
|
<translation>Длина пути приложения должна быть < %1</translation>
|
||||||
</message>
|
</message>
|
||||||
@ -310,17 +310,22 @@
|
|||||||
<translation>Сдвинуть направо</translation>
|
<translation>Сдвинуть направо</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/apps/AppsColumn.qml" line="46"/>
|
<location filename="../qml/pages/apps/AppsColumn.qml" line="47"/>
|
||||||
<source>Enabled</source>
|
<source>Enabled</source>
|
||||||
<translation>Включено</translation>
|
<translation>Включено</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/apps/AppsColumn.qml" line="64"/>
|
<location filename="../qml/pages/apps/AppsColumn.qml" line="62"/>
|
||||||
|
<source>period, hours:</source>
|
||||||
|
<translation>период, часы</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../qml/pages/apps/AppsColumn.qml" line="113"/>
|
||||||
<source>Block</source>
|
<source>Block</source>
|
||||||
<translation>Блокировать</translation>
|
<translation>Блокировать</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../qml/pages/apps/AppsColumn.qml" line="84"/>
|
<location filename="../qml/pages/apps/AppsColumn.qml" line="133"/>
|
||||||
<source>Allow</source>
|
<source>Allow</source>
|
||||||
<translation>Разрешить</translation>
|
<translation>Разрешить</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -9,7 +9,7 @@ ApplicationWindow {
|
|||||||
|
|
||||||
width: 1025
|
width: 1025
|
||||||
height: 768
|
height: 768
|
||||||
minimumWidth: 800
|
minimumWidth: 950
|
||||||
minimumHeight: 600
|
minimumHeight: 600
|
||||||
|
|
||||||
font.pixelSize: 16
|
font.pixelSize: 16
|
||||||
|
@ -42,6 +42,7 @@ ColumnLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CheckBox {
|
CheckBox {
|
||||||
|
id: cbEnabled
|
||||||
text: translationManager.trTrigger
|
text: translationManager.trTrigger
|
||||||
&& qsTranslate("qml", "Enabled")
|
&& qsTranslate("qml", "Enabled")
|
||||||
checked: appGroup.enabled
|
checked: appGroup.enabled
|
||||||
@ -51,6 +52,54 @@ ColumnLayout {
|
|||||||
setConfFlagsEdited();
|
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 {
|
RowLayout {
|
||||||
|
@ -46,11 +46,13 @@ int ConfUtil::write(const FirewallConf &conf, QByteArray &buf)
|
|||||||
quint32 appPathsLen = 0;
|
quint32 appPathsLen = 0;
|
||||||
QStringList appPaths;
|
QStringList appPaths;
|
||||||
numbers_arr_t appPerms;
|
numbers_arr_t appPerms;
|
||||||
|
quint8 appPeriodsCount = 0;
|
||||||
|
chars_arr_t appPeriods;
|
||||||
appgroups_map_t appGroupIndexes;
|
appgroups_map_t appGroupIndexes;
|
||||||
|
|
||||||
if (!parseAppGroups(conf.appGroupsList(),
|
if (!parseAppGroups(conf.appGroupsList(),
|
||||||
appPaths, appPathsLen,
|
appPaths, appPathsLen, appPerms,
|
||||||
appPerms, appGroupIndexes))
|
appPeriods, appPeriodsCount, appGroupIndexes))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (appPathsLen > FORT_CONF_APPS_LEN_MAX) {
|
if (appPathsLen > FORT_CONF_APPS_LEN_MAX) {
|
||||||
@ -61,7 +63,8 @@ int ConfUtil::write(const FirewallConf &conf, QByteArray &buf)
|
|||||||
// Fill the buffer
|
// Fill the buffer
|
||||||
const int confIoSize = FORT_CONF_IO_CONF_OFF + FORT_CONF_DATA_OFF
|
const int confIoSize = FORT_CONF_IO_CONF_OFF + FORT_CONF_DATA_OFF
|
||||||
+ addressGroupsSize
|
+ 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)
|
+ appPaths.size() * sizeof(quint32)
|
||||||
+ FORT_CONF_STR_HEADER_SIZE(appPaths.size())
|
+ FORT_CONF_STR_HEADER_SIZE(appPaths.size())
|
||||||
+ FORT_CONF_STR_DATA_SIZE(appPathsLen);
|
+ FORT_CONF_STR_DATA_SIZE(appPathsLen);
|
||||||
@ -70,7 +73,8 @@ int ConfUtil::write(const FirewallConf &conf, QByteArray &buf)
|
|||||||
|
|
||||||
writeData(buf.data(), conf,
|
writeData(buf.data(), conf,
|
||||||
addressRanges, addressGroupOffsets,
|
addressRanges, addressGroupOffsets,
|
||||||
appPaths, appPerms, appGroupIndexes);
|
appPaths, appPerms,
|
||||||
|
appPeriods, appPeriodsCount, appGroupIndexes);
|
||||||
|
|
||||||
return confIoSize;
|
return confIoSize;
|
||||||
}
|
}
|
||||||
@ -152,6 +156,8 @@ bool ConfUtil::parseAppGroups(const QList<AppGroup *> &appGroups,
|
|||||||
QStringList &appPaths,
|
QStringList &appPaths,
|
||||||
quint32 &appPathsLen,
|
quint32 &appPathsLen,
|
||||||
numbers_arr_t &appPerms,
|
numbers_arr_t &appPerms,
|
||||||
|
chars_arr_t &appPeriods,
|
||||||
|
quint8 &appPeriodsCount,
|
||||||
appgroups_map_t &appGroupIndexes)
|
appgroups_map_t &appGroupIndexes)
|
||||||
{
|
{
|
||||||
const int groupsCount = appGroups.size();
|
const int groupsCount = appGroups.size();
|
||||||
@ -178,6 +184,21 @@ bool ConfUtil::parseAppGroups(const QList<AppGroup *> &appGroups,
|
|||||||
|| !parseApps(appGroup->allowText(), false,
|
|| !parseApps(appGroup->allowText(), false,
|
||||||
appPermsMap, appGroupIndexes, i))
|
appPermsMap, appGroupIndexes, i))
|
||||||
return false;
|
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
|
// Fill app. paths & perms arrays
|
||||||
@ -260,14 +281,16 @@ void ConfUtil::writeData(char *output, const FirewallConf &conf,
|
|||||||
const numbers_arr_t &addressGroupOffsets,
|
const numbers_arr_t &addressGroupOffsets,
|
||||||
const QStringList &appPaths,
|
const QStringList &appPaths,
|
||||||
const numbers_arr_t &appPerms,
|
const numbers_arr_t &appPerms,
|
||||||
|
const chars_arr_t &appPeriods,
|
||||||
|
quint8 appPeriodsCount,
|
||||||
const appgroups_map_t &appGroupIndexes)
|
const appgroups_map_t &appGroupIndexes)
|
||||||
{
|
{
|
||||||
PFORT_CONF_IO drvConfIo = (PFORT_CONF_IO) output;
|
PFORT_CONF_IO drvConfIo = (PFORT_CONF_IO) output;
|
||||||
PFORT_CONF drvConf = &drvConfIo->conf;
|
PFORT_CONF drvConf = &drvConfIo->conf;
|
||||||
char *data = drvConf->data;
|
char *data = drvConf->data;
|
||||||
const quint32 appPathsSize = appPaths.size();
|
const quint32 appPathsSize = appPaths.size();
|
||||||
quint32 addrGroupsOff;
|
quint32 addrGroupsOff, appGroupsOff;
|
||||||
quint32 appPathsOff, appPermsOff, appGroupsOff;
|
quint32 appPathsOff, appPermsOff, appPeriodsOff;
|
||||||
|
|
||||||
#define CONF_DATA_OFFSET (data - drvConf->data)
|
#define CONF_DATA_OFFSET (data - drvConf->data)
|
||||||
addrGroupsOff = CONF_DATA_OFFSET;
|
addrGroupsOff = CONF_DATA_OFFSET;
|
||||||
@ -280,6 +303,9 @@ void ConfUtil::writeData(char *output, const FirewallConf &conf,
|
|||||||
appPermsOff = CONF_DATA_OFFSET;
|
appPermsOff = CONF_DATA_OFFSET;
|
||||||
writeNumbers(&data, appPerms);
|
writeNumbers(&data, appPerms);
|
||||||
|
|
||||||
|
appPeriodsOff = CONF_DATA_OFFSET;
|
||||||
|
writeChars(&data, appPeriods);
|
||||||
|
|
||||||
appPathsOff = CONF_DATA_OFFSET;
|
appPathsOff = CONF_DATA_OFFSET;
|
||||||
writeStrings(&data, appPaths);
|
writeStrings(&data, appPaths);
|
||||||
#undef CONF_DATA_OFFSET
|
#undef CONF_DATA_OFFSET
|
||||||
@ -305,11 +331,13 @@ void ConfUtil::writeData(char *output, const FirewallConf &conf,
|
|||||||
FortCommon::confAppPermsMaskInit(drvConf);
|
FortCommon::confAppPermsMaskInit(drvConf);
|
||||||
|
|
||||||
drvConf->apps_n = appPathsSize;
|
drvConf->apps_n = appPathsSize;
|
||||||
|
drvConf->app_periods_n = appPeriodsCount;
|
||||||
|
|
||||||
drvConf->addr_groups_off = addrGroupsOff;
|
drvConf->addr_groups_off = addrGroupsOff;
|
||||||
|
|
||||||
drvConf->app_groups_off = appGroupsOff;
|
drvConf->app_groups_off = appGroupsOff;
|
||||||
drvConf->app_perms_off = appPermsOff;
|
drvConf->app_perms_off = appPermsOff;
|
||||||
|
drvConf->app_periods_off = appPeriodsOff;
|
||||||
drvConf->apps_off = appPathsOff;
|
drvConf->apps_off = appPathsOff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -368,7 +396,7 @@ void ConfUtil::writeAddressRange(char **data,
|
|||||||
writeNumbers(data, addressRange.excludeRange().toArray());
|
writeNumbers(data, addressRange.excludeRange().toArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfUtil::writeNumbers(char **data, const QVector<quint32> &array)
|
void ConfUtil::writeNumbers(char **data, const numbers_arr_t &array)
|
||||||
{
|
{
|
||||||
const int arraySize = array.size() * sizeof(quint32);
|
const int arraySize = array.size() * sizeof(quint32);
|
||||||
|
|
||||||
@ -377,7 +405,7 @@ void ConfUtil::writeNumbers(char **data, const QVector<quint32> &array)
|
|||||||
*data += arraySize;
|
*data += arraySize;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfUtil::writeChars(char **data, const QVector<qint8> &array)
|
void ConfUtil::writeChars(char **data, const chars_arr_t &array)
|
||||||
{
|
{
|
||||||
const int arraySize = array.size();
|
const int arraySize = array.size();
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ QT_FORWARD_DECLARE_CLASS(FirewallConf)
|
|||||||
QT_FORWARD_DECLARE_STRUCT(fort_conf_limit)
|
QT_FORWARD_DECLARE_STRUCT(fort_conf_limit)
|
||||||
|
|
||||||
using numbers_arr_t = QVector<quint32>;
|
using numbers_arr_t = QVector<quint32>;
|
||||||
|
using chars_arr_t = QVector<qint8>;
|
||||||
|
|
||||||
using addrranges_arr_t = QVarLengthArray<AddressRange, 2>;
|
using addrranges_arr_t = QVarLengthArray<AddressRange, 2>;
|
||||||
|
|
||||||
@ -52,6 +53,8 @@ private:
|
|||||||
QStringList &appPaths,
|
QStringList &appPaths,
|
||||||
quint32 &appPathsLen,
|
quint32 &appPathsLen,
|
||||||
numbers_arr_t &appPerms,
|
numbers_arr_t &appPerms,
|
||||||
|
chars_arr_t &appPeriods,
|
||||||
|
quint8 &appPeriodsCount,
|
||||||
appgroups_map_t &appGroupIndexes);
|
appgroups_map_t &appGroupIndexes);
|
||||||
|
|
||||||
bool parseApps(const QString &text, bool blocked,
|
bool parseApps(const QString &text, bool blocked,
|
||||||
@ -66,6 +69,8 @@ private:
|
|||||||
const numbers_arr_t &addressGroupOffsets,
|
const numbers_arr_t &addressGroupOffsets,
|
||||||
const QStringList &appPaths,
|
const QStringList &appPaths,
|
||||||
const numbers_arr_t &appPerms,
|
const numbers_arr_t &appPerms,
|
||||||
|
const chars_arr_t &appPeriods,
|
||||||
|
quint8 appPeriodsCount,
|
||||||
const appgroups_map_t &appGroupIndexes);
|
const appgroups_map_t &appGroupIndexes);
|
||||||
|
|
||||||
static quint16 writeLimits(struct fort_conf_limit *limits,
|
static quint16 writeLimits(struct fort_conf_limit *limits,
|
||||||
@ -76,8 +81,8 @@ private:
|
|||||||
static void writeAddressRange(char **data,
|
static void writeAddressRange(char **data,
|
||||||
const AddressRange &addressRange);
|
const AddressRange &addressRange);
|
||||||
|
|
||||||
static void writeNumbers(char **data, const QVector<quint32> &array);
|
static void writeNumbers(char **data, const numbers_arr_t &array);
|
||||||
static void writeChars(char **data, const QVector<qint8> &array);
|
static void writeChars(char **data, const chars_arr_t &array);
|
||||||
static void writeStrings(char **data, const QStringList &list);
|
static void writeStrings(char **data, const QStringList &list);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <QLocale>
|
#include <QLocale>
|
||||||
|
|
||||||
|
#include "../../common/util.h"
|
||||||
|
|
||||||
DateUtil::DateUtil(QObject *parent) :
|
DateUtil::DateUtil(QObject *parent) :
|
||||||
QObject(parent)
|
QObject(parent)
|
||||||
{
|
{
|
||||||
@ -86,7 +88,5 @@ bool DateUtil::isHourBetween(qint32 unixHour, qint32 unixDay,
|
|||||||
{
|
{
|
||||||
const int hour = unixHour - unixDay;
|
const int hour = unixHour - unixDay;
|
||||||
|
|
||||||
return fromHour <= toHour
|
return is_hour_between(hour, fromHour, toHour);
|
||||||
? (hour >= fromHour && hour < toHour)
|
|
||||||
: (hour == 0 || hour >= fromHour || hour < toHour);
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user