From f97fc0dd3d4bd3ae2470b23d4e98348b871bf8cc Mon Sep 17 00:00:00 2001 From: hunteraraujo Date: Wed, 4 Oct 2023 11:32:45 -0700 Subject: [PATCH] Add GitHub Repository Validation to Leaderboard Submission Dialog (#5539) --- frontend/lib/utils/uri_utility.dart | 28 +++++++++++++++++++ .../leaderboard_submission_dialog.dart | 20 +++++++------ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/frontend/lib/utils/uri_utility.dart b/frontend/lib/utils/uri_utility.dart index 592bacbd..ace65f08 100644 --- a/frontend/lib/utils/uri_utility.dart +++ b/frontend/lib/utils/uri_utility.dart @@ -1,3 +1,6 @@ +import 'package:http/http.dart' as http; +import 'dart:convert'; + class UriUtility { static bool isURL(String url) { // Validate if the URL string is empty, or contains spaces or invalid characters @@ -44,4 +47,29 @@ class UriUtility { print('URL is valid.'); return true; } + + Future isValidGitHubRepo(String repoUrl) async { + var uri = Uri.parse(repoUrl); + if (uri.host != 'github.com') { + return false; + } + + var segments = uri.pathSegments; + if (segments.length < 2) { + return false; + } + + var user = segments[0]; + var repo = segments[1]; + + var apiUri = Uri.https('api.github.com', '/repos/$user/$repo'); + + var response = await http.get(apiUri); + if (response.statusCode != 200) { + return false; + } + + var data = json.decode(response.body); + return data is Map && data['full_name'] == '$user/$repo'; + } } diff --git a/frontend/lib/views/task_queue/leaderboard_submission_dialog.dart b/frontend/lib/views/task_queue/leaderboard_submission_dialog.dart index a0fd980e..add0fba9 100644 --- a/frontend/lib/views/task_queue/leaderboard_submission_dialog.dart +++ b/frontend/lib/views/task_queue/leaderboard_submission_dialog.dart @@ -44,14 +44,18 @@ class _LeaderboardSubmissionDialogState }); } - void _validateAndSubmit() { + void _validateAndSubmit() async { + setState(() { + _teamNameError = null; + _repoUrlError = null; + _commitShaError = null; + }); + bool isValid = true; if (_teamNameController.text.isEmpty) { isValid = false; _teamNameError = 'Team Name is required'; - } else { - _teamNameError = null; } if (_repoUrlController.text.isEmpty) { @@ -60,20 +64,20 @@ class _LeaderboardSubmissionDialogState } else if (!UriUtility.isURL(_repoUrlController.text)) { isValid = false; _repoUrlError = 'Invalid URL format'; - } else { - _repoUrlError = null; + } else if (!(await UriUtility() + .isValidGitHubRepo(_repoUrlController.text))) { + isValid = false; + _repoUrlError = 'Not a valid GitHub repository'; } if (_commitShaController.text.isEmpty) { isValid = false; _commitShaError = 'Commit SHA is required'; - } else { - _commitShaError = null; } if (isValid) { print('Valid leaderboard submission parameters!'); - _saveToSharedPreferences(); + await _saveToSharedPreferences(); widget.onSubmit?.call(_teamNameController.text, _repoUrlController.text, _commitShaController.text); Navigator.of(context).pop();