Skip to content

Commit 3ef20db

Browse files
authored
Merge pull request #42 from aarranz/feature/configurability
[WIP] Allow to configure some basic Django settings through environment variables
2 parents 9a9801a + 92afa19 commit 3ef20db

3 files changed

Lines changed: 111 additions & 11 deletions

File tree

1.3/settings.py

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@
118118
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
119119
# )
120120

121-
# Make this unique, and don't share it with anybody.
121+
# Default value, this value must be overwritten using one of the following
122+
# environment variables: SECRET_KEY or SECRET_KEY_FILE
122123
SECRET_KEY = '4&0+qo=m4yk!7hohzh&xsw=i&g_7t88*-9_^j(xi!fzm9zz^7l'
123124

124125
ROOT_URLCONF = 'wirecloud_instance.urls'
@@ -131,24 +132,68 @@
131132

132133
## String settings
133134
STRING_SETTINGS = (
135+
"CSRF_COOKIE_NAME",
136+
"EMAIL_HOST",
137+
"EMAIL_HOST_PASSWORD",
138+
"EMAIL_HOST_USER",
134139
"FIWARE_IDM_SERVER",
135140
"FIWARE_IDM_PUBLIC_URL",
136-
"SOCIAL_AUTH_FIWARE_KEY",
137-
"SOCIAL_AUTH_FIWARE_SECRET",
138141
"KEYCLOAK_SERVER",
139142
"KEYCLOAK_REALM",
140143
"KEYCLOAK_KEY",
144+
"SECRET_KEY",
145+
"SESSION_COOKIE_NAME",
146+
"SOCIAL_AUTH_FIWARE_KEY",
147+
"SOCIAL_AUTH_FIWARE_SECRET",
148+
"SOCIAL_AUTH_KEYCLOAK_KEY",
149+
"SOCIAL_AUTH_KEYCLOAK_SECRET",
150+
)
151+
SENSITIVE_SETTINGS = (
152+
"EMAIL_HOST_PASSWORD",
153+
"KEYCLOAK_KEY",
154+
"SECRET_KEY",
155+
"SOCIAL_AUTH_FIWARE_KEY",
156+
"SOCIAL_AUTH_FIWARE_SECRET",
141157
"SOCIAL_AUTH_KEYCLOAK_KEY",
142158
"SOCIAL_AUTH_KEYCLOAK_SECRET",
143159
)
144160
for setting in STRING_SETTINGS:
145-
value = os.environ.get(setting, "").strip()
161+
if setting in SENSITIVE_SETTINGS and (setting + '_FILE') in os.environ:
162+
filename = os.environ[setting + '_FILE']
163+
try:
164+
with open(filename, 'rb') as f:
165+
value = f.read()
166+
except IOError as error:
167+
print("Error reading the file ({}) pointed out by {}: {}".format(setting + '_FILE', filename, error))
168+
print("Ignoring it")
169+
value = os.environ.get(setting, "").strip()
170+
else:
171+
value = os.environ.get(setting, "").strip()
146172
if value != "":
147173
locals()[setting] = value
148174

175+
## Number settings
176+
NUMBER_SETTINGS = (
177+
"CSRF_COOKIE_AGE",
178+
"EMAIL_PORT",
179+
"SESSION_COOKIE_AGE",
180+
)
181+
for setting in NUMBER_SETTINGS:
182+
value = os.environ.get(setting, "").strip()
183+
try:
184+
locals()[setting] = int(value)
185+
except ValueError:
186+
pass
187+
149188
## Boolean settings
150189
BOOLEAN_SETTINGS = (
190+
"CSRF_COOKIE_HTTPONLY",
191+
"CSRF_COOKIE_SECURE",
192+
"EMAIL_USE_TLS",
193+
"EMAIL_USE_SSL",
151194
"KEYCLOAK_GLOBAL_ROLE",
195+
"SESSION_COOKIE_HTTPONLY",
196+
"SESSION_COOKIE_SECURE",
152197
)
153198
for setting in BOOLEAN_SETTINGS:
154199
value = os.environ.get(setting, "").strip()
@@ -158,7 +203,7 @@
158203

