Skip to content

Commit d05152a

Browse files
author
Matthew Fisher
committed
refactor(controller): move app regex to settings
1 parent 98edce4 commit d05152a

3 files changed

Lines changed: 26 additions & 19 deletions

File tree

controller/api/serializers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import re
88

9+
from django.conf import settings
910
from django.contrib.auth.models import User
1011
from rest_framework import serializers
1112

@@ -184,7 +185,9 @@ def validate_domain(self, attrs, source):
184185
Check that the hostname is valid
185186
"""
186187
value = attrs[source]
187-
match = re.match(r'^(\*\.)?([a-z0-9-]+\.)*([a-z0-9-]+)\.([a-z0-9]{2,})$', value)
188+
match = re.match(
189+
r'^(\*\.)?(' + settings.APP_URL_REGEX + r'\.)*([a-z0-9-]+)\.([a-z0-9]{2,})$',
190+
value)
188191
if not match:
189192
raise serializers.ValidationError(
190193
"Hostname does not look like a valid hostname. "

controller/api/urls.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@
230230

231231
from __future__ import unicode_literals
232232

233+
from django.conf import settings
233234
from django.conf.urls import include
234235
from django.conf.urls import patterns
235236
from django.conf.urls import url
@@ -251,46 +252,47 @@
251252
url(r'^clusters/?',
252253
views.ClusterViewSet.as_view({'get': 'list', 'post': 'create'})),
253254
# application release components
254-
url(r'^apps/(?P<id>[-a-z0-9]+)/config/?',
255+
url(r'^apps/(?P<id>{})/config/?'.format(settings.APP_URL_REGEX),
255256
views.AppConfigViewSet.as_view({'get': 'retrieve', 'post': 'create'})),
256-
url(r'^apps/(?P<id>[-a-z0-9]+)/builds/(?P<uuid>[-_\w]+)/?',
257+
url(r'^apps/(?P<id>{})/builds/(?P<uuid>[-_\w]+)/?'.format(settings.APP_URL_REGEX),
257258
views.AppBuildViewSet.as_view({'get': 'retrieve'})),
258-
url(r'^apps/(?P<id>[-a-z0-9]+)/builds/?',
259+
url(r'^apps/(?P<id>{})/builds/?'.format(settings.APP_URL_REGEX),
259260
views.AppBuildViewSet.as_view({'get': 'list', 'post': 'create'})),
260-
url(r'^apps/(?P<id>[-a-z0-9]+)/releases/v(?P<version>[0-9]+)/?',
261+
url(r'^apps/(?P<id>{})/releases/v(?P<version>[0-9]+)/?'.format(settings.APP_URL_REGEX),
261262
views.AppReleaseViewSet.as_view({'get': 'retrieve'})),
262-
url(r'^apps/(?P<id>[-a-z0-9]+)/releases/rollback/?',
263+
url(r'^apps/(?P<id>{})/releases/rollback/?'.format(settings.APP_URL_REGEX),
263264
views.AppReleaseViewSet.as_view({'post': 'rollback'})),
264-
url(r'^apps/(?P<id>[-a-z0-9]+)/releases/?',
265+
url(r'^apps/(?P<id>{})/releases/?'.format(settings.APP_URL_REGEX),
265266
views.AppReleaseViewSet.as_view({'get': 'list'})),
266267
# application infrastructure
267-
url(r'^apps/(?P<id>[-a-z0-9]+)/containers/(?P<type>[-_\w]+)/(?P<num>[-_\w]+)/?',
268+
url(r'^apps/(?P<id>{})/containers/(?P<type>[-_\w]+)/(?P<num>[-_\w]+)/?'.format(
269+
settings.APP_URL_REGEX),
268270
views.AppContainerViewSet.as_view({'get': 'retrieve'})),
269-
url(r'^apps/(?P<id>[-a-z0-9]+)/containers/(?P<type>[-_\w.]+)/?',
271+
url(r'^apps/(?P<id>{})/containers/(?P<type>[-_\w.]+)/?'.format(settings.APP_URL_REGEX),
270272
views.AppContainerViewSet.as_view({'get': 'list'})),
271-
url(r'^apps/(?P<id>[-a-z0-9]+)/containers/?',
273+
url(r'^apps/(?P<id>{})/containers/?'.format(settings.APP_URL_REGEX),
272274
views.AppContainerViewSet.as_view({'get': 'list'})),
273275
# application domains
274-
url(r'^apps/(?P<id>[-a-z0-9]+)/domains/(?P<domain>[-\._\w]+)/?',
276+
url(r'^apps/(?P<id>{})/domains/(?P<domain>[-\._\w]+)/?'.format(settings.APP_URL_REGEX),
275277
views.DomainViewSet.as_view({'delete': 'destroy'})),
276-
url(r'^apps/(?P<id>[-a-z0-9]+)/domains/?',
278+
url(r'^apps/(?P<id>{})/domains/?'.format(settings.APP_URL_REGEX),
277279
views.DomainViewSet.as_view({'post': 'create', 'get': 'list'})),
278280
# application actions
279-
url(r'^apps/(?P<id>[-a-z0-9]+)/scale/?',
281+
url(r'^apps/(?P<id>{})/scale/?'.format(settings.APP_URL_REGEX),
280282
views.AppViewSet.as_view({'post': 'scale'})),
281-
url(r'^apps/(?P<id>[-a-z0-9]+)/logs/?',
283+
url(r'^apps/(?P<id>{})/logs/?'.format(settings.APP_URL_REGEX),
282284
views.AppViewSet.as_view({'post': 'logs'})),
283-
url(r'^apps/(?P<id>[-a-z0-9]+)/run/?',
285+
url(r'^apps/(?P<id>{})/run/?'.format(settings.APP_URL_REGEX),
284286
views.AppViewSet.as_view({'post': 'run'})),
285-
url(r'^apps/(?P<id>[-a-z0-9]+)/calculate/?',
287+
url(r'^apps/(?P<id>{})/calculate/?'.format(settings.APP_URL_REGEX),
286288
views.AppViewSet.as_view({'post': 'calculate'})),
287289
# apps sharing
288-
url(r'^apps/(?P<id>[-a-z0-9]+)/perms/(?P<username>[-_\w]+)/?',
290+
url(r'^apps/(?P<id>{})/perms/(?P<username>[-_\w]+)/?'.format(settings.APP_URL_REGEX),
289291
views.AppPermsViewSet.as_view({'delete': 'destroy'})),
290-
url(r'^apps/(?P<id>[-a-z0-9]+)/perms/?',
292+
url(r'^apps/(?P<id>{})/perms/?'.format(settings.APP_URL_REGEX),
291293
views.AppPermsViewSet.as_view({'get': 'list', 'post': 'create'})),
292294
# apps base endpoint
293-
url(r'^apps/(?P<id>[-a-z0-9]+)/?',
295+
url(r'^apps/(?P<id>{})/?'.format(settings.APP_URL_REGEX),
294296
views.AppViewSet.as_view({'get': 'retrieve', 'delete': 'destroy'})),
295297
url(r'^apps/?',
296298
views.AppViewSet.as_view({'get': 'list', 'post': 'create'})),

controller/deis/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,8 @@
297297
}
298298
}
299299

300+
APP_URL_REGEX = '[a-z0-9-]+'
301+
300302
# SECURITY: change this to allowed fqdn's to prevent host poisioning attacks
301303
# see https://docs.djangoproject.com/en/1.5/ref/settings/#std:setting-ALLOWED_HOSTS
302304
ALLOWED_HOSTS = ['*']

0 commit comments

Comments
 (0)