@@ -144,6 +144,10 @@ def get_catalog(arch, build, language, beta):
144144    # fill the catalog 
145145    entries  =  []
146146    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 ()
147151        entry  =  {
148152            "package" : b .version .package .name ,
149153            "version" : b .version .version_string ,
@@ -154,7 +158,11 @@ def get_catalog(arch, build, language, beta):
154158                language , b .version .descriptions ["enu" ]
155159            ).description ,
156160            "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 ,
158166            ),
159167            "thumbnail" : [
160168                url_for (".data" , path = icon .path , _external = True )
@@ -251,33 +259,42 @@ def catalog():
251259    return  Response (json .dumps (catalog ), mimetype = "application/json" )
252260
253261
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 ):
256264    # 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 :
259270        abort (403 )
260271
261272    # architecture 
262-     architecture  =  Architecture .query .get_or_404 ( architecture_id )
273+     architecture  =  Architecture .query .filter_by ( code = arch ). one_or_none ( )
263274
275+     if  architecture  is  None :
276+         abort (404 )
264277    # 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+     ):
266283        abort (400 )
267284
268285    # insert in database 
269286    download  =  Download (
270-         build = build ,
287+         build = build_obj ,
271288        architecture = architecture ,
272-         firmware_build = firmware_build ,
289+         firmware_build = build ,
273290        ip_address = request .remote_addr ,
274291        user_agent = request .user_agent .string ,
275292    )
276293    db .session .add (download )
277294    db .session .commit ()
278295
279296    # redirect 
280-     return  redirect (url_for (".data" , path = build .path ))
297+     return  redirect (url_for (".data" , path = build_obj .path ))
281298
282299
283300@nas .route ("/<path:path>" ) 
0 commit comments