159204
# FIWARE & Keycloak configuration
160205
IDM_AUTH = 'fiware' if "FIWARE_IDM_SERVER" in locals() and "SOCIAL_AUTH_FIWARE_KEY" in locals() and "SOCIAL_AUTH_FIWARE_SECRET" in locals() else None
161-
IDM_AUTH = 'keycloak' if "KEYCLOAK_IDM_SERVER" in locals() and "KEYCLOAK_REALM" in locals() and "KEYCLOAK_KEY" in locals() and "SOCIAL_AUTH_KEYCLOAK_KEY" in locals() and "SOCIAL_AUTH_KEYCLOAK_SECRET" in locals() else IDM_AUTH
206+
IDM_AUTH = 'keycloak' if "KEYCLOAK_SERVER" in locals() and "KEYCLOAK_REALM" in locals() and "KEYCLOAK_KEY" in locals() and "SOCIAL_AUTH_KEYCLOAK_KEY" in locals() and "SOCIAL_AUTH_KEYCLOAK_SECRET" in locals() else IDM_AUTH
162207

163208
if IDM_AUTH == 'fiware':
164209
INSTALLED_APPS += (

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ The following environment variables are also honored for configuring your WireCl
3131
mode. Debug mode should be enabled for running WireCloud in standalone mode)
3232
- `-e LOGLEVEL=...` (defaults to "INFO")
3333
- `-e ALLOWED_HOSTS=...` (defaults to "*", whitespace whitespace-separated list
34-
of allowed hosts. See [django documentation][ALLOWED_HOSTS] for more
34+
of allowed hosts. See [Django documentation][ALLOWED_HOSTS] for more
3535
details)
3636
- `-e DEFAULT_LANGUAGE=...` (defaults to "browser", see
3737
[documentation][DEFAULT_LANGUAGE] for more details)
@@ -68,12 +68,22 @@ The following environment variables are also honored for configuring your WireCl
6868
- `-e SOCIAL_AUTH_KEYCLOAK_KEY=...` (defaults to nothing)
6969
- `-e SOCIAL_AUTH_KEYCLOAK_SECRET=...` (defaults to nothing)
7070

71+
In addition to those environment variables, this docker image also allows you to
72+
configure the following Django settings using environment variables with the
73+
same name: `CSRF_COOKIE_AGE`, `CSRF_COOKIE_HTTPONLY`, `CSRF_COOKIE_NAME`,
74+
`CSRF_COOKIE_SECURE`, `EMAIL_HOST`, `EMAIL_HOST_PASSWORD`, `EMAIL_PORT`,
75+
`EMAIL_HOST_USER`, `EMAIL_USE_SSL`, `EMAIL_USE_TLS`, `SECRET_KEY`,
76+
`SESSION_COOKIE_AGE`, `SESSION_COOKIE_NAME`, `SESSION_COOKIE_HTTPONLY` and
77+
`SESSION_COOKIE_SECURE`. See [Django documentation](DJANGO_SETTINGS) for more
78+
details.
79+
7180
When running WireCloud with TLS behind a reverse proxy such as Apache/NGINX
7281
which is responsible for doing TLS termination, be sure to set
7382
the `X-Forwarded-Proto`, `X-Forwarded-Host` and `X-Forwarded-Port` headers
7483
appropriately.
7584

7685

86+
[DJANGO_SETTINGS]: https://docs.djangoproject.com/en/2.1/ref/settings/
7787
[ALLOWED_HOSTS]: https://docs.djangoproject.com/en/2.1/ref/settings/#allowed-hosts
7888
[DEFAULT_LANGUAGE]: https://wirecloud.readthedocs.io/en/stable/installation_guide/#default_language
7989
[LANGUAGE_CODE]: https://docs.djangoproject.com/en/2.1/ref/settings/#language-code

dev/settings.py

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@
118118
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
119119
# )
120120

121-
# Make this unique, and don't share it with anybody.
121+
# Default value, this value must be overwritten using one of the following
122+
# environment variables: SECRET_KEY or SECRET_KEY_FILE
122123
SECRET_KEY = '4&0+qo=m4yk!7hohzh&xsw=i&g_7t88*-9_^j(xi!fzm9zz^7l'
123124

124125
ROOT_URLCONF = 'wirecloud_instance.urls'
@@ -130,24 +131,68 @@
130131

