Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-proton-vpn-network-manager
for openSUSE:Factory checked in at 2025-11-06 18:15:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-proton-vpn-network-manager (Old)
and
/work/SRC/openSUSE:Factory/.python-proton-vpn-network-manager.new.1980 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-proton-vpn-network-manager"
Thu Nov 6 18:15:39 2025 rev:7 rq:1316027 version:0.13.4
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-proton-vpn-network-manager/python-proton-vpn-network-manager.changes
2025-04-02 17:12:22.726871067 +0200
+++
/work/SRC/openSUSE:Factory/.python-proton-vpn-network-manager.new.1980/python-proton-vpn-network-manager.changes
2025-11-06 18:19:07.174447197 +0100
@@ -1,0 +2,6 @@
+Sun Nov 2 16:21:54 UTC 2025 - Yunhe Guo <[email protected]>
+
+- Update to 0.13.4::
+ * fix: Silence CancelledError exceptions when cancelling local agent
+
+-------------------------------------------------------------------
Old:
----
v0.12.13.tar.gz
New:
----
v0.13.4.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-proton-vpn-network-manager.spec ++++++
--- /var/tmp/diff_new_pack.0Cww33/_old 2025-11-06 18:19:07.870476627 +0100
+++ /var/tmp/diff_new_pack.0Cww33/_new 2025-11-06 18:19:07.874476797 +0100
@@ -19,7 +19,7 @@
%define skip_python2 1
%{?sle15_python_module_pythons}
Name: python-proton-vpn-network-manager
-Version: 0.12.13
+Version: 0.13.4
Release: 0
Summary: Proton VPN library for NetworkManager
License: GPL-3.0-or-later
@@ -84,7 +84,7 @@
%check
# buildroot doesn't provide network manager service, so it is not possible to
run killswitch tests
# ignore tests which are failing -> `Permission denied: '/run/user'`
-%pytest tests --deselect
"tests/integration/killswitch/default/test_killswitch_connection.py" --deselect
"tests/integration/killswitch/wireguard/test_killswitch_connection.py" --ignore
"tests/openvpn/test_openvpn.py" --ignore
"tests/openvpn/test_openvpnconfiguration.py" --ignore
"tests/unit/core/test_networkmanager.py"
+%pytest tests --deselect
"tests/integration/killswitch/default/test_killswitch_connection.py" --deselect
"tests/integration/killswitch/wireguard/test_killswitch_connection.py" --ignore
"tests/openvpn/test_openvpn.py" --ignore
"tests/openvpn/test_openvpnconfiguration.py" --ignore
"tests/unit/core/test_networkmanager.py" --ignore
"tests/unit/wireguard/test_wireguard.py"
%files %{python_files}
%license LICENSE
++++++ v0.12.13.tar.gz -> v0.13.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-proton-vpn-network-manager-0.12.13/.gitignore
new/python-proton-vpn-network-manager-0.13.4/.gitignore
--- old/python-proton-vpn-network-manager-0.12.13/.gitignore 2025-02-28
17:10:31.000000000 +0100
+++ new/python-proton-vpn-network-manager-0.13.4/.gitignore 2025-10-01
17:25:58.000000000 +0200
@@ -13,3 +13,5 @@
.coverage
.idea
venv
+package.spec
+changelog
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-proton-vpn-network-manager-0.12.13/debian/control
new/python-proton-vpn-network-manager-0.13.4/debian/control
--- old/python-proton-vpn-network-manager-0.12.13/debian/control
2025-02-28 17:10:31.000000000 +0100
+++ new/python-proton-vpn-network-manager-0.13.4/debian/control 2025-10-01
17:25:58.000000000 +0200
@@ -3,7 +3,7 @@
Priority: optional
Maintainer: Proton AG <[email protected]>
Build-Depends: debhelper (>= 9), dh-python, python3-all, python3-setuptools,
python3-proton-core,
- python3-proton-vpn-api-core (>= 0.42.3), python3-proton-vpn-local-agent(>=
1.4.4),
+ python3-proton-vpn-api-core (>= 0.46.2), python3-proton-vpn-local-agent(>=
1.5.0),
network-manager, network-manager-openvpn, network-manager-openvpn-gnome,
python3-gi, python3-gi-cairo, gir1.2-nm-1.0, python3-jinja2
Standards-Version: 4.1.1
@@ -12,8 +12,8 @@
Package: python3-proton-vpn-network-manager
Architecture: all
Depends: ${python3:Depends}, ${misc:Depends}, python3-proton-core,
- python3-proton-vpn-api-core (>= 0.42.3), network-manager,
network-manager-openvpn, network-manager-openvpn-gnome,
- python3-gi, gir1.2-nm-1.0, python3-proton-vpn-local-agent(>= 1.4.4),
python3-packaging, python3-jinja2
+ python3-proton-vpn-api-core (>= 0.46.2), network-manager,
network-manager-openvpn, network-manager-openvpn-gnome,
+ python3-gi, gir1.2-nm-1.0, python3-proton-vpn-local-agent(>= 1.5.0),
python3-packaging, python3-jinja2
Breaks: python3-proton-vpn-network-manager-openvpn (<< 0.1.1),
python3-proton-vpn-network-manager-wireguard (<< 0.4.7),
python3-proton-vpn-killswitch-network-manager (<< 0.6.1),
python3-proton-vpn-killswitch-network-manager-wireguard (<< 0.2.1)
Replaces: python3-proton-vpn-network-manager-openvpn,
python3-proton-vpn-network-manager-wireguard,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-proton-vpn-network-manager-0.12.13/proton/vpn/backend/linux/networkmanager/core/local_agent/listener.py
new/python-proton-vpn-network-manager-0.13.4/proton/vpn/backend/linux/networkmanager/core/local_agent/listener.py
---
old/python-proton-vpn-network-manager-0.12.13/proton/vpn/backend/linux/networkmanager/core/local_agent/listener.py
2025-02-28 17:10:31.000000000 +0100
+++
new/python-proton-vpn-network-manager-0.13.4/proton/vpn/backend/linux/networkmanager/core/local_agent/listener.py
2025-10-01 17:25:58.000000000 +0200
@@ -48,7 +48,8 @@
"""
private_key = credentials.get_ed25519_sk_pem()
certificate = credentials.certificate_pem
- self._listener = await Listener.connect(domain, private_key,
certificate)
+ self._listener = await Listener.connect(domain, private_key,
+ certificate)
async def listen(self):
"""Starts the background process of listening to incoming messages
from LA."""
@@ -59,8 +60,7 @@
async def request_features(self, features: AgentFeatures):
"""Requests the features to be set on the current VPN connection."""
- if features:
- await self._listener.request_features(features)
+ await self._listener.request_features(features)
async def stop(self):
"""Stops reading incoming messages from LA."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-proton-vpn-network-manager-0.12.13/proton/vpn/backend/linux/networkmanager/core/localagent_mixin.py
new/python-proton-vpn-network-manager-0.13.4/proton/vpn/backend/linux/networkmanager/core/localagent_mixin.py
---
old/python-proton-vpn-network-manager-0.12.13/proton/vpn/backend/linux/networkmanager/core/localagent_mixin.py
2025-02-28 17:10:31.000000000 +0100
+++
new/python-proton-vpn-network-manager-0.13.4/proton/vpn/backend/linux/networkmanager/core/localagent_mixin.py
2025-10-01 17:25:58.000000000 +0200
@@ -21,13 +21,15 @@
"""
import asyncio
import logging
+import random
+from concurrent import futures
from proton.vpn.connection import events
from proton.vpn.connection.events import EventContext
from proton.vpn.connection.exceptions \
import FeatureError, FeaturePolicyError, FeatureSyntaxError
-from proton.vpn.connection.interfaces import Features
+from proton.vpn.core.settings.features import Features
from proton.vpn.backend.linux.networkmanager.core.local_agent import (
AgentListener, Status, ExpiredCertificateError, AgentFeatures,
@@ -36,6 +38,12 @@
logger = logging.getLogger(__name__)
+TWOFA_REASON_CODES = [
+ ReasonCode.REASON_CODE_2FA_UNSPECIFIED,
+ ReasonCode.REASON_CODE_2FA_EXPIRED,
+ ReasonCode.REASON_CODE_2FA_SITUATION_CHANGED
+]
+
class LocalAgentMixin: # pylint: disable=too-few-public-methods
"""
@@ -62,11 +70,33 @@
self._vpnserver.domain)
context = EventContext(connection=self)
- if not await self.__attempt_to_connect_to_listener(context):
+ agent_connection_drops = 0
+ while True:
+ if not await self.__attempt_to_connect_to_listener(context):
+ return
+
+ if not await
self.__attempt_to_request_connection_features(context):
+ return
+
+ if not await self.__attempt_to_listen(context):
+ agent_connection_drops += 1
+ # nosemgrep: gitlab.bandit.B311
+ sleep_seconds = random.uniform(0, 10) # nosec B311
+ logger.warning(
+ "Agent connection dropped (#%s). Retrying in %.1f
seconds.",
+ agent_connection_drops, sleep_seconds
+ )
+ await asyncio.sleep(sleep_seconds)
+ continue
+
return
- await self.__attempt_to_request_connection_features(context)
- await self.__attempt_to_listen(context)
+ # Absorb CancelledError before it is logged by Future's done callback
handler
+ def _handle_future_result(self, future: futures.Future):
+ try:
+ future.result()
+ except futures.CancelledError:
+ pass
def _async_start_local_agent_listener(self):
"""
@@ -77,7 +107,7 @@
self._start_local_agent_listener(),
self._asyncio_loop
)
- future.add_done_callback(lambda f: f.result())
+ future.add_done_callback(self._handle_future_result)
def _async_stop_local_agent_listener(self):
"""
@@ -88,11 +118,18 @@
self._agent_listener.stop(),
self._asyncio_loop
)
- future.add_done_callback(lambda f: f.result())
+ future.add_done_callback(self._handle_future_result)
async def _request_connection_features(self, features: Features):
- agent_features = self.__get_agent_features(features)
+ if features.are_free_tier_defaults():
+ # No need to request default features, since they are available by
default.
+ # Also, the local agent server raises an error if features are
requested
+ # for free users, even when the requested features are the default
ones.
+ logger.info("Using default VPN connection features.")
+ return
+
logger.info("Requesting VPN connection features...")
+ agent_features = self.__get_agent_features(features)
await self._agent_listener.request_features(agent_features)
logger.info("VPN connection features requested.")
@@ -120,6 +157,10 @@
self._notify_subscribers_threadsafe(
events.ExpiredCertificate(context)
)
+ elif status.reason.code in TWOFA_REASON_CODES:
+ self._notify_subscribers_threadsafe(
+ events.TwoFARequired(context)
+ )
elif
self.__has_reached_max_amount_of_concurrent_vpn_connections(status.reason.code):
self._notify_subscribers_threadsafe(
events.MaximumSessionsReached(context)
@@ -176,11 +217,11 @@
except ExpiredCertificateError:
self._notify_subscribers_threadsafe(
events.ExpiredCertificate(context))
- return
+ return False
except TimeoutError:
logger.info("Connect timeout")
self._notify_subscribers_threadsafe(events.Timeout(context))
- return
+ return False
except Exception:
self._notify_subscribers_threadsafe(
events.UnexpectedError(context))
@@ -189,33 +230,31 @@
return True
async def __attempt_to_request_connection_features(self,
- context: EventContext):
+ context: EventContext)
-> bool:
try:
await self._request_connection_features(self.settings.features)
except TimeoutError:
self._notify_subscribers_threadsafe(events.Timeout(context))
+ return False
except Exception:
self._notify_subscribers_threadsafe(
events.UnexpectedError(context))
raise
- async def __attempt_to_listen(self, context: EventContext):
+ return True
+
+ async def __attempt_to_listen(self, context: EventContext) -> bool:
try:
await self._agent_listener.listen()
+ return True
except TimeoutError:
- self._notify_subscribers_threadsafe(events.Timeout(context))
+ return False
except Exception:
self._notify_subscribers_threadsafe(
events.UnexpectedError(context))
raise
def __get_agent_features(self, features: Features) -> AgentFeatures:
- if features is None:
- # The free tier does not pass connection features since
- # our servers do not allow setting connection features on the free
- # tier, not even the defaults.
- return None
-
randomized_nat = (not features.moderate_nat
if features.moderate_nat is not None else None)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-proton-vpn-network-manager-0.12.13/proton/vpn/backend/linux/networkmanager/protocol/wireguard/wireguard.py
new/python-proton-vpn-network-manager-0.13.4/proton/vpn/backend/linux/networkmanager/protocol/wireguard/wireguard.py
---
old/python-proton-vpn-network-manager-0.12.13/proton/vpn/backend/linux/networkmanager/protocol/wireguard/wireguard.py
2025-02-28 17:10:31.000000000 +0100
+++
new/python-proton-vpn-network-manager-0.13.4/proton/vpn/backend/linux/networkmanager/protocol/wireguard/wireguard.py
2025-10-01 17:25:58.000000000 +0200
@@ -19,7 +19,10 @@
You should have received a copy of the GNU General Public License
along with ProtonVPN. If not, see <https://www.gnu.org/licenses/>.
"""
-from typing import Union
+from __future__ import annotations
+import os
+from random import randrange
+from typing import Optional, Union
from ipaddress import IPv4Address, IPv6Address
import socket
import uuid
@@ -43,6 +46,10 @@
logger = logging.getLogger(__name__)
+FWMARK_ENV_VAR = "PROTON_VPN_FWMARK"
+MIN_FWMARK_VALUE = 51821
+MAX_FWMARK_VALUE = 2**32 # 32-bit integer
+
@dataclass
class Config:
@@ -90,13 +97,46 @@
)
+def get_fwmark_from_env_var() -> Optional[int]:
+ """
+ Returns the fwmark from the env var or None if not available or not valid.
+ """
+ fwmark_str = os.getenv(FWMARK_ENV_VAR)
+
+ if not fwmark_str:
+ return None
+
+ try:
+ fwmark = int(fwmark_str)
+
+ if fwmark not in range(MIN_FWMARK_VALUE, MAX_FWMARK_VALUE):
+ raise ValueError("fwmark out of range")
+
+ return fwmark
+ except ValueError:
+ logger.error(
+ "The %s env var should contain an integer "
+ "higher or equal than %s and lower than %s",
+ FWMARK_ENV_VAR, MIN_FWMARK_VALUE, MAX_FWMARK_VALUE
+ )
+
+ return None
+
+
+def get_random_fwmark() -> int:
+ """Returns a random fwmark within the expected range."""
+ # nosemgrep: gitlab.bandit.B311
+ return randrange(MIN_FWMARK_VALUE, MAX_FWMARK_VALUE) # nosec B311
+
+
class Wireguard(LinuxNetworkManager, LocalAgentMixin):
"""Creates a Wireguard connection."""
- SIGNAL_NAME = "state-changed"
- VIRTUAL_DEVICE_NAME = "proton0"
- protocol = "wireguard"
- ui_protocol = "WireGuard"
- connection = None
+ SIGNAL_NAME: str = "state-changed"
+ VIRTUAL_DEVICE_NAME: str = "proton0"
+ protocol: str = "wireguard"
+ ui_protocol: str = "WireGuard"
+ connection: Optional[NM.SimpleConnection] = None
+ FWMARK: int = get_fwmark_from_env_var() or get_random_fwmark()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -265,6 +305,10 @@
self._vpncredentials.pubkey_credentials.wg_private_key
)
+ wireguard_config.set_property(
+ NM.SETTING_WIREGUARD_FWMARK, self.FWMARK
+ )
+
self.connection.add_setting(wireguard_config)
# pylint: disable=arguments-renamed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-proton-vpn-network-manager-0.12.13/rpmbuild/SPECS/package.spec.template
new/python-proton-vpn-network-manager-0.13.4/rpmbuild/SPECS/package.spec.template
---
old/python-proton-vpn-network-manager-0.12.13/rpmbuild/SPECS/package.spec.template
2025-02-28 17:10:31.000000000 +0100
+++
new/python-proton-vpn-network-manager-0.13.4/rpmbuild/SPECS/package.spec.template
2025-10-01 17:25:58.000000000 +0200
@@ -1,4 +1,5 @@
%define unmangled_name proton-vpn-network-manager
+%define pep_625_name proton_vpn_network_manager
%define version {version}
%define release 1
@@ -13,9 +14,9 @@
License: GPLv3
Vendor: Proton AG <[email protected]>
URL: https://github.com/ProtonVPN/python-%{{unmangled_name}}
-Source0: %{{unmangled_name}}-%{{version}}.tar.gz
+Source0: %{{pep_625_name}}-%{{version}}.tar.gz
BuildArch: noarch
-BuildRoot:
%{{_tmppath}}/%{{unmangled_name}}-%{{version}}-%{{release}}-buildroot
+BuildRoot: %{{_tmppath}}/%{{pep_625_name}}-%{{version}}-%{{release}}-buildroot
BuildRequires: python3-gobject
BuildRequires: NetworkManager
@@ -24,8 +25,8 @@
BuildRequires: gobject-introspection
BuildRequires: python3-setuptools
BuildRequires: python3-proton-core
-BuildRequires: python3-proton-vpn-api-core >= 0.42.3
-BuildRequires: python3-proton-vpn-local-agent >= 1.4.4
+BuildRequires: python3-proton-vpn-api-core >= 0.46.2
+BuildRequires: python3-proton-vpn-local-agent >= 1.5.0
BuildRequires: python3-jinja2
Requires: python3-gobject
@@ -35,8 +36,8 @@
Requires: gobject-introspection
Requires: python3-setuptools
Requires: python3-proton-core
-Requires: python3-proton-vpn-api-core >= 0.42.3
-Requires: python3-proton-vpn-local-agent >= 1.4.4
+Requires: python3-proton-vpn-api-core >= 0.46.2
+Requires: python3-proton-vpn-local-agent >= 1.5.0
Requires: python3-jinja2
Conflicts: python3-proton-vpn-network-manager-openvpn < 0.1.1
@@ -54,20 +55,16 @@
%description
Package %{{unmangled_name}} library.
-
%prep
-%setup -n %{{unmangled_name}}-%{{version}} -n %{{unmangled_name}}-%{{version}}
+%setup -q -n %{{pep_625_name}}-%{{version}}
%build
-python3 setup.py build
+%pyproject_wheel
%install
-python3 setup.py install --single-version-externally-managed -O1
--root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
-
+%pyproject_install
+%pyproject_save_files proton
-%files -f INSTALLED_FILES
-%{{python3_sitelib}}/proton/
-%{{python3_sitelib}}/proton_vpn_network_manager-%{{version}}*.egg-info/
-%defattr(-,root,root)
+%files -n %{{name}} -f %{{pyproject_files}}
%changelog
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-proton-vpn-network-manager-0.12.13/setup.py
new/python-proton-vpn-network-manager-0.13.4/setup.py
--- old/python-proton-vpn-network-manager-0.12.13/setup.py 2025-02-28
17:10:31.000000000 +0100
+++ new/python-proton-vpn-network-manager-0.13.4/setup.py 2025-10-01
17:25:58.000000000 +0200
@@ -22,7 +22,7 @@
"proton.vpn.backend.linux.networkmanager.killswitch.wireguard*",
]),
include_package_data=True,
- install_requires=["proton-core", "proton-vpn-api-core", "pygobject",
"pycairo", "packaging", "jinja2"],
+ install_requires=["proton-core", "proton-vpn-api-core", "pygobject",
"pycairo", "packaging", "jinja2", "proton-vpn-local-agent"],
extras_require={
"development": ["wheel", "pytest", "pytest-cov", "pytest-asyncio",
"flake8", "pylint", "PyYAML"]
},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-proton-vpn-network-manager-0.12.13/tests/unit/wireguard/test_wireguard.py
new/python-proton-vpn-network-manager-0.13.4/tests/unit/wireguard/test_wireguard.py
---
old/python-proton-vpn-network-manager-0.12.13/tests/unit/wireguard/test_wireguard.py
1970-01-01 01:00:00.000000000 +0100
+++
new/python-proton-vpn-network-manager-0.13.4/tests/unit/wireguard/test_wireguard.py
2025-10-01 17:25:58.000000000 +0200
@@ -0,0 +1,21 @@
+import os
+
+import pytest
+from proton.vpn.backend.linux.networkmanager.protocol.wireguard.wireguard
import FWMARK_ENV_VAR, get_fwmark_from_env_var
+
+
+def
test_get_fwmark_from_env_var_returns_env_var_value_if_available_and_valid():
+ os.environ[FWMARK_ENV_VAR] = "51821"
+ assert get_fwmark_from_env_var() == 51821
+
+
[email protected](
+ "env_var_value", [
+ "51820", # too small
+ str(2**32), # too big
+ "#!!?" # invalid int,
+ ]
+)
+def
test_get_fwmark_from_env_var_returns_None_if_env_var_contains_invalid_value(env_var_value):
+ os.environ[FWMARK_ENV_VAR] = env_var_value
+ assert get_fwmark_from_env_var() is None
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-proton-vpn-network-manager-0.12.13/versions.yml
new/python-proton-vpn-network-manager-0.13.4/versions.yml
--- old/python-proton-vpn-network-manager-0.12.13/versions.yml 2025-02-28
17:10:31.000000000 +0100
+++ new/python-proton-vpn-network-manager-0.13.4/versions.yml 2025-10-01
17:25:58.000000000 +0200
@@ -1,3 +1,66 @@
+version: 0.13.4
+time: 2025/10/01 16:25
+author: Richard Paterson
+email: [email protected]
+urgency: low
+stability: unstable
+description:
+- "fix: Silence CancelledError exceptions when cancelling local agent"
+---
+version: 0.13.3
+time: 2025/09/22 10:00
+author: Alexandru Cheltuitor
+email: <[email protected]>
+urgency: low
+stability: unstable
+description:
+- "fix: update spec file"
+---
+version: 0.13.2
+time: 2025/09/18 14:21
+author: Luke Titley
+email: [email protected]
+urgency: low
+stability: unstable
+description:
+- "chore: Remove debug playback integration with listener"
+---
+version: 0.13.1
+time: 2025/09/17 16:16
+author: Luke Titley
+email: [email protected]
+urgency: low
+stability: unstable
+description:
+- "feat: Support 2fa hard-jailing"
+---
+version: 0.13.0
+time: 2025/09/05 12:58
+author: Pep Llaneras
+email: [email protected]
+urgency: low
+stability: unstable
+description:
+- "feat: keep wireguard fwmark stable"
+---
+version: 0.12.15
+time: 2025/07/08 10:18
+author: Pep Llaneras
+email: [email protected]
+urgency: low
+stability: unstable
+description:
+- "fix: Do not request default connection features"
+---
+version: 0.12.14
+time: 2025/07/07 16:40
+author: Pep Llaneras
+email: [email protected]
+urgency: low
+stability: unstable
+description:
+- "fix: handle LA connection reset"
+---
version: 0.12.13
time: 2025/02/28 16:07
author: Luke Titley
@@ -207,7 +270,7 @@
- Fix unsupported type annotation in python 3.8.10.
---
version: 0.9.6
-time: 2024/10/30 09:00
+time: 2024/10/30 12:00
author: Alexandru Cheltuitor
email: [email protected]
urgency: medium
@@ -216,7 +279,7 @@
- Fix bug where automatic DNS settings is ignored, regardless if custom DNS is
passed or not.
---
version: 0.9.5
-time: 2024/10/30 12:00
+time: 2024/10/30 09:00
author: Luke Titley
email: [email protected]
urgency: medium