ProtonVPN / proton-vpn-gtk-app

Official ProtonVPN Linux app
https://protonvpn.com/download-linux
GNU General Public License v3.0
152 stars 20 forks source link

Locked Gnome keyring causes race condition and authentication denied #43

Open alexandrevicenzi opened 3 months ago

alexandrevicenzi commented 3 months ago

We are happy to answer your questions about the code or discuss technical ideas.

Please complete the following checklist (by adding [x]):


There's an issue when Gnome keyring is locked and it can be summarized as this:

  1. The Gnome keyring is locked
  2. Open the Proton VPN app
  3. Attempt to Quick Connect
  4. Proton attempts to connect
  5. nmcli prompts to unlock Gnome keyring
  6. While typing the keyring password Proton starts the network
  7. nmcli has no knowledge of any passwords because the keyring is locked and prompts to type OpenVPN credentials (see image below)
  8. Cancel OpenVPN credentials password request
  9. Finish typing the password, this will unlock Gnome keyring
  10. VPN connection failed with Authentication Error and internet access has been blocked
  11. Cancel current connection
  12. Attempt to Quick Connect
  13. Now the connection works because the Gnome keyring has been unlocked

image

I tried to trace the problem, but with so many callbacks and async everywhere it is hard.

There's one solution that works, but it might not be the best.

Here is my solution:

  1. In the file proton/vpn/backend/linux/networkmanager/core/networkmanager.py
  2. On the start method
  3. Make a keyring call, this will prompt it to unlock it
  4. Type the password
  5. This will unlock Gnome keyring
  6. Connection works as expected

As the credentials and other data are stored in the keyring, ideally, in every new connection it should be checked if the keyring is locked or not. The user can manually lock it or another application can lock it.

What I have done in the code is:

diff --git a/proton/vpn/backend/linux/networkmanager/core/networkmanager.py b/proton/vpn/backend/linux/networkmanager/core/networkmanager.py
index 8fd7e55..a5b4149 100644
--- a/proton/vpn/backend/linux/networkmanager/core/networkmanager.py
+++ b/proton/vpn/backend/linux/networkmanager/core/networkmanager.py
@@ -116,6 +116,13 @@ class LinuxNetworkManager(VPNConnection):
             self._notify_subscribers(events.Disconnected(EventContext(connection=self)))
             return

+        try:
+            import keyring
+            k = keyring.get_keyring()
+            k.get_credential('ProtonVPN', 'ProtonUser')
+        except:
+            pass
+
         try:
             future_vpn_connection = self.nm_client.start_connection_async(connection)
             vpn_connection = await loop.run_in_executor(

This solves my problem, but if this would be a valid solution, possibly it should be a call to Dbus.

Maybe the issue is somewhere else, it feels like a race condition, the VPN connection should not start while I type the keyring password to unlock the VPN credentials.

With some help, I could possibly patch this properly.

alexandrevicenzi commented 3 months ago

Log message from cmd line:

2024-04-02T16:11:11.709256 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected (initial state)
2024-04-02T16:11:11.715150 | proton.vpn.app.gtk.app:57 | INFO | APP:PROCESS_START | self=<app.App object at 0x7f6ac2fe3c40 (proton+vpn+app+gtk+app+App at 0x556e2adf14a0)>
2024-04-02T16:11:11.818687 | proton.vpn.app.gtk.services.reconnector.reconnector:96 | INFO | VPN reconnector enabled.
2024-04-02T16:11:14.039356 | proton.vpn.app.gtk.controller:139 | INFO | APP.STARTUP:STARTUP_ACTIONS | Running startup actions
2024-04-02T16:11:14.039571 | proton.vpn.app.gtk.widgets.vpn.vpn_widget:178 | INFO | APP.VPN:WIDGET_READY | VPN widget is ready (load time: 2.22 seconds)
2024-04-02T16:11:14.039707 | proton.vpn.app.gtk.services.refresher.vpn_data_refresher:148 | INFO | APP.VPN_DATA_REFRESHER:ENABLE | VPN data refresher service enabled.
2024-04-02T16:11:14.039800 | proton.vpn.app.gtk.services.refresher.client_config_refresher:68 | INFO | Client config refresher enabled.
2024-04-02T16:11:14.039911 | proton.vpn.app.gtk.services.refresher.client_config_refresher:107 | INFO | Next client config refresh scheduled in 0:07:13.922803
2024-04-02T16:11:14.039994 | proton.vpn.app.gtk.services.refresher.server_list_refresher:74 | INFO | Server list refresher enabled.
2024-04-02T16:11:14.040106 | proton.vpn.app.gtk.services.refresher.server_list_refresher:126 | INFO | Next server list refresh scheduled in 0:14:45.538127
2024-04-02T16:11:15.781807 | proton.vpn.app.gtk.services.reconnector.reconnector:176 | INFO | Network connectivity was detected.
2024-04-02T16:11:18.285520 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:96 | INFO | UI.TRAY:CONNECT | Connect to fastest server
2024-04-02T16:11:18.354741 | proton.vpn.core.connection:156 | INFO | CONN.CONNECT:START | Server: 149.102.235.33 / Protocol: openvpn-tcp / Ports: [443, 7770, 8443] / Backend: None
2024-04-02T16:11:18.435632 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-04-02T16:11:21.791435 | proton.vpn.backend.linux.networkmanager.core.networkmanager:90 | INFO | VPN server REACHABLE.
2024-04-02T16:12:57.790908 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Error
2024-04-02T16:12:57.791240 | proton.vpn.connection.states:334 | WARNING | Reached connection error state: AuthDenied (<enum NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS of type NM.VpnConnectionStateReason>)
2024-04-02T16:12:57.807734 | proton.vpn.app.gtk.services.reconnector.reconnector:191 | INFO | VPN connection drop was detected.
2024-04-02T16:12:57.816084 | proton.vpn.app.gtk.services.reconnector.reconnector:194 | INFO | VPN reconnection not possible: fatal connection error.
2024-04-02T16:12:57.817243 | proton.vpn.app.gtk.widgets.main.exception_handler:163 | ERROR | APP:ERROR | Reconnection not possible due to authentication error.
Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/services/reconnector/reconnector.py", line 148, in _on_reconnection_error
    raise AuthenticationError("Reconnection not possible due to authentication error.")
proton.vpn.connection.exceptions.AuthenticationError: Reconnection not possible due to authentication error.
2024-04-02T16:14:28.591222 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:101 | INFO | UI:DISCONNECT | Disconnect from VPN
2024-04-02T16:14:28.592099 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected
calexandru2018 commented 2 months ago

Given that this is specific to a non-supported distro we won't be prioritizing this atm.

Giger22 commented 1 week ago

Same on Artix OpenRC. I use KDE Plasma and since 6.1.0 I have to manually enter an openvpn password every single time when reconnecting.

protonvpn-app:10054): Gtk-WARNING **: 07:15:51.439: Locale not supported by C library.
        Using the fallback 'C' locale.
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/secretstorage/util.py", line 48, in send_and_get_reply
    raise DBusErrorResponse(resp_msg)
