{{ accordion.end() }}
{% endfor %}
diff --git a/little_brother/templates/users.template.html b/little_brother/templates/users.template.html
index 3db6a9b..1ebbaa6 100644
--- a/little_brother/templates/users.template.html
+++ b/little_brother/templates/users.template.html
@@ -292,14 +292,16 @@
{{ helper.render_field(forms[user2device.html_key].active) }}
+
{{ helper.render_field(forms[user2device.html_key].blockable) }}
{{ helper.render_field(forms[user2device.html_key].percent) }}
-
diff --git a/little_brother/test/api/test_api_view_handler.py b/little_brother/test/api/test_api_view_handler.py
index 85c6b5a..c2f76cf 100644
--- a/little_brother/test/api/test_api_view_handler.py
+++ b/little_brother/test/api/test_api_view_handler.py
@@ -19,9 +19,10 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import datetime
import os
-import time
import unittest
+import time
+
# from little_brother import constants, dependency_injection
from little_brother import dependency_injection, admin_event, constants
from little_brother.admin_event import AdminEvent
@@ -64,7 +65,7 @@ def test_dummy_event(self):
master_connector = MasterConnector(p_config=master_connector_config)
- hostname = "SLAVE"
+ hostname = "CLIENT"
process_name = "MY_PROCESS"
event = AdminEvent(p_event_type=admin_event.EVENT_TYPE_DUMMY_1,
diff --git a/little_brother/test/api/test_master_connector.py b/little_brother/test/api/test_master_connector.py
index a37dfeb..fdc7136 100644
--- a/little_brother/test/api/test_master_connector.py
+++ b/little_brother/test/api/test_master_connector.py
@@ -53,11 +53,11 @@ def test_encode_and_decode(self):
self.assertIsNotNone(received_message)
self.assertEqual(3, len(received_message))
- hostname, json_events, json_slave_stats = received_message
+ hostname, json_events, json_client_stats = received_message
self.assertEqual(HOSTNAME, hostname)
self.assertEqual(1, len(json_events))
- self.assertEqual(1, len(json_slave_stats))
+ self.assertEqual(1, len(json_client_stats))
if __name__ == "__main__":
diff --git a/little_brother/test/persistence/test_persistence.py b/little_brother/test/persistence/test_persistence.py
index 244cf8b..61b73ba 100644
--- a/little_brother/test/persistence/test_persistence.py
+++ b/little_brother/test/persistence/test_persistence.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
@@ -119,8 +119,6 @@ def test_get_create_table_session(self):
self.assertIsNotNone(session2)
self.assertEqual(session, session2)
-
-
@staticmethod
def create_pinfo(p_age_in_days, p_include_end_time=False):
diff --git a/little_brother/test/persistence/test_persistent_device.py b/little_brother/test/persistence/test_persistent_device.py
new file mode 100644
index 0000000..d17a09c
--- /dev/null
+++ b/little_brother/test/persistence/test_persistent_device.py
@@ -0,0 +1,88 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2019-2022 Marcus Rickert
+#
+# See https://github.com/marcus67/little_brother
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from little_brother import dependency_injection
+from little_brother.persistence.persistence import Persistence
+from little_brother.persistence.persistent_device import Device
+from little_brother.persistence.persistent_device_entity_manager import DeviceEntityManager
+from little_brother.persistence.session_context import SessionContext
+from little_brother.test.persistence import test_persistence
+from python_base_app import tools
+from python_base_app.test import base_test
+
+SPECIFIC_DNS_NAME = "welt.de"
+SPECIFIC_DNS_NAMES = [ "welt.de", "ikea.de" ]
+SPECIFIC_DNS_NAMES_STRING = "\n".join(SPECIFIC_DNS_NAMES)
+
+class TestDevice(base_test.BaseTestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+
+ def setUp(self):
+ dependency_injection.reset()
+
+ def test_list_of_ip_addresses(self):
+
+ test_persistence.TestPersistence.create_dummy_persistence(self._logger)
+ dummy_persistence = dependency_injection.container[Persistence]
+
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+ device = Device()
+ device.populate_test_data(p_session_context=session_context)
+ device.blocked_urls = SPECIFIC_DNS_NAMES_STRING
+ session = session_context.get_session()
+ session.add(device)
+ session.commit()
+ new_id = device.id
+
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+ entity_manager = DeviceEntityManager()
+ saved_entity : Device = entity_manager.get_by_id(p_session_context=session_context, p_id=new_id)
+ self.assertIsNotNone(saved_entity)
+
+ ip_addresses = saved_entity.list_of_blocked_ip_addresses
+
+ for dns_name in SPECIFIC_DNS_NAMES:
+ ip_address = tools.get_ip_address_by_dns_name(dns_name)
+ self.assertIn(ip_address, ip_addresses)
+
+
+ def test_ip_address(self):
+
+ test_persistence.TestPersistence.create_dummy_persistence(self._logger)
+ dummy_persistence = dependency_injection.container[Persistence]
+
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+ device = Device()
+ device.populate_test_data(p_session_context=session_context)
+ device.hostname = SPECIFIC_DNS_NAME
+ session = session_context.get_session()
+ session.add(device)
+ session.commit()
+ new_id = device.id
+
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+ entity_manager = DeviceEntityManager()
+ saved_entity : Device = entity_manager.get_by_id(p_session_context=session_context, p_id=new_id)
+ self.assertIsNotNone(saved_entity)
+
+ self.assertEqual(tools.get_ip_address_by_dns_name(SPECIFIC_DNS_NAME), saved_entity.ip_address)
diff --git a/little_brother/test/persistence/test_suite.py b/little_brother/test/persistence/test_suite.py
index cf45e91..39ee370 100755
--- a/little_brother/test/persistence/test_suite.py
+++ b/little_brother/test/persistence/test_suite.py
@@ -21,10 +21,11 @@
import unittest
-from little_brother.test.persistence import test_persistence
+from little_brother.test.persistence.test_persistence import TestPersistence
from little_brother.test.persistence.test_persistent_admin_event_entity_manager import TestAdminEventEntityManager
from little_brother.test.persistence.test_persistent_daily_user_status_entity_manager import \
TestDailyUserStatusEntityManager
+from little_brother.test.persistence.test_persistent_device import TestDevice
from little_brother.test.persistence.test_persistent_device_entity_manager import TestDeviceEntityManager
from little_brother.test.persistence.test_persistent_process_info_entity_manager import TestProcessInfoEntityManager
from little_brother.test.persistence.test_persistent_rule_override_entity_manager import TestRuleOverrideEntityManager
@@ -38,7 +39,7 @@
def add_test_cases(p_test_suite, p_config_filename=None):
base_test.add_tests_in_test_unit(
- p_test_suite=p_test_suite, p_test_unit_class=test_persistence.TestPersistence,
+ p_test_suite=p_test_suite, p_test_unit_class=TestPersistence,
p_config_filename=p_config_filename)
base_test.add_tests_in_test_unit(
@@ -49,6 +50,10 @@ def add_test_cases(p_test_suite, p_config_filename=None):
p_test_suite=p_test_suite, p_test_unit_class=TestDeviceEntityManager,
p_config_filename=p_config_filename)
+ base_test.add_tests_in_test_unit(
+ p_test_suite=p_test_suite, p_test_unit_class=TestDevice,
+ p_config_filename=p_config_filename)
+
base_test.add_tests_in_test_unit(
p_test_suite=p_test_suite, p_test_unit_class=TestProcessInfoEntityManager,
p_config_filename=p_config_filename)
diff --git a/little_brother/test/pytests/__init__.py b/little_brother/test/pytests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/little_brother/test/pytests/devices/__init__.py b/little_brother/test/pytests/devices/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/little_brother/test/pytests/devices/test_device_activation_manager.py b/little_brother/test/pytests/devices/test_device_activation_manager.py
new file mode 100644
index 0000000..714bceb
--- /dev/null
+++ b/little_brother/test/pytests/devices/test_device_activation_manager.py
@@ -0,0 +1,417 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2021-2022 Marcus Rickert
+#
+# See https://github.com/marcus67/little_brother
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import os
+
+import pytest
+from mockito import when
+
+from little_brother import dependency_injection
+from little_brother.app_control_config_model import AppControlConfigModel
+from little_brother.devices.device_activation_manager import DeviceActivationManager
+from little_brother.devices.device_activation_manager_config_model import DeviceActivationManagerConfigModel
+from little_brother.devices.firewall_device_activation_handler import FirewallDeviceActivationHandler
+from little_brother.devices.firewall_entry import key
+from little_brother.devices.firewall_handler import FirewallHandler
+from little_brother.devices.firewall_handler_config_model import FirewallHandlerConfigModel, \
+ DEFAULT_IPTABLES_ADD_FORWARD_COMMAND_PATTERN, DEFAULT_COMMENT
+from little_brother.login_mapping import LoginMapping
+from little_brother.persistence.persistence import Persistence
+from little_brother.persistence.persistent_device import Device
+from little_brother.persistence.persistent_user import User
+from little_brother.persistence.persistent_user_2_device import User2Device
+from little_brother.persistence.session_context import SessionContext
+from little_brother.test.persistence.test_persistence import TestPersistence
+from little_brother.user_manager import UserManager
+from little_brother.user_status import UserStatus
+from python_base_app import log_handling, tools
+from python_base_app.configuration import ConfigurationException
+
+DEFAULT_SERVER_GROUP = "default-group"
+DEFAULT_TARGET_IP = "0.0.0.0"
+DEFAULT_SOURCE_IP = "192.1.0.254"
+
+DEFAULT_SPECIFIC_TARGET_IPS = [ "1.2.3.4", "4.3.2.1" ]
+
+
+@pytest.fixture
+def default_device_activation_manager_config():
+ config = DeviceActivationManagerConfigModel()
+ return config
+
+
+@pytest.fixture
+def logger():
+ return log_handling.get_logger("pytest-executor")
+
+
+def setup_function():
+ dependency_injection.reset()
+
+
+@pytest.fixture
+def dummy_persistence(logger):
+ TestPersistence.create_dummy_persistence(p_logger=logger, p_delete=True)
+ yield dependency_injection.container[Persistence]
+
+
+@pytest.fixture
+def user_manager_with_activity_forbidden() -> UserManager:
+ app_control_config = AppControlConfigModel()
+ login_mapping = LoginMapping()
+
+ user_status = UserStatus()
+ user_status.activity_allowed = False
+
+ with when(UserManager).get_current_user_status(...).thenReturn(user_status):
+ user_manager = UserManager(p_config=app_control_config, p_is_master=True, p_login_mapping=login_mapping,
+ p_server_group=DEFAULT_SERVER_GROUP)
+ dependency_injection.container[UserManager] = user_manager
+ yield user_manager
+
+
+@pytest.fixture
+def user_manager_with_activity_permitted() -> UserManager:
+ app_control_config = AppControlConfigModel()
+ login_mapping = LoginMapping()
+
+ user_status = UserStatus()
+ user_status.activity_allowed = True
+
+ with when(UserManager).get_current_user_status(...).thenReturn(user_status):
+ user_manager = UserManager(p_config=app_control_config, p_is_master=True, p_login_mapping=login_mapping,
+ p_server_group=DEFAULT_SERVER_GROUP)
+ dependency_injection.container[UserManager] = user_manager
+ yield user_manager
+
+
+@pytest.fixture
+def default_firewall_handler_config():
+ config = FirewallHandlerConfigModel()
+ config.target_ip = [DEFAULT_TARGET_IP]
+ return config
+
+@pytest.fixture
+def firewall_handler_config_with_several_ips():
+ config = FirewallHandlerConfigModel()
+ config.target_ip = DEFAULT_SPECIFIC_TARGET_IPS
+ return config
+
+
+@pytest.fixture
+def firewall_device_activation_handler(default_firewall_handler_config):
+ handler = FirewallDeviceActivationHandler()
+ firewall_handler = FirewallHandler(p_config=default_firewall_handler_config)
+ dependency_injection.container[FirewallHandler] = firewall_handler
+ return handler
+
+@pytest.fixture
+def firewall_device_activation_handler_with_several_ips(firewall_handler_config_with_several_ips):
+ handler = FirewallDeviceActivationHandler()
+ firewall_handler = FirewallHandler(p_config=firewall_handler_config_with_several_ips)
+ dependency_injection.container[FirewallHandler] = firewall_handler
+ return handler
+
+
+def populate_user_and_device(p_session_context : SessionContext, p_blocked_urls : list[str]=None):
+ session = p_session_context.get_session()
+ user = User()
+ session.add(user)
+ user.populate_test_data(p_session_context=p_session_context)
+ device = Device()
+ session.add(device)
+ device.populate_test_data(p_session_context=p_session_context)
+
+ if p_blocked_urls is not None:
+ device.blocked_urls = "\n".join(p_blocked_urls)
+
+ device.hostname = "localhost"
+ user2device = User2Device()
+ session.add(user2device)
+ user2device.user = user
+ user2device.device = device
+ user2device.active = True
+ user2device.blockable = True
+ session.commit()
+ return device
+
+
+def test_create_device_activation_manager(default_device_activation_manager_config):
+ manager = DeviceActivationManager(p_config=default_device_activation_manager_config)
+ assert manager is not None
+
+
+def test_get_recurring_task_without_handlers(default_device_activation_manager_config):
+ manager = DeviceActivationManager(p_config=default_device_activation_manager_config)
+
+ task = manager.get_recurring_task()
+ assert task is None
+
+
+def test_get_recurring_task_with_handlers(default_device_activation_manager_config):
+ manager = DeviceActivationManager(p_config=default_device_activation_manager_config)
+
+ handler = FirewallDeviceActivationHandler()
+ manager.add_handler(p_handler=handler)
+
+ task = manager.get_recurring_task()
+ assert task is not None
+ assert "check_device_activation_status" in task.name
+ assert task.interval == manager._config.check_interval
+
+
+def test_user_manager(default_device_activation_manager_config, user_manager_with_activity_forbidden):
+ manager = DeviceActivationManager(p_config=default_device_activation_manager_config)
+
+ local_user_manager = manager.user_manager
+ assert local_user_manager is not None
+ assert user_manager_with_activity_forbidden == local_user_manager
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_set_usage_permission_status_for_device_with_activity_forbidden(dummy_persistence,
+ user_manager_with_activity_forbidden,
+ default_device_activation_manager_config,
+ firewall_device_activation_handler):
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+
+ device = populate_user_and_device(p_session_context=session_context)
+
+ manager = DeviceActivationManager(default_device_activation_manager_config)
+
+ manager.add_handler(p_handler=firewall_device_activation_handler)
+ handler = dependency_injection.container[FirewallHandler]
+
+ try:
+
+ forward_entries = handler.get_active_forward_entries(p_ip_address=device.hostname)
+
+ entry_key = key(p_source=tools.get_ip_address_by_dns_name(device.hostname), p_destination=DEFAULT_TARGET_IP)
+ assert entry_key not in forward_entries
+
+ entries = handler.entries
+ number_of_entries = len(entries)
+
+ manager.check_device_activation_status()
+
+ forward_entries = handler.get_active_forward_entries(p_ip_address=device.hostname)
+ assert entry_key in forward_entries
+
+ assert len(entries) == number_of_entries + 1
+
+ finally:
+ manager.shutdown()
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_set_usage_permission_status_for_device_with_activity_forbidden_check_comment(
+ dummy_persistence,
+ user_manager_with_activity_forbidden,
+ default_device_activation_manager_config,
+ firewall_device_activation_handler):
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+
+ device = populate_user_and_device(p_session_context=session_context)
+
+ manager = DeviceActivationManager(default_device_activation_manager_config)
+
+ manager.add_handler(p_handler=firewall_device_activation_handler)
+ handler = dependency_injection.container[FirewallHandler]
+
+ try:
+ entry_key = key(p_source=tools.get_ip_address_by_dns_name(device.hostname), p_destination=DEFAULT_TARGET_IP)
+
+ manager.check_device_activation_status()
+
+ forward_entries = handler.get_active_forward_entries(p_ip_address=device.hostname)
+ assert entry_key in forward_entries
+
+ forward_entry = forward_entries.get(entry_key)
+
+ assert DEFAULT_COMMENT in forward_entry.comment
+
+ finally:
+ manager.shutdown()
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_set_usage_permission_status_for_device_with_activity_forbidden_several_ip_addresses(
+ dummy_persistence,
+ user_manager_with_activity_forbidden,
+ default_device_activation_manager_config,
+ firewall_device_activation_handler_with_several_ips):
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+
+ device = populate_user_and_device(p_session_context=session_context)
+
+ firewall_device_activation_handler.target_ip = DEFAULT_SPECIFIC_TARGET_IPS
+
+ manager = DeviceActivationManager(default_device_activation_manager_config)
+
+ manager.add_handler(p_handler=firewall_device_activation_handler_with_several_ips)
+ handler = dependency_injection.container[FirewallHandler]
+
+ try:
+
+ forward_entries = handler.get_active_forward_entries(p_ip_address=device.hostname)
+
+ for ip_address in DEFAULT_SPECIFIC_TARGET_IPS:
+ entry_key = key(p_source=tools.get_ip_address_by_dns_name(device.hostname), p_destination=ip_address)
+ assert entry_key not in forward_entries
+
+ entries = handler.entries
+ number_of_entries = len(entries)
+
+ manager.check_device_activation_status()
+ forward_entries = handler.get_active_forward_entries(p_ip_address=device.hostname)
+
+ entry_key = key(p_source=tools.get_ip_address_by_dns_name(device.hostname), p_destination=DEFAULT_TARGET_IP)
+ assert entry_key not in forward_entries
+
+ for ip_address in DEFAULT_SPECIFIC_TARGET_IPS:
+ entry_key = key(p_source=tools.get_ip_address_by_dns_name(device.hostname), p_destination=ip_address)
+ assert entry_key in forward_entries
+
+ assert len(entries) == number_of_entries + len(DEFAULT_SPECIFIC_TARGET_IPS)
+
+ finally:
+ manager.shutdown()
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_set_usage_permission_status_for_device_with_activity_forbidden_device_ip_addresses_override(
+ dummy_persistence,
+ user_manager_with_activity_forbidden,
+ default_device_activation_manager_config,
+ firewall_device_activation_handler):
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+
+ device = populate_user_and_device(p_session_context=session_context, p_blocked_urls=DEFAULT_SPECIFIC_TARGET_IPS)
+
+ firewall_device_activation_handler.target_ip = DEFAULT_SPECIFIC_TARGET_IPS
+
+ manager = DeviceActivationManager(default_device_activation_manager_config)
+
+ manager.add_handler(p_handler=firewall_device_activation_handler)
+ handler = dependency_injection.container[FirewallHandler]
+
+ try:
+
+ forward_entries = handler.get_active_forward_entries(p_ip_address=device.hostname)
+
+ for ip_address in DEFAULT_SPECIFIC_TARGET_IPS:
+ entry_key = key(p_source=tools.get_ip_address_by_dns_name(device.hostname), p_destination=ip_address)
+ assert entry_key not in forward_entries
+
+ entries = handler.entries
+ number_of_entries = len(entries)
+
+ manager.check_device_activation_status()
+ forward_entries = handler.get_active_forward_entries(p_ip_address=device.hostname)
+
+ entry_key = key(p_source=tools.get_ip_address_by_dns_name(device.hostname), p_destination=DEFAULT_TARGET_IP)
+ assert entry_key not in forward_entries
+
+ for ip_address in DEFAULT_SPECIFIC_TARGET_IPS:
+ entry_key = key(p_source=tools.get_ip_address_by_dns_name(device.hostname), p_destination=ip_address)
+ assert entry_key in forward_entries
+
+ assert len(entries) == number_of_entries + len(DEFAULT_SPECIFIC_TARGET_IPS)
+
+ finally:
+ manager.shutdown()
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_set_usage_permission_status_for_device_with_activity_allowed(dummy_persistence,
+ user_manager_with_activity_permitted,
+ default_device_activation_manager_config,
+ firewall_device_activation_handler):
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+
+ device = populate_user_and_device(p_session_context=session_context)
+
+ manager = DeviceActivationManager(default_device_activation_manager_config)
+
+ manager.add_handler(p_handler=firewall_device_activation_handler)
+ handler = dependency_injection.container[FirewallHandler]
+
+ try:
+
+ forward_entries = handler.get_active_forward_entries(p_ip_address=device.hostname)
+
+ entry_key = key(p_source=tools.get_ip_address_by_dns_name(device.hostname), p_destination=DEFAULT_TARGET_IP)
+ assert entry_key not in forward_entries
+
+ entries = handler.entries
+ number_of_entries = len(entries)
+
+ manager.check_device_activation_status()
+
+ forward_entries = handler.get_active_forward_entries(p_ip_address=device.hostname)
+ assert entry_key not in forward_entries
+
+ assert len(entries) == number_of_entries
+
+ finally:
+ manager.shutdown()
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_set_usage_permission_status_for_device_invalid_binary(dummy_persistence,
+ user_manager_with_activity_forbidden,
+ default_device_activation_manager_config,
+ firewall_device_activation_handler):
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+
+ manager = DeviceActivationManager(default_device_activation_manager_config)
+
+ populate_user_and_device(p_session_context=session_context)
+
+ manager.add_handler(p_handler=firewall_device_activation_handler)
+ handler = dependency_injection.container[FirewallHandler]
+ handler._config.iptables_add_forward_command_pattern = "x" + DEFAULT_IPTABLES_ADD_FORWARD_COMMAND_PATTERN
+
+ try:
+ with pytest.raises(ConfigurationException) as e:
+ manager.check_device_activation_status()
+
+ assert "returns exit code" in str(e)
+
+ finally:
+ manager.shutdown()
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_iptables_insert_entry_invalid_binary(default_firewall_handler_config):
+ handler = FirewallHandler(default_firewall_handler_config)
+ assert handler is not None
+
+ handler.read_forward_entries()
+
+ try:
+ handler._config.iptables_add_forward_command_pattern = "x" + DEFAULT_IPTABLES_ADD_FORWARD_COMMAND_PATTERN
+
+ with pytest.raises(ConfigurationException) as e:
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=False)
+
+ assert "returns exit code" in str(e)
+
+ finally:
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=True)
diff --git a/little_brother/test/pytests/devices/test_device_activation_manager_config_model.py b/little_brother/test/pytests/devices/test_device_activation_manager_config_model.py
new file mode 100644
index 0000000..f88cb89
--- /dev/null
+++ b/little_brother/test/pytests/devices/test_device_activation_manager_config_model.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2021-2022 Marcus Rickert
+#
+# See https://github.com/marcus67/little_brother
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from little_brother.devices.device_activation_manager_config_model import DeviceActivationManagerConfigModel
+
+def test_create_device_activation_manager_config_model():
+ config = DeviceActivationManagerConfigModel()
+ assert config is not None
+ assert config.check_interval is not None
diff --git a/little_brother/test/pytests/devices/test_firewall_device_activation_handler.py b/little_brother/test/pytests/devices/test_firewall_device_activation_handler.py
new file mode 100644
index 0000000..3e63fe9
--- /dev/null
+++ b/little_brother/test/pytests/devices/test_firewall_device_activation_handler.py
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2021-2022 Marcus Rickert
+#
+# See https://github.com/marcus67/little_brother
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import pytest
+from mockito import patch
+
+from little_brother import dependency_injection
+from little_brother.devices.firewall_device_activation_handler import FirewallDeviceActivationHandler
+from little_brother.devices.firewall_handler import FirewallHandler
+from little_brother.devices.firewall_handler_config_model import FirewallHandlerConfigModel
+from little_brother.persistence.persistence import Persistence
+from little_brother.persistence.persistent_device import Device
+from little_brother.persistence.session_context import SessionContext
+from little_brother.test.persistence.test_persistence import TestPersistence
+from python_base_app import log_handling, tools
+
+DEFAULT_TARGET_IP = "8.8.8.8"
+DEFAULT_HOSTNAME = "localhost"
+
+
+class CallResult:
+
+ def __init__(self):
+ self.ip_address = None
+ self.usage_permitted = None
+ self.blocked_ip_addresses = []
+
+ def set(self, p_ip_address, p_blocked_ip_addresses, p_usage_permitted):
+ self.ip_address = p_ip_address
+ self.blocked_ip_addresses = p_blocked_ip_addresses
+ self.usage_permitted = p_usage_permitted
+
+
+@pytest.fixture
+def default_firewall_handler_config():
+ config = FirewallHandlerConfigModel()
+ config.target_ip = [DEFAULT_TARGET_IP]
+ return config
+
+
+@pytest.fixture
+def default_firewall_handler(default_firewall_handler_config):
+ handler = FirewallHandler(p_config=default_firewall_handler_config)
+ dependency_injection.container[FirewallHandler] = handler
+ return handler
+
+
+@pytest.fixture
+def patched_firewall_handler_test_result(default_firewall_handler_config):
+ handler = FirewallHandler(p_config=default_firewall_handler_config)
+ test_result = CallResult()
+ with patch(handler.set_usage_permission_for_ip,
+ lambda p_ip_address, p_blocked_ip_addresses, p_usage_permitted:
+ test_result.set(p_ip_address=p_ip_address,
+ p_blocked_ip_addresses=p_blocked_ip_addresses,
+ p_usage_permitted=p_usage_permitted)):
+ dependency_injection.container[FirewallHandler] = handler
+ yield test_result
+
+
+@pytest.fixture
+def logger():
+ return log_handling.get_logger("pytest-executor")
+
+
+def setup_function():
+ dependency_injection.reset()
+
+
+@pytest.fixture
+def dummy_persistence(logger):
+ TestPersistence.create_dummy_persistence(p_logger=logger, p_delete=True)
+ return dependency_injection.container[Persistence]
+
+
+def test_create_firewall_device_activation_handler(default_firewall_handler):
+ handler = FirewallDeviceActivationHandler()
+ assert handler is not None
+ assert handler.firewall_handler == default_firewall_handler
+
+
+def test_create_firewall_device_activation_handler_set_usage_permission_for_ip(
+ patched_firewall_handler_test_result, dummy_persistence):
+ with SessionContext(p_persistence=dummy_persistence) as session_context:
+ handler = FirewallDeviceActivationHandler()
+ assert handler is not None
+ device = Device()
+ device.populate_test_data(p_session_context=session_context)
+ device.hostname = DEFAULT_HOSTNAME
+ session = session_context.get_session()
+ session.add(device)
+ session.commit()
+
+ handler.set_usage_permission_for_device(p_device=device, p_usage_permitted=False)
+
+ assert patched_firewall_handler_test_result.ip_address == tools.get_ip_address_by_dns_name(
+ p_dns_name=DEFAULT_HOSTNAME)
+ assert not patched_firewall_handler_test_result.usage_permitted
+
+ device.hostname = tools.get_ip_address_by_dns_name(p_dns_name=DEFAULT_HOSTNAME)
+ session.commit()
+
+ handler.set_usage_permission_for_device(p_device=device, p_usage_permitted=True)
+
+ assert patched_firewall_handler_test_result.ip_address == device.hostname
+ assert patched_firewall_handler_test_result.usage_permitted
diff --git a/little_brother/test/pytests/devices/test_firewall_entry.py b/little_brother/test/pytests/devices/test_firewall_entry.py
new file mode 100644
index 0000000..e8d1185
--- /dev/null
+++ b/little_brother/test/pytests/devices/test_firewall_entry.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2021-2022 Marcus Rickert
+#
+# See https://github.com/marcus67/little_brother
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from little_brother.devices.firewall_entry import FirewallEntry
+
+def test_create_firewall_entry():
+
+ assert FirewallEntry() is not None
diff --git a/little_brother/test/pytests/devices/test_firewall_handler.py b/little_brother/test/pytests/devices/test_firewall_handler.py
new file mode 100644
index 0000000..0631be3
--- /dev/null
+++ b/little_brother/test/pytests/devices/test_firewall_handler.py
@@ -0,0 +1,200 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2021-2022 Marcus Rickert
+#
+# See https://github.com/marcus67/little_brother
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import os
+import time
+
+import pytest
+
+from little_brother.devices.firewall_entry import key, FirewallEntry
+from little_brother.devices.firewall_handler import FirewallHandler
+from little_brother.devices.firewall_handler_config_model import FirewallHandlerConfigModel, \
+ DEFAULT_IPTABLES_ADD_FORWARD_COMMAND_PATTERN, DEFAULT_IPTABLES_REMOVE_FORWARD_COMMAND_PATTERN, \
+ DEFAULT_IPTABLES_LIST_FORWARD_COMMAND
+from python_base_app.configuration import ConfigurationException
+
+DEFAULT_SOURCE_IP = "192.1.0.254"
+DEFAULT_SOURCE_IP_2 = "192.1.0.253"
+DEFAULT_TARGET_IP = "8.8.8.8"
+
+
+@pytest.fixture
+def default_firewall_handler_config():
+ config = FirewallHandlerConfigModel()
+ config.target_ip = [DEFAULT_TARGET_IP]
+ return config
+
+
+def test_create_firewall_handler(default_firewall_handler_config):
+ handler = FirewallHandler(default_firewall_handler_config)
+ assert handler is not None
+ assert handler._config.target_ip is not None
+ assert len(handler._config.target_ip) == 1
+ assert handler._config.target_ip[0] == DEFAULT_TARGET_IP
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_iptables_read_table(default_firewall_handler_config):
+ handler = FirewallHandler(default_firewall_handler_config)
+ assert handler is not None
+
+ handler.read_forward_entries()
+ assert handler._entries is not None
+
+ entry_key = key(p_source=DEFAULT_SOURCE_IP, p_destination=DEFAULT_TARGET_IP)
+ assert entry_key not in handler._entries
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_iptables_insert_and_delete_entry(default_firewall_handler_config):
+ handler: FirewallHandler = FirewallHandler(default_firewall_handler_config)
+ assert handler is not None
+
+ handler.read_forward_entries()
+ assert handler._entries is not None
+
+ entries = handler._entries
+
+ number_of_entries = len(entries)
+
+ forward_entries = handler.get_active_forward_entries(p_ip_address=DEFAULT_SOURCE_IP)
+
+ try:
+ entry_key = key(p_source=DEFAULT_SOURCE_IP, p_destination=DEFAULT_TARGET_IP)
+ assert entry_key not in forward_entries
+
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=False)
+ forward_entries = handler.get_active_forward_entries(p_ip_address=DEFAULT_SOURCE_IP)
+ assert entry_key in forward_entries
+
+ assert len(entries) == number_of_entries + 1
+
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP_2, p_blocked_ip_addresses=[],
+ p_usage_permitted=False)
+ assert entry_key in forward_entries
+ assert len(entries) == number_of_entries + 2
+
+ entry_key_2 = key(p_source=DEFAULT_SOURCE_IP_2, p_destination=DEFAULT_TARGET_IP)
+ forward_entries = handler.get_active_forward_entries(p_ip_address=DEFAULT_SOURCE_IP)
+ forward_entries_2 = handler.get_active_forward_entries(p_ip_address=DEFAULT_SOURCE_IP_2)
+ assert entry_key in forward_entries
+ assert entry_key_2 in forward_entries_2
+
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=True)
+ forward_entries = handler.get_active_forward_entries(p_ip_address=DEFAULT_SOURCE_IP)
+ forward_entries_2 = handler.get_active_forward_entries(p_ip_address=DEFAULT_SOURCE_IP_2)
+ assert entry_key not in forward_entries
+ assert entry_key_2 in forward_entries_2
+ assert len(entries) == number_of_entries + 1
+
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP_2, p_blocked_ip_addresses=[],
+ p_usage_permitted=True)
+ forward_entries = handler.get_active_forward_entries(p_ip_address=DEFAULT_SOURCE_IP)
+ forward_entries_2 = handler.get_active_forward_entries(p_ip_address=DEFAULT_SOURCE_IP_2)
+ assert entry_key not in forward_entries
+ assert entry_key_2 not in forward_entries_2
+ assert len(entries) == number_of_entries
+
+ finally:
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=True)
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP_2, p_blocked_ip_addresses=[],
+ p_usage_permitted=True)
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_iptables_insert_entry_invalid_binary(default_firewall_handler_config):
+ handler = FirewallHandler(default_firewall_handler_config)
+ assert handler is not None
+
+ handler.read_forward_entries()
+
+ try:
+ handler._config.iptables_add_forward_command_pattern = "x" + DEFAULT_IPTABLES_ADD_FORWARD_COMMAND_PATTERN
+
+ with pytest.raises(ConfigurationException) as e:
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=False)
+
+ assert "returns exit code" in str(e)
+
+ finally:
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=True)
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_iptables_remove_entry_invalid_binary(default_firewall_handler_config):
+ handler = FirewallHandler(default_firewall_handler_config)
+ assert handler is not None
+
+ handler.read_forward_entries()
+ old_pattern = handler._config.iptables_remove_forward_command_pattern
+
+ try:
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=False)
+
+ handler._config.iptables_remove_forward_command_pattern = "x" + DEFAULT_IPTABLES_REMOVE_FORWARD_COMMAND_PATTERN
+
+ with pytest.raises(ConfigurationException) as e:
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=True)
+
+ assert "returns exit code" in str(e)
+
+ finally:
+ handler._config.iptables_remove_forward_command_pattern = old_pattern
+ handler.set_usage_permission_for_ip(p_ip_address=DEFAULT_SOURCE_IP, p_blocked_ip_addresses=[],
+ p_usage_permitted=True)
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_iptables_list_entries_invalid_binary(default_firewall_handler_config):
+ handler = FirewallHandler(default_firewall_handler_config)
+ assert handler is not None
+
+ handler._config.iptables_list_forward_command = "x" + DEFAULT_IPTABLES_LIST_FORWARD_COMMAND
+
+ with pytest.raises(ConfigurationException) as e:
+ handler.read_forward_entries()
+
+ assert "returns exit code" in str(e)
+
+
+@pytest.mark.skipif(os.getenv("NO_IPTABLES"), reason="no iptables allowed")
+def test_iptables_list_entries_with_cache_timeout(default_firewall_handler_config):
+ default_firewall_handler_config.cache_ttl = 1
+ handler = FirewallHandler(default_firewall_handler_config)
+ assert handler is not None
+
+ entries = handler.entries
+
+ assert id(entries) == id(handler.entries)
+
+ entries.append(FirewallEntry())
+
+ assert id(entries) == id(handler.entries)
+
+ time.sleep(default_firewall_handler_config.cache_ttl + 1)
+
+ assert id(entries) != id(handler.entries)
diff --git a/little_brother/test/pytests/devices/test_firewall_handler_config_model.py b/little_brother/test/pytests/devices/test_firewall_handler_config_model.py
new file mode 100644
index 0000000..09304a0
--- /dev/null
+++ b/little_brother/test/pytests/devices/test_firewall_handler_config_model.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2021-2022 Marcus Rickert
+#
+# See https://github.com/marcus67/little_brother
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from little_brother.devices.firewall_handler_config_model import FirewallHandlerConfigModel
+
+DEFAULT_TARGET_IP = "8.8.8.8"
+
+
+def test_create_firewall_handler_config_model():
+ config = FirewallHandlerConfigModel()
+ assert config is not None
+ assert not config.is_active()
+
+
+def test_create_active_firewall_handler_config_model():
+ config = FirewallHandlerConfigModel()
+ assert config is not None
+ config.target_ip = DEFAULT_TARGET_IP
+ assert config.is_active()
diff --git a/little_brother/test/test_app.py b/little_brother/test/test_app.py
index b998d49..eb79921 100644
--- a/little_brother/test/test_app.py
+++ b/little_brother/test/test_app.py
@@ -20,9 +20,10 @@
import os
import os.path
-import sys
import unittest
+import sys
+
from little_brother import dependency_injection
from little_brother.api.master_connector import MasterConnector
from little_brother.app import App, ProcessIteratorFactory, APP_NAME, get_argument_parser
@@ -76,7 +77,8 @@ def test_prepare_configuration(self):
self.assertIsNotNone(config)
- self.assertEqual(14, len(configuration._sections))
+ self.assertEqual(15, len(configuration._sections))
+ self.assertEqual(1, len(configuration._optional_section_handler_definitions))
@classmethod
def create_dummy_app(cls, p_logger):
diff --git a/little_brother/test/test_app_control.py b/little_brother/test/test_app_control.py
index ef7926f..45dbaa0 100644
--- a/little_brother/test/test_app_control.py
+++ b/little_brother/test/test_app_control.py
@@ -98,7 +98,7 @@ def test_retrieve_user_mappings(self):
user_manager.retrieve_user_mappings()
- def test_is_slave(self):
+ def test_is_client(self):
mc_config = master_connector.MasterConnectorConfigModel()
mc_config.host_url = "htt" + "p://master.domain/"
config = app_control.AppControlConfigModel()
diff --git a/little_brother/test/test_client_device_handler.py b/little_brother/test/test_client_device_handler.py
index febf8f4..8b7572e 100644
--- a/little_brother/test/test_client_device_handler.py
+++ b/little_brother/test/test_client_device_handler.py
@@ -41,7 +41,7 @@ def setUp(self):
def check_list_has_n_elements(self, p_list, p_n):
self.assertIsNotNone(p_list)
self.assertIsInstance(p_list, list)
- self.assertEqual(len(p_list), p_n)
+ self.assertEqual(p_n, len(p_list))
@base_test.skip_if_env("NO_PING")
def test_existing_host(self):
diff --git a/little_brother/test/test_client_info.py b/little_brother/test/test_client_info.py
index e815fa4..c595ba7 100644
--- a/little_brother/test/test_client_info.py
+++ b/little_brother/test/test_client_info.py
@@ -58,7 +58,7 @@ def test_property_node_type(self):
ci = client_info.ClientInfo(p_is_master=False, p_host_name=HOSTNAME, p_client_stats=None)
- self.assertEqual(ci.node_type, "Slave")
+ self.assertEqual(ci.node_type, "Client")
def test_property_seconds_without_ping(self):
@@ -117,7 +117,7 @@ def test_property_version_class(self):
ci = client_info.ClientInfo(p_is_master=True, p_host_name=HOSTNAME, p_client_stats=None,
p_master_version=MASTER_VERSION)
- self.assertEqual(ci.version_class, client_info.CSS_CLASS_SLAVE_VERSION_OUTDATED)
+ self.assertEqual(ci.version_class, client_info.CSS_CLASS_CLIENT_VERSION_OUTDATED)
ci.client_stats = ClientStats(p_version=MASTER_VERSION)
@@ -125,7 +125,7 @@ def test_property_version_class(self):
ci.client_stats = ClientStats(p_version=OLD_CLIENT_VERSION)
- self.assertEqual(ci.version_class, client_info.CSS_CLASS_SLAVE_VERSION_OUTDATED)
+ self.assertEqual(ci.version_class, client_info.CSS_CLASS_CLIENT_VERSION_OUTDATED)
if __name__ == "__main__":
unittest.main()
diff --git a/little_brother/test/test_pytest.py b/little_brother/test/test_pytest.py
new file mode 100644
index 0000000..2525ebe
--- /dev/null
+++ b/little_brother/test/test_pytest.py
@@ -0,0 +1,27 @@
+# Copyright (C) 2019 Marcus Rickert
+#
+# See https://github.com/marcus67/python_base_app
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+import os
+
+from python_base_app.test import base_test
+
+
+class TestPytest(base_test.BaseTestCase):
+
+ def test_pytest(self):
+ base_dir = os.path.dirname(__file__)
+ self.execute_pytest(p_base_dir=base_dir)
diff --git a/little_brother/test/test_suite.py b/little_brother/test/test_suite.py
index 0f8158b..55ad4ef 100755
--- a/little_brother/test/test_suite.py
+++ b/little_brother/test/test_suite.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
@@ -20,7 +20,7 @@
import unittest
-from little_brother.test import test_app, test_client_info
+from little_brother.test import test_app, test_client_info, test_pytest
from little_brother.test import test_app_control
from little_brother.test import test_client_device_handler
from little_brother.test import test_client_process_handler
@@ -42,6 +42,10 @@
def add_test_cases(p_test_suite, p_config_filename=None):
+ base_test.add_tests_in_test_unit(
+ p_test_suite=p_test_suite,
+ p_test_unit_class=test_pytest.TestPytest, p_config_filename=p_config_filename)
+
base_test.add_tests_in_test_unit(
p_test_suite=p_test_suite,
p_test_unit_class=test_process_info.TestProcessInfo, p_config_filename=p_config_filename)
diff --git a/little_brother/test/web/base_test_status_server.py b/little_brother/test/web/base_test_status_server.py
index 083021c..08814e8 100644
--- a/little_brother/test/web/base_test_status_server.py
+++ b/little_brother/test/web/base_test_status_server.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
@@ -23,6 +23,7 @@
import unittest
import selenium
+from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.remote.webelement import WebElement
@@ -48,6 +49,7 @@
from little_brother.web import web_server
from python_base_app import locale_helper
from python_base_app.base_user_handler import BaseUserHandler
+from python_base_app.configuration import ConfigurationException
from python_base_app.test import base_test
from python_base_app.test import test_unix_user_handler
@@ -159,7 +161,7 @@ def create_selenium_driver(self):
self._driver = selenium.webdriver.Chrome(options=options)
else:
- self._driver = selenium.webdriver.PhantomJS()
+ raise ConfigurationException("No valid Selenium driver selected! Use SELENIUM_CHROME_DRIVER=1.")
def create_status_server_using_ruleset_configs(self, p_ruleset_configs):
@@ -213,17 +215,17 @@ def login_admin(self):
assert "Administration" in self._driver.title
def check_empty_user_list(self):
- self._driver.find_element_by_xpath(XPATH_EMPTY_USER_LIST)
+ self._driver.find_element(By.XPATH, XPATH_EMPTY_USER_LIST)
def check_empty_device_list(self):
- self._driver.find_element_by_xpath(XPATH_EMPTY_DEVICE_LIST)
+ self._driver.find_element(By.XPATH, XPATH_EMPTY_DEVICE_LIST)
def login(self):
- elem = self._driver.find_element_by_name("username")
+ elem = self._driver.find_element(By.NAME, "username")
elem.clear()
elem.send_keys(test_unix_user_handler.ADMIN_USER)
- elem = self._driver.find_element_by_name("password")
+ elem = self._driver.find_element(By.NAME, "password")
elem.clear()
elem.send_keys(test_unix_user_handler.ADMIN_PASSWORD)
elem.send_keys(Keys.RETURN)
@@ -249,7 +251,7 @@ def add_new_user(self, p_user_entity_manager: UserEntityManager) -> int:
user.active = True
session.commit()
- user_manager : UserManager = dependency_injection.container[UserManager]
+ user_manager: UserManager = dependency_injection.container[UserManager]
user_manager.add_monitored_user(p_username=self.get_new_user_name())
user_manager.retrieve_user_mappings()
diff --git a/little_brother/test/web/test_status_server.py b/little_brother/test/web/test_status_server.py
index dd98154..ae49331 100644
--- a/little_brother/test/web/test_status_server.py
+++ b/little_brother/test/web/test_status_server.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
diff --git a/little_brother/test/web/test_status_server_about.py b/little_brother/test/web/test_status_server_about.py
index e087aea..9471471 100644
--- a/little_brother/test/web/test_status_server_about.py
+++ b/little_brother/test/web/test_status_server_about.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
@@ -20,6 +20,8 @@
import unittest
+from selenium.webdriver.common.by import By
+
from little_brother import constants
from little_brother import settings
from little_brother.test.web.base_test_status_server import BaseTestStatusServer
@@ -39,11 +41,12 @@ def test_page_about(self):
assert "About" in self._driver.title
xpath = "//DIV[DIV[1] = 'Version' and DIV[2] = '{version}']"
- self._driver.find_element_by_xpath(xpath.format(version=settings.settings['version']))
+ self._driver.find_element(By.XPATH, xpath.format(version=settings.settings['version']))
xpath = "//DIV[DIV[1] = 'Debian Package Revision' and DIV[2] = '{debian_package_revision}']"
- self._driver.find_element_by_xpath(
- xpath.format(debian_package_revision=settings.extended_settings['debian_package_revision']))
+ self._driver.find_element(By.XPATH,
+ xpath.format(
+ debian_package_revision=settings.extended_settings['debian_package_revision']))
if __name__ == "__main__":
diff --git a/little_brother/test/web/test_status_server_admin.py b/little_brother/test/web/test_status_server_admin.py
index 1eb2b0d..1a869b3 100644
--- a/little_brother/test/web/test_status_server_admin.py
+++ b/little_brother/test/web/test_status_server_admin.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
@@ -21,6 +21,8 @@
import unittest
from typing import List
+from selenium.webdriver.common.by import By
+
from little_brother import constants
from little_brother import dependency_injection
from little_brother.persistence.persistent_rule_override import RuleOverride
@@ -113,25 +115,25 @@ def test_page_admin_edit(self):
elem_name_prefix = self.get_admin_elem_name_prefix(p_reference_date=reference_date)
- elem = self._driver.find_element_by_id(elem_name_prefix + "min_time_of_day")
+ elem = self._driver.find_element(By.ID, elem_name_prefix + "min_time_of_day")
self.set_value(p_value=NEW_MIN_TIME_OF_DAY, p_elem=elem)
- elem = self._driver.find_element_by_id(elem_name_prefix + "max_time_of_day")
+ elem = self._driver.find_element(By.ID, elem_name_prefix + "max_time_of_day")
self.set_value(p_value=NEW_MAX_TIME_OF_DAY, p_elem=elem)
- elem = self._driver.find_element_by_id(elem_name_prefix + "max_time_per_day")
+ elem = self._driver.find_element(By.ID, elem_name_prefix + "max_time_per_day")
self.set_value(p_value=NEW_MAX_TIME_PER_DAY, p_elem=elem)
- elem = self._driver.find_element_by_id(elem_name_prefix + "max_activity_duration")
+ elem = self._driver.find_element(By.ID, elem_name_prefix + "max_activity_duration")
self.set_value(p_value=NEW_MAX_ACTIVITY_DURATION, p_elem=elem)
- elem = self._driver.find_element_by_id(elem_name_prefix + "min_break")
+ elem = self._driver.find_element(By.ID, elem_name_prefix + "min_break")
self.set_value(p_value=NEW_MIN_BREAK, p_elem=elem)
- elem = self._driver.find_element_by_id(elem_name_prefix + "free_play")
+ elem = self._driver.find_element(By.ID, elem_name_prefix + "free_play")
self.click(elem)
- save_button = self._driver.find_element_by_id("save")
+ save_button = self._driver.find_element(By.ID, "save")
self.click(save_button)
with SessionContext(self._persistence) as session_context:
@@ -173,7 +175,7 @@ def test_page_add_time_extension(self):
elem_name = "time_extension_{username}_{extension}".format(
username=self.get_new_user_name(), extension=EXTENSION_IN_MINUTES)
- elem = self._driver.find_element_by_id(elem_name)
+ elem = self._driver.find_element(By.ID, elem_name)
self.click(elem)
with SessionContext(self._persistence) as session_context:
@@ -212,7 +214,7 @@ def test_page_delete_time_extension(self):
elem_name = "time_extension_{username}_0".format(username=self.get_new_user_name())
- elem = self._driver.find_element_by_id(elem_name)
+ elem = self._driver.find_element(By.ID, elem_name)
self.click(elem)
with SessionContext(self._persistence) as session_context:
@@ -248,7 +250,7 @@ def test_page_extend_time_extension(self):
elem_name = "time_extension_{username}_{extension}".format(username=self.get_new_user_name(),
extension=SECOND_EXTENSION_IN_MINUTES)
- elem = self._driver.find_element_by_id(elem_name)
+ elem = self._driver.find_element(By.ID, elem_name)
self.click(elem)
with SessionContext(self._persistence) as session_context:
@@ -281,14 +283,14 @@ def test_page_admin_edit_invalid_duration_format(self):
elem_name_prefix = self.get_admin_elem_name_prefix(p_reference_date=reference_date)
elem_name = elem_name_prefix + "max_activity_duration"
- elem = self._driver.find_element_by_id(elem_name)
+ elem = self._driver.find_element(By.ID, elem_name)
self.set_value(p_value=NEW_INVALID_DURATION, p_elem=elem)
- save_button = self._driver.find_element_by_id("save")
+ save_button = self._driver.find_element(By.ID, "save")
self.click(save_button)
xpath = "//LABEL[@CLASS = 'error-label' and @FOR = '{elem_name}']".format(elem_name=elem_name)
- self._driver.find_element_by_xpath(xpath)
+ self._driver.find_element(By.XPATH, xpath)
# Data was not saved!
with SessionContext(self._persistence) as session_context:
@@ -315,14 +317,14 @@ def _test_page_admin_edit_invalid_data(self, p_elem_name: str, p_invalid_data: s
elem_name_prefix = self.get_admin_elem_name_prefix(p_reference_date=reference_date)
elem_name = elem_name_prefix + p_elem_name
- elem = self._driver.find_element_by_id(elem_name)
+ elem = self._driver.find_element(By.ID, elem_name)
self.set_value(p_value=p_invalid_data, p_elem=elem)
- save_button = self._driver.find_element_by_id("save")
+ save_button = self._driver.find_element(By.ID, "save")
self.click(save_button)
xpath = "//LABEL[@CLASS = 'error-label' and @FOR = '{elem_name}']".format(elem_name=elem_name)
- self._driver.find_element_by_xpath(xpath)
+ self._driver.find_element(By.XPATH, xpath)
# Data was not saved!
with SessionContext(self._persistence) as session_context:
diff --git a/little_brother/test/web/test_status_server_devices.py b/little_brother/test/web/test_status_server_devices.py
index 7d3a88d..8785ed5 100644
--- a/little_brother/test/web/test_status_server_devices.py
+++ b/little_brother/test/web/test_status_server_devices.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
@@ -20,6 +20,8 @@
import unittest
+from selenium.webdriver.common.by import By
+
from little_brother import constants
from little_brother import dependency_injection
from little_brother.persistence.persistent_device import Device
@@ -74,7 +76,7 @@ def test_page_devices_add_and_delete_device(self):
new_device_name = device_entity_manager.get_new_device_name(
p_session_context=session_context, p_name_pattern=constants.DEFAULT_DEVICE_NEW_NAME_PATTERN)
- add_button = self._driver.find_element_by_id("add_device")
+ add_button = self._driver.find_element(By.ID, "add_device")
add_button.click()
device: Device = device_entity_manager.get_by_device_name(
@@ -84,12 +86,12 @@ def test_page_devices_add_and_delete_device(self):
device_id = device.id
xpath = "//DIV/A[@aria-controls='detailsdevice_1']"
- self._driver.find_element_by_xpath(xpath)
+ self._driver.find_element(By.XPATH, xpath)
- delete_button = self._driver.find_element_by_id("delete_device_1")
+ delete_button = self._driver.find_element(By.ID, "delete_device_1")
delete_button.click()
- delete_button = self._driver.find_element_by_id("delete_device_1-modal-confirm")
+ delete_button = self._driver.find_element(By.ID, "delete_device_1-modal-confirm")
self.click(delete_button)
@@ -115,22 +117,22 @@ def test_page_devices_edit_device(self):
elem_prefix = "device_{id}_".format(id=device_id)
- elem = self._driver.find_element_by_id(elem_prefix + "device_name")
+ elem = self._driver.find_element(By.ID, elem_prefix + "device_name")
self.set_value(p_elem=elem, p_value=NEW_DEVICE_NAME)
- elem = self._driver.find_element_by_id(elem_prefix + "hostname")
+ elem = self._driver.find_element(By.ID, elem_prefix + "hostname")
self.set_value(p_elem=elem, p_value=NEW_DEVICE_HOST_NAME)
- elem = self._driver.find_element_by_id(elem_prefix + "min_activity_duration")
+ elem = self._driver.find_element(By.ID, elem_prefix + "min_activity_duration")
self.set_value(p_elem=elem, p_value=NEW_DEVICE_MIN_ACTIVITY_DURATION)
- elem = self._driver.find_element_by_id(elem_prefix + "max_active_ping_delay")
+ elem = self._driver.find_element(By.ID, elem_prefix + "max_active_ping_delay")
self.set_value(p_elem=elem, p_value=NEW_DEVICE_MAX_ACTIVE_PING_DELAY)
- elem = self._driver.find_element_by_id(elem_prefix + "sample_size")
+ elem = self._driver.find_element(By.ID, elem_prefix + "sample_size")
self.set_value(p_elem=elem, p_value=NEW_DEVICE_SAMPLE_SIZE)
- save_button = self._driver.find_element_by_id("save")
+ save_button = self._driver.find_element(By.ID, "save")
self.click(save_button)
with SessionContext(self._persistence) as session_context:
@@ -163,14 +165,14 @@ def _test_page_devices_edit_invalid_data(self, p_elem_name: str, p_invalid_data:
elem_name_prefix = "device_{id}_".format(id=device_id)
elem_name = elem_name_prefix + p_elem_name
- elem = self._driver.find_element_by_id(elem_name)
+ elem = self._driver.find_element(By.ID, elem_name)
self.set_value(p_value=p_invalid_data, p_elem=elem)
- save_button = self._driver.find_element_by_id("save")
+ save_button = self._driver.find_element(By.ID, "save")
self.click(save_button)
xpath = "//LABEL[@CLASS = 'error-label' and @FOR = '{elem_name}']".format(elem_name=elem_name)
- self._driver.find_element_by_xpath(xpath)
+ self._driver.find_element(By.XPATH, xpath)
# Data was not saved!
with SessionContext(self._persistence) as session_context:
diff --git a/little_brother/test/web/test_status_server_index.py b/little_brother/test/web/test_status_server_index.py
index 5eb0dc3..ad545e3 100644
--- a/little_brother/test/web/test_status_server_index.py
+++ b/little_brother/test/web/test_status_server_index.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
@@ -20,6 +20,8 @@
import unittest
+from selenium.webdriver.common.by import By
+
from little_brother import constants
from little_brother.test import test_data
from little_brother.test.web.base_test_status_server import BaseTestStatusServer
@@ -30,7 +32,7 @@ class TestStatusServerIndex(BaseTestStatusServer):
def check_index_page_visible(self):
xpath = "//DIV[DIV[1] = 'User' and DIV[2] = 'Context' and DIV[12] = 'Reasons']"
- self._driver.find_element_by_xpath(xpath)
+ self._driver.find_element(By.XPATH, xpath)
@base_test.skip_if_env("NO_SELENIUM_TESTS")
def test_page_index_with_process_no_restrictions(self):
diff --git a/little_brother/test/web/test_status_server_topology.py b/little_brother/test/web/test_status_server_topology.py
index 0779281..1ef37e7 100644
--- a/little_brother/test/web/test_status_server_topology.py
+++ b/little_brother/test/web/test_status_server_topology.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
@@ -20,6 +20,8 @@
import unittest
+from selenium.webdriver.common.by import By
+
from little_brother import constants
from little_brother.test.web.base_test_status_server import BaseTestStatusServer
from python_base_app.test import base_test
@@ -44,7 +46,7 @@ def test_page_topology(self):
# After logging in we are on the users page
xpath = "//DIV/DIV[DIV[1] = 'Node Type' and DIV[2] = 'Node Name']"
assert "Topology" in self._driver.title
- self._driver.find_element_by_xpath(xpath)
+ self._driver.find_element(By.XPATH, xpath)
# The second time we call the users page.
self._driver.get(self._status_server.get_url(p_internal=False, p_rel_url=constants.TOPOLOGY_REL_URL))
@@ -53,7 +55,7 @@ def test_page_topology(self):
# we are on the users page right away...
xpath = "//DIV/DIV[DIV[1] = 'Node Type' and DIV[2] = 'Node Name']"
- self._driver.find_element_by_xpath(xpath)
+ self._driver.find_element(By.XPATH, xpath)
if __name__ == "__main__":
diff --git a/little_brother/test/web/test_status_server_users.py b/little_brother/test/web/test_status_server_users.py
index fc46915..66d6ffb 100644
--- a/little_brother/test/web/test_status_server_users.py
+++ b/little_brother/test/web/test_status_server_users.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright (C) 2019-2021 Marcus Rickert
+# Copyright (C) 2019-2022 Marcus Rickert
#
# See https://github.com/marcus67/little_brother
#
@@ -21,6 +21,7 @@
import unittest
import selenium.webdriver.support.ui
+from selenium.webdriver.common.by import By
from little_brother import constants
from little_brother import dependency_injection
@@ -70,11 +71,11 @@ def test_page_users_add_and_delete_user(self):
self.login_users()
- elem = self._driver.find_element_by_id("username")
+ elem = self._driver.find_element(By.ID, "username")
dropdown = selenium.webdriver.support.ui.Select(elem)
dropdown.select_by_value(test_unix_user_handler.USER_2_UID)
- add_button = self._driver.find_element_by_id("add_user")
+ add_button = self._driver.find_element(By.ID, "add_user")
add_button.click()
user_entity_manager: UserEntityManager = dependency_injection.container[UserEntityManager]
@@ -87,12 +88,12 @@ def test_page_users_add_and_delete_user(self):
user_id = user.id
xpath = "//DIV/A[@aria-controls='detailsuser_1']"
- self._driver.find_element_by_xpath(xpath)
+ self._driver.find_element(By.XPATH, xpath)
- delete_button = self._driver.find_element_by_id("delete_user_1")
+ delete_button = self._driver.find_element(By.ID, "delete_user_1")
self.click(delete_button)
- delete_button = self._driver.find_element_by_id("delete_user_1-modal-confirm")
+ delete_button = self._driver.find_element(By.ID, "delete_user_1-modal-confirm")
self.click(delete_button)
with SessionContext(self._persistence) as session_context:
@@ -115,22 +116,22 @@ def test_page_users_edit_user(self):
elem_prefix = "user_{id}_".format(id=user_id)
- elem = self._driver.find_element_by_id(elem_prefix + "first_name")
+ elem = self._driver.find_element(By.ID, elem_prefix + "first_name")
self.set_value(p_elem=elem, p_value=NEW_USER_FIRST_NAME)
- elem = self._driver.find_element_by_id(elem_prefix + "last_name")
+ elem = self._driver.find_element(By.ID, elem_prefix + "last_name")
self.set_value(p_elem=elem, p_value=NEW_USER_LAST_NAME)
- elem = self._driver.find_element_by_id(elem_prefix + "process_name_pattern")
+ elem = self._driver.find_element(By.ID, elem_prefix + "process_name_pattern")
self.set_value(p_elem=elem, p_value=NEW_USER_PROCESS_NAME_PATTERN)
- elem = self._driver.find_element_by_id(elem_prefix + "locale")
+ elem = self._driver.find_element(By.ID, elem_prefix + "locale")
self.set_value(p_elem=elem, p_value=NEW_USER_LOCALE)
- check_box = self._driver.find_element_by_id(elem_prefix + "active")
+ check_box = self._driver.find_element(By.ID, elem_prefix + "active")
self.click(check_box)
- save_button = self._driver.find_element_by_id("save")
+ save_button = self._driver.find_element(By.ID, "save")
self.click(save_button)
with SessionContext(self._persistence) as session_context:
@@ -157,7 +158,7 @@ def test_page_users_assign_rule_set(self):
self.login_users()
elem_name = "new_ruleset_user_{id}".format(id=user_id)
- add_button = self._driver.find_element_by_id(elem_name)
+ add_button = self._driver.find_element(By.ID, elem_name)
self.click(add_button)
with SessionContext(self._persistence) as session_context:
@@ -185,10 +186,10 @@ def test_page_users_unassign_rule_set(self):
self.login_users()
elem_name = "delete_ruleset_{id}".format(id=rule_set_id)
- unassign_button = self._driver.find_element_by_id(elem_name)
+ unassign_button = self._driver.find_element(By.ID, elem_name)
self.click(unassign_button)
- confirm_button = self._driver.find_element_by_id(elem_name + "-modal-confirm")
+ confirm_button = self._driver.find_element(By.ID, elem_name + "-modal-confirm")
self.click(confirm_button)
with SessionContext(self._persistence) as session_context:
@@ -218,7 +219,7 @@ def test_page_users_move_rule_set_down(self):
self.login_users()
elem_name = "move_down_ruleset_{id}".format(id=rule_set_2_id)
- add_button = self._driver.find_element_by_id(elem_name)
+ add_button = self._driver.find_element(By.ID, elem_name)
self.click(add_button)
with SessionContext(self._persistence) as session_context:
@@ -246,7 +247,7 @@ def test_page_users_move_rule_set_up(self):
self.login_users()
elem_name = "move_up_ruleset_{id}".format(id=rule_set_1_id)
- add_button = self._driver.find_element_by_id(elem_name)
+ add_button = self._driver.find_element(By.ID, elem_name)
self.click(add_button)
with SessionContext(self._persistence) as session_context:
@@ -292,11 +293,11 @@ def test_page_users_assign_device(self):
self.login_users()
elem_name = "user_{id}_device_id".format(id=user_id)
- select_device = self._driver.find_element_by_id(elem_name)
+ select_device = self._driver.find_element(By.ID, elem_name)
self.set_value(p_elem=select_device, p_value=device_id)
elem_name = "new_device_user_{id}".format(id=user_id)
- add_button = self._driver.find_element_by_id(elem_name)
+ add_button = self._driver.find_element(By.ID, elem_name)
self.click(add_button)
with SessionContext(self._persistence) as session_context:
@@ -334,10 +335,10 @@ def test_page_users_unassign_device(self):
self.login_users()
elem_name = "delete_user2device_{id}".format(id=user_2_device_id)
- unassign_button = self._driver.find_element_by_id(elem_name)
+ unassign_button = self._driver.find_element(By.ID, elem_name)
self.click(unassign_button)
- confirm_button = self._driver.find_element_by_id(elem_name + "-modal-confirm")
+ confirm_button = self._driver.find_element(By.ID, elem_name + "-modal-confirm")
self.click(confirm_button)
with SessionContext(self._persistence) as session_context:
diff --git a/little_brother/translations/bn/LC_MESSAGES/messages.po b/little_brother/translations/bn/LC_MESSAGES/messages.po
index df85ce7..68b34f3 100644
--- a/little_brother/translations/bn/LC_MESSAGES/messages.po
+++ b/little_brother/translations/bn/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LittleBrother\n"
"Report-Msgid-Bugs-To: little-brother@web.de\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-20 10:00+0200\n"
"Last-Translator: Rownak Jyoti Zaman
\n"
"Language: bn\n"
@@ -68,7 +68,7 @@ msgstr "ব্যবহারকারী"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
#, fuzzy
-msgid "Slave"
+msgid "Client"
msgstr "সেইভ"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -79,8 +79,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -316,11 +316,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "ব্যবহারকারীর নাম '{username}' মনিটর করা হচ্ছে না"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -331,7 +331,7 @@ msgid "Username"
msgstr "ব্যবহারকারীর নাম"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -346,7 +346,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -483,7 +483,7 @@ msgstr "ওভাররাইড"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "সেইভ"
@@ -524,18 +524,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -746,7 +750,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -775,23 +779,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -858,3 +866,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/da/LC_MESSAGES/messages.po b/little_brother/translations/da/LC_MESSAGES/messages.po
index 070ebe0..61454ab 100644
--- a/little_brother/translations/da/LC_MESSAGES/messages.po
+++ b/little_brother/translations/da/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LittleBrother\n"
"Report-Msgid-Bugs-To: little-brother@web.de\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-05-11 23:49+0200\n"
"Last-Translator: Erik Husmark\n"
"Language: da\n"
@@ -68,7 +68,7 @@ msgstr "Bruger"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
#, fuzzy
-msgid "Slave"
+msgid "Client"
msgstr "Gem"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -79,8 +79,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -301,11 +301,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "bruger '{username}' overvåges ikke"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -316,7 +316,7 @@ msgid "Username"
msgstr "Brugernavn"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -331,7 +331,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -468,7 +468,7 @@ msgstr "særregel"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Gem"
@@ -509,18 +509,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -729,7 +733,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -758,23 +762,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -835,3 +843,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/de/LC_MESSAGES/messages.po b/little_brother/translations/de/LC_MESSAGES/messages.po
index 82d29b9..8788b2b 100644
--- a/little_brother/translations/de/LC_MESSAGES/messages.po
+++ b/little_brother/translations/de/LC_MESSAGES/messages.po
@@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: little-brother\n"
"Report-Msgid-Bugs-To: marcus.rickert@web.de\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2019-02-27 23:25+0100\n"
"Last-Translator: Marcus Rickert \n"
"Language: de\n"
@@ -75,8 +75,8 @@ msgid "Master"
msgstr "Master"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
-msgid "Slave"
-msgstr "Slave"
+msgid "Client"
+msgstr "Client"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
msgid "Details"
@@ -86,9 +86,9 @@ msgstr "Details"
msgid "Sub pattern must be longer than one character"
msgstr "Teilmuster muss länger als ein Zeichen sein"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
-msgstr "Keine gültige Computer-Adresse"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
+msgstr "Keine gültige Computer-Adresse: {url}"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
msgid "vacation"
@@ -321,11 +321,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "Benutzer '{username}' wird nicht überwacht"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr "Zugewiesene Benutzer"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr "Computername"
@@ -336,7 +336,7 @@ msgid "Username"
msgstr "Benutzername"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -351,7 +351,7 @@ msgstr "Unbekannt"
msgid "Locale"
msgstr "Lokalisierung"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr "Geteilt mit"
@@ -488,7 +488,7 @@ msgstr "ersetzt"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Sichern"
@@ -529,18 +529,22 @@ msgstr "Stichproben- größe"
msgid "Max Active Response Delay [ms]"
msgstr "Max. Verzögerung der Antwort [ms]"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr "Blockierte URLs"
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr "Möchten Sie die Beobachtung des Geräts permanent beenden?"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr "Beobachtung beenden"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr "Abbruch"
@@ -749,7 +753,7 @@ msgid "Edit ruleset details"
msgstr "Ändere Details des Regelsatzes"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr "Regelsatz entfernen"
@@ -778,23 +782,27 @@ msgid "Remove monitoring of this device for the user"
msgstr "Beobachtung dieses Geräts für den Benutzer beenden"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr "Blockierbar"
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr "Prozent"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr "Möchten Sie die Beobachtung des Benutzers permanent beenden?"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr "Beobachtung beenden"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr "Möchten Sie den Regelsatz permanent entfernen?"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -808,11 +816,13 @@ msgid ""
"HREF=\"{changes_url}\">here for changes. Download Debian package here."
msgstr ""
-"Neue Version von LittleBrother für den"
-" Update-Kanal {channel}
verfügbar:"
-" Version {suggested_version}
in "
-"Revision {suggested_revision}
. "
-"Siehe hier für eine Liste der Änderungen. "
-"Debian-Paket hier "
-"herunterladen."
+"Neue Version von LittleBrother für den Update-Kanal "
+"{channel}
verfügbar: Version "
+"{suggested_version}
in Revision "
+"{suggested_revision}
. Siehe hier für eine Liste der Änderungen. Debian-"
+"Paket hier herunterladen."
+
+#~ msgid "Not a valid host address"
+#~ msgstr "Keine gültige Computer-Adresse"
diff --git a/little_brother/translations/es/LC_MESSAGES/messages.po b/little_brother/translations/es/LC_MESSAGES/messages.po
index a31ef69..eddb129 100644
--- a/little_brother/translations/es/LC_MESSAGES/messages.po
+++ b/little_brother/translations/es/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-14 21:34+0200\n"
"Last-Translator: FULL NAME \n"
"Language: es\n"
@@ -66,7 +66,7 @@ msgid "Master"
msgstr "Usuario"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
-msgid "Slave"
+msgid "Client"
msgstr "Asegura"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -77,8 +77,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -311,11 +311,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "nombre de usuario '{username}' no está observado"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -326,7 +326,7 @@ msgid "Username"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -341,7 +341,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -478,7 +478,7 @@ msgstr "sobrevira"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Asegura"
@@ -519,18 +519,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -741,7 +745,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -770,23 +774,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -853,3 +861,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/fi/LC_MESSAGES/messages.po b/little_brother/translations/fi/LC_MESSAGES/messages.po
index b8dcb6f..bb9c07f 100644
--- a/little_brother/translations/fi/LC_MESSAGES/messages.po
+++ b/little_brother/translations/fi/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-19 11:47+0200\n"
"Last-Translator: FULL NAME \n"
"Language: fi\n"
@@ -66,7 +66,7 @@ msgid "Master"
msgstr "Käyttäjä"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
-msgid "Slave"
+msgid "Client"
msgstr "Tallenna"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -77,8 +77,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -312,11 +312,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "Käyttäjätunnusta '{username}' ei tarkkailla"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -327,7 +327,7 @@ msgid "Username"
msgstr "Käyttäjätunnus"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -342,7 +342,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -479,7 +479,7 @@ msgstr "override"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Tallenna"
@@ -520,18 +520,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -742,7 +746,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -771,23 +775,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -854,3 +862,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/fr/LC_MESSAGES/messages.po b/little_brother/translations/fr/LC_MESSAGES/messages.po
index 86dcf7c..7a6d419 100644
--- a/little_brother/translations/fr/LC_MESSAGES/messages.po
+++ b/little_brother/translations/fr/LC_MESSAGES/messages.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LittleBrother\n"
"Report-Msgid-Bugs-To: little-brother@web.de\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2021-02-21 10:30+0100\n"
"Last-Translator: albano battistella \n"
"Language: fr\n"
@@ -65,8 +65,8 @@ msgid "Master"
msgstr "Master"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
-msgid "Slave"
-msgstr "Slave"
+msgid "Client"
+msgstr "Client"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
msgid "Details"
@@ -76,9 +76,9 @@ msgstr "Détails"
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
-msgstr "Pas une adresse hôte valide"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
+msgstr "Pas une adresse hôte valide: {url}"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
msgid "vacation"
@@ -317,11 +317,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "le nom d'utilisateur '{username}' n'est pas surveillé"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr "Utilisateurs attribués"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr "Nom Hôte"
@@ -332,7 +332,7 @@ msgid "Username"
msgstr "Nom d'utilisateur"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -347,7 +347,7 @@ msgstr "Inconnu"
msgid "Locale"
msgstr "Local"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr "Partagé avec"
@@ -484,7 +484,7 @@ msgstr "réécriture"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Sauver"
@@ -525,20 +525,24 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr "Délai de réponse actif maximum [ms]"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
"Voulez-vous vraiment supprimer définitivement le dispositif de "
"surveillance?"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr "Retirer de la surveillance"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr "Annuler"
@@ -747,7 +751,7 @@ msgid "Edit ruleset details"
msgstr "Modifier les détails de l'ensemble de règles"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr "Supprimer l'ensemble de règles"
@@ -776,25 +780,30 @@ msgid "Remove monitoring of this device for the user"
msgstr "Supprimer la surveillance de cet dispositif pour l'utilisateur"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+#, fuzzy
+msgid "Blockable"
+msgstr "Local"
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr "Pour cent"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
"Voulez-vous vraiment supprimer définitivement l'utilisateur de la "
"surveillance?"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr "Retirer de la surveillance"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr "Voulez-vous vraiment supprimer définitivement l'ensemble de règles?"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -863,3 +872,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr "Pas une adresse hôte valide"
+
diff --git a/little_brother/translations/hr/LC_MESSAGES/messages.po b/little_brother/translations/hr/LC_MESSAGES/messages.po
index 9999102..b2d07ad 100644
--- a/little_brother/translations/hr/LC_MESSAGES/messages.po
+++ b/little_brother/translations/hr/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-09-06 22:56+0200\n"
"Last-Translator: FULL NAME \n"
"Language: hr\n"
@@ -69,7 +69,7 @@ msgstr "Korisnik"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
#, fuzzy
-msgid "Slave"
+msgid "Client"
msgstr "Spremiti"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -80,8 +80,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -315,11 +315,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "Korisnik '{username}' se ne nadzire"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -330,7 +330,7 @@ msgid "Username"
msgstr "Ime korisnika"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -345,7 +345,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -482,7 +482,7 @@ msgstr "prekoracenje"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Spremiti"
@@ -523,18 +523,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -745,7 +749,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -774,23 +778,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -833,3 +841,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/hu/LC_MESSAGES/messages.po b/little_brother/translations/hu/LC_MESSAGES/messages.po
index 6f5bd75..c98c956 100644
--- a/little_brother/translations/hu/LC_MESSAGES/messages.po
+++ b/little_brother/translations/hu/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-20 09:48+0200\n"
"Last-Translator: FULL NAME \n"
"Language: hu\n"
@@ -66,7 +66,7 @@ msgid "Master"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
-msgid "Slave"
+msgid "Client"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -77,8 +77,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -287,11 +287,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -302,7 +302,7 @@ msgid "Username"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -317,7 +317,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -454,7 +454,7 @@ msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr ""
@@ -495,18 +495,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -714,7 +718,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -743,23 +747,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -832,3 +840,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/it/LC_MESSAGES/messages.po b/little_brother/translations/it/LC_MESSAGES/messages.po
index b6bd9f7..8c145fa 100644
--- a/little_brother/translations/it/LC_MESSAGES/messages.po
+++ b/little_brother/translations/it/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2021-12-25 15:00+0100\n"
"Last-Translator: albano battistella \n"
"Language: it\n"
@@ -66,8 +66,8 @@ msgid "Master"
msgstr "Master"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
-msgid "Slave"
-msgstr "Slave"
+msgid "Client"
+msgstr "Client"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
msgid "Details"
@@ -77,9 +77,9 @@ msgstr "Dettagli"
msgid "Sub pattern must be longer than one character"
msgstr "Il sotto-modello deve essere più lungo di un carattere"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
-msgstr "Non è un indirizzo host valido"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
+msgstr "Non è un indirizzo host valido: {url}"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
msgid "vacation"
@@ -307,11 +307,11 @@ msgstr "parametro '{parameter_name}' con valore '{value}' ha un formato sbagliat
msgid "username '{username}' does not exist or is not being monitored"
msgstr "nome utente '{username}' non esiste o non viene monitorato"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr "Utenti assegnati"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr "Nome Host"
@@ -322,7 +322,7 @@ msgid "Username"
msgstr "Nome Utente"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -337,7 +337,7 @@ msgstr "Sconosciuto"
msgid "Locale"
msgstr "Locale"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr "Condiviso con"
@@ -474,7 +474,7 @@ msgstr "annullare"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Salva"
@@ -515,18 +515,22 @@ msgstr "Misura di prova"
msgid "Max Active Response Delay [ms]"
msgstr "Ritardo risposta attiva massima [ms]"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr "Vuoi veramente rimuovere definitivamente il dispositivo dal monitoraggio?"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr "Rimuovi dal monitoraggio"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr "Cancella"
@@ -735,7 +739,7 @@ msgid "Edit ruleset details"
msgstr "Aggiungi dettaglio regola"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr "Rimuovi regola"
@@ -764,23 +768,28 @@ msgid "Remove monitoring of this device for the user"
msgstr "Rimuovere il monitoraggio di questo dispositivo per l'utente"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+#, fuzzy
+msgid "Blockable"
+msgstr "Locale"
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr "Percentuale"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr "Vuoi veramente rimuovere permanentemente l'utente dal monitoraggio?"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr "Rimuovi dal monitoraggio"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr "Vuoi veramente rimuovere definitivamente il set di regole?"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -852,3 +861,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr "Non è un indirizzo host valido"
+
diff --git a/little_brother/translations/ja/LC_MESSAGES/messages.po b/little_brother/translations/ja/LC_MESSAGES/messages.po
index 5d133df..42d5940 100644
--- a/little_brother/translations/ja/LC_MESSAGES/messages.po
+++ b/little_brother/translations/ja/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-20 09:49+0200\n"
"Last-Translator: Arik Mahbub \n"
"Language: ja\n"
@@ -68,7 +68,7 @@ msgstr "ユーザー"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
#, fuzzy
-msgid "Slave"
+msgid "Client"
msgstr "セーブ"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -79,8 +79,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -302,11 +302,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "ユーザー名 '{username}' は監視されていません"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -317,7 +317,7 @@ msgid "Username"
msgstr "ユーザー名"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -332,7 +332,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -469,7 +469,7 @@ msgstr "オーバーライド"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "セーブ"
@@ -510,18 +510,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -732,7 +736,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -761,23 +765,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -844,3 +852,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/lt/LC_MESSAGES/messages.po b/little_brother/translations/lt/LC_MESSAGES/messages.po
index 7176d76..aa8e893 100644
--- a/little_brother/translations/lt/LC_MESSAGES/messages.po
+++ b/little_brother/translations/lt/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-20 09:48+0200\n"
"Last-Translator: FULL NAME \n"
"Language: lt\n"
@@ -67,7 +67,7 @@ msgid "Master"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
-msgid "Slave"
+msgid "Client"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -78,8 +78,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -288,11 +288,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -303,7 +303,7 @@ msgid "Username"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -318,7 +318,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -455,7 +455,7 @@ msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr ""
@@ -496,18 +496,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -715,7 +719,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -744,23 +748,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -833,3 +841,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/nl/LC_MESSAGES/messages.po b/little_brother/translations/nl/LC_MESSAGES/messages.po
index 5a907f7..d29cae0 100644
--- a/little_brother/translations/nl/LC_MESSAGES/messages.po
+++ b/little_brother/translations/nl/LC_MESSAGES/messages.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LittleBrother 0.2\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-14 20:21+0200\n"
"Last-Translator: FULL NAME \n"
"Language: nl\n"
@@ -69,7 +69,7 @@ msgstr "Gebruikers"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
#, fuzzy
-msgid "Slave"
+msgid "Client"
msgstr "Opslaan"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -80,8 +80,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -298,11 +298,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "gebruikersnaam '{username}' niet gecontroleerd worden"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -313,7 +313,7 @@ msgid "Username"
msgstr "Gebruikersnaam"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -328,7 +328,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -465,7 +465,7 @@ msgstr "Zet uit"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Opslaan"
@@ -506,18 +506,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -728,7 +732,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -757,23 +761,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -840,3 +848,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/ru/LC_MESSAGES/messages.po b/little_brother/translations/ru/LC_MESSAGES/messages.po
index ab13013..9495a84 100644
--- a/little_brother/translations/ru/LC_MESSAGES/messages.po
+++ b/little_brother/translations/ru/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LittleBrother\n"
"Report-Msgid-Bugs-To: little-brother@web.de\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-20 09:53+0200\n"
"Last-Translator: J. Moldawski\n"
"Language: ru\n"
@@ -69,7 +69,7 @@ msgstr "Пользователь"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
#, fuzzy
-msgid "Slave"
+msgid "Client"
msgstr "Сохранить"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -80,8 +80,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -318,11 +318,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "Пользователь '{username}' не отслеживается"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -333,7 +333,7 @@ msgid "Username"
msgstr "Имя пользователя"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -348,7 +348,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -485,7 +485,7 @@ msgstr "изменение"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Сохранить"
@@ -526,18 +526,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -748,7 +752,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -777,23 +781,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -860,3 +868,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/sr/LC_MESSAGES/messages.po b/little_brother/translations/sr/LC_MESSAGES/messages.po
index ab84116..5e74845 100644
--- a/little_brother/translations/sr/LC_MESSAGES/messages.po
+++ b/little_brother/translations/sr/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-21 00:21+0200\n"
"Last-Translator: FULL NAME \n"
"Language: sr\n"
@@ -67,7 +67,7 @@ msgid "Master"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
-msgid "Slave"
+msgid "Client"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -78,8 +78,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -288,11 +288,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -303,7 +303,7 @@ msgid "Username"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -318,7 +318,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -455,7 +455,7 @@ msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr ""
@@ -496,18 +496,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -715,7 +719,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -744,23 +748,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -833,3 +841,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/th/LC_MESSAGES/messages.po b/little_brother/translations/th/LC_MESSAGES/messages.po
index 78b5bf9..3d90429 100644
--- a/little_brother/translations/th/LC_MESSAGES/messages.po
+++ b/little_brother/translations/th/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-19 23:19+0200\n"
"Last-Translator: FULL NAME \n"
"Language: th\n"
@@ -68,7 +68,7 @@ msgstr "ผู้ใช้"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
#, fuzzy
-msgid "Slave"
+msgid "Client"
msgstr "บันทึก"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -79,8 +79,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -313,11 +313,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "ชื่อผู้ใช้'{username}'ไม่ถูกเฝ้าระวัง"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -328,7 +328,7 @@ msgid "Username"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -343,7 +343,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -480,7 +480,7 @@ msgstr "ยกเลิก"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "บันทึก"
@@ -521,18 +521,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -743,7 +747,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -772,23 +776,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -855,3 +863,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/translations/tr/LC_MESSAGES/messages.po b/little_brother/translations/tr/LC_MESSAGES/messages.po
index c382320..9d6baf7 100644
--- a/little_brother/translations/tr/LC_MESSAGES/messages.po
+++ b/little_brother/translations/tr/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-01-30 21:24+0100\n"
+"POT-Creation-Date: 2022-06-19 18:18+0200\n"
"PO-Revision-Date: 2020-04-19 23:19+0200\n"
"Last-Translator: FULL NAME \n"
"Language: tr\n"
@@ -68,7 +68,7 @@ msgstr "Kullanıcı"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/client_info.py:68
#, fuzzy
-msgid "Slave"
+msgid "Client"
msgstr "Kaydet"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/context_rule_handler.py:62
@@ -79,8 +79,8 @@ msgstr ""
msgid "Sub pattern must be longer than one character"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:70
-msgid "Not a valid host address"
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/entity_forms.py:74
+msgid "Not a valid host address: {url}"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/german_vacation_context_rule_handler.py:33
@@ -313,11 +313,11 @@ msgstr ""
msgid "username '{username}' does not exist or is not being monitored"
msgstr "kullanıcı adı '{username}' gözetlenmiyor"
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:74
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:87
msgid "Assigned users"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:76
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_device.py:89
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:87
msgid "Host Name"
msgstr ""
@@ -328,7 +328,7 @@ msgid "Username"
msgstr "Kullanıcı adı"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user.py:192
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:48
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:49
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:101
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:294
msgid "Monitored"
@@ -343,7 +343,7 @@ msgstr ""
msgid "Locale"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:52
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/persistence/persistent_user_2_device.py:53
msgid "Shared with"
msgstr ""
@@ -480,7 +480,7 @@ msgstr "Geçersiz kıl"
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:80
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:106
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:198
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:303
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:305
msgid "Save"
msgstr "Kaydet"
@@ -521,18 +521,22 @@ msgstr ""
msgid "Max Active Response Delay [ms]"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:99
+msgid "Blocked URLs"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Do you really want to permanently remove the device from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
msgid "Remove from Monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:132
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/devices.template.html:140
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Cancel"
msgstr ""
@@ -743,7 +747,7 @@ msgid "Edit ruleset details"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:182
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Remove ruleset"
msgstr ""
@@ -772,23 +776,27 @@ msgid "Remove monitoring of this device for the user"
msgstr ""
#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:295
+msgid "Blockable"
+msgstr ""
+
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:296
msgid "Percent"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
msgid "Do you really want to permanently remove the user from monitoring?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:319
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:321
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid "Remove from monitoring"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:324
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:326
msgid "Do you really want to permanently remove the ruleset?"
msgstr ""
-#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:329
+#: /home/mr/projects/LittleBrotherGitHub/little_brother/templates/users.template.html:331
msgid ""
"Do you really want to permanently remove monitoring of the device for "
"this user?"
@@ -855,3 +863,6 @@ msgstr ""
#~ "href=\"{download_url}\">here."
#~ msgstr ""
+#~ msgid "Not a valid host address"
+#~ msgstr ""
+
diff --git a/little_brother/user_manager.py b/little_brother/user_manager.py
index 725d499..ffec586 100644
--- a/little_brother/user_manager.py
+++ b/little_brother/user_manager.py
@@ -151,7 +151,7 @@ def queue_event_update_login_mapping(self, p_hostname, p_login_mapping):
p_payload=p_login_mapping)
self.event_handler.queue_event(p_event=event, p_is_action=True)
- def send_login_mapping_to_slave(self, p_hostname):
+ def send_login_mapping_to_client(self, p_hostname):
self.queue_event_update_login_mapping(p_hostname=p_hostname,
p_login_mapping=self._login_mapping.to_json())
diff --git a/little_brother/web/users_view_handler.py b/little_brother/web/users_view_handler.py
index 5fbbe59..5ffc8e0 100644
--- a/little_brother/web/users_view_handler.py
+++ b/little_brother/web/users_view_handler.py
@@ -124,7 +124,7 @@ def handle_button_press_for_user(self, p_forms, p_session_context, p_submit_id,
p_session_context=p_session_context, p_username=p_user.username)
self.persistence.clear_cache()
self.user_manager.reset_users(p_session_context=p_session_context)
- self.app_control.send_config_to_all_slaves()
+ self.app_control.send_config_to_all_clients()
self.app_control.reset_process_patterns()
elif p_submit_id == p_user.new_ruleset_html_key:
@@ -256,7 +256,7 @@ def save_users_data(self, p_users, p_forms):
if changed:
session.commit()
self._persistence.clear_cache()
- self.app_control.send_config_to_all_slaves()
+ self.app_control.send_config_to_all_clients()
self.user_manager.reset_users(p_session_context=session_context)
self.app_control.reset_process_patterns()
diff --git a/little_brother/web/web_server.py b/little_brother/web/web_server.py
index 05b75d4..3a19c24 100644
--- a/little_brother/web/web_server.py
+++ b/little_brother/web/web_server.py
@@ -27,6 +27,7 @@
import little_brother
from little_brother import app_control
from little_brother import constants
+from little_brother import entity_forms
from little_brother.api import api_view_handler
from little_brother.persistence.persistent_dependency_injection_mix_in import PersistenceDependencyInjectionMixIn
from little_brother.web.about_view_handler import AboutViewHandler
@@ -136,12 +137,14 @@ def __init__(self,
self._app.jinja_env.filters['seconds_as_humanized_duration'] = self.format_seconds_as_humanized_duration
self._app.jinja_env.filters['_base'] = self._base_gettext
- self._babel = flask_babel.Babel(self._app)
- self._babel.localeselector(self._locale_helper.locale_selector)
+ self._babel = flask_babel.Babel()
+ #self._babel.localeselector(self._locale_helper.locale_selector)
+ self._babel.init_app(app=self._app, locale_selector=self._locale_helper.locale_selector)
gettext.bindtextdomain("messages", "little_brother/translations")
- def invert(self, rel_font_size):
+ entity_forms.set_get_text(self.gettext)
+ def invert(self, rel_font_size):
return str(int(1.0 / float(rel_font_size) * 10000.0))
def format_datetime(self, value):
diff --git a/requirements.txt b/requirements.txt
index 643d3d6..947d50a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,21 +1,24 @@
-alembic>=1.7.5
-lagom>=1.3.0
-requests>=2.25.0
-psutil>=5.7.3
-python-dateutil>=2.8.1
-python-ldap>=3.3.1
-SQLAlchemy>=1.3.18
-PyMySQL>=0.10.1
-pytest>=6.2.1
-Flask>=1.1.2
-Flask-Login>=0.5.0
-Flask-Babel>=2.0.0
-Flask-Migrate>=2.5.3
-Flask-WTF>=0.14.3
+Flask-Babel>=3.1.0
+Flask-Migrate>=4.0.4
+Flask-WTF>=1.1.1
+Flask>=2.3.2
+PyMySQL>=1.1.0
+SQLAlchemy>=2.0.19
+WTForms>=3.0.1
+alembic>=1.11.1
+distro>=1.8.0
+flask-login>=0.6.2
+humanize>=4.7.0
+lagom>=2.4.1
+mockito>=1.4.0
+packaging>=23.1
+prometheus_client>=0.17.1
+psutil>=5.9.5
+pytest>=7.4.0
+python-dateutil>=2.8.2
+requests>=2.31.0
secure>=0.3.0
-selenium>=3.141.0
-urllib3>=1.26.2
-prometheus_client>=0.9.0
-humanize>=3.2.0
-wtforms>=3.0.0a1 # not directly required, pinned by Snyk to avoid a vulnerability
-distro>=1.6.0
+selenium>=4.10.0
+urllib3>=2.0.4
+
+
diff --git a/setup.py b/setup.py
index fb339ab..bde1f13 100755
--- a/setup.py
+++ b/setup.py
@@ -36,10 +36,13 @@
"packages": ['little_brother',
'little_brother.api',
+ 'little_brother.devices',
'little_brother.persistence',
'little_brother.web',
'little_brother.test',
'little_brother.test.persistence',
+ 'little_brother.test.pytests.devices',
+ 'little_brother.test.pytests',
'little_brother.test.web',
'little_brother.test.api',
],
@@ -51,25 +54,30 @@
"run_little_brother_test_suite.py",
],
"long_description": "Tool to monitor login time of users on Debian hosts and terminate processes if usage times "
- "are exceeded.",
+ "are exceeded. Note that this package is not meant as a simple install with PIP since it "
+ "also requires additional work in the operating system (e.g. add a user, create directories, "
+ "define a startup service). This is all done by the Debian package provided at "
+ "https://sourceforge.net/projects/little-brother/ .",
}
extended_setup_params = {
# Target version to be used to upgrade the database
- "target_alembic_version": "9713cef84918",
+ "target_alembic_version": "ed5e0310d209",
"docker_registry_user": "marcusrickert",
# Docker image contexts to be built. The second entry of the tuple denotes if the resulting image is to be uploaded
"docker_contexts": [ ('little-brother-base', False),
- #'docker/little-brother-master',
('little-brother-client', True),
('little-brother-ubuntu-base', False),
- # 'docker/little-brother-master',
('little-brother-ubuntu-client', True),
+# ('little-brother-arch-linux-base', False),
+# ('little-brother-arch-linux-client', True),
+ ('little-brother-alpine-client', True),
],
# additional setup configuration used by CI stages
+ "owasp": True,
# technical name used for e.g. directories, PIP-package, and users
"create_user": True,
@@ -79,21 +87,25 @@
# "deploy_tmpfile_conf": True,
"deploy_sudoers_file": True,
"deploy_apparmor_file": True,
- "contributing_setups": ["python_base_app", "some_flask_helpers"],
+ "contributing_setups": [
+ "python_base_app",
+ "some_flask_helpers",
+ ],
"publish_debian_package": little_brother.settings.SOURCEFORGE_CHANNELS,
"publish_docker_images": little_brother.settings.DOCKER_CHANNELS,
"publish_latest_docker_image": little_brother.settings.RELEASE_BRANCH_NAME,
"debian_extra_files": [
- ("etc/slave.config", "etc/little-brother/slave.config"),
+ ("etc/client.config", "etc/little-brother/client.config"),
("etc/master.config", "etc/little-brother/master.config"),
],
"debian_templates": [
("/etc/little-brother/master.config", "/etc/little-brother/little-brother.config")
],
"build_pypi_package": True,
- "publish_pypi_package": { little_brother.settings.RELEASE_BRANCH_NAME: ('PYPI_API_URL', 'PYPI_API_TOKEN', 'TEST_PYPI_API_USER'),
- little_brother.settings.MASTER_BRANCH_NAME: ('TEST_PYPI_API_URL', 'TEST_PYPI_API_TOKEN', 'TEST_PYPI_API_USER')
- },
+ "publish_pypi_package": {
+ little_brother.settings.RELEASE_BRANCH_NAME: ('PYPI_API_URL', 'PYPI_API_TOKEN', 'TEST_PYPI_API_USER'),
+ little_brother.settings.MASTER_BRANCH_NAME: ('TEST_PYPI_API_URL', 'TEST_PYPI_API_TOKEN', 'TEST_PYPI_API_USER')
+ },
"generate_generic_install": True,
"analyze": True,
"analyze_extra_exclusions" : "vagrant/**",
diff --git a/vagrant/.gitignore b/vagrant/.gitignore
deleted file mode 100644
index 4456848..0000000
--- a/vagrant/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-.settings
-.vagrant
diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile
deleted file mode 100644
index 44fdf39..0000000
--- a/vagrant/Vagrantfile
+++ /dev/null
@@ -1,76 +0,0 @@
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-# Copyright (C) 2019 Marcus Rickert
-#
-# See https://github.com/marcus67/little_brother
-# This program 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.
-# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
-VAGRANTFILE_API_VERSION = "2"
-
-# See https://stackoverflow.com/questions/26811089/vagrant-how-to-have-host-platform-specific-provisioning-steps
-module OS
- def OS.windows
- (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
- end
-
- def OS.mac
- (/darwin/ =~ RUBY_PLATFORM) != nil
- end
-
- def OS.unix
- !OS.windows
- end
-
- def OS.linux
- OS.unix and not OS.mac
- end
-end
-
-require './settings.rb'
-
-# Require the reboot plugin.
-#require './assets/vagrant-provision-reboot-plugin'
-
-
-# VM Settings
-VAGRANT_HOME_PARTITION_FILE="drives/home.dvi"
-
-Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
-
- config.vm.box = VAGRANT_BOX
- config.vm.box_version = VAGRANT_BOX_VERSION
- config.ssh.insert_key = false
-
- config.vm.provider :virtualbox do |vb,override|
- vb.name = VM_NAME
- vb.gui = true
-
- vb.memory = VM_MEMORY
- vb.cpus = VM_CPUS
-
- # Siehe http://stackoverflow.com/questions/24231620/how-to-set-vagrant-virtualbox-video-memory
- vb.customize ["modifyvm", :id, "--vram", VM_VRAM]
-
- # enable shared clipboard and drag'n'drop
- vb.customize ["modifyvm", :id, "--clipboard", "bidirectional"]
- vb.customize ["modifyvm", :id, "--draganddrop", "bidirectional"]
-
- override.vm.network "private_network", :type => 'dhcp', :adapter => 2
- end
-
- # Create groups and users "seth" and "jennifer" ein
- config.vm.provision "shell", path: "assets/setup-users.sh"
-
-end
diff --git a/vagrant/assets/setup-groups-and-users.sh b/vagrant/assets/setup-groups-and-users.sh
deleted file mode 100644
index 9ed1142..0000000
--- a/vagrant/assets/setup-groups-and-users.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#! /bin/bash
-
-echo "Create users and groups..."
-for user in jennifer, seth; do
- adduser --disabled-login --gecos "${user}, ACME, 123, 123, 123" ${user}
-done