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

Reply via email to