jeepney.wrappers.DBusErrorResponse: [org.freedesktop.DBus.Error.ServiceUnknown] ('The name org.freedesktop.secrets was not provided by any .service files',)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/keyring/backends/SecretService.py", line 62, in get_preferred_collection
    collection = secretstorage.get_default_collection(bus)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/secretstorage/collection.py", line 177, in get_default_collection
    return Collection(connection)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/secretstorage/collection.py", line 45, in __init__
    self._collection.get_property('Label')
  File "/usr/lib/python3.12/site-packages/secretstorage/util.py", line 67, in get_property
    (signature, value), = self.send_and_get_reply(msg)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/secretstorage/util.py", line 58, in send_and_get_reply
    raise SecretServiceNotAvailableException(data) from resp
secretstorage.exceptions.SecretServiceNotAvailableException: The name org.freedesktop.secrets was not provided by any .service files

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/keyring_linux/core/keyring_linux.py", line 110, in _is_backend_working
    keyring_backend.get_password(
  File "/usr/lib/python3.12/site-packages/keyring/backends/SecretService.py", line 79, in get_password
    collection = self.get_preferred_collection()
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/keyring/backends/SecretService.py", line 64, in get_preferred_collection
    raise InitError(f"Failed to create the collection: {e}.") from e
keyring.errors.InitError: Failed to create the collection: The name org.freedesktop.secrets was not provided by any .service files.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.12/logging/__init__.py", line 1160, in emit
    msg = self.format(record)
          ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/logging/__init__.py", line 999, in format
    return fmt.format(record)
           ^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/logging/__init__.py", line 703, in format
    record.message = record.getMessage()
                     ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/logging/__init__.py", line 392, in getMessage
    msg = msg % self.args
          ~~~~^~~~~~~~~~~
  File "/usr/lib/python3.12/site-packages/keyring/backend.py", line 99, in __str__
    return f"{keyring_class.__module__}.{keyring_class.__name__} (priority: {keyring_class.priority:g})"
                                                                             ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/jaraco/classes/properties.py", line 202, in __get__
    return self.fget.__get__(None, owner)()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/keyring/backends/SecretService.py", line 44, in priority
    raise RuntimeError(
RuntimeError: The Secret Service daemon is neither running nor activatable through D-Bus
Call stack:
  File "/usr/lib/python3.12/threading.py", line 1030, in _bootstrap
    self._bootstrap_inner()
  File "/usr/lib/python3.12/threading.py", line 1073, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.12/threading.py", line 1010, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/utils/executor.py", line 89, in _run_asyncio_loop_forever
    self._loop.run_forever()
  File "/usr/lib/python3.12/asyncio/base_events.py", line 641, in run_forever
    self._run_once()
  File "/usr/lib/python3.12/asyncio/base_events.py", line 1987, in _run_once
    handle._run()
  File "/usr/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/controller.py", line 94, in initialize_vpn_connector
    self._connector = await self._api.get_vpn_connector()
  File "/usr/lib/python3.12/site-packages/proton/vpn/core/api.py", line 57, in get_vpn_connector
    settings = await self.load_settings()
  File "/usr/lib/python3.12/site-packages/proton/vpn/core/api.py", line 67, in load_settings
    if self._session_holder.session.logged_in:
  File "/usr/lib/python3.12/site-packages/proton/vpn/core/session_holder.py", line 73, in session
    self._session = self._proton_sso.get_default_session(
  File "/usr/lib/python3.12/site-packages/proton/sso/sso.py", line 192, in get_default_session
    sessions = self.sessions
  File "/usr/lib/python3.12/site-packages/proton/sso/sso.py", line 130, in sessions
    keyring = self._keyring
  File "/usr/lib/python3.12/site-packages/proton/sso/sso.py", line 111, in _keyring
    self.__keyring_backend = Keyring.get_from_factory()
  File "/usr/lib/python3.12/site-packages/proton/keyring/_base.py", line 49, in get_from_factory
    keyring_backend = Loader.get("keyring", class_name=backend)
  File "/usr/lib/python3.12/site-packages/proton/loader/loader.py", line 105, in get
    if entry.cls._validate():
  File "/usr/lib/python3.12/site-packages/proton/keyring_linux/secretservice/secretservice_backend.py", line 43, in _validate
    return cls._is_backend_working(SecretService.Keyring())
  File "/usr/lib/python3.12/site-packages/proton/keyring_linux/core/keyring_linux.py", line 119, in _is_backend_working
    logger.exception("Keyring %s error", keyring_backend)
Message: 'Keyring %s error'
Arguments: (<keyring.backends.SecretService.Keyring object at 0x7f20999279b0>,)
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/secretstorage/util.py", line 48, in send_and_get_reply
    raise DBusErrorResponse(resp_msg)
jeepney.wrappers.DBusErrorResponse: [org.freedesktop.DBus.Error.ServiceUnknown] ('The name org.freedesktop.secrets was not provided by any .service files',)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/keyring/backends/SecretService.py", line 62, in get_preferred_collection
    collection = secretstorage.get_default_collection(bus)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/secretstorage/collection.py", line 177, in get_default_collection
    return Collection(connection)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/secretstorage/collection.py", line 45, in __init__
    self._collection.get_property('Label')
  File "/usr/lib/python3.12/site-packages/secretstorage/util.py", line 67, in get_property
    (signature, value), = self.send_and_get_reply(msg)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/secretstorage/util.py", line 58, in send_and_get_reply
    raise SecretServiceNotAvailableException(data) from resp
secretstorage.exceptions.SecretServiceNotAvailableException: The name org.freedesktop.secrets was not provided by any .service files

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/keyring_linux/core/keyring_linux.py", line 110, in _is_backend_working
    keyring_backend.get_password(
  File "/usr/lib/python3.12/site-packages/keyring/backends/SecretService.py", line 79, in get_password
    collection = self.get_preferred_collection()
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/keyring/backends/SecretService.py", line 64, in get_preferred_collection
    raise InitError(f"Failed to create the collection: {e}.") from e
keyring.errors.InitError: Failed to create the collection: The name org.freedesktop.secrets was not provided by any .service files.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.12/logging/handlers.py", line 73, in emit
    if self.shouldRollover(record):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/logging/handlers.py", line 196, in shouldRollover
    msg = "%s\n" % self.format(record)
                   ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/logging/__init__.py", line 999, in format
    return fmt.format(record)
           ^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/logging/__init__.py", line 703, in format
    record.message = record.getMessage()
                     ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/logging/__init__.py", line 392, in getMessage
    msg = msg % self.args
          ~~~~^~~~~~~~~~~
  File "/usr/lib/python3.12/site-packages/keyring/backend.py", line 99, in __str__
    return f"{keyring_class.__module__}.{keyring_class.__name__} (priority: {keyring_class.priority:g})"
                                                                             ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/jaraco/classes/properties.py", line 202, in __get__
    return self.fget.__get__(None, owner)()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/keyring/backends/SecretService.py", line 44, in priority
    raise RuntimeError(
RuntimeError: The Secret Service daemon is neither running nor activatable through D-Bus
Call stack:
  File "/usr/lib/python3.12/threading.py", line 1030, in _bootstrap
    self._bootstrap_inner()
  File "/usr/lib/python3.12/threading.py", line 1073, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.12/threading.py", line 1010, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/utils/executor.py", line 89, in _run_asyncio_loop_forever
    self._loop.run_forever()
  File "/usr/lib/python3.12/asyncio/base_events.py", line 641, in run_forever
    self._run_once()
  File "/usr/lib/python3.12/asyncio/base_events.py", line 1987, in _run_once
    handle._run()
  File "/usr/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/controller.py", line 94, in initialize_vpn_connector
    self._connector = await self._api.get_vpn_connector()
  File "/usr/lib/python3.12/site-packages/proton/vpn/core/api.py", line 57, in get_vpn_connector
    settings = await self.load_settings()
  File "/usr/lib/python3.12/site-packages/proton/vpn/core/api.py", line 67, in load_settings
    if self._session_holder.session.logged_in:
  File "/usr/lib/python3.12/site-packages/proton/vpn/core/session_holder.py", line 73, in session
    self._session = self._proton_sso.get_default_session(
  File "/usr/lib/python3.12/site-packages/proton/sso/sso.py", line 192, in get_default_session
    sessions = self.sessions
  File "/usr/lib/python3.12/site-packages/proton/sso/sso.py", line 130, in sessions
    keyring = self._keyring
  File "/usr/lib/python3.12/site-packages/proton/sso/sso.py", line 111, in _keyring
    self.__keyring_backend = Keyring.get_from_factory()
  File "/usr/lib/python3.12/site-packages/proton/keyring/_base.py", line 49, in get_from_factory
    keyring_backend = Loader.get("keyring", class_name=backend)
  File "/usr/lib/python3.12/site-packages/proton/loader/loader.py", line 105, in get
    if entry.cls._validate():
  File "/usr/lib/python3.12/site-packages/proton/keyring_linux/secretservice/secretservice_backend.py", line 43, in _validate
    return cls._is_backend_working(SecretService.Keyring())
  File "/usr/lib/python3.12/site-packages/proton/keyring_linux/core/keyring_linux.py", line 119, in _is_backend_working
    logger.exception("Keyring %s error", keyring_backend)
Message: 'Keyring %s error'
Arguments: (<keyring.backends.SecretService.Keyring object at 0x7f20999279b0>,)
/usr/lib/python3.12/site-packages/proton/loader/loader.py:90: RuntimeWarning: Loader: couldn't load transport/requests, is it installed properly?
  acceptable_classes = self.get_all(type_name)
2024-06-22T05:15:51.751733 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected (initial state)
2024-06-22T05:15:51.857874 | proton.vpn.app.gtk.app:57 | INFO | APP:PROCESS_START | self=<app.App object at 0x7f208f5bb500 (proton+vpn+app+gtk+app+App at 0x5c3bb8e76350)>
2024-06-22T05:15:51.945772 | proton.vpn.app.gtk.widgets.main.tray_indicator:45 | INFO | AyanaAppIndicator3 not found: Namespace AyatanaAppIndicator3 not available
2024-06-22T05:15:51.949832 | proton.vpn.app.gtk.services.reconnector.reconnector:96 | INFO | VPN reconnector enabled.
2024-06-22T05:15:53.967601 | proton.vpn.app.gtk.controller:144 | INFO | APP.STARTUP:STARTUP_ACTIONS | Running startup actions
2024-06-22T05:15:53.975948 | proton.vpn.app.gtk.widgets.vpn.vpn_widget:178 | INFO | APP.VPN:WIDGET_READY | VPN widget is ready (load time: 2.03 seconds)
2024-06-22T05:15:53.976112 | proton.vpn.core.connection:160 | INFO | CONN.CONNECT:START | Server: NL-FREE#112122 / Domain: node-nl-158.protonvpn.net / IP: 149.34.244.179 / OpenVPN Ports: ProtocolPorts(udp=[80, 51820, 4569, 1194, 5060], tcp=[443, 7770, 8443]) / WireGuard Ports: ProtocolPorts(udp=[443, 88, 1224, 51820, 500, 4500], tcp=[443]) / Protocol: openvpn-udp / Backend: None
2024-06-22T05:15:53.976244 | proton.vpn.app.gtk.services.refresher.vpn_data_refresher:157 | INFO | APP.VPN_DATA_REFRESHER:ENABLE | VPN data refresher service enabled.
2024-06-22T05:15:53.976487 | proton.vpn.app.gtk.services.refresher.client_config_refresher:68 | INFO | Client config refresher enabled.
2024-06-22T05:15:53.976803 | proton.vpn.app.gtk.services.refresher.client_config_refresher:107 | INFO | Next client config refresh scheduled in 0:00:00
2024-06-22T05:15:53.977007 | proton.vpn.app.gtk.services.refresher.server_list_refresher:74 | INFO | Server list refresher enabled.
2024-06-22T05:15:53.977146 | proton.vpn.app.gtk.services.refresher.server_list_refresher:126 | INFO | Next server list refresh scheduled in 0:12:05.182203
2024-06-22T05:15:53.977214 | proton.vpn.app.gtk.services.refresher.certificate_refresher:65 | INFO | Certificate refresher enabled.
2024-06-22T05:15:53.977469 | proton.vpn.app.gtk.services.refresher.certificate_refresher:110 | INFO | Next certificate refresh scheduled in 0:00:00
2024-06-22T05:15:54.024172 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-22T05:15:54.250036 | proton.vpn.backend.linux.networkmanager.core.networkmanager:91 | INFO | VPN server REACHABLE.
2024-06-22T05:15:55.867244 | proton.vpn.core.session.utils:25 | INFO | API:REQUEST | '/vpn/v2/clientconfig'
2024-06-22T05:15:55.868397 | proton.vpn.core.session.utils:25 | INFO | API:REQUEST | '/vpn/v1/certificate'
2024-06-22T05:15:56.464766 | proton.vpn.app.gtk.services.reconnector.reconnector:176 | INFO | Network connectivity was detected.
2024-06-22T05:16:06.887777 | proton.vpn.app.gtk.services.refresher.client_config_refresher:96 | WARNING | Client config update failed: No working transports found
2024-06-22T05:16:06.888055 | proton.vpn.app.gtk.services.refresher.client_config_refresher:107 | INFO | Next client config refresh scheduled in 2:39:19.483314
2024-06-22T05:16:06.888583 | proton.vpn.app.gtk.services.refresher.certificate_refresher:98 | WARNING | Certificate refresh failed: No working transports found
2024-06-22T05:16:06.888665 | proton.vpn.app.gtk.services.refresher.certificate_refresher:110 | INFO | Next certificate refresh scheduled in 19:22:10.741774
2024-06-22T05:16:37.195042 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connected
2024-06-22T05:16:48.317278 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:101 | INFO | UI:DISCONNECT | Disconnect from VPN
2024-06-22T05:16:48.317590 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnecting
2024-06-22T05:16:48.342925 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected
2024-06-22T05:16:48.733052 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:96 | INFO | UI.TRAY:CONNECT | Connect to fastest server
2024-06-22T05:16:48.741091 | proton.vpn.core.connection:160 | INFO | CONN.CONNECT:START | Server: NL-FREE#112122 / Domain: node-nl-158.protonvpn.net / IP: 149.34.244.179 / OpenVPN Ports: ProtocolPorts(udp=[80, 51820, 4569, 1194, 5060], tcp=[443, 7770, 8443]) / WireGuard Ports: ProtocolPorts(udp=[443, 88, 1224, 51820, 500, 4500], tcp=[443]) / Protocol: openvpn-udp / Backend: None
2024-06-22T05:16:48.741526 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-22T05:16:48.968339 | proton.vpn.backend.linux.networkmanager.core.networkmanager:91 | INFO | VPN server REACHABLE.
2024-06-22T05:16:51.801783 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connected
2024-06-22T05:17:04.843230 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:101 | INFO | UI:DISCONNECT | Disconnect from VPN
2024-06-22T05:17:04.843493 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnecting
2024-06-22T05:17:04.868562 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected
2024-06-22T05:17:05.325573 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:96 | INFO | UI.TRAY:CONNECT | Connect to fastest server
2024-06-22T05:17:05.333573 | proton.vpn.core.connection:160 | INFO | CONN.CONNECT:START | Server: NL-FREE#112122 / Domain: node-nl-158.protonvpn.net / IP: 149.34.244.179 / OpenVPN Ports: ProtocolPorts(udp=[80, 51820, 4569, 1194, 5060], tcp=[443, 7770, 8443]) / WireGuard Ports: ProtocolPorts(udp=[443, 88, 1224, 51820, 500, 4500], tcp=[443]) / Protocol: openvpn-udp / Backend: None
2024-06-22T05:17:05.334186 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-22T05:17:05.557729 | proton.vpn.backend.linux.networkmanager.core.networkmanager:91 | INFO | VPN server REACHABLE.
2024-06-22T05:17:07.889011 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connected
2024-06-22T05:17:11.201087 | proton.vpn.core.connection:160 | INFO | CONN.CONNECT:START | Server: US-FREE#379050 / Domain: node-us-132.protonvpn.net / IP: 156.146.51.129 / OpenVPN Ports: ProtocolPorts(udp=[80, 51820, 4569, 1194, 5060], tcp=[443, 7770, 8443]) / WireGuard Ports: ProtocolPorts(udp=[443, 88, 1224, 51820, 500, 4500], tcp=[443]) / Protocol: openvpn-udp / Backend: None
2024-06-22T05:17:11.201730 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnecting
2024-06-22T05:17:11.227768 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected
2024-06-22T05:17:11.260024 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-22T05:17:11.607637 | proton.vpn.backend.linux.networkmanager.core.networkmanager:91 | INFO | VPN server REACHABLE.
2024-06-22T05:17:15.142617 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connected
^CError in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/widgets/main/exception_handler.py", line 127, in handle_exception
    raise exc_value if exc_value else exc_type
  File "/usr/bin/protonvpn-app", line 33, in <module>
    sys.exit(load_entry_point('proton-vpn-gtk-app==4.3.2', 'console_scripts', 'protonvpn-app')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/__main__.py", line 35, in main
    sys.exit(App(controller).run(sys.argv))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/gi/overrides/Gio.py", line 40, in run
    with register_sigint_fallback(self.quit):
  File "/usr/lib/python3.12/contextlib.py", line 144, in __exit__
    next(self.gen)
  File "/usr/lib/python3.12/site-packages/gi/_ossighelper.py", line 237, in register_sigint_fallback
    signal.default_int_handler(signal.SIGINT, None)
KeyboardInterrupt

Original exception was:
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/widgets/main/exception_handler.py", line 127, in handle_exception
    raise exc_value if exc_value else exc_type
  File "/usr/bin/protonvpn-app", line 33, in <module>
    sys.exit(load_entry_point('proton-vpn-gtk-app==4.3.2', 'console_scripts', 'protonvpn-app')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/__main__.py", line 35, in main
    sys.exit(App(controller).run(sys.argv))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/gi/overrides/Gio.py", line 40, in run
    with register_sigint_fallback(self.quit):
  File "/usr/lib/python3.12/contextlib.py", line 144, in __exit__
    next(self.gen)
  File "/usr/lib/python3.12/site-packages/gi/_ossighelper.py", line 237, in register_sigint_fallback
    signal.default_int_handler(signal.SIGINT, None)
KeyboardInterrupt

arous:[artix]:/$ protonvpn-app 

(protonvpn-app:12565): Gtk-WARNING **: 07:17:26.074: Locale not supported by C library.
        Using the fallback 'C' locale.
2024-06-22T05:17:39.032598 | root:100 | ERROR | Keyring credential is not valid JSON, deleting
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/keyring_linux/secretservice/secretservice_backend.py", line 97, in _get_item
    return json.loads(stored_data)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
/usr/lib/python3.12/site-packages/proton/loader/loader.py:90: RuntimeWarning: Loader: couldn't load transport/requests, is it installed properly?
  acceptable_classes = self.get_all(type_name)
2024-06-22T05:17:39.209294 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connected (initial state)
2024-06-22T05:17:39.210758 | proton.vpn.app.gtk.app:57 | INFO | APP:PROCESS_START | self=<app.App object at 0x73064b232280 (proton+vpn+app+gtk+app+App at 0x5e47c6c60490)>
2024-06-22T05:17:39.295783 | proton.vpn.app.gtk.widgets.main.tray_indicator:45 | INFO | AyanaAppIndicator3 not found: Namespace AyatanaAppIndicator3 not available
2024-06-22T05:17:53.773130 | proton.vpn.app.gtk.widgets.login.login_form:106 | INFO | UI.LOGIN:CLICK | Clicked on login
2024-06-22T05:17:53.789494 | root:100 | ERROR | Keyring credential is not valid JSON, deleting
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/keyring_linux/secretservice/secretservice_backend.py", line 97, in _get_item
    return json.loads(stored_data)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2024-06-22T05:18:01.494570 | proton.vpn.core.session.utils:25 | INFO | API:REQUEST | '/vpn'
2024-06-22T05:18:01.496167 | proton.vpn.core.session.utils:25 | INFO | API:REQUEST | '/vpn/v1/certificate'
2024-06-22T05:18:01.496635 | proton.vpn.core.session.utils:25 | INFO | API:REQUEST | '/vpn/location'
2024-06-22T05:18:01.497010 | proton.vpn.core.session.utils:25 | INFO | API:REQUEST | '/vpn/v2/clientconfig'
2024-06-22T05:18:03.065647 | proton.vpn.core.session.utils:29 | INFO | API:RESPONSE | '/vpn/location'
2024-06-22T05:18:03.075777 | proton.vpn.core.session.utils:29 | INFO | API:RESPONSE | '/vpn/v2/clientconfig'
2024-06-22T05:18:03.271554 | proton.vpn.core.session.utils:29 | INFO | API:RESPONSE | '/vpn'
2024-06-22T05:18:03.295962 | proton.vpn.core.session.utils:29 | INFO | API:RESPONSE | '/vpn/v1/certificate'
2024-06-22T05:18:03.296202 | proton.vpn.core.session.utils:25 | INFO | API:REQUEST | '/vpn/logicals?SecureCoreFilter=all'
2024-06-22T05:18:07.000047 | proton.vpn.core.session.utils:29 | INFO | API:RESPONSE | '/vpn/logicals?SecureCoreFilter=all'
2024-06-22T05:18:07.209694 | proton.vpn.app.gtk.services.reconnector.reconnector:96 | INFO | VPN reconnector enabled.
2024-06-22T05:18:10.791361 | proton.vpn.app.gtk.widgets.vpn.vpn_widget:178 | INFO | APP.VPN:WIDGET_READY | VPN widget is ready (load time: 3.58 seconds)
2024-06-22T05:18:10.791507 | proton.vpn.app.gtk.services.refresher.vpn_data_refresher:157 | INFO | APP.VPN_DATA_REFRESHER:ENABLE | VPN data refresher service enabled.
2024-06-22T05:18:10.791569 | proton.vpn.app.gtk.services.refresher.client_config_refresher:68 | INFO | Client config refresher enabled.
2024-06-22T05:18:10.791636 | proton.vpn.app.gtk.services.refresher.client_config_refresher:107 | INFO | Next client config refresh scheduled in 3:28:05.204919
2024-06-22T05:18:10.791687 | proton.vpn.app.gtk.services.refresher.server_list_refresher:74 | INFO | Server list refresher enabled.
2024-06-22T05:18:10.791748 | proton.vpn.app.gtk.services.refresher.server_list_refresher:126 | INFO | Next server list refresh scheduled in 0:12:40.951376
2024-06-22T05:18:10.791799 | proton.vpn.app.gtk.services.refresher.certificate_refresher:65 | INFO | Certificate refresher enabled.
2024-06-22T05:18:10.792075 | proton.vpn.app.gtk.services.refresher.certificate_refresher:110 | INFO | Next certificate refresh scheduled in 18:00:10.207956
2024-06-22T05:18:12.037432 | proton.vpn.app.gtk.services.reconnector.reconnector:176 | INFO | Network connectivity was detected.
2024-06-22T05:18:14.392261 | proton.vpn.core.connection:160 | INFO | CONN.CONNECT:START | Server: NL-FREE#402131 / Domain: node-nl-171.protonvpn.net / IP: 185.107.56.138 / OpenVPN Ports: ProtocolPorts(udp=[80, 51820, 4569, 1194, 5060], tcp=[443, 7770, 8443]) / WireGuard Ports: ProtocolPorts(udp=[443, 88, 1224, 51820, 500, 4500], tcp=[443]) / Protocol: openvpn-udp / Backend: None
2024-06-22T05:18:14.392841 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnecting
2024-06-22T05:18:14.418220 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected
2024-06-22T05:18:14.444760 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-22T05:18:14.646478 | proton.vpn.backend.linux.networkmanager.core.networkmanager:91 | INFO | VPN server REACHABLE.
2024-06-22T05:18:22.452996 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connected
2024-06-22T05:19:24.829322 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:101 | INFO | UI:DISCONNECT | Disconnect from VPN
2024-06-22T05:19:24.829680 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnecting
2024-06-22T05:19:24.842590 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected
2024-06-22T05:19:25.519865 | proton.vpn.core.connection:160 | INFO | CONN.CONNECT:START | Server: NL-FREE#402131 / Domain: node-nl-171.protonvpn.net / IP: 185.107.56.138 / OpenVPN Ports: ProtocolPorts(udp=[80, 51820, 4569, 1194, 5060], tcp=[443, 7770, 8443]) / WireGuard Ports: ProtocolPorts(udp=[443, 88, 1224, 51820, 500, 4500], tcp=[443]) / Protocol: openvpn-udp / Backend: None
2024-06-22T05:19:25.520497 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-22T05:19:25.741048 | proton.vpn.backend.linux.networkmanager.core.networkmanager:91 | INFO | VPN server REACHABLE.
2024-06-22T05:19:41.983170 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Error
2024-06-22T05:19:41.983464 | proton.vpn.connection.states:334 | WARNING | Reached connection error state: AuthDenied (<enum NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS of type NM.VpnConnectionStateReason>)
2024-06-22T05:19:41.988353 | proton.vpn.app.gtk.services.reconnector.reconnector:191 | INFO | VPN connection drop was detected.
2024-06-22T05:19:41.988527 | proton.vpn.app.gtk.services.reconnector.reconnector:194 | INFO | VPN reconnection not possible: fatal connection error.
2024-06-22T05:19:42.658389 | proton.vpn.app.gtk.widgets.main.exception_handler:164 | ERROR | APP:ERROR | Reconnection not possible due to authentication error.
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/services/reconnector/reconnector.py", line 148, in _on_reconnection_error
    raise AuthenticationError("Reconnection not possible due to authentication error.")
proton.vpn.connection.exceptions.AuthenticationError: Reconnection not possible due to authentication error.
2024-06-22T05:20:06.130057 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:101 | INFO | UI:DISCONNECT | Disconnect from VPN
2024-06-22T05:20:06.130419 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected
2024-06-22T05:20:06.130805 | proton.vpn.connection.persistence:110 | WARNING | CONN.PERSISTENCE:REMOVE | Connection persistence not found when trying to remove it: /home/artix/.cache/Proton/VPN/connection/connection_persistence.json
2024-06-22T05:20:06.887418 | proton.vpn.core.connection:160 | INFO | CONN.CONNECT:START | Server: NL-FREE#402131 / Domain: node-nl-171.protonvpn.net / IP: 185.107.56.138 / OpenVPN Ports: ProtocolPorts(udp=[80, 51820, 4569, 1194, 5060], tcp=[443, 7770, 8443]) / WireGuard Ports: ProtocolPorts(udp=[443, 88, 1224, 51820, 500, 4500], tcp=[443]) / Protocol: openvpn-udp / Backend: None
2024-06-22T05:20:06.888086 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-22T05:20:07.093184 | proton.vpn.backend.linux.networkmanager.core.networkmanager:91 | INFO | VPN server REACHABLE.
2024-06-22T05:20:09.543978 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connected
2024-06-22T05:20:20.686046 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:101 | INFO | UI:DISCONNECT | Disconnect from VPN
2024-06-22T05:20:20.686394 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnecting
2024-06-22T05:20:20.710464 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected
2024-06-22T05:20:21.613406 | proton.vpn.app.gtk.widgets.vpn.quick_connect_widget:96 | INFO | UI.TRAY:CONNECT | Connect to fastest server
2024-06-22T05:20:21.621285 | proton.vpn.core.connection:160 | INFO | CONN.CONNECT:START | Server: US-FREE#188062 / Domain: node-us-234.protonvpn.net / IP: 87.249.134.133 / OpenVPN Ports: ProtocolPorts(udp=[80, 51820, 4569, 1194, 5060], tcp=[443, 7770, 8443]) / WireGuard Ports: ProtocolPorts(udp=[443, 88, 1224, 51820, 500, 4500], tcp=[443]) / Protocol: openvpn-udp / Backend: None
2024-06-22T05:20:21.621998 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-22T05:20:21.932352 | proton.vpn.backend.linux.networkmanager.core.networkmanager:91 | INFO | VPN server REACHABLE.
2024-06-22T05:20:25.053410 | proton.vpn.app.gtk.widgets.vpn.connection_status_widget:57 | INFO | UI:DISCONNECT | Disconnect from VPN
2024-06-22T05:20:25.053762 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnecting
2024-06-22T05:20:25.057499 | proton.vpn.connection.states:123 | WARNING | CONN:WARNING | DISCONNECTING state received unexpected event: Connected
2024-06-22T05:20:25.058270 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected
2024-06-22T05:20:25.058500 | proton.vpn.connection.persistence:110 | WARNING | CONN.PERSISTENCE:REMOVE | Connection persistence not found when trying to remove it: /home/artix/.cache/Proton/VPN/connection/connection_persistence.json
2024-06-22T05:20:26.551337 | proton.vpn.core.connection:160 | INFO | CONN.CONNECT:START | Server: NL-FREE#402131 / Domain: node-nl-171.protonvpn.net / IP: 185.107.56.138 / OpenVPN Ports: ProtocolPorts(udp=[80, 51820, 4569, 1194, 5060], tcp=[443, 7770, 8443]) / WireGuard Ports: ProtocolPorts(udp=[443, 88, 1224, 51820, 500, 4500], tcp=[443]) / Protocol: openvpn-udp / Backend: None
2024-06-22T05:20:26.552019 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-22T05:20:26.751309 | proton.vpn.backend.linux.networkmanager.core.networkmanager:91 | INFO | VPN server REACHABLE.
2024-06-22T05:20:29.572191 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connected

EDIT Now, I cannot even connect to a server.

2024-06-23T19:23:17.925858 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting
2024-06-23T19:23:22.932767 | proton.vpn.app.gtk.widgets.main.exception_handler:175 | CRITICAL | APP:CRASH | Unexpected error.
Traceback (most recent call last):
  File "/usr/lib/python3.12/concurrent/futures/_base.py", line 449, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
TimeoutError
2024-06-23T19:23:22.933443 | proton.vpn.core.usage:80 | ERROR | Failed to report error '(<class 'TimeoutError'>, TimeoutError(), <traceback object at 0x71ef0e6086c0>)'
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/vpn/core/usage.py", line 76, in report_error
    sanitized_error = self._sanitize_error(error)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/core/usage.py", line 130, in _sanitize_error
    return (error_info[0], _sanitize(error_info[1]), error_info[2])
                           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/core/usage.py", line 125, in _sanitize
    _, filename = os.path.split(error.filename)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen posixpath>", line 103, in split
TypeError: expected str, bytes or os.PathLike object, not NoneType
Anonymous941 commented 1 week ago

Given that this is specific to a non-supported distro we won't be prioritizing this atm.

@calexandru2018 This is happening for me on Ubuntu 24.04, which is a supported distro...