Skip to content

Commit 46b3fde

Browse files
bmarteljombooth
andauthored
fix: LEAP-38: Rework secret key generation to use data volume more reliably (#4716)
fix: LEAP-38: rework secret key generation to use data volume more reliably (#4713) * fix: LEAP-38: rework secret key generation to use data volume more reliably * remove key name param * Update label_studio/core/utils/secret_key.py --------- Co-authored-by: Jo Booth <[email protected]>
1 parent 40c725a commit 46b3fde

File tree

4 files changed

+33
-30
lines changed

4 files changed

+33
-30
lines changed

label_studio/core/settings/base.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,9 @@
7474
if not logging.getLogger().hasHandlers():
7575
logging.basicConfig(level=logging.DEBUG, format='%(message)s')
7676

77-
from label_studio.core.utils.io import get_data_dir, generate_key_if_missing
77+
from label_studio.core.utils.io import get_data_dir
7878
from label_studio.core.utils.params import get_bool_env, get_env, get_env_list_int
79+
from label_studio.core.utils.secret_key import generate_secret_key_if_missing
7980

8081
logger = logging.getLogger(__name__)
8182
SILENCED_SYSTEM_CHECKS = []
@@ -104,9 +105,6 @@
104105

105106
INTERNAL_PORT = '8080'
106107

107-
# SECURITY WARNING: keep the secret key used in production secret!
108-
SECRET_KEY = generate_key_if_missing('SECRET_KEY')
109-
110108
# SECURITY WARNING: don't run with debug turned on in production!
111109
DEBUG = get_bool_env('DEBUG', True)
112110
DEBUG_MODAL_EXCEPTIONS = get_bool_env('DEBUG_MODAL_EXCEPTIONS', True)
@@ -119,6 +117,9 @@
119117
os.makedirs(BASE_DATA_DIR, exist_ok=True)
120118
logger.info('=> Database and media directory: %s', BASE_DATA_DIR)
121119

120+
# SECURITY WARNING: keep the secret key used in production secret!
121+
SECRET_KEY = generate_secret_key_if_missing(BASE_DATA_DIR)
122+
122123
# Databases
123124
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
124125
DJANGO_DB_MYSQL = 'mysql'

label_studio/core/utils/io.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
from contextlib import contextmanager
1717
from tempfile import mkstemp, mkdtemp
1818

19-
from django.conf import settings
20-
from django.core.management.utils import get_random_secret_key
21-
from label_studio.core.utils.params import env, env_file
2219
from appdirs import user_config_dir, user_data_dir, user_cache_dir
2320

2421
# full path import results in unit test failures
@@ -210,20 +207,3 @@ def validate_upload_url(url, block_local_urls=True):
210207
for subnet in local_subnets:
211208
if ipaddress.ip_address(ip) in ipaddress.ip_network(subnet):
212209
raise InvalidUploadUrlError
213-
214-
def generate_key_if_missing(key):
215-
value = env.str(key, "")
216-
217-
if value == "":
218-
print(f'Warning: {key} not found in environment variables will generate a random key.')
219-
value = get_random_secret_key()
220-
try:
221-
with open(env_file, 'a') as f:
222-
f.write(f'\n{key}={value}\n')
223-
except Exception as e:
224-
print(f'Warning: failed to write {key} to .env file: {e}, new key will be regenerated on every server restart. If this key is used for signing, it will invalidate all existing sessions or tokens. Please set {key} in your environment variables to avoid this warning.')
225-
226-
os.environ[key] = value
227-
228-
return value
229-

label_studio/core/utils/params.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
import os
2-
import environ
32

43
from rest_framework.exceptions import ValidationError
54

65

7-
env = environ.Env()
8-
data_dir = os.environ.get('LABEL_STUDIO_DATA_DIR', os.path.join(os.path.dirname(__file__), '..', '..', '..', 'data'))
9-
env_file = os.path.join(data_dir, '.env')
10-
environ.Env.read_env(env_file)
11-
126
def cast_bool_from_str(value):
137
if isinstance(value, str):
148
if value.lower() in ['true', 'yes', 'on', '1']:
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import logging
2+
import os
3+
import environ
4+
from django.core.management.utils import get_random_secret_key
5+
6+
7+
logger = logging.getLogger(__name__)
8+
9+
10+
def generate_secret_key_if_missing(data_dir: str) -> str:
11+
env_key = 'SECRET_KEY'
12+
env = environ.Env()
13+
env_filepath = os.path.join(data_dir, '.env')
14+
environ.Env.read_env(env_filepath)
15+
16+
if existing_secret := env.str(env_key, ""):
17+
return existing_secret
18+
19+
logger.warning(f'Warning: {env_key} not found in environment variables. Will generate a random key.')
20+
new_secret = get_random_secret_key()
21+
try:
22+
with open(env_filepath, 'a') as f:
23+
f.write(f'\n{env_key}={new_secret}\n') # nosec
24+
except Exception as e:
25+
logger.warning(f'Warning: failed to write {env_key} to .env file: {e}, new key will be regenerated on every server restart. If this key is used for signing, it will invalidate all existing sessions or tokens. Please set {key} in your environment variables to avoid this warning.')
26+
27+
os.environ[env_key] = new_secret
28+
return new_secret

0 commit comments

Comments
 (0)