@@ -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