Skip to content

Commit 5cfabb6

Browse files
fix(#367): decode server feature bit flags
1 parent 568dc77 commit 5cfabb6

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

protonvpn_cli/connection.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# protonvpn-cli Functions
1515
from .logger import logger
1616
from .utils import (
17-
check_init, pull_server_data, is_connected,
17+
check_init, get_server_features, pull_server_data, is_connected,
1818
get_servers, get_server_value, get_config_value,
1919
set_config_value, get_ip_info, get_country_name,
2020
get_fastest_server, check_update, get_default_nic,
@@ -412,14 +412,12 @@ def status():
412412
ip, isp = get_ip_info()
413413

414414
# Collect Information
415-
all_features = {0: "Normal", 1: "Secure-Core", 2: "Tor", 4: "P2P"}
416-
417415
logger.debug("Collecting status information")
418416
country_code = get_server_value(connected_server, "ExitCountry", servers)
419417
country = get_country_name(country_code)
420418
city = get_server_value(connected_server, "City", servers)
421419
load = get_server_value(connected_server, "Load", servers)
422-
feature = get_server_value(connected_server, "Features", servers)
420+
features = get_server_features(connected_server, servers)
423421
last_connection = get_config_value("metadata", "connected_time")
424422
connection_time = time.time() - int(last_connection)
425423

@@ -441,7 +439,7 @@ def status():
441439
+ "Time: {0}\n".format(connection_time)
442440
+ "IP: {0}\n".format(ip)
443441
+ "Server: {0}\n".format(connected_server)
444-
+ "Features: {0}\n".format(all_features[feature])
442+
+ "Features: {0}\n".format(', '.join(features))
445443
+ "Protocol: {0}\n".format(connected_protocol.upper())
446444
+ "Kill Switch: {0}\n".format(killswitch_status)
447445
+ "Country: {0}\n".format(country)

protonvpn_cli/constants.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
CONFIG_DIR = os.path.join(os.path.expanduser("~{0}".format(USER)), ".pvpn-cli")
1515
CONFIG_FILE = os.path.join(CONFIG_DIR, "pvpn-cli.cfg")
1616
SERVER_INFO_FILE = os.path.join(CONFIG_DIR, "serverinfo.json")
17+
SERVER_FEATURES = {
18+
1: "Secure-Core",
19+
2: "Tor",
20+
4: "P2P",
21+
8: "Streaming",
22+
}
1723
SPLIT_TUNNEL_FILE = os.path.join(CONFIG_DIR, "split_tunnel.txt")
1824
OVPN_FILE = os.path.join(CONFIG_DIR, "connect.ovpn")
1925
PASSFILE = os.path.join(CONFIG_DIR, "pvpnpass")

protonvpn_cli/utils.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from .logger import logger
1717
# Constants
1818
from .constants import (
19-
USER, CONFIG_FILE, SERVER_INFO_FILE, SPLIT_TUNNEL_FILE,
19+
USER, CONFIG_FILE, SERVER_INFO_FILE, SERVER_FEATURES, SPLIT_TUNNEL_FILE,
2020
VERSION, OVPN_FILE, CLIENT_SUFFIX
2121
)
2222
import distro
@@ -115,12 +115,19 @@ def get_servers():
115115
# Sort server IDs by Tier
116116
return [server for server in servers if server["Tier"] <= user_tier and server["Status"] == 1] # noqa
117117

118-
119118
def get_server_value(servername, key, servers):
120119
"""Return the value of a key for a given server."""
121120
value = [server[key] for server in servers if server['Name'] == servername]
122121
return value[0]
123122

123+
def get_server_features(servername, servers):
124+
"""Decode server feature bit flags and return feature strings in list"""
125+
feat = int(get_server_value(servername, "Features", servers))
126+
server_features = []
127+
for bit_flag in SERVER_FEATURES:
128+
if (feat & bit_flag):
129+
server_features.append(SERVER_FEATURES[bit_flag])
130+
return server_features
124131

125132
def get_config_value(group, key):
126133
"""Return specific value from CONFIG_FILE as string"""

0 commit comments

Comments
 (0)