131132
## String settings
132133
STRING_SETTINGS = (
134+
"CSRF_COOKIE_NAME",
135+
"EMAIL_HOST",
136+
"EMAIL_HOST_PASSWORD",
137+
"EMAIL_HOST_USER",
133138
"FIWARE_IDM_SERVER",
134139
"FIWARE_IDM_PUBLIC_URL",
135-
"SOCIAL_AUTH_FIWARE_KEY",
136-
"SOCIAL_AUTH_FIWARE_SECRET",
137140
"KEYCLOAK_SERVER",
138141
"KEYCLOAK_REALM",
139142
"KEYCLOAK_KEY",
143+
"SECRET_KEY",
144+
"SESSION_COOKIE_NAME",
145+
"SOCIAL_AUTH_FIWARE_KEY",
146+
"SOCIAL_AUTH_FIWARE_SECRET",
147+
"SOCIAL_AUTH_KEYCLOAK_KEY",
148+
"SOCIAL_AUTH_KEYCLOAK_SECRET",
149+
)
150+
SENSITIVE_SETTINGS = (
151+
"EMAIL_HOST_PASSWORD",
152+
"KEYCLOAK_KEY",
153+
"SECRET_KEY",
154+
"SOCIAL_AUTH_FIWARE_KEY",
155+
"SOCIAL_AUTH_FIWARE_SECRET",
140156
"SOCIAL_AUTH_KEYCLOAK_KEY",
141157
"SOCIAL_AUTH_KEYCLOAK_SECRET",
142158
)
143159
for setting in STRING_SETTINGS:
144-
value = os.environ.get(setting, "").strip()
160+
if setting in SENSITIVE_SETTINGS and (setting + '_FILE') in os.environ:
161+
filename = os.environ[setting + '_FILE']
162+
try:
163+
with open(filename, 'rb') as f:
164+
value = f.read()
165+
except IOError as error:
166+
print("Error reading the file ({}) pointed out by {}: {}".format(setting + '_FILE', filename, error))
167+
print("Ignoring it")
168+
value = os.environ.get(setting, "").strip()
169+
else:
170+
value = os.environ.get(setting, "").strip()
145171
if value != "":
146172
locals()[setting] = value
147173

174+
## Number settings
175+
NUMBER_SETTINGS = (
176+
"CSRF_COOKIE_AGE",
177+
"EMAIL_PORT",
178+
"SESSION_COOKIE_AGE",
179+
)
180+
for setting in NUMBER_SETTINGS:
181+
value = os.environ.get(setting, "").strip()
182+
try:
183+
locals()[setting] = int(value)
184+
except ValueError:
185+
pass
186+
148187
## Boolean settings
149188
BOOLEAN_SETTINGS = (
189+
"CSRF_COOKIE_HTTPONLY",
190+
"CSRF_COOKIE_SECURE",
191+
"EMAIL_USE_TLS",
192+
"EMAIL_USE_SSL",
150193
"KEYCLOAK_GLOBAL_ROLE",
194+
"SESSION_COOKIE_HTTPONLY",
195+
"SESSION_COOKIE_SECURE",
151196
)
152197
for setting in BOOLEAN_SETTINGS:
153198
value = os.environ.get(setting, "").strip()
@@ -157,7 +202,7 @@
157202

158203
# FIWARE & Keycloak configuration
159204
IDM_AUTH = 'fiware' if "FIWARE_IDM_SERVER" in locals() and "SOCIAL_AUTH_FIWARE_KEY" in locals() and "SOCIAL_AUTH_FIWARE_SECRET" in locals() else None
160-
IDM_AUTH = 'keycloak' if "KEYCLOAK_IDM_SERVER" in locals() and "KEYCLOAK_REALM" in locals() and "KEYCLOAK_KEY" in locals() and "SOCIAL_AUTH_KEYCLOAK_KEY" in locals() and "SOCIAL_AUTH_KEYCLOAK_SECRET" in locals() else IDM_AUTH
205+
IDM_AUTH = 'keycloak' if "KEYCLOAK_SERVER" in locals() and "KEYCLOAK_REALM" in locals() and "KEYCLOAK_KEY" in locals() and "SOCIAL_AUTH_KEYCLOAK_KEY" in locals() and "SOCIAL_AUTH_KEYCLOAK_SECRET" in locals() else IDM_AUTH
161206

162207
if IDM_AUTH == 'fiware':
163208
INSTALLED_APPS += (

0 commit comments

Comments
 (0)