We are happy to answer your questions about the code or discuss technical ideas.
Please complete the following checklist (by adding [x]):
After recent updates to Fedora KDE spin, VPN fails to connect, but creates a "pvpn-killswitch" connection despite being turned off in config. Killswitch can be turned on, but not off.
Output when running 'protonvpn connect':
Traceback (most recent call last):
File "/usr/lib64/python3.14/asyncio/tasks.py", line 488, in wait_for
return await fut
^^^^^^^^^
asyncio.exceptions.CancelledError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/bin/protonvpn", line 8, in <module>
sys.exit(main())
~~~~^^
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/__init__.py", line 170, in main
app(
~~~^
obj=Params(
^^^^^^^^^^^
...<4 lines>...
args=cli_args
^^^^^^^^^^^^^
)
^
File "/usr/lib/python3.14/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
File "/usr/lib/python3.14/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
File "/usr/lib/python3.14/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
File "/usr/lib/python3.14/site-packages/click/decorators.py", line 33, in new_func
return f(get_current_context(), *args, **kwargs)
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/core/run_async.py", line 31, in wrapper
return asyncio.run(func(*args, **kwargs))
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.14/asyncio/runners.py", line 204, in run
return runner.run(main)
~~~~~~~~~~^^^^^^
File "/usr/lib64/python3.14/asyncio/runners.py", line 127, in run
return self._loop.run_until_complete(task)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/usr/lib64/python3.14/asyncio/base_events.py", line 719, in run_until_complete
return future.result()
~~~~~~~~~~~~~^^
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/commands/server.py", line 140, in connect
connection_state = await controller.connect(server)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/core/controller.py", line 452, in connect
connector = await self.get_vpn_connector()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/core/controller.py", line 531, in get_vpn_connector
vpn_connector = await self._api.get_vpn_connector()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/vpn/core/api.py", line 69, in get_vpn_connector
self._vpn_connector = await VPNConnector.get(
^^^^^^^^^^^^^^^^^^^^^^^
...<3 lines>...
)
^
File "/usr/lib/python3.14/site-packages/proton/vpn/core/connection.py", line 100, in get
await connector.initialize_state()
File "/usr/lib/python3.14/site-packages/proton/vpn/core/connection.py", line 296, in initialize_state
await self._update_state(state)
File "/usr/lib/python3.14/site-packages/proton/vpn/core/connection.py", line 517, in _update_state
new_event = await self._current_state.run_tasks()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/vpn/connection/states.py", line 196, in run_tasks
await self.context.kill_switch.disable()
File "/usr/lib/python3.14/site-packages/proton/vpn/backend/networkmanager/killswitch/wireguard/wgkillswitch.py", line 76, in disable
await self._ks_handler.remove_killswitch_connection()
File "/usr/lib/python3.14/site-packages/proton/vpn/backend/networkmanager/killswitch/wireguard/killswitch_connection_handler.py", line 270, in remove_killswitch_connection
await self._remove_connection(_get_connection_id(permanent=False))
File "/usr/lib/python3.14/site-packages/proton/vpn/backend/networkmanager/killswitch/wireguard/killswitch_connection_handler.py", line 289, in _remove_connection
await _wrap_future(self.nm_client.remove_connection_async(connection))
File "/usr/lib/python3.14/site-packages/proton/vpn/backend/networkmanager/killswitch/wireguard/killswitch_connection_handler.py", line 56, in _wrap_future
return await asyncio.wait_for(
^^^^^^^^^^^^^^^^^^^^^^^
...<2 lines>...
)
^
File "/usr/lib64/python3.14/asyncio/tasks.py", line 487, in wait_for
async with timeouts.timeout(timeout):
~~~~~~~~~~~~~~~~^^^^^^^^^
File "/usr/lib64/python3.14/asyncio/timeouts.py", line 114, in __aexit__
raise TimeoutError from exc_val
TimeoutError
Output when running 'protonvpn config set kill-switch off':
Traceback (most recent call last):
File "/usr/bin/protonvpn", line 8, in <module>
sys.exit(main())
~~~~^^
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/__init__.py", line 170, in main
app(
~~~^
obj=Params(
^^^^^^^^^^^
...<4 lines>...
args=cli_args
^^^^^^^^^^^^^
)
^
File "/usr/lib/python3.14/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
File "/usr/lib/python3.14/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
File "/usr/lib/python3.14/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
File "/usr/lib/python3.14/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
File "/usr/lib/python3.14/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
File "/usr/lib/python3.14/site-packages/click/decorators.py", line 33, in new_func
return f(get_current_context(), *args, **kwargs)
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/core/run_async.py", line 31, in wrapper
return asyncio.run(func(*args, **kwargs))
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.14/asyncio/runners.py", line 204, in run
return runner.run(main)
~~~~~~~~~~^^^^^^
File "/usr/lib64/python3.14/asyncio/runners.py", line 127, in run
return self._loop.run_until_complete(task)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/usr/lib64/python3.14/asyncio/base_events.py", line 719, in run_until_complete
return future.result()
~~~~~~~~~~~~~^^
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/commands/settings.py", line 189, in killswitch_command
controller = await Controller.create(params=ctx.obj, click_ctx=ctx)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/core/controller.py", line 158, in create
await controller.get_settings()
File "/usr/lib/python3.14/site-packages/proton/vpn/cli/core/controller.py", line 217, in get_settings
return await self._api.load_settings()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/vpn/core/api.py", line 85, in load_settings
user_tier = self._session_holder.user_tier or 0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/vpn/core/session_holder.py", line 102, in user_tier
if self.session.loaded:
^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/vpn/core/session_holder.py", line 93, in session
self._session = self._proton_sso.get_default_session(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
override_class=VPNSession
^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/lib/python3.14/site-packages/proton/sso/sso.py", line 195, in get_default_session
sessions = self.sessions
^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/sso/sso.py", line 140, in sessions
cleaned_index = [account_name for account_name in keyring_index if len(self._get_session_data(account_name)) > 0]
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/sso/sso.py", line 239, in _get_session_data
data = self._keyring[self.__keyring_key_name(account_name)]
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/site-packages/proton/keyring/_base.py", line 65, in __getitem__
return self._get_item(key)
~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.14/site-packages/proton/keyring_linux/secretservice/secretservice_backend.py", line 56, in _get_item
stored_data = self._backend.get_password(
self.KEYRING_SERVICE,
key
)
File "/usr/lib/python3.14/site-packages/keyring/backends/SecretService.py", line 84, in get_password
return item.get_secret().decode('utf-8')
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
Please complete the following checklist (by adding [x]):
After recent updates to Fedora KDE spin, VPN fails to connect, but creates a "pvpn-killswitch" connection despite being turned off in config. Killswitch can be turned on, but not off.
Output when running 'protonvpn connect':
Output when running 'protonvpn config set kill-switch off':