Skip to content

Commit 98a7eaa

Browse files
committed
✨(backend) support _FILE environment variables for secrets
1 parent 96f6aee commit 98a7eaa

File tree

1 file changed

+37
-9
lines changed

1 file changed

+37
-9
lines changed

src/backend/impress/settings.py

+37-9
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,34 @@ def get_release():
3737
except (FileNotFoundError, KeyError):
3838
return "NA" # Default: not available
3939

40+
class SecretFileValue(values.Value):
41+
file_suffix = 'FILE'
42+
43+
def setup(self, name):
44+
value = self.default
45+
if self.environ:
46+
full_environ_name = self.full_environ_name(name)
47+
full_environ_name_file = f'{full_environ_name}_{self.file_suffix}'
48+
if full_environ_name_file in os.environ:
49+
filename = os.environ[full_environ_name_file]
50+
if not os.path.exists(filename):
51+
raise ValueError('Path {0!r} does not exist.'.format(filename))
52+
try:
53+
file = open(filename, 'r')
54+
value = self.to_python(file.read().removesuffix("\n"))
55+
file.close()
56+
except:
57+
raise ValueError('Path {0!r} cannot be read.'.format(filename))
58+
elif full_environ_name in os.environ:
59+
value = self.to_python(os.environ[full_environ_name])
60+
elif self.environ_required:
61+
raise ValueError('Value {0!r} is required to be set as the '
62+
'environment variable {1!r} or {2!r}'
63+
.format(name, full_environ_name_file, full_environ_name))
64+
self.value = value
65+
return value
66+
67+
4068

4169
class Base(Configuration):
4270
"""
@@ -65,7 +93,7 @@ class Base(Configuration):
6593

6694
# Security
6795
ALLOWED_HOSTS = values.ListValue([])
68-
SECRET_KEY = values.Value(None)
96+
SECRET_KEY = SecretFileValue(None)
6997
SERVER_TO_SERVER_API_TOKENS = values.ListValue([])
7098

7199
# Application definition
@@ -84,7 +112,7 @@ class Base(Configuration):
84112
"impress", environ_name="DB_NAME", environ_prefix=None
85113
),
86114
"USER": values.Value("dinum", environ_name="DB_USER", environ_prefix=None),
87-
"PASSWORD": values.Value(
115+
"PASSWORD": SecretFileValue(
88116
"pass", environ_name="DB_PASSWORD", environ_prefix=None
89117
),
90118
"HOST": values.Value(
@@ -122,10 +150,10 @@ class Base(Configuration):
122150
AWS_S3_ENDPOINT_URL = values.Value(
123151
environ_name="AWS_S3_ENDPOINT_URL", environ_prefix=None
124152
)
125-
AWS_S3_ACCESS_KEY_ID = values.Value(
153+
AWS_S3_ACCESS_KEY_ID = SecretFileValue(
126154
environ_name="AWS_S3_ACCESS_KEY_ID", environ_prefix=None
127155
)
128-
AWS_S3_SECRET_ACCESS_KEY = values.Value(
156+
AWS_S3_SECRET_ACCESS_KEY = SecretFileValue(
129157
environ_name="AWS_S3_SECRET_ACCESS_KEY", environ_prefix=None
130158
)
131159
AWS_S3_REGION_NAME = values.Value(
@@ -378,7 +406,7 @@ class Base(Configuration):
378406
EMAIL_BRAND_NAME = values.Value(None)
379407
EMAIL_HOST = values.Value(None)
380408
EMAIL_HOST_USER = values.Value(None)
381-
EMAIL_HOST_PASSWORD = values.Value(None)
409+
EMAIL_HOST_PASSWORD = SecretFileValue(None)
382410
EMAIL_LOGO_IMG = values.Value(None)
383411
EMAIL_PORT = values.PositiveIntegerValue(None)
384412
EMAIL_USE_TLS = values.BooleanValue(False)
@@ -401,7 +429,7 @@ class Base(Configuration):
401429
COLLABORATION_API_URL = values.Value(
402430
None, environ_name="COLLABORATION_API_URL", environ_prefix=None
403431
)
404-
COLLABORATION_SERVER_SECRET = values.Value(
432+
COLLABORATION_SERVER_SECRET = SecretFileValue(
405433
None, environ_name="COLLABORATION_SERVER_SECRET", environ_prefix=None
406434
)
407435
COLLABORATION_WS_URL = values.Value(
@@ -470,7 +498,7 @@ class Base(Configuration):
470498
OIDC_RP_CLIENT_ID = values.Value(
471499
"impress", environ_name="OIDC_RP_CLIENT_ID", environ_prefix=None
472500
)
473-
OIDC_RP_CLIENT_SECRET = values.Value(
501+
OIDC_RP_CLIENT_SECRET = SecretFileValue(
474502
None,
475503
environ_name="OIDC_RP_CLIENT_SECRET",
476504
environ_prefix=None,
@@ -565,7 +593,7 @@ class Base(Configuration):
565593
AI_FEATURE_ENABLED = values.BooleanValue(
566594
default=False, environ_name="AI_FEATURE_ENABLED", environ_prefix=None
567595
)
568-
AI_API_KEY = values.Value(None, environ_name="AI_API_KEY", environ_prefix=None)
596+
AI_API_KEY = SecretFileValue(None, environ_name="AI_API_KEY", environ_prefix=None)
569597
AI_BASE_URL = values.Value(None, environ_name="AI_BASE_URL", environ_prefix=None)
570598
AI_MODEL = values.Value(None, environ_name="AI_MODEL", environ_prefix=None)
571599
AI_ALLOW_REACH_FROM = values.Value(
@@ -586,7 +614,7 @@ class Base(Configuration):
586614
}
587615

588616
# Y provider microservice
589-
Y_PROVIDER_API_KEY = values.Value(
617+
Y_PROVIDER_API_KEY = SecretFileValue(
590618
environ_name="Y_PROVIDER_API_KEY",
591619
environ_prefix=None,
592620
)

0 commit comments

Comments
 (0)