Skip to content

Commit 8abbbd7

Browse files
committed
fix download counter
- rewrite catalog download links using md5 hashes for id - allow downloads of noarch builds to pass arch checks - rewrite nas tests for new url structure
1 parent d8593ea commit 8abbbd7

File tree

2 files changed

+45
-28
lines changed

2 files changed

+45
-28
lines changed

spkrepo/tests/test_nas.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -560,9 +560,9 @@ def test_generic(self):
560560
response = self.client.get(
561561
url_for(
562562
"nas.download",
563-
architecture_id=architecture.id,
564-
firmware_build=4458,
565-
build_id=build.id,
563+
md5=build.md5,
564+
arch=architecture.code,
565+
build=4458,
566566
),
567567
environ_base={"REMOTE_ADDR": "127.0.0.1"},
568568
headers={"User-Agent": "My User Agent"},
@@ -592,9 +592,9 @@ def test_wrong_build(self):
592592
response = self.client.get(
593593
url_for(
594594
"nas.download",
595-
architecture_id=architecture.id,
596-
firmware_build=4458,
597-
build_id=build.id + 1,
595+
md5=build.md5 + "1",
596+
arch=architecture.code,
597+
build=4458,
598598
)
599599
)
600600
self.assert404(response)
@@ -613,9 +613,9 @@ def test_inactive_build(self):
613613
response = self.client.get(
614614
url_for(
615615
"nas.download",
616-
architecture_id=architecture.id,
617-
firmware_build=4458,
618-
build_id=build.id,
616+
md5=build.md5,
617+
arch=architecture.code,
618+
build=4458,
619619
)
620620
)
621621
self.assert403(response)
@@ -634,9 +634,9 @@ def test_wrong_architecture(self):
634634
response = self.client.get(
635635
url_for(
636636
"nas.download",
637-
architecture_id=10,
638-
firmware_build=4458,
639-
build_id=build.id,
637+
md5=build.md5,
638+
arch=Architecture.find(10).code if Architecture.find(10) else "",
639+
build=4458,
640640
)
641641
)
642642
self.assert404(response)
@@ -655,9 +655,9 @@ def test_incorrect_architecture(self):
655655
response = self.client.get(
656656
url_for(
657657
"nas.download",
658-
architecture_id=Architecture.find("cedarview").id,
659-
firmware_build=4458,
660-
build_id=build.id,
658+
md5=build.md5,
659+
arch=Architecture.find("cedarview").code,
660+
build=4458,
661661
)
662662
)
663663
self.assert400(response)
@@ -676,9 +676,9 @@ def test_incorrect_firmware_build(self):
676676
response = self.client.get(
677677
url_for(
678678
"nas.download",
679-
architecture_id=architecture.id,
680-
firmware_build=1593,
681-
build_id=build.id,
679+
md5=build.md5,
680+
arch=architecture.code,
681+
build=1593,
682682
)
683683
)
684684
self.assert400(response)

spkrepo/views/nas.py

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)