Code Monkey home page Code Monkey logo

proton-vpn-gtk-app's Introduction

Proton VPN GTK app

Copyright (c) 2023 Proton AG

This repository holds the Proton VPN GTK app. For licensing information see COPYING and LICENSE. For contribution policy see CONTRIBUTING.

Description

The Proton VPN GTK app is intended for every Proton VPN service user, it provides full access to all functionalities available to authenticated users, with the user signup process handled on the website.

Installation

You can get the latest stable release from our Proton VPN official website.

Dependencies

For development purposes (within a virtual environment) see the required packages in the setup.py file, under install_requires and extra_require. As of now these packages will not be available on pypi. Also see Virtual environment below.

Virtual environment

If you didn't do it yet, to be able to pip install Proton VPN components you'll need to set up our internal Python package registry. You can do so running the command below, after replacing {GITLAB_TOKEN} with your personal access token with the scope set to api.

pip config set global.index-url https://__token__:{GITLAB_TOKEN}@{GITLAB_INSTANCE}/api/v4/groups/{GROUP_ID}/-/packages/pypi/simple

You can create the virtual environment and install the rest of dependencies as follows:

python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

GUI application

App logs are stored under ~/.cache/Proton/VPN/logs/ directory.

User settings are under ~/.config/Proton/VPN/ directory.

Folder structure

Folder "debian"

Contains all debian related data, for easy package compilation.

Folder "rpmbuild"

Contains all rpm/fedora related data, for easy package compilation.

Folder "proton/app/gtk"

This folder contains the gtk app source code.

Folder "tests"

This folder contains unit/integrations test code.

You can run the integration tests with:

behave tests/integration/features

On headless systems, it's possible to run the integration tests using Xvfb (virtual framebuffer X server). On Debian-based distributions, you just have to install the xvfb package. After that, you can run the integration tests with:

xvfb-run -a behave integration_tests/features

Versioning

Version matches format: [major][minor][patch]

proton-vpn-gtk-app's People

Contributors

bartsanchez avatar calexandru2018 avatar jllaneras avatar pedro-avalos avatar weilbyte avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

proton-vpn-gtk-app's Issues

login button not working - void linux

2023-12-11T08:54:18.151935 | proton.vpn.connection.vpnconnector:185 | INFO | CONN:STATE_CHANGED | Disconnected (initial state)
2023-12-11T08:54:25.085995 | proton.vpn.app.gtk.widgets.login.login_form:106 | INFO | UI.LOGIN:CLICK | Clicked on login
2023-12-11T08:54:25.096355 | proton.vpn.app.gtk.widgets.main.exception_handler:174 | CRITICAL | APP:CRASH | Unexpected error.
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/widgets/login/login_form.py", line 124, in _on_login_result
    if result.authenticated:
       ^^^^^^^^^^^^^^^^^^^^
AttributeError: 'coroutine' object has no attribute 'authenticated'

OS: Void Linux
Python 3.12

`proton-vpn-gtk-app` beta on Arch linux

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Just wondering when we can gat beta application on arch linux? Like we dont even have a beta branch on github so Just asking.

Deleting my .cache folder caused a RuntimeError

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

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

  • [ x] I have searched open and closed issues for duplicates
  • [ x] This isn't a feature request
  • [ x] This is not a report about my app not working as expected

