3
3
import datetime
4
4
import functools
5
5
import logging
6
+ import re
6
7
import time
7
8
8
9
import flask
27
28
28
29
store = storage .load ()
29
30
logger = logging .getLogger (__name__ )
31
+ _re_hex_image_id = re .compile (r'^([a-f0-9]{16}|[a-f0-9]{64})$' )
30
32
31
33
32
34
def require_completion (f ):
@@ -60,6 +62,16 @@ def wrapper(*args, **kwargs):
60
62
return wrapper
61
63
62
64
65
+ def valid_image_id (f ):
66
+ @functools .wraps (f )
67
+ def wrapper (* args , ** kwargs ):
68
+ image_id = kwargs .get ('image_id' , '' )
69
+ if _re_hex_image_id .match (image_id ):
70
+ return f (* args , ** kwargs )
71
+ return toolkit .api_error ("Invalid image ID" , 404 )
72
+ return wrapper
73
+
74
+
63
75
def _get_image_layer (image_id , headers = None , bytes_range = None ):
64
76
if headers is None :
65
77
headers = {}
@@ -172,6 +184,7 @@ def _valid_bytes_range(bytes_range):
172
184
@app .route ('/v1/images/<image_id>/layer' , methods = ['GET' ])
173
185
@toolkit .requires_auth
174
186
@require_completion
187
+ @valid_image_id
175
188
@set_cache_headers
176
189
@mirroring .source_lookup (cache = True , stream = True )
177
190
def get_image_layer (image_id , headers ):
@@ -193,6 +206,7 @@ def get_image_layer(image_id, headers):
193
206
194
207
@app .route ('/v1/images/<image_id>/layer' , methods = ['PUT' ])
195
208
@toolkit .requires_auth
209
+ @valid_image_id
196
210
def put_image_layer (image_id ):
197
211
client_version = toolkit .docker_client_version ()
198
212
if client_version and client_version < (0 , 10 ):
@@ -227,6 +241,7 @@ def put_image_layer(image_id):
227
241
228
242
@app .route ('/v1/images/<image_id>/checksum' , methods = ['PUT' ])
229
243
@toolkit .requires_auth
244
+ @valid_image_id
230
245
def put_image_checksum (image_id ):
231
246
checksum = flask .request .headers .get ('X-Docker-Checksum-Payload' )
232
247
if checksum is None :
@@ -256,6 +271,7 @@ def put_image_checksum(image_id):
256
271
257
272
@app .route ('/v1/images/<image_id>/json' , methods = ['GET' ])
258
273
@toolkit .requires_auth
274
+ @valid_image_id
259
275
@require_completion
260
276
@set_cache_headers
261
277
@mirroring .source_lookup (cache = True , stream = False )
@@ -274,6 +290,7 @@ def get_image_json(image_id, headers):
274
290
275
291
@app .route ('/v1/images/<image_id>/ancestry' , methods = ['GET' ])
276
292
@toolkit .requires_auth
293
+ @valid_image_id
277
294
@require_completion
278
295
@set_cache_headers
279
296
@mirroring .source_lookup (cache = True , stream = False )
@@ -325,6 +342,7 @@ def load_checksums(image_id):
325
342
326
343
@app .route ('/v1/images/<image_id>/json' , methods = ['PUT' ])
327
344
@toolkit .requires_auth
345
+ @valid_image_id
328
346
def put_image_json (image_id ):
329
347
data = None
330
348
try :
@@ -372,6 +390,7 @@ def put_image_json(image_id):
372
390
373
391
@app .route ('/v1/images/<image_id>/files' , methods = ['GET' ])
374
392
@toolkit .requires_auth
393
+ @valid_image_id
375
394
@require_completion
376
395
@set_cache_headers
377
396
def get_image_files (image_id , headers ):
@@ -392,6 +411,7 @@ def get_image_files(image_id, headers):
392
411
393
412
@app .route ('/v1/images/<image_id>/diff' , methods = ['GET' ])
394
413
@toolkit .requires_auth
414
+ @valid_image_id
395
415
@require_completion
396
416
@set_cache_headers
397
417
def get_image_diff (image_id , headers ):
0 commit comments