Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 79be58c

Browse files
authored
add UploadTokenRequiresAuthenticationCheck to core upload endpoints (#874)
1 parent d5ca070 commit 79be58c

File tree

8 files changed

+384
-0
lines changed

8 files changed

+384
-0
lines changed

codecov_auth/tests/factories.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class Meta:
7777
)
7878
user = factory.SubFactory(UserFactory)
7979
trial_status = TrialStatus.NOT_STARTED.value
80+
upload_token_required_for_public_repos = True
8081

8182

8283
class SentryUserFactory(DjangoModelFactory):

upload/tests/views/test_commits.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,73 @@ def test_commit_tokenless(db, client, mocker, branch, private):
254254
assert commit is None
255255

256256

257+
@pytest.mark.parametrize("branch", ["main", "someone:main", "someone/fork:main"])
258+
@pytest.mark.parametrize("private", [True, False])
259+
@pytest.mark.parametrize("upload_token_required_for_public_repos", [True, False])
260+
def test_commit_upload_token_required_auth_check(
261+
db, client, mocker, branch, private, upload_token_required_for_public_repos
262+
):
263+
repository = RepositoryFactory(
264+
private=private,
265+
author__username="codecov",
266+
name="the_repo",
267+
author__upload_token_required_for_public_repos=upload_token_required_for_public_repos,
268+
)
269+
mocked_call = mocker.patch.object(TaskService, "update_commit")
270+
271+
client = APIClient()
272+
repo_slug = f"{repository.author.username}::::{repository.name}"
273+
url = reverse(
274+
"new_upload.commits",
275+
args=[repository.author.service, repo_slug],
276+
)
277+
response = client.post(
278+
url,
279+
{
280+
"commitid": "commit_sha",
281+
"pullid": "4",
282+
"branch": branch,
283+
},
284+
format="json",
285+
)
286+
287+
# when TokenlessAuthentication is removed, this test should use `if private == False and upload_token_required_for_public_repos == False:`
288+
# but TokenlessAuthentication lets some additional uploads through.
289+
authorized_by_tokenless_auth_class = ":" in branch
290+
291+
if private == False and (
292+
upload_token_required_for_public_repos == False
293+
or authorized_by_tokenless_auth_class
294+
):
295+
assert response.status_code == 201
296+
response_json = response.json()
297+
commit = Commit.objects.get(commitid="commit_sha")
298+
expected_response = {
299+
"author": None,
300+
"branch": f"{branch}",
301+
"ci_passed": None,
302+
"commitid": "commit_sha",
303+
"message": None,
304+
"parent_commit_id": None,
305+
"repository": {
306+
"name": repository.name,
307+
"is_private": repository.private,
308+
"active": repository.active,
309+
"language": repository.language,
310+
"yaml": repository.yaml,
311+
},
312+
"pullid": 4,
313+
"state": None,
314+
"timestamp": commit.timestamp.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
315+
}
316+
assert expected_response == response_json
317+
mocked_call.assert_called_with(commitid="commit_sha", repoid=repository.repoid)
318+
else:
319+
assert response.status_code == 401
320+
commit = Commit.objects.filter(commitid="commit_sha").first()
321+
assert commit is None
322+
323+
257324
@patch("upload.helpers.jwt.decode")
258325
@patch("upload.helpers.PyJWKClient")
259326
def test_commit_github_oidc_auth(mock_jwks_client, mock_jwt_decode, db, mocker):