protonvpn-app
2024-01-27T04:49:31.903948 | proton.vpn.connection.vpnconnector:168 | INFO | CONN:STATE_CHANGED | Disconnected (initial state)
2024-01-27T04:49:32.076491 | proton.vpn.session.session:92 | ERROR | Error deserializing VPN session.
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/vpn/session/servers/fetcher.py", line 107, in load_from_cache
    cache = self._cache_file.load()
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/session/cache.py", line 57, in load
    return CacheFile.from_path(self.file_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/session/cache.py", line 69, in from_path
    with open(file_path, "r", encoding="utf-8") as file:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/home/elmo/.cache/Proton/VPN/serverlist.json'

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

Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/vpn/session/session.py", line 89, in __setstate__
    self._server_list = self._fetcher.load_server_list_from_cache()
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/session/fetcher.py", line 96, in load_server_list_from_cache
    return self._server_list_fetcher.load_from_cache()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/session/servers/fetcher.py", line 109, in load_from_cache
    raise ServerListDecodeError("Cached server list was not found") from error
proton.vpn.session.exceptions.ServerListDecodeError: Cached server list was not found
Traceback (most recent call last):
  File "/usr/bin/protonvpn-app", line 33, in <module>
    sys.exit(load_entry_point('proton-vpn-gtk-app==4.1.8', 'console_scripts', 'protonvpn-app')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/__main__.py", line 34, in main
    controller = Controller.get(executor)
                 ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/controller.py", line 55, in get
    executor.submit(controller.initialize_vpn_connector).result()
  File "/usr/lib64/python3.12/concurrent/futures/_base.py", line 456, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.12/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/controller.py", line 101, in initialize_vpn_connector
    self._reconnector.enable()
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/services/reconnector/reconnector.py", line 91, in enable
    raise RuntimeError("VPN data refresher is not ready.")
RuntimeError: VPN data refresher is not ready.

Facing many and annoying connection drops

Proton,
I'm a paid user and I have already opened a report, but no one can solve it yet.
I have facing A LOT and ANNOYING connection drops!

paid

Looking at logs, I see many of this:

2024-03-17T14:19:56.971101 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Error 2024-03-17T14:19:56.971371 | proton.vpn.connection.states:334 | WARNING | Reached connection error state: Timeout (None) 2024-03-17T14:19:56.972559 | proton.vpn.app.gtk.services.reconnector.reconnector:191 | INFO | VPN connection drop was detected. 2024-03-17T14:19:56.972796 | proton.vpn.app.gtk.services.reconnector.reconnector:133 | INFO | Reconnection attempt #1 scheduled in 1.96 seconds. 2024-03-17T14:19:58.930200 | proton.vpn.app.gtk.services.reconnector.reconnector:207 | INFO | Reconnecting (attempt #1)... 2024-03-17T14:19:58.932429 | proton.vpn.core.connection:156 | INFO | CONN.CONNECT:START | Server: <omitted> / Protocol: openvpn-udp / Ports: [80, 51820, 4569, 1194, 5060] / Backend: linuxnetworkmanager 2024-03-17T14:19:58.933446 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Connecting 2024-03-17T14:20:04.443903 | proton.vpn.backend.linux.networkmanager.core.networkmanager:86 | INFO | VPN server NOT reachable.

After getting this connection drop, I have to reconnect manually.

ProtonVPN Fatal Error on Connect in Ubuntu 23.10 on Raspberry Pi 5

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

OS: Ubuntu 23.10
Hardware: Raspberry Pi 5
Running as a system user
Checked permissions for .cache, correct
All optional features turned off
Reinstall tried
Tried running on newly created user
Stable (4.3.0) and Beta version tried
Different countries/servers tried

ProtonVPN becomes stuck in the 'connecting' state. If the application is closed, it will only open again after a restart.

Relevant logs:

2024-04-27T17:26:06.188771 | proton.vpn.session.session:92 | ERROR | Error deserializing VPN session.
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/proton/vpn/session/servers/fetcher.py", line 107, in load_from_cache
cache = self._cache_file.load()
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/proton/vpn/session/cache.py", line 57, in load
return CacheFile.from_path(self.file_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/proton/vpn/session/cache.py", line 69, in from_path
with open(file_path, "r", encoding="utf-8") as file:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/home/seedbox/.cache/Proton/VPN/serverlist.json'

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

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/proton/vpn/session/session.py", line 89, in setstate
self._server_list = self._fetcher.load_server_list_from_cache()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/proton/vpn/session/fetcher.py", line 96, in load_server_list_from_cache
return self._server_list_fetcher.load_from_cache()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/proton/vpn/session/servers/fetcher.py", line 109, in load_from_cache
raise ServerListDecodeError("Cached server list was not found") from error
proton.vpn.session.exceptions.ServerListDecodeError: Cached server list was not found

`serverlist.json` Not Found

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

I have installed proton-vpn-gtk-app and it was not connecting to vpn, saying auth denied some thing like that, then i uninstalled it completly, removed every file and folder it created. Reinstalled it and it is showing this error

2024-02-04T02:01:34.907074 | proton.vpn.connection.vpnconnector:168 | INFO | CONN:STATE_CHANGED | Disconnected (initial state)
2024-02-04T02:01:35.107865 | proton.vpn.session.session:92 | ERROR | Error deserializing VPN session.
Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/proton/vpn/session/servers/fetcher.py", line 107, in load_from_cache
    cache = self._cache_file.load()
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/session/cache.py", line 57, in load
    return CacheFile.from_path(self.file_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/session/cache.py", line 69, in from_path
    with open(file_path, "r", encoding="utf-8") as file:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/home/ishank/.cache/Proton/VPN/serverlist.json'

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

Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/proton/vpn/session/session.py", line 89, in __setstate__
    self._server_list = self._fetcher.load_server_list_from_cache()
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/session/fetcher.py", line 96, in load_server_list_from_cache
    return self._server_list_fetcher.load_from_cache()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/session/servers/fetcher.py", line 109, in load_from_cache
    raise ServerListDecodeError("Cached server list was not found") from error
proton.vpn.session.exceptions.ServerListDecodeError: Cached server list was not found

I tried restarting my pc but nothing worked

Consider using a monorepo for all python-proton-vpn-* packages

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

The README states:

Virtual environment

If you didn't do it yet, to be able to pip install Proton VPN components you'll need to set up our internal Python package registry. You can do so running the command below, after replacing {GITLAB_TOKEN} with your personal access token with the scope set to api.

pip config set global.index-url https://__token__:{GITLAB_TOKEN}@{GITLAB_INSTANCE}/api/v4/groups/{GROUP_ID}/-/packages/pypi/simple

This makes the job of using running the app from the source code extremely difficult. Moreover, the README also doesn't mention what GitLab instance to use, which makes me think that the instance being used is https://gitlab.com/, a 3rd party service.

I bring this up as I would like an easy way to build/run the app from source without needing to clone a bunch of other repositories or authenticate with GitLab (which doesn't really make sense since the source is on GitHub and pip can install packages from git)

Finally found the keyring problem

Many keyrings
These are either blank, contain just the ProtonVPN login password, or contain that password and some VPN configurations. This is on GNOME, so kde-wallet cannot be causing the issue. Could it be caused because I also have keyrings named Default keyring?
It seems very likely that the issue is that it fails to detect the keyring named Default, and makes another one every single time the app is restarted. This means you have to login after every reboot
This is happening on all of my computers, some with KDE and some with GNOME, and probably caused #8

Please fix these basic and extremely annoying issues (probably just need to stop using gnome keyring/kwallet)

The app wants to create a new keyring called "Default" each time I start my computer. In addition, the app never saves my login after it closes.

These issues happen to me on clean installs of:

  • Ubuntu
  • Kubuntu
  • Debian Gnome
  • Debian KDE

I don't know if you all didn't bother testing the application or i'm just really unlucky but please just store the information for the application somewhere in the home folder. Windscribe does this and as a result it works perfectly on every distribution and desktop environment. These keyrings have had random issues like this reported constantly over the last 10 years and the solution that works 100% of the time is to simply not use them.

Linux: minimise on start option

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Hope this helps those struggling. I want to believe that Proton team will add an option to start apps into system tray at some point. Meanwhile this is my solution.

I am using both Proton VPN & Mail Bridge on Ubuntu with Gnome. In my case these are flatpaks but I don't think that matters. Here's what I ended up load both apps minimized to system tray. Just add this script to your startup apps.

proton-startup.sh

#!/bin/bash

# Proton VPN
gtk-launch com.protonvpn.www.desktop </dev/null &>/dev/null &
xdotool search --sync --name "Proton VPN" windowactivate
xdotool key --clearmodifiers --delay 500 alt+F4

# Proton Mail Bridge
gtk-launch ch.protonmail.protonmail-bridge.desktop </dev/null &>/dev/null &
xdotool search --sync --name "Proton Mail Bridge" windowactivate
xdotool key --clearmodifiers --delay 500 alt+F4

Auto select protocol should be more humanity for client

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Once detected proton main site API blocked. should trying to connect stealth protocol first. on the most network restrictive environment. other VPN protocol almost unable to use.
Might you know, users can not wait connect for long time, right?

Locked Gnome keyring causes race condition and authentication denied

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

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.

AttributeError: 'KeyringBackendLinuxSecretService' object has no attribute 'KEYRING_SERVICE'

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

When executing protonvpn-app after updating:

(protonvpn-app:1227797): Gdk-WARNING **: 14:49:26.033: Failed to read portal settings: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface “org.freedesktop.portal.Settings” on object at path /org/freedesktop/portal/desktop
Traceback (most recent call last):
  File "/usr/bin/protonvpn-app", line 33, in <module>
    sys.exit(load_entry_point('proton-vpn-gtk-app==4.3.0', 'console_scripts', 'protonvpn-app')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/proton/vpn/app/gtk/__main__.py", line 34, in main
    controller = Controller.get(executor)
                 ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/proton/vpn/app/gtk/controller.py", line 57, in get
    executor.submit(controller.initialize_vpn_connector).result()
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 456, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3/dist-packages/proton/vpn/app/gtk/controller.py", line 97, in initialize_vpn_connector
    self._connector = await self._api.get_vpn_connector()
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/proton/vpn/core/api.py", line 55, in get_vpn_connector
    settings = await self.load_settings()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/proton/vpn/core/api.py", line 65, in load_settings
    if self._session_holder.session.logged_in:
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/proton/vpn/core/session.py", line 73, in session
    self._session = self._proton_sso.get_default_session(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/proton/sso/sso.py", line 192, in get_default_session
    sessions = self.sessions
               ^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/proton/sso/sso.py", line 133, in sessions
    keyring_index = keyring[self.__keyring_index_name()]
                    ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/proton/keyring/_base.py", line 65, in __getitem__
    return self._get_item(key)
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/proton/keyring_linux/secretservice/secretservice_backend.py", line 57, in _get_item
    self.KEYRING_SERVICE,
    ^^^^^^^^^^^^^^^^^^^^
AttributeError: 'KeyringBackendLinuxSecretService' object has no attribute 'KEYRING_SERVICE'

Popup is not

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

image

Why do I get this popup?

Nothing of my proton credentials seem to satisfy this

How can I install this new app in fedora 39 ?

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Issue: Authentication Denied on `proton-vpn-gtk-app` in *Arch Linux*

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

2024-02-14_22-35

I am trying to login to my server but not working, it is showing authentication denied

Things I have tried

  • Logout Login
  • Uninstall Reinstall
  • Try another account
  • Completly remove proton from face of my pc and reinstall

When i manually removed proton then their was a problem with cache, with was fixed by #25 but took awfully long time on arch linux.

Support VNC session

Is there any chance to support VNC sessions in proton-vpn-gtk-app ? Currently, I'm starting VNC session with KDE (but the Desktop Environment is not important) and when I'm starting the app I'm getting:

2024-02-16T08:02:09.514193 | proton.vpn.connection.vpnconnector:168 | INFO | CONN:STATE_CHANGED | Disconnected (initial state)
2024-02-16T08:02:09.514507 | proton.vpn.app.gtk.app:57 | INFO | APP:PROCESS_START | self=<app.App object at 0xffff84484c40 (proton+vpn+app+gtk+app+App at 0xaaab2458dad0)>
2024-02-16T08:02:09.561668 | proton.vpn.app.gtk.widgets.main.tray_indicator:45 | INFO | AyanaAppIndicator3 not found: Namespace AyatanaAppIndicator3 not available
2024-02-16T08:02:09.700696 | dbus.proxies:407 | ERROR | Introspect error on :1.10:/org/freedesktop/login1/seat/auto: dbus.exceptions.DBusException: org.freedesktop.DBus.Error.UnknownObject: Unknown object '/org/freedesktop/login1/seat/auto'.
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/widgets/vpn/vpn_widget.py", line 139, in _on_vpn_data_ready
    self.display(self._controller.user_tier, server_list)
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/widgets/vpn/vpn_widget.py", line 164, in display
    self._controller.reconnector.enable()
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/services/reconnector/reconnector.py", line 95, in enable
    self._session_monitor.enable()
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/services/reconnector/session_monitor.py", line 61, in enable
    self._setup()
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/services/reconnector/session_monitor.py", line 102, in _setup
    seat_properties = seat_auto_properties_proxy.GetAll(SEAT_INTERFACE)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.12/site-packages/dbus/proxies.py", line 72, in __call__
    return self._proxy_method(*args, **keywords)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.12/site-packages/dbus/proxies.py", line 141, in __call__
    return self._connection.call_blocking(self._named_service,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.12/site-packages/dbus/connection.py", line 634, in call_blocking
    reply_message = self.send_message_with_reply_and_block(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.UnknownObject: Unknown object '/org/freedesktop/login1/seat/auto'.
2024-02-16T08:02:09.716784 | proton.vpn.app.gtk.services.refresher.vpn_data_refresher:148 | INFO | APP.VPN_DATA_REFRESHER:ENABLE | VPN data refresher service enabled.
2024-02-16T08:02:09.716858 | proton.vpn.app.gtk.services.refresher.client_config_refresher:68 | INFO | Client config refresher enabled.
2024-02-16T08:02:09.716919 | proton.vpn.app.gtk.services.refresher.client_config_refresher:107 | INFO | Next client config refresh scheduled in 2:39:28.999014
2024-02-16T08:02:09.716952 | proton.vpn.app.gtk.services.refresher.server_list_refresher:74 | INFO | Server list refresher enabled.
2024-02-16T08:02:09.717739 | proton.vpn.session.utils:25 | INFO | API:REQUEST | '/vpn/loads'
2024-02-16T08:02:09.754349 | proton.vpn.app.gtk.services.reconnector.reconnector:176 | INFO | Network connectivity was detected.
2024-02-16T08:02:10.692619 | proton.vpn.session.utils:29 | INFO | API:RESPONSE | '/vpn/loads'
2024-02-16T08:02:10.789967 | proton.vpn.app.gtk.services.refresher.server_list_refresher:126 | INFO | Next server list refresh scheduled in 0:17:36.605211

It's because VNC session doesn't allocate any seat and app hangs on:

image

I've installed packages in the following versions:

~ rpm -qa | grep -i proton
protonvpn-stable-release-1.0.1-2.noarch
python3-proton-core-0.1.16-1.fc39.noarch
python3-proton-vpn-logger-0.2.1-1.fc39.noarch
python3-proton-vpn-killswitch-0.2.0-1.fc39.noarch
python3-proton-vpn-connection-0.11.3-1.fc39.noarch
python3-proton-vpn-network-manager-0.3.3-1.fc39.noarch
python3-proton-vpn-network-manager-openvpn-0.0.4-1.fc39.noarch
python3-proton-vpn-killswitch-network-manager-0.2.0-1.fc39.noarch
python3-proton-vpn-session-0.6.5-1.fc39.noarch
python3-proton-vpn-api-core-0.20.3-1.fc39.noarch
proton-vpn-gtk-app-4.1.10-1.fc39.noarch
python3-proton-keyring-linux-0.0.1-1.fc39.noarch
python3-proton-keyring-linux-secretservice-0.0.1-1.fc39.noarch
proton-vpn-gnome-desktop-0.2.0-1.fc39.noarch
protonvpn-cli-2.2.11-9.fc39.noarch

Output from loginctl command:

~ loginctl                
SESSION  UID USER SEAT TTY STATE   IDLE SINCE
     c1 1000 XXX        n/a closing no        

1 sessions listed.

protonvpn-cli works, but it would be nice to use gtk-app on headless stations only with VNC session started.

`proton-vpn-gtk-app` not opening withing 2 minute (120 second) of system startup!

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

I am on arch linux and have bspwm, when use anything like old protovpn-gui/cli it openes fine on startup but when i put this new gtk app it dont open forsometimes it just shows genric png type image agter 2 minute it openes fine, tried running it throught termianl got output

╭─ishank@ArchBeast /home/ishank  ‹system›
╰─$ protonvpn-app
2024-02-24T15:00:08.552323 | proton.vpn.connection.vpnconnector:168 | INFO | CONN:STATE_CHANGED | Disconnected (initial state)
2024-02-24T15:00:08.553048 | proton.vpn.app.gtk.app:57 | INFO | APP:PROCESS_START | self=<app.App object at 0x7a929c329c00 (proton+vpn+app+gtk+app+App at 0x63f7e4212960)>
2024-02-24T15:00:08.643254 | proton.vpn.app.gtk.widgets.main.tray_indicator:45 | INFO | AyanaAppIndicator3 not found: Namespace AyatanaAppIndicator3 not available
Traceback (most recent call last):
  File "/usr/lib/python3.11/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 is not activatable',)

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

Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/keyring/backends/SecretService.py", line 61, in get_preferred_collection
    collection = secretstorage.get_default_collection(bus)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/secretstorage/collection.py", line 177, in get_default_collection
    return Collection(connection)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/secretstorage/collection.py", line 45, in __init__
    self._collection.get_property('Label')
  File "/usr/lib/python3.11/site-packages/secretstorage/util.py", line 67, in get_property
    (signature, value), = self.send_and_get_reply(msg)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/secretstorage/util.py", line 58, in send_and_get_reply
    raise SecretServiceNotAvailableException(data) from resp
secretstorage.exceptions.SecretServiceNotAvailableException: The name is not activatable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/proton/keyring_linux/core/keyring_linux.py", line 99, in _is_backend_working
    keyring_backend.get_password(
  File "/usr/lib/python3.11/site-packages/keyring/backends/SecretService.py", line 78, in get_password
    collection = self.get_preferred_collection()
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/keyring/backends/SecretService.py", line 63, in get_preferred_collection
    raise InitError("Failed to create the collection: %s." % e)
keyring.errors.InitError: Failed to create the collection: The name is not activatable.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/app.py", line 94, in do_activate
    self.tray_indicator = self._build_tray_indicator_if_possible(
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/app.py", line 195, in _build_tray_indicator_if_possible
    return TrayIndicator(controller, main_window)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/widgets/main/tray_indicator.py", line 118, in __init__
    self._menu = self._build_menu()
                 ^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/widgets/main/tray_indicator.py", line 221, in _build_menu
    if self._controller.user_logged_in:
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/controller.py", line 129, in user_logged_in
    return self._api.is_user_logged_in()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/core/api.py", line 89, in is_user_logged_in
    return self._session_holder.session.logged_in
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/core/session.py", line 71, in session
    self._session = self._proton_sso.get_default_session(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/sso/sso.py", line 192, in get_default_session
    sessions = self.sessions
               ^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/sso/sso.py", line 130, in sessions
    keyring = self._keyring
              ^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/sso/sso.py", line 111, in _keyring
    self.__keyring_backend = Keyring.get_from_factory()
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/keyring/_base.py", line 49, in get_from_factory
    keyring_backend = Loader.get("keyring", class_name=backend)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/loader/loader.py", line 105, in get
    if entry.cls._validate():
       ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/keyring_linux/secretservice/secretservice_backend.py", line 40, in _validate
    return cls._is_backend_working(SecretService.Keyring())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/keyring_linux/core/keyring_linux.py", line 108, in _is_backend_working
    logger.exception(f"Keyring \"{keyring_backend}\" error")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/keyring/backend.py", line 95, in __str__
    keyring_class.__module__, keyring_class.__name__, keyring_class.priority
                                                      ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/jaraco/classes/properties.py", line 201, in __get__
    return self.fget.__get__(None, owner)()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/keyring/backends/SecretService.py", line 43, in priority
    raise RuntimeError(
RuntimeError: The Secret Service daemon is neither running nor activatable through D-Bus

(protonvpn-app:2428): Gdk-CRITICAL **: 20:30:08.837: gdk_window_thaw_toplevel_updates: assertion 'window->update_and_descendants_freeze_count > 0' failed

after 2 minute, exactly 120 sec it works fine without error

  • WTF is relation between proton and 120 seconds ?? in my problem #33 the problem get solved exactly after 120 seconds and this problem too get solved in 120 second ?!?!??!?!?!?!??!?

Library update breaks app on up to date pop os

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Following an update to proton vpn libraries on 27th nov, today the app disappeared from the "Pop!_Shop" app center and dock

I uninstalled using instructions on your website help and tried to reinstall but I am getting this message:

The following packages have unmet dependencies.
 python3-proton-vpn-session : Breaks: python3-proton-vpn-api-core (< 0.20.2) but 0.20.1 is to be installed
E: Unable to correct problems, you have held broken packages.

Alternative API endpoint should have other ports

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Hello, Proton VPN team:
Presently, if the primary ProtonVPN API endpoint is inaccessible due to blocking, the application attempts to connect through alternative available endpoints.
However, upon examining the backup endpoint, a critical issue emerges: it solely utilizes port 443 for HTTPS connections and lacks additional ports.
Consequently, in restricted environments, users may encounter difficulties in establishing a successful connection to the API server, significantly impairing the functionality of the application.
To address this concern, it's imperative to include a non-standard HTTPS port for the backup endpoint.

Thanks.

Will there be a patch for Novel attack

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

https://arstechnica.com/security/2024/05/novel-attack-against-virtually-all-vpn-apps-neuters-their-entire-purpose/

Will this app be updated?
what about the legacy https://github.com/ProtonVPN/linux-cli and https://github.com/ProtonVPN/linux-app ?

Fedora 38 & 39: cannot install protonvpn (certificate is not live error)

Hi,

my OS: Linux Fedora 38

Previously I had Fedora 36, I upgraded to 37 and 38. During the upgrade I had to disable/remove the protonvpn repo
Then I tried to (re-)install protonvpn following this guide https://protonvpn.com/support/official-linux-vpn-fedora/
After downloading the RPM, I do:

sudo dnf install ./protonvpn-stable-release-1.0.1-2.noarch.rpm

I'm getting this error:

sudo dnf install ./protonvpn-stable-release-1.0.1-2.noarch.rpm
Last metadata expiration check: 0:19:09 ago on Sun 19 Nov 2023 04:12:08 PM CET.
Dependencies resolved.
======================================================================================================================================================================================================
 Package                                                    Architecture                             Version                                     Repository                                      Size
======================================================================================================================================================================================================
Installing:
 protonvpn-stable-release                                   noarch                                   1.0.1-2                                     @commandline                                   7.1 k

Transaction Summary
======================================================================================================================================================================================================
Install  1 Package

Total size: 7.1 k
Installed size: 280  
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
RPM: error: Verifying a signature using certificate A88441BD4864F95BEE08E63A71EB474019940E11 (Proton Technologies AG <[email protected]>):
RPM:   1. Certificiate 71EB474019940E11 invalid: certificate is not alive
RPM:       because: The primary key is not live
RPM:       because: Expired on 2022-10-28T13:52:11Z
RPM:   2. Key 71EB474019940E11 invalid: key is not alive
RPM:       because: The primary key is not live
RPM:       because: Expired on 2022-10-28T13:52:11Z
Error: Transaction test error:
  package protonvpn-stable-release-1.0.1-2.noarch does not verify: Header V4 RSA/SHA256 Signature, key ID 19940e11: NOTTRUSTED

I upgraded my system to Fedora 39, same issue when I try installing the RPM. So I have no clue what to do to make this work. Ideas? Thank you.

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

  • [ x ] I have searched open and closed issues for duplicates
  • [ x ] This isn't a feature request
  • [ x ] This is not a report about my app not working as expected

Not able to Login in linux client on kali kde plasma

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

I have contacted the support & posted on reddit as well. The desktop client is not running on kali 2023.4 kde plasma. I have used it in the past on kali for several years but recently I'm trying to install on my new machine & the gtk client is not logging in. When I enter my creds I see a notification in my phone about a new login but then it's stuck in the login screen.

Here is the reddit issue where I have put my logs
& also I have emailed the support with logs as well https://www.reddit.com/r/ProtonVPN/comments/18q295y/desktop_client_stuck_at_login_loop_on_kali_linux/

Instructions or a way to install the app on unsupported linux distribution

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

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

  • [ x ] I have searched open and closed issues for duplicates
  • This isn't a feature request
  • [ x ] This is not a report about my app not working as expected

Please provide a way to use the official app package in case of unsupported linux distributions.
This is especially important now that you have deprecated protonvpn-cli and it no longer works at all Rafficer/linux-cli-community#365

Maybe you can provide instructions on how to install it into virtual env with pip? Or even you can create official releases with AppImage or Flatpak which wok on any distro?

Thanks

I'm having a problem

I have been facing this problem since yesterday and I have not found any solution to it, I tried all available methods and searched on many sites and I did not find a solution for it, please help

python3-proton-vpn-session : breaks: python3-proton-vpn-api-core (< 0.20.2) but 0.20.1 is to be installed

I try to install proton after pkg, and i got this problem
Debian 12

ProtonVPN App (from Proton repos) slow and unresponsive

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

System: Fedora 39, KDE Plasma 5.27.11, Wayland, Kernel 6.8.8-200 (should not be relevant but maybe there might be a difference on other systems)

The ProtonVPN GTK App (from Proton repos) is on activation (on click if opened on desktop but out of focus, minimized in taskbar, or if minimized in tray) unresponsive and greyed (sometimes even whited) out. This has been the case across the last updates for the GTK app. The App works fine otherwise, just it takes some time to become fully responsive and to be displayed properly.

Other than that, thank you very much for making the GTK app, it works great otherwise.

That is basically all.

Pytest fails with Segmentation fault on headless session

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

The tests fail to run if the session has no desktop environment, for example, over SSH or while building an RPM. On a graphical environment, I see that tests open windows.

Ideally, tests should be skipped if there's no desktop, it might be easier than rewriting tests to not require a desktop env.

tests/unit/widgets/headerbar/menu/settings/test_account_settings.py Fatal Python error: Segmentation fault

Thread 0x00007f0fd4e5b700 (most recent call first):
  File "/usr/lib64/python3.10/selectors.py", line 469 in select
  File "/usr/lib64/python3.10/asyncio/base_events.py", line 1871 in _run_once
  File "/usr/lib64/python3.10/asyncio/base_events.py", line 603 in run_forever
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/proton/vpn/app/gtk/utils/executor.py", line 89 in _run_asyncio_loop_forever
  File "/usr/lib64/python3.10/threading.py", line 953 in run
  File "/usr/lib64/python3.10/threading.py", line 1016 in _bootstrap_inner
  File "/usr/lib64/python3.10/threading.py", line 973 in _bootstrap

Current thread 0x00007f0fe4013740 (most recent call first):
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib64/python3.10/site-packages/gi/overrides/__init__.py", line 313 in new_init
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/proton/vpn/app/gtk/widgets/headerbar/menu/settings/common.py", line 37 in __init__
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/proton/vpn/app/gtk/widgets/headerbar/menu/settings/account_settings.py", line 35 in __init__
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/tests/unit/widgets/headerbar/menu/settings/test_account_settings.py", line 18 in test_account_settings_when_is_called_upon_building_ui_elements
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/python.py", line 195 in pytest_pyfunc_call
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_callers.py", line 102 in _multicall
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_manager.py", line 119 in _hookexec
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_hooks.py", line 501 in __call__
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/python.py", line 1772 in runtest
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/runner.py", line 172 in pytest_runtest_call
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_callers.py", line 102 in _multicall
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_manager.py", line 119 in _hookexec
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_hooks.py", line 501 in __call__
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/runner.py", line 240 in <lambda>
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/runner.py", line 340 in from_call
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/runner.py", line 239 in call_and_report
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/runner.py", line 134 in runtestprotocol
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/runner.py", line 115 in pytest_runtest_protocol
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_callers.py", line 102 in _multicall
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_manager.py", line 119 in _hookexec
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_hooks.py", line 501 in __call__
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/main.py", line 364 in pytest_runtestloop
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_callers.py", line 102 in _multicall
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_manager.py", line 119 in _hookexec
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_hooks.py", line 501 in __call__
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/main.py", line 339 in _main
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/main.py", line 285 in wrap_session
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/main.py", line 332 in pytest_cmdline_main
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_callers.py", line 102 in _multicall
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_manager.py", line 119 in _hookexec
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/pluggy/_hooks.py", line 501 in __call__
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/config/__init__.py", line 174 in main
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/lib/python3.10/site-packages/_pytest/config/__init__.py", line 197 in console_main
  File "/home/alexandre/workspace/alxd/proton-vpn-gtk-app/venv/bin/pytest", line 8 in <module>

Extension modules: gi._gi, cairo._cairo, gi._gi_cairo, _cffi_backend, _dbus_bindings, _dbus_glib_bindings (total: 6)
[1]    14235 segmentation fault (core dumped)  pytest

[Solved] Internet stops working after some times. `auth-failure`

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Issue: I casually surf the web and suddenly my internet stops working and everything stops, now I need to disconnect and exactly afer 2 minute i need to connect, if i connect within 2 minute like 1:30 then it will stuck in asking password (same as #4 and #8 ). When i try to get log on networkmanager i get these logs

Feb 20 08:39:01 ArchBeast nm-openvpn[3325853]: TUN/TAP device proton0 opened
Feb 20 08:39:01 ArchBeast nm-openvpn[3325853]: /usr/lib/nm-openvpn-service-openvpn-helper --debug 0 3325677 --bus-name org.freedesktop.NetworkManager.openvpn.Connection_140 --tun -- proton0 1500 0 10.96.0.29 255.255.0.0 init
Feb 20 08:39:01 ArchBeast NetworkManager[579]: <info>  [1708398541.0827] manager: (proton0): new Tun device (/org/freedesktop/NetworkManager/Devices/88)
Feb 20 08:39:01 ArchBeast nm-openvpn[3325853]: Initialization Sequence Completed
Feb 20 08:39:10 ArchBeast NetworkManager[579]: <warn>  [1708398550.0439] platform-linux: do-add-ip4-address[106: 10.96.0.20/16]: failure 19 (No such device - ipv4: Device not found)
Feb 20 08:39:10 ArchBeast NetworkManager[579]: <warn>  [1708398550.0441] l3cfg[01e4c419cb239cb3,ifindex=106]: unable to configure IPv4 route: type unicast 10.96.0.0/16 dev 106 metric 50 mss 0 rt-src rt-kernel scope link pref-src 10.96.0.20
Feb 20 08:39:10 ArchBeast NetworkManager[579]: <warn>  [1708398550.0442] platform-linux: do-add-ip6-address[106: fd54:20a4:d33b:b10c:c1f:0:60:14]: failure 19 (No such device - ipv6: Unable to find the interface)
Feb 20 09:00:16 ArchBeast NetworkManager[579]: <info>  [1708399816.6190] dhcp4 (wlp2s0): state changed new lease, address=192.168.1.7
Feb 20 09:36:03 ArchBeast nm-openvpn[3325853]: AUTH: Received control message: AUTH_FAILED
Feb 20 09:36:03 ArchBeast nm-openvpn[3325853]: SIGUSR1[soft,auth-failure] received, process restarting

After Initialization Sequence Completed it randomly show auth failed and when try to reconenct (received, process restarting) it just stuck on loop for asking passwords, and in logs it just try to reconnect and exactly after 2 minute mean exactly after 120 seconds it connects and works.

This disconnection happnes anytime, like it might not happen for 5 hrs and sometimes it happned after 5 minute

Unable to get my personal access token

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

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

  • [x ] I have searched open and closed issues for duplicates
  • [x ] This isn't a feature request
  • [x ] This is not a report about my app not working as expected

I tried to follow instructions at https://github.com/ProtonVPN/proton-vpn-gtk-app#proton-package-registry but I am unable to reach
https://gitlab.protontech.ch/help/user/profile/personal_access_tokens.md
(seems to be a broken link)

I cannot reach https://gitlab.protontech.ch/
Has this link changed?

The reason I am trying to build the VPN GTK app is because it seems protonvpn from AUR is outdated. I cannot find a tarball, deb, rpm package to install the VPN.

Honestly, it's a pain to deal with installation issues and your web page https://protonvpn.com/download-linux is not user friendly at all. It only takes you from on link to another and goes back in circles. The AUR package is outdated right now, as far as I understand.

At least provide a correct way to install the programs from source. I'm a paying subscriber and this is making me regret my choice.


Systemctl autostart protonvpn-cli without call to login

Hi @natanjunges, don't you have to call protonvpn-cli login first? Also, how do you specify the password as it isn't an argument to the command?

Hey @toxpal
So to answer to some of your questions:

  1. It is planned, but until then you could use something that linux already offers out-of-the box, a .service configuration within --user space. Also not sure by what you mean about the killswitch, could you please provide more details ?

How exactly would one go about doing this? I currently have Protonvpn configured to start on boot using Manjaro's Autostart feature, however the VPN will not automatically turn on, and must be activated manually. Is there a way to auto-activate the connection in addition to simply auto-opening the application? If not, is this feature in the works?

I created a systemd service in user space, as @calexandru2018 mentioned. It works quite well, it waits for network-online.target (it needs NetworkManager to be fully initialized), connects automatically, opens the GUI and disconnects automatically on logout. It also restarts itself in case it fails to start.

[Unit]
Description=ProtonVPN autostart

[Service]
Type=oneshot
RemainAfterExit=yes
# Waits until it is online. It is required because system targets cannot be used in user services.
ExecStartPre=sh -c "until systemctl is-active network-online.target; do sleep 1; done"
ExecStart=protonvpn-cli c -f
ExecStartPost=-sh -c "protonvpn &"
TimeoutStartSec=30
ExecStop=protonvpn-cli d
Restart=on-failure

[Install]
WantedBy=default.target

To use it, just save it in ~/.config/systemd/user/protonvpn-autostart.service, reload the systemd daemon with systemctl --user daemon-reload and enable it with systemctl --user enable protonvpn-autostart.

I could not get it working reliably with Kill Switch enabled at first, but the solution from ProtonVPN/linux-cli#44 (comment) seems to have worked. Just insert these two lines after RemainAfterExit=yes:

ExecStartPre=-protonvpn-cli ks --off
ExecStartPre=-protonvpn-cli ks --on

Then reload the systemd daemon with systemctl --user daemon-reload.

Originally posted by @natanjunges in ProtonVPN/linux-app#4 (comment)

Why isn't the ProtonVPN on flathub verified?

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Alot of apps on flathub are now being verified by their developers since Flathub introduces verification. ProtonVPN aren't verified. Why isn't it?

Tags are being removed frequently

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

As an AUR maintainer I'm using tags here, and they are being created removed randomly, can I rely on them or not?

Wireguard Technical Questions

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

What is the status of Wireguard implementation and where are the roadblocks? If there is a timeline page for it, I have not found it.

My main concern is that the GTK app for ProtonVPN already utilizes the OpenVPN structure built into Linux. Why is the Wireguard implementation within Linux not being used as well?

I just want to know how I can potentially contribute.

Proton-vpn not working on manjaro anymore

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Since the latest update, the app is not working on manjaro ( it was working fine until now )

I'm getting a "ModuleNotFoundError" when I try to launch it.

Any idea on what the issue is?

Complete logs from installing all the packages needed ( yay did all of it )

~ took 54s
❯ protonvpn-app
Traceback (most recent call last):
  File "/usr/bin/protonvpn-app", line 33, in <module>
    sys.exit(load_entry_point('proton-vpn-gtk-app==4.3.0', 'console_scripts', 'protonvpn-app')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/bin/protonvpn-app", line 25, in importlib_load_entry_point
    return next(matches).load()
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/importlib/metadata/__init__.py", line 205, in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 995, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/__init__.py", line 33, in <module>
    from proton.vpn import logging  # pylint: disable=C0413 # noqa: E402
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/logging/__init__.py", line 26, in <module>
    from proton.utils.environment import VPNExecutionEnvironment
ModuleNotFoundError: No module named 'proton.utils'

Fedora 40 Killswitch Problem

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Distro: Fedora Linux 40
DE: KDE Plasma 6
Kernel: 6.8.9-300.fc40.x86_64

When I start proton-vpn-gtk-app from the terminal, I get an error about killswitch. The output is as follows:

Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/proton/vpn/killswitch/interface/killswitch.py", line 57, in get
    return Loader.get("killswitch", class_name=class_name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/loader/loader.py", line 113, in get
    raise RuntimeError(f"Loader: couldn't find an acceptable implementation for {type_name}.")
RuntimeError: Loader: couldn't find an acceptable implementation for killswitch.

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

Traceback (most recent call last):
  File "/usr/bin/protonvpn-app", line 33, in <module>
    sys.exit(load_entry_point('proton-vpn-gtk-app==4.3.1', 'console_scripts', 'protonvpn-app')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/__main__.py", line 34, in main
    controller = Controller.get(executor)
                 ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/controller.py", line 59, in get
    executor.submit(controller.initialize_vpn_connector).result()
  File "/usr/lib64/python3.12/concurrent/futures/_base.py", line 456, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.12/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3.12/site-packages/proton/vpn/app/gtk/controller.py", line 99, 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 56, in get_vpn_connector
    vpn_connector = await VPNConnector.get_instance(settings)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/connection/vpnconnector.py", line 64, in get_instance
    cls._instance = VPNConnector(settings, kill_switch=kill_switch)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/connection/vpnconnector.py", line 86, in __init__
    self._kill_switch = kill_switch or KillSwitch.get()()
                                       ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/proton/vpn/killswitch/interface/killswitch.py", line 59, in get
    raise MissingKillSwitchBackendDetails(excp) from excp
proton.vpn.killswitch.interface.exceptions.MissingKillSwitchBackendDetails: Loader: couldn't find an acceptable implementation for killswitch.

Will you add an OpenRC support?

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

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

  • [x ] I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Will you add an OpenRC and others (dinit, runit) support?

Fail to start if app crash or get killed unexpected last time

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

Step to reproduce:

  1. Start ProtonVPN GTK app
  2. Connect to a server
  3. Kill the app process or simply shutdown your system (this can happen when your laptop run out of battery)
  4. Try to start ProtonVPN again

Expected result:

The app should start with no problem

Actual result:

The app failed to start.

The reason is that when the ProtonVPN process was killed unexpectedly, here is no chance for it to clean up created NetworkManager connections for killswitch. Next time when you start ProtonVPN, it fails to recreate it.

截图_20240323_201804

2024-03-24T12:44:22.890956 | proton.vpn.connection.vpnconnector:238 | INFO | CONN:STATE_CHANGED | Disconnected (initial state)
Traceback (most recent call last):
  File "/usr/bin/protonvpn-app", line 33, in <module>
    sys.exit(load_entry_point('proton-vpn-gtk-app==4.2.0', 'console_scripts', 'protonvpn-app')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/__main__.py", line 34, in main
    controller = Controller.get(executor)
                 ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/controller.py", line 56, in get
    executor.submit(controller.initialize_vpn_connector).result()
  File "/usr/lib64/python3.11/concurrent/futures/_base.py", line 456, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.11/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/controller.py", line 89, in initialize_vpn_connector
    self._connector = await self._api.get_vpn_connector()
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/core/api.py", line 54, in get_vpn_connector
    vpn_connector = await VPNConnector.get_instance(settings)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/connection/vpnconnector.py", line 66, in get_instance
    await cls._instance.initialize_state(initial_state)
  File "/usr/lib/python3.11/site-packages/proton/vpn/connection/vpnconnector.py", line 149, in initialize_state
    await self._update_state(state)
  File "/usr/lib/python3.11/site-packages/proton/vpn/connection/vpnconnector.py", line 250, in _update_state
    new_event = await state_tasks
                ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/connection/states.py", line 176, in run_tasks
    await self.context.kill_switch.disable()
  File "/usr/lib/python3.11/site-packages/proton/vpn/killswitch/backend/linux/networkmanager/nmkillswitch.py", line 77, in disable
    await self._ks_handler.remove_full_killswitch_connection()
  File "/usr/lib/python3.11/site-packages/proton/vpn/killswitch/backend/linux/networkmanager/killswitch_connection_handler.py", line 202, in remove_full_killswitch_connection
    await self._remove_connection(_get_connection_id(permanent=False))
  File "/usr/lib/python3.11/site-packages/proton/vpn/killswitch/backend/linux/networkmanager/killswitch_connection_handler.py", line 228, in _remove_connection
    await _wrap_future(self.nm_client.remove_connection_async(connection))
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/killswitch/backend/linux/networkmanager/nmclient.py", line 230, in remove_connection_async
    self._run_on_glib_loop_thread(_remove_connection_async).result()
  File "/usr/lib64/python3.11/concurrent/futures/_base.py", line 456, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.11/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3.11/site-packages/proton/vpn/killswitch/backend/linux/networkmanager/nmclient.py", line 118, in wrapper
    future.set_result(function(*args, **kwargs))
                      ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/proton/vpn/killswitch/backend/linux/networkmanager/nmclient.py", line 217, in _remove_connection_async
    handler_id = device.connect("state-changed", _on_interface_state_changed)
                 ^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'connect'

Latest update breaks

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

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

The following packages have unmet dependencies:
python3-proton-vpn-api-core : Breaks: proton-vpn-gtk-app (< 4.1.2) but 4.1.0 is to be installed
E: Unable to correct problems, you have held broken packages.

Review PR? Keyring issue

Hi,

I've submitted ProtonVPN/python-proton-keyring-linux#1 over a month ago, and was told by @calexandru2018 that it was being discussed internally. Can I have some kind of update on this, even if it's been declined? This has been a very frustrating bug that impacts all my computers constantly, and likely causes issues with others as well. Again, any response would be fine, just please tell me some update.

Adding a simple toggle to enable auto connect to fastest p2p/stream servers only

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

  • I have searched open and closed issues for duplicates
  • This isn't a feature request
  • This is not a report about my app not working as expected

I'm sorry if this bothers you that this issue is a feature request (or if the feature was already discussed here), but I feel this is the only way i can get heard!

the V4 linux app is incomplete.

With the V3 app, i could:

use an autostart bash script that connects me to the fastest p2p server quick connect to the fastest p2p server
enable a permanent killswitch

If you can at least add a p2p/stream toggle for auto connect, v4 will officially be a full fledged replacement for v3 when this is done.

edited! 👍

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.