From baa7a87efb970a5db277c9905f2e4b881912c514 Mon Sep 17 00:00:00 2001 From: Ben Busby Date: Mon, 12 Apr 2021 16:40:59 -0400 Subject: [PATCH] Fix incorrect config bool env var casting Config boolean environment variables need to be cast to ints, since they are set or unset using 0 and 1. Previously they were interpreted as (pseudocode) read_var(name, default=False), which meant that setting CONFIG_VAR=0 would enable that variable since Python reads environment variables as strings, and '0' is truthy. This updates the previous logic to (still pseudocode) int(read_var(name, default='0')). Fixes #279 --- app/models/config.py | 36 +++++++++++++++++++++++------------- test/conftest.py | 2 +- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/app/models/config.py b/app/models/config.py index b2ebc57..ec2bc79 100644 --- a/app/models/config.py +++ b/app/models/config.py @@ -8,17 +8,19 @@ class Config: self.url = os.getenv('WHOOGLE_CONFIG_URL', '') self.lang_search = os.getenv('WHOOGLE_CONFIG_LANGUAGE', '') self.lang_interface = os.getenv('WHOOGLE_CONFIG_LANGUAGE', '') - self.style = open(os.path.join(app_config['STATIC_FOLDER'], - 'css/variables.css')).read() + self.style = os.getenv( + 'WHOOGLE_CONFIG_STYLE', + open(os.path.join(app_config['STATIC_FOLDER'], + 'css/variables.css')).read()) self.ctry = os.getenv('WHOOGLE_CONFIG_COUNTRY', '') - self.safe = bool(os.getenv('WHOOGLE_CONFIG_SAFE', False)) - self.dark = bool(os.getenv('WHOOGLE_CONFIG_DARK', False)) - self.alts = bool(os.getenv('WHOOGLE_CONFIG_ALTS', False)) - self.nojs = bool(os.getenv('WHOOGLE_CONFIG_NOJS', False)) - self.tor = bool(os.getenv('WHOOGLE_CONFIG_TOR', False)) + self.safe = int(os.getenv('WHOOGLE_CONFIG_SAFE', '0')) + self.dark = int(os.getenv('WHOOGLE_CONFIG_DARK', '0')) + self.alts = int(os.getenv('WHOOGLE_CONFIG_ALTS', '0')) + self.nojs = int(os.getenv('WHOOGLE_CONFIG_NOJS', '0')) + self.tor = int(os.getenv('WHOOGLE_CONFIG_TOR', '0')) self.near = os.getenv('WHOOGLE_CONFIG_NEAR', '') - self.new_tab = bool(os.getenv('WHOOGLE_CONFIG_NEW_TAB', False)) - self.get_only = bool(os.getenv('WHOOGLE_CONFIG_GET_ONLY', False)) + self.new_tab = int(os.getenv('WHOOGLE_CONFIG_NEW_TAB', '0')) + self.get_only = int(os.getenv('WHOOGLE_CONFIG_GET_ONLY', '0')) self.safe_keys = [ 'lang_search', 'lang_interface', @@ -26,10 +28,13 @@ class Config: 'dark' ] - for key, value in kwargs.items(): - if not value: - continue - setattr(self, key, value) + # Skip setting custom config if there isn't one + if kwargs: + for attr in self.get_mutable_attrs(): + if attr not in kwargs.keys(): + setattr(self, attr, '') + else: + setattr(self, attr, kwargs[attr]) def __getitem__(self, name): return getattr(self, name) @@ -43,6 +48,11 @@ class Config: def __contains__(self, name): return hasattr(self, name) + def get_mutable_attrs(self): + return {name: attr for name, attr in self.__dict__.items() + if not name.startswith("__") + and (type(attr) is int or type(attr) is str)} + def is_safe_key(self, key) -> bool: """Establishes a group of config options that are safe to set in the url. diff --git a/test/conftest.py b/test/conftest.py index 34c92c4..3068b32 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -5,7 +5,7 @@ import random demo_config = { 'near': random.choice(['Seattle', 'New York', 'San Francisco']), - 'dark_mode': str(random.getrandbits(1)), + 'dark': str(random.getrandbits(1)), 'nojs': str(random.getrandbits(1)), 'lang_interface': random.choice(app.config['LANGUAGES'])['value'], 'lang_search': random.choice(app.config['LANGUAGES'])['value'],