diff --git a/aurweb/routers/packages.py b/aurweb/routers/packages.py index 76f82ffb..fc292610 100644 --- a/aurweb/routers/packages.py +++ b/aurweb/routers/packages.py @@ -254,6 +254,11 @@ async def package_base(request: Request, name: str) -> Response: async def package_base_voters(request: Request, name: str) -> Response: # Get the PackageBase. pkgbase = get_pkg_or_base(name, models.PackageBase) + + if not request.user.has_credential(creds.PKGBASE_LIST_VOTERS): + return RedirectResponse(f"/pkgbase/{name}", + status_code=HTTPStatus.SEE_OTHER) + context = make_context(request, "Voters") context["pkgbase"] = pkgbase return render_template(request, "pkgbase/voters.html", context) diff --git a/templates/partials/packages/details.html b/templates/partials/packages/details.html index 78e0ad1c..ae7c45f4 100644 --- a/templates/partials/packages/details.html +++ b/templates/partials/packages/details.html @@ -131,14 +131,14 @@ {{ "Votes" | tr }}: - {% if not is_maintainer %} - {{ pkgbase.NumVotes }} - {% else %} + {% if request.user.has_credential(creds.PKGBASE_LIST_VOTERS) %} {{ pkgbase.NumVotes }} + {% else %} + {{ pkgbase.NumVotes }} {% endif %} diff --git a/test/test_packages_routes.py b/test/test_packages_routes.py index c1b27627..03ab5ab8 100644 --- a/test/test_packages_routes.py +++ b/test/test_packages_routes.py @@ -1078,22 +1078,39 @@ def test_packages_per_page(client: TestClient, maintainer: User): assert len(rows) == 250 -def test_pkgbase_voters(client: TestClient, maintainer: User, package: Package): +def test_pkgbase_voters(client: TestClient, tu_user: User, package: Package): pkgbase = package.PackageBase endpoint = f"/pkgbase/{pkgbase.Name}/voters" now = int(datetime.utcnow().timestamp()) with db.begin(): - db.create(PackageVote, User=maintainer, PackageBase=pkgbase, - VoteTS=now) + db.create(PackageVote, User=tu_user, PackageBase=pkgbase, VoteTS=now) + cookies = {"AURSID": tu_user.login(Request(), "testPassword")} with client as request: - resp = request.get(endpoint) + resp = request.get(endpoint, cookies=cookies, allow_redirects=False) assert resp.status_code == int(HTTPStatus.OK) + # We should've gotten one link to the voter, tu_user. root = parse_root(resp.text) - rows = root.xpath('//div[@class="box"]//ul/li') + rows = root.xpath('//div[@class="box"]//ul/li/a') assert len(rows) == 1 + assert rows[0].text.strip() == tu_user.Username + + +def test_pkgbase_voters_unauthorized(client: TestClient, user: User, + package: Package): + pkgbase = package.PackageBase + endpoint = f"/pkgbase/{pkgbase.Name}/voters" + + now = int(datetime.utcnow().timestamp()) + with db.begin(): + db.create(PackageVote, User=user, PackageBase=pkgbase, VoteTS=now) + + with client as request: + resp = request.get(endpoint, allow_redirects=False) + assert resp.status_code == int(HTTPStatus.SEE_OTHER) + assert resp.headers.get("location") == f"/pkgbase/{pkgbase.Name}" def test_pkgbase_comment_not_found(client: TestClient, maintainer: User,