upload/tests/views/test_reports.py

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,84 @@ def test_reports_post_tokenless(client, db, mocker, private, branch, branch_sent
171171
assert response.json().get("detail") == "Not valid tokenless upload"
172172

173173

174+
@pytest.mark.parametrize("private", [False, True])
175+
@pytest.mark.parametrize("branch", ["main", "fork:branch", "someone/fork:branch"])
176+
@pytest.mark.parametrize(
177+
"branch_sent",
178+
[
179+
None,
180+
"branch",
181+
"fork:branch",
182+
"someone/fork:branch",
183+
],
184+
)
185+
@pytest.mark.parametrize("upload_token_required_for_public_repos", [True, False])
186+
def test_reports_post_upload_token_required_auth_check(
187+
client,
188+
db,
189+
mocker,
190+
private,
191+
branch,
192+
branch_sent,
193+
upload_token_required_for_public_repos,
194+
):
195+
mocked_call = mocker.patch.object(TaskService, "preprocess_upload")
196+
repository = RepositoryFactory(
197+
name="the_repo",
198+
author__username="codecov",
199+
author__service="github",
200+
private=private,
201+
author__upload_token_required_for_public_repos=upload_token_required_for_public_repos,
202+
)
203+
commit = CommitFactory(repository=repository)
204+
commit.branch = branch
205+
repository.save()
206+
commit.save()
207+
208+
client = APIClient()
209+
url = reverse(
210+
"new_upload.reports",
211+
args=["github", "codecov::::the_repo", commit.commitid],
212+
)
213+
214+
data = {"code": "code1"}
215+
if branch_sent:
216+
data["branch"] = branch_sent
217+
response = client.post(
218+
url,
219+
data=data,
220+
headers={},
221+
)
222+
223+
assert (
224+
url == f"/upload/github/codecov::::the_repo/commits/{commit.commitid}/reports"
225+
)
226+
227+
# when TokenlessAuthentication is removed, this test should use `if private == False and upload_token_required_for_public_repos == False:`
228+
# but TokenlessAuthentication lets some additional uploads through.
229+
authorized_by_tokenless_auth_class = ":" in branch
230+
231+
if private == False and (
232+
upload_token_required_for_public_repos == False
233+
or authorized_by_tokenless_auth_class
234+
):
235+
assert response.status_code == 201
236+
assert CommitReport.objects.filter(
237+
commit_id=commit.id,
238+
code="code1",
239+
report_type=CommitReport.ReportType.COVERAGE,
240+
).exists()
241+
mocked_call.assert_called_with(repository.repoid, commit.commitid, "code1")
242+
else:
243+
assert response.status_code == 401
244+
assert not CommitReport.objects.filter(
245+
commit_id=commit.id,
246+
code="code1",
247+
report_type=CommitReport.ReportType.COVERAGE,
248+
).exists()
249+
assert response.json().get("detail") == "Not valid tokenless upload"
250+
251+
174252
def test_create_report_already_exists(client, db, mocker):
175253
mocked_call = mocker.patch.object(TaskService, "preprocess_upload")
176254
repository = RepositoryFactory(
@@ -316,6 +394,82 @@ def test_reports_results_post_successful_github_oidc_auth(
316394
)
317395

318396

397+
@pytest.mark.parametrize("private", [False, True])
398+
@pytest.mark.parametrize("branch", ["main", "fork:branch", "someone/fork:branch"])
399+
@pytest.mark.parametrize(
400+
"branch_sent",
401+
[
402+
None,
403+
"branch",
404+
"fork:branch",
405+
"someone/fork:branch",
406+
],
407+
)
408+
@pytest.mark.parametrize("upload_token_required_for_public_repos", [True, False])
409+
def test_reports_results_post_upload_token_required_auth_check(
410+
client,
411+
db,
412+
mocker,
413+
private,
414+
branch,
415+
branch_sent,
416+
upload_token_required_for_public_repos,
417+
):
418+
mocked_task = mocker.patch("services.task.TaskService.create_report_results")
419+
repository = RepositoryFactory(
420+
name="the_repo",
421+
author__username="codecov",
422+
author__service="github",
423+
private=private,
424+
author__upload_token_required_for_public_repos=upload_token_required_for_public_repos,
425+
)
426+
commit = CommitFactory(repository=repository)
427+
commit_report = CommitReport.objects.create(commit=commit, code="code")
428+
commit.branch = branch
429+
repository.save()
430+
commit.save()
431+
432+
client = APIClient()
433+
url = reverse(
434+
"new_upload.reports_results",
435+
args=["github", "codecov::::the_repo", commit.commitid, "code"],
436+
)
437+
438+
data = {"code": "code1"}
439+
if branch_sent:
440+
data["branch"] = branch_sent
441+
response = client.post(
442+
url,
443+
data=data,
444+
headers={},
445+
)
446+
447+
assert (
448+
url
449+
== f"/upload/github/codecov::::the_repo/commits/{commit.commitid}/reports/code/results"
450+
)
451+
452+
# when TokenlessAuthentication is removed, this test should use `if private == False and upload_token_required_for_public_repos == False:`
453+
# but TokenlessAuthentication lets some additional uploads through.
454+
authorized_by_tokenless_auth_class = ":" in branch
455+
456+
if private == False and (
457+
upload_token_required_for_public_repos == False
458+
or authorized_by_tokenless_auth_class
459+
):
460+
assert response.status_code == 201
461+
assert ReportResults.objects.filter(
462+
report_id=commit_report.id,
463+
).exists()
464+
mocked_task.assert_called_once()
465+
else:
466+
assert response.status_code == 401
467+
assert not ReportResults.objects.filter(
468+
report_id=commit_report.id,
469+
).exists()
470+
assert response.json().get("detail") == "Not valid tokenless upload"
471+
472+
319473
def test_reports_results_already_exists_post_successful(client, db, mocker):
320474
mocked_task = mocker.patch("services.task.TaskService.create_report_results")
321475
mocker.patch.object(

0 commit comments

Comments
 (0)