@@ -144,6 +144,10 @@ def get_catalog(arch, build, language, beta):
144
144
# fill the catalog
145
145
entries = []
146
146
for b in latest_build .all ():
147
+ # correct any missing md5 hashes
148
+ if b .md5 is None :
149
+ b .md5 = b .calculate_md5 ()
150
+ db .session .commit ()
147
151
entry = {
148
152
"package" : b .version .package .name ,
149
153
"version" : b .version .version_string ,
@@ -154,7 +158,11 @@ def get_catalog(arch, build, language, beta):
154
158
language , b .version .descriptions ["enu" ]
155
159
).description ,
156
160
"link" : url_for (
157
- ".data" , path = b .path , arch = arch , build = build , _external = True
161
+ ".download" ,
162
+ md5 = b .md5 ,
163
+ arch = arch ,
164
+ build = build ,
165
+ _external = True ,
158
166
),
159
167
"thumbnail" : [
160
168
url_for (".data" , path = icon .path , _external = True )
@@ -251,33 +259,42 @@ def catalog():
251
259
return Response (json .dumps (catalog ), mimetype = "application/json" )
252
260
253
261
254
- @nas .route ("/download/<int:architecture_id >/<int:firmware_build >/<int:build_id >" )
255
- def download (architecture_id , firmware_build , build_id ):
262
+ @nas .route ("/download/<string:md5 >/<string:arch >/<int:build >" )
263
+ def download (md5 , arch , build ):
256
264
# check build
257
- build = Build .query .get_or_404 (build_id )
258
- if not build .active :
265
+ build_obj = Build .query .filter_by (md5 = md5 ).one_or_none ()
266
+
267
+ if build_obj is None :
268
+ abort (404 )
269
+ elif not build_obj .active :
259
270
abort (403 )
260
271
261
272
# architecture
262
- architecture = Architecture .query .get_or_404 ( architecture_id )
273
+ architecture = Architecture .query .filter_by ( code = arch ). one_or_none ( )
263
274
275
+ if architecture is None :
276
+ abort (404 )
264
277
# check consistency
265
- if architecture not in build .architectures or firmware_build < build .firmware .build :
278
+ elif build < build_obj .firmware .build :
279
+ abort (400 )
280
+ elif architecture not in build_obj .architectures and not any (
281
+ arch .code == "noarch" for arch in build_obj .architectures
282
+ ):
266
283
abort (400 )
267
284
268
285
# insert in database
269
286
download = Download (
270
- build = build ,
287
+ build = build_obj ,
271
288
architecture = architecture ,
272
- firmware_build = firmware_build ,
289
+ firmware_build = build ,
273
290
ip_address = request .remote_addr ,
274
291
user_agent = request .user_agent .string ,
275
292
)
276
293
db .session .add (download )
277
294
db .session .commit ()
278
295
279
296
# redirect
280
- return redirect (url_for (".data" , path = build .path ))
297
+ return redirect (url_for (".data" , path = build_obj .path ))
281
298
282
299
283
300
@nas .route ("/<path:path>" )
0 commit comments