mirror of
https://github.com/evilsocket/opensnitch.git
synced 2025-03-04 00:24:40 +01:00
ui,popups: mark temporary rules as inactive
Once the temporary rules expire, mark them as inactive in the DB.
This commit is contained in:
parent
e403b080bc
commit
85173c3553
6 changed files with 119 additions and 2 deletions
|
@ -134,6 +134,9 @@ class Nodes(QObject):
|
||||||
|
|
||||||
return nid, notif, rules_list
|
return nid, notif, rules_list
|
||||||
|
|
||||||
|
def disable_rule(self, addr, rule_name):
|
||||||
|
self._rules.disable(addr, rule_name)
|
||||||
|
|
||||||
def update_rule_time(self, time, rule_name, addr):
|
def update_rule_time(self, time, rule_name, addr):
|
||||||
self._rules.update_time(time, rule_name, addr)
|
self._rules.update_time(time, rule_name, addr)
|
||||||
|
|
||||||
|
|
|
@ -165,6 +165,16 @@ class Rules(QObject):
|
||||||
|
|
||||||
return rule_name
|
return rule_name
|
||||||
|
|
||||||
|
def disable(self, addr, name):
|
||||||
|
"""Mark a rule as not enabled in the DB"""
|
||||||
|
self._db.update(
|
||||||
|
"rules",
|
||||||
|
"enabled='False'",
|
||||||
|
(name, addr),
|
||||||
|
"name=? AND node=?",
|
||||||
|
action_on_conflict="OR REPLACE"
|
||||||
|
)
|
||||||
|
|
||||||
def update_time(self, time, name, addr):
|
def update_time(self, time, name, addr):
|
||||||
"""Updates the time of a rule, whenever a new connection matched a
|
"""Updates the time of a rule, whenever a new connection matched a
|
||||||
rule.
|
rule.
|
||||||
|
|
|
@ -26,8 +26,15 @@ from opensnitch.nodes import Nodes
|
||||||
from opensnitch.config import Config
|
from opensnitch.config import Config
|
||||||
from opensnitch.version import version
|
from opensnitch.version import version
|
||||||
from opensnitch.database import Database
|
from opensnitch.database import Database
|
||||||
from opensnitch.utils import Utils, CleanerTask, Themes
|
from opensnitch.utils import (
|
||||||
from opensnitch.utils import Message, languages
|
Utils,
|
||||||
|
CleanerTask,
|
||||||
|
Themes,
|
||||||
|
OneshotTimer,
|
||||||
|
languages,
|
||||||
|
Message
|
||||||
|
)
|
||||||
|
from opensnitch.utils.duration import duration
|
||||||
from opensnitch.utils.xdg import Autostart
|
from opensnitch.utils.xdg import Autostart
|
||||||
|
|
||||||
class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
|
class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
|
||||||
|
@ -738,6 +745,16 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
|
||||||
# daemon.
|
# daemon.
|
||||||
rule.operator.data = ""
|
rule.operator.data = ""
|
||||||
|
|
||||||
|
# disable temporal rules in the db
|
||||||
|
def _disable_temp_rule(args):
|
||||||
|
self._nodes.disable_rule(args[0], args[1].name)
|
||||||
|
timeout = duration.to_seconds(rule.duration)
|
||||||
|
if rule.duration == Config.DURATION_ONCE:
|
||||||
|
timeout = 1
|
||||||
|
if timeout > 0:
|
||||||
|
ost = OneshotTimer(timeout, _disable_temp_rule, (kwargs['peer'], rule,))
|
||||||
|
ost.start()
|
||||||
|
|
||||||
elif kwargs['action'] == self.DELETE_RULE:
|
elif kwargs['action'] == self.DELETE_RULE:
|
||||||
self._db.delete_rule(kwargs['name'], kwargs['addr'])
|
self._db.delete_rule(kwargs['name'], kwargs['addr'])
|
||||||
|
|
||||||
|
|
|
@ -227,7 +227,13 @@ class OneshotTimer(GenericTimer):
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.stop_flag.wait(self.interval)
|
self.stop_flag.wait(self.interval)
|
||||||
|
if self.stop_flag.is_set():
|
||||||
|
return
|
||||||
self.callback(self.args)
|
self.callback(self.args)
|
||||||
|
self.stop()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.stop_flag.set()
|
||||||
|
|
||||||
class CleanerTask(Thread):
|
class CleanerTask(Thread):
|
||||||
interval = 1
|
interval = 1
|
||||||
|
|
20
ui/opensnitch/utils/duration/__init__.py
Normal file
20
ui/opensnitch/utils/duration/__init__.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# Copyright (C) 2018 Simone Margaritelli
|
||||||
|
# 2018 MiWCryptAnalytics
|
||||||
|
# 2023 munix9
|
||||||
|
# 2023 Wojtek Widomski
|
||||||
|
# 2019-2025 Gustavo Iñiguez Goia
|
||||||
|
#
|
||||||
|
# This file is part of OpenSnitch.
|
||||||
|
#
|
||||||
|
# OpenSnitch is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# OpenSnitch is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with OpenSnitch. If not, see <http://www.gnu.org/licenses/>.
|
61
ui/opensnitch/utils/duration/duration.py
Normal file
61
ui/opensnitch/utils/duration/duration.py
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Copyright (C) 2018 Simone Margaritelli
|
||||||
|
# 2018 MiWCryptAnalytics
|
||||||
|
# 2023 munix9
|
||||||
|
# 2023 Wojtek Widomski
|
||||||
|
# 2019-2025 Gustavo Iñiguez Goia
|
||||||
|
#
|
||||||
|
# This file is part of OpenSnitch.
|
||||||
|
#
|
||||||
|
# OpenSnitch is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# OpenSnitch is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with OpenSnitch. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
r = re.compile(r'(\d+)([smhdw]+)')
|
||||||
|
|
||||||
|
_second = 1
|
||||||
|
_minute = 60
|
||||||
|
_hour = 60 * _minute
|
||||||
|
_day = 60 * _hour
|
||||||
|
_week = 60 * _day
|
||||||
|
|
||||||
|
_units = {
|
||||||
|
's': _second,
|
||||||
|
'm': _minute,
|
||||||
|
'h': _hour,
|
||||||
|
'd': _day,
|
||||||
|
'w': _week
|
||||||
|
}
|
||||||
|
|
||||||
|
def to_seconds(dur_str):
|
||||||
|
"""converts a Golang duration string to seconds:
|
||||||
|
"20s" -> 20 seconds
|
||||||
|
"2m" -> 120 seconds
|
||||||
|
...
|
||||||
|
"""
|
||||||
|
secs = 0
|
||||||
|
try:
|
||||||
|
finds = r.findall(dur_str)
|
||||||
|
for d in finds:
|
||||||
|
try:
|
||||||
|
unit = _units[d[1]]
|
||||||
|
secs += (unit * int(d[0]))
|
||||||
|
except:
|
||||||
|
print("duration.to_seconds(): invalid unit:", d)
|
||||||
|
|
||||||
|
return secs
|
||||||
|
except:
|
||||||
|
return secs
|
Loading…
Add table
Reference in a new issue