/**
  * Checks that, if there's no wait time, 0 is posted in max_wait_time
  */
 public function testGetStatsNoWaitTime()
 {
     // Get a problem
     $problemData = ProblemsFactory::createProblem();
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Add the problem to the contest
     ContestsFactory::addProblemToContest($problemData, $contestData);
     // Create our contestant
     $contestant = UserFactory::createUser();
     $ACRunsCount = 2;
     $ACRunsData = array();
     for ($i = 0; $i < $ACRunsCount; $i++) {
         $ACRunsData[$i] = RunsFactory::createRun($problemData, $contestData, $contestant);
         // Grade the run
         RunsFactory::gradeRun($ACRunsData[$i]);
     }
     // Create request
     $r = new Request();
     $r['contest_alias'] = $contestData['request']['alias'];
     $r['auth_token'] = $this->login($contestData['director']);
     // Call API
     $response = ContestController::apiStats($r);
     // Check number of pending runs
     $this->assertEquals($ACRunsCount, $response['total_runs']);
     $this->assertEquals(0, $response['max_wait_time']);
     $this->assertEquals(0, $response['max_wait_time_guid']);
 }
 public function testRemoveUser()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Create a user
     $user = UserFactory::createUser();
     // Add user to contest
     ContestsFactory::addUser($contestData, $user);
     // Validate 0 users
     $r = new Request();
     $r['contest_alias'] = $contestData['request']['alias'];
     $r['auth_token'] = $this->login($contestData['director']);
     $response = ContestController::apiUsers($r);
     $this->assertEquals(1, count($response['users']));
     // Remove user
     $r = new Request();
     $r['contest_alias'] = $contestData['request']['alias'];
     $r['usernameOrEmail'] = $user->getUsername();
     $r['auth_token'] = $this->login($contestData['director']);
     ContestController::apiRemoveUser($r);
     // Validate 0 users in contest
     $r = new Request();
     $r['contest_alias'] = $contestData['request']['alias'];
     $r['auth_token'] = $this->login($contestData['director']);
     $response = ContestController::apiUsers($r);
     $this->assertEquals(0, count($response['users']));
 }
 /**
  * Contestant submits runs and admin is able to get them
  */
 public function testGetRunsForContest()
 {
     // Get a problem
     $problemData = ProblemsFactory::createProblem();
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Add the problem to the contest
     ContestsFactory::addProblemToContest($problemData, $contestData);
     // Create our contestant
     $contestant = UserFactory::createUser();
     // Create a run
     $runData = RunsFactory::createRun($problemData, $contestData, $contestant);
     // Grade the run
     RunsFactory::gradeRun($runData);
     // Create request
     $r = new Request();
     $r['contest_alias'] = $contestData['request']['alias'];
     $r['auth_token'] = $this->login($contestData['director']);
     // Call API
     $response = ContestController::apiRuns($r);
     // Assert
     $this->assertEquals(1, count($response['runs']));
     $this->assertEquals($runData['response']['guid'], $response['runs'][0]['guid']);
     $this->assertEquals($contestant->username, $response['runs'][0]['username']);
     $this->assertEquals('J1', $response['runs'][0]['judged_by']);
 }
Example #4
0
 public function testContestUsersValid()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Create 10 users
     $n = 10;
     $users = array();
     for ($i = 0; $i < $n; $i++) {
         // Create a user
         $users[$i] = UserFactory::createUser();
         // Add it to the contest
         ContestsFactory::addUser($contestData, $users[$i]);
     }
     // Create a n+1 user who will just join to the contest withot being
     // added via API. For public contests, by entering to the contest, the user should be in
     // the list of contest's users.
     $nonRegisteredUser = UserFactory::createUser();
     ContestsFactory::openContest($contestData, $nonRegisteredUser);
     // Prepare request
     $r = new Request();
     $r["contest_alias"] = $contestData["request"]["alias"];
     // Log in with the admin of the contest
     $r["auth_token"] = $this->login($contestData["director"]);
     // Call API
     $response = ContestController::apiUsers($r);
     // Check that we have n+1 users
     $this->assertEquals($n + 1, count($response["users"]));
 }
Example #5
0
 /**
  * Contestant submits runs and admin is able to get them
  */
 public function testGetRunsForContest()
 {
     // Get a problem
     $problemData = ProblemsFactory::createProblem();
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Add the problem to the contest
     ContestsFactory::addProblemToContest($problemData, $contestData);
     // Create our contestant
     $contestant = UserFactory::createUser();
     // Create a run
     $runData = RunsFactory::createRun($problemData, $contestData, $contestant);
     // Grade the run
     RunsFactory::gradeRun($runData);
     // Create request
     $r = new Request();
     $r["contest_alias"] = $contestData["request"]["alias"];
     $r["auth_token"] = $this->login($contestData["director"]);
     // Call API
     $response = ContestController::apiRuns($r);
     // Assert
     $this->assertEquals(1, count($response["runs"]));
     $this->assertEquals($runData["response"]["guid"], $response["runs"][0]["guid"]);
     $this->assertEquals($contestant->username, $response["runs"][0]["username"]);
     $this->assertEquals("J1", $response["runs"][0]["judged_by"]);
 }
 public function testSimpleRegistrationActions()
 {
     self::log("Started");
     //create a contest and its admin
     $contestData = ContestsFactory::createContest(null, 1);
     $contestAdmin = UserFactory::createUser();
     ContestsFactory::addAdminUser($contestData, $contestAdmin);
     //make it "registrable"
     self::log("Udate contest to make it registrable");
     $r1 = new Request();
     $r1["contest_alias"] = $contestData["request"]["alias"];
     $r1["contestant_must_register"] = true;
     $r1["auth_token"] = $this->login($contestAdmin);
     ContestController::apiUpdate($r1);
     //some user asks for contest
     $contestant = UserFactory::createUser();
     $r2 = new Request();
     $r2["contest_alias"] = $contestData["request"]["alias"];
     $r2["auth_token"] = $this->login($contestant);
     try {
         $response = ContestController::apiDetails($r2);
         $this->AssertFalse(true, "User gained access to contest even though its registration needed.");
     } catch (ForbiddenAccessException $fae) {
         // Expected. Continue.
     }
     self::log("user registers, into contest");
     ContestController::apiRegisterForContest($r2);
     //admin lists registrations
     $r3 = new Request();
     $r3["contest_alias"] = $contestData["request"]["alias"];
     $r3["auth_token"] = $this->login($contestAdmin);
     $result = ContestController::apiRequests($r3);
     $this->assertEquals(sizeof($result["users"]), 1);
     self::log("amin rejects registration");
     $r3["username"] = $contestant->username;
     $r3["resolution"] = false;
     ContestController::apiArbitrateRequest($r3);
     //ask for details again, this should fail again
     $r2 = new Request();
     $r2["contest_alias"] = $contestData["request"]["alias"];
     $r2["auth_token"] = $this->login($contestant);
     try {
         $response = ContestController::apiDetails($r2);
         $this->AssertFalse(true);
     } catch (ForbiddenAccessException $fae) {
         // Expected. Continue.
     }
     //admin admits user
     $r3["username"] = $contestant->username;
     $r3["resolution"] = true;
     ContestController::apiArbitrateRequest($r3);
     //user can now submit to contest
     $r2 = new Request();
     $r2["contest_alias"] = $contestData["request"]["alias"];
     $r2["auth_token"] = $this->login($contestant);
     // Explicitly join contest
     ContestController::apiOpen($r2);
     ContestController::apiDetails($r2);
 }
Example #7
0
 /**
  *
  */
 public function testViewProblemInAContestDetailsValid()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Get a user to be the author
     $author = UserFactory::createUser();
     // Get a problem
     $problemData = ProblemsFactory::createProblem(null, null, 1, $author);
     // Add the problem to the contest
     ContestsFactory::addProblemToContest($problemData, $contestData);
     // Get a user for our scenario
     $contestant = UserFactory::createUser();
     // Prepare our request
     $r = new Request();
     $r["contest_alias"] = $contestData["request"]["alias"];
     $r["problem_alias"] = $problemData["request"]["alias"];
     // Log in the user
     $r["auth_token"] = $this->login($contestant);
     // Explicitly join contest
     ContestController::apiOpen($r);
     // Call api
     $response = ProblemController::apiDetails($r);
     // Get problem and contest from DB to check it
     $problemDAO = ProblemsDAO::getByAlias($problemData["request"]["alias"]);
     $contestDAO = ContestsDAO::getByAlias($contestData["request"]["alias"]);
     $contestantsDAO = UsersDAO::search(new Users(array("username" => $contestant->getUsername())));
     $contestantDAO = $contestantsDAO[0];
     // Assert data
     $this->assertEquals($response["title"], $problemDAO->getTitle());
     $this->assertEquals($response["alias"], $problemDAO->getAlias());
     $this->assertEquals($response["validator"], $problemDAO->getValidator());
     $this->assertEquals($response["time_limit"], $problemDAO->getTimeLimit());
     $this->assertEquals($response["memory_limit"], $problemDAO->getMemoryLimit());
     $this->assertEquals($response["problemsetter"]['username'], $author->username);
     $this->assertEquals($response["problemsetter"]['name'], $author->name);
     $this->assertEquals($response["source"], $problemDAO->getSource());
     $this->assertContains("<h1>Entrada</h1>", $response["problem_statement"]);
     $this->assertEquals($response["order"], $problemDAO->getOrder());
     $this->assertEquals($response["score"], 0);
     // Default data
     $this->assertEquals(0, $problemDAO->getVisits());
     $this->assertEquals(0, $problemDAO->getSubmissions());
     $this->assertEquals(0, $problemDAO->getAccepted());
     $this->assertEquals(0, $problemDAO->getDifficulty());
     // Verify that we have an empty array of runs
     $this->assertEquals(0, count($response["runs"]));
     // Verify that problem was marked as Opened
     $problem_opened = ContestProblemOpenedDAO::getByPK($contestDAO->getContestId(), $problemDAO->getProblemId(), $contestantDAO->getUserId());
     $this->assertNotNull($problem_opened);
     // Verify open time
     $this->assertEquals(Utils::GetPhpUnixTimestamp(), Utils::GetPhpUnixTimestamp($problem_opened->getOpenTime()));
 }
 /**
  * Tests that 2 contests with same name cannot be created
  *
  * @expectedException DuplicatedEntryInDatabaseException
  */
 public function testCreate2ContestsWithSameAlias()
 {
     // Create a valid contest Request object
     $contestData = ContestsFactory::getRequest();
     $r = $contestData['request'];
     $contestDirector = $contestData['director'];
     // Log in the user and set the auth token in the new request
     $r['auth_token'] = $this->login($contestDirector);
     // Call the API
     $response = ContestController::apiCreate($r);
     $this->assertEquals('ok', $response['status']);
     // Call the API for the 2nd time with same alias
     $response = ContestController::apiCreate($r);
 }
 public function testContestActivityReport()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest();
     $user = UserFactory::createUser();
     ContestsFactory::openContest($contestData, $user);
     ContestController::apiDetails(new Request(array('contest_alias' => $contestData['request']['alias'], 'auth_token' => $this->login($user))));
     // Call API
     $response = ContestController::apiActivityReport(new Request(array('contest_alias' => $contestData['request']['alias'], 'auth_token' => $this->login($contestData['director']))));
     // Check that we have entries in the log.
     $this->assertEquals(1, count($response['events']));
     $this->assertEquals($user->username, $response['events'][0]['username']);
     $this->assertEquals(0, $response['events'][0]['ip']);
     $this->assertEquals('open', $response['events'][0]['event']['name']);
 }
 /**
  * Basic test for getting the list of clarifications of a contest.
  * Create 4 clarifications in a contest with one user, then another 3 clarifications
  * with another user. 
  * Get the list for the first user, will see only his 4
  */
 public function testListPublicClarificationsForContestant()
 {
     // Get a problem
     $problemData = ProblemsFactory::createProblem();
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Add the problem to the contest
     ContestsFactory::addProblemToContest($problemData, $contestData);
     // Create our contestant who will submit the clarification
     $contestant1 = UserFactory::createUser();
     // Create 4 clarifications with this contestant
     $clarificationData1 = array();
     $this->detourBroadcasterCalls($this->exactly(9));
     for ($i = 0; $i < 4; $i++) {
         $clarificationData1[$i] = ClarificationsFactory::createClarification($problemData, $contestData, $contestant1);
     }
     // Answer clarification 0 and 2
     ClarificationsFactory::answer($clarificationData1[0], $contestData);
     ClarificationsFactory::answer($clarificationData1[2], $contestData);
     // Create another contestant
     $contestant2 = UserFactory::createUser();
     // Create 3 clarifications with this contestant
     $clarificationData2 = array();
     for ($i = 0; $i < 3; $i++) {
         $clarificationData2[$i] = ClarificationsFactory::createClarification($problemData, $contestData, $contestant2);
     }
     // Prepare the request
     $r = new Request();
     $r["contest_alias"] = $contestData["request"]["alias"];
     // Log in with first user
     $r["auth_token"] = $this->login($contestant1);
     // Call API
     $response = ContestController::apiClarifications($r);
     // Check that we got all clarifications
     $this->assertEquals(count($clarificationData1), count($response["clarifications"]));
     // Check that the clarifications came in the order we expect
     // First we expect clarifications not answered
     $this->assertEquals($clarificationData1[3]["request"]["message"], $response["clarifications"][0]["message"]);
     $this->assertEquals($clarificationData1[1]["request"]["message"], $response["clarifications"][1]["message"]);
     // Then clarifications answered, newer first
     $this->assertEquals($clarificationData1[2]["request"]["message"], $response["clarifications"][2]["message"]);
     $this->assertEquals($clarificationData1[0]["request"]["message"], $response["clarifications"][3]["message"]);
 }
Example #11
0
 /**
  * Tests remove admins
  */
 public function testRemoveAdmin()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Get users
     $user = UserFactory::createUser();
     $user2 = UserFactory::createUser();
     ContestsFactory::addAdminUser($contestData, $user);
     ContestsFactory::addAdminUser($contestData, $user2);
     // Prepare request for remove one admin
     $r = new Request();
     $r["auth_token"] = $this->login($contestData["director"]);
     $r["usernameOrEmail"] = $user->getUsername();
     $r["contest_alias"] = $contestData["request"]["alias"];
     // Call api
     ContestController::apiRemoveAdmin($r);
     $contest = ContestsDAO::getByAlias($contestData['request']['alias']);
     $this->AssertFalse(Authorization::IsContestAdmin($user->getUserId(), $contest));
     $this->AssertTrue(Authorization::IsContestAdmin($user2->getUserId(), $contest));
 }
Example #12
0
<?php

require_once '../../server/bootstrap.php';
$smarty->assign('admin', false);
$smarty->assign('practice', false);
$r = new Request(array("auth_token" => array_key_exists("ouat", $_REQUEST) ? $_REQUEST["ouat"] : null, "contest_alias" => $_REQUEST["contest_alias"]));
if (ContestController::showContestIntro($r)) {
    $smarty->display('../../templates/arena.contest.intro.tpl');
} else {
    $smarty->assign('jsfile', '/ux/contest.js');
    $smarty->display('../../templates/arena.contest.tpl');
}
Example #13
0
 /**
  * Tests contest report used in OMI
  */
 public function testContestReport()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest();
     $contestDirector = $contestData["director"];
     // Get a problem
     $problemData = ProblemsFactory::createProblemWithAuthor($contestDirector);
     // Add the problem to the contest
     ContestsFactory::addProblemToContest($problemData, $contestData);
     // Create our contestants
     $contestants = array();
     array_push($contestants, UserFactory::createUser());
     array_push($contestants, UserFactory::createUser());
     array_push($contestants, UserFactory::createUser());
     $contestAdmin = UserFactory::createUser();
     ContestsFactory::addAdminUser($contestData, $contestAdmin);
     // Create runs
     $runsData = array();
     $runsData[0] = RunsFactory::createRun($problemData, $contestData, $contestants[0]);
     $runsData[1] = RunsFactory::createRun($problemData, $contestData, $contestants[0]);
     $runsData[2] = RunsFactory::createRun($problemData, $contestData, $contestants[1]);
     $runsData[3] = RunsFactory::createRun($problemData, $contestData, $contestants[2]);
     $runDataDirector = RunsFactory::createRun($problemData, $contestData, $contestDirector);
     $runDataAdmin = RunsFactory::createRun($problemData, $contestData, $contestAdmin);
     // Grade the runs
     RunsFactory::gradeRun($runsData[0], 0, "CE");
     RunsFactory::gradeRun($runsData[1]);
     RunsFactory::gradeRun($runsData[2], 0.9, "PA");
     RunsFactory::gradeRun($runsData[3], 1, "AC", 180);
     RunsFactory::gradeRun($runDataDirector, 1, "AC", 120);
     RunsFactory::gradeRun($runDataAdmin, 1, "AC", 110);
     // Create API
     $response = ContestController::apiReport(new Request(array("contest_alias" => $contestData["request"]["alias"], "auth_token" => $this->login($contestDirector))));
     $this->assertEquals($problemData["request"]["alias"], $response["problems"][0]["alias"]);
     foreach ($contestants as $contestant) {
         $found = false;
         foreach ($response["ranking"] as $rank) {
             if ($rank["username"] == $contestant->username) {
                 $found = true;
                 break;
             }
         }
         $this->assertTrue($found);
     }
 }
Example #14
0
 public static function addAdminUser($contestData, $user)
 {
     // Prepare our request
     $r = new Request();
     $r["contest_alias"] = $contestData["request"]["alias"];
     $r["usernameOrEmail"] = $user->getUsername();
     // Log in the contest director
     $r["auth_token"] = OmegaupTestCase::login($contestData["director"]);
     // Call api
     ContestController::apiAddAdmin($r);
     unset($_REQUEST);
 }
Example #15
0
 /** 
  * 
  */
 public function testPrivateContestForContestAdmin()
 {
     $r = new Request();
     // Create new private contest
     $contestData = ContestsFactory::createContest(null, false);
     // Get a user for our scenario
     $contestant = UserFactory::createUser();
     // Add user to our private contest
     ContestsFactory::addAdminUser($contestData, $contestant);
     $r["auth_token"] = $this->login($contestant);
     $response = ContestController::apiList($r);
     // Assert our contest is there
     $this->assertTitleInList($response, $contestData);
 }
Example #16
0
 /**
  * Generates a CSV for contest report
  *
  * @param Request $r
  * @return array
  */
 public static function apiCsvReport(Request $r)
 {
     self::authenticateRequest($r);
     self::validateStats($r);
     // Get full Report API of the contest
     $reportRequest = new Request(array("contest_alias" => $r["contest_alias"], "auth_token" => $r["auth_token"]));
     $contestReport = self::apiReport($reportRequest);
     // Get problem stats for each contest problem so we can
     // have the full list of cases
     $problemStats = array();
     $i = 0;
     foreach ($contestReport["problems"] as $entry) {
         $problem_alias = $entry["alias"];
         $problemStatsRequest = new Request(array("problem_alias" => $problem_alias, "auth_token" => $r["auth_token"]));
         $problemStats[$i] = ProblemController::apiStats($problemStatsRequest);
         $problemStats[$problem_alias] = $problemStats[$i];
         $i++;
     }
     // Build a csv
     $csvData = array();
     // Build titles
     $csvRow = array();
     $csvRow[] = "username";
     foreach ($contestReport["problems"] as $entry) {
         foreach ($problemStats[$entry["alias"]]["cases_stats"] as $caseName => $counts) {
             $csvRow[] = $caseName;
         }
         $csvRow[] = $entry["alias"] . " total";
     }
     $csvRow[] = "total";
     $csvData[] = $csvRow;
     foreach ($contestReport["ranking"] as $userData) {
         if ($userData === "ok") {
             continue;
         }
         $csvRow = array();
         $csvRow[] = $userData["username"];
         foreach ($userData["problems"] as $key => $problemData) {
             // If the user don't have these details then he didn't submit,
             // we need to fill the report with 0s for completeness
             if (!isset($problemData["run_details"]["cases"]) || count($problemData["run_details"]["cases"]) === 0) {
                 for ($i = 0; $i < count($problemStats[$key]["cases_stats"]); $i++) {
                     $csvRow[] = '0';
                 }
                 // And adding the total for this problem
                 $csvRow[] = '0';
             } else {
                 // for each case
                 foreach ($problemData["run_details"]["cases"] as $caseData) {
                     // If case is correct
                     if (strcmp($caseData["meta"]["status"], "OK") === 0 && strcmp($caseData["out_diff"], "") === 0) {
                         $csvRow[] = '1';
                     } else {
                         $csvRow[] = '0';
                     }
                 }
                 $csvRow[] = $problemData["points"];
             }
         }
         $csvRow[] = $userData["total"]["points"];
         $csvData[] = $csvRow;
     }
     // Set headers to auto-download file
     header("Pragma: public");
     header("Expires: 0");
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
     header("Content-Type: application/force-download");
     header("Content-Type: application/octet-stream");
     header("Content-Type: application/download");
     header("Content-Disposition: attachment;filename=" . $r["contest_alias"] . "_report.csv");
     header("Content-Transfer-Encoding: binary");
     // Write contents to a csv raw string
     // TODO(https://github.com/omegaup/omegaup/issues/628): Escape = to prevent applications from inadvertently executing code
     // http://contextis.co.uk/blog/comma-separated-vulnerabilities/
     $out = fopen('php://output', 'w');
     foreach ($csvData as $csvRow) {
         fputcsv($out, ContestController::escapeCsv($csvRow));
     }
     fclose($out);
     // X_X
     die;
 }
Example #17
0
 /**
  * Update from private to public with problems added
  * 
  */
 public function testUpdatePrivateContestToPublicWithProblems()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest(null, 0);
     // Get a problem
     $problemData = ProblemsFactory::createProblem();
     // Add the problem to the contest
     ContestsFactory::addProblemToContest($problemData, $contestData);
     // Prepare request
     $r = new Request();
     $r["contest_alias"] = $contestData["request"]["alias"];
     // Log in with contest director
     $r["auth_token"] = $this->login($contestData["director"]);
     // Update public
     $r["public"] = 1;
     // Call API
     $response = ContestController::apiUpdate($r);
     $contestData["request"]["public"] = $r["public"];
     $this->assertContest($contestData["request"]);
 }
 /**
  * Set Recommended flag to a given contest from non admin account
  *
  * @expectedException ForbiddenAccessException
  */
 public function testSetRecommendedFlagNonAdmin()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Prepare request
     $r = new Request();
     $r['contest_alias'] = $contestData['request']['alias'];
     // Log in with contest owner
     $r['auth_token'] = $this->login($contestData['director']);
     // Update value to TRUE
     $r['value'] = 1;
     // Call API
     ContestController::apiSetRecommended($r);
 }
 /**
  * Test that contests with recommended flag show first in list.
  */
 public function testRecommendedShowsOnTop()
 {
     $r = new Request();
     // Create 2 contests, with the not-recommended.finish_time > recommended.finish_time
     $recommendedContestData = ContestsFactory::createContest();
     $notRecommendedContestData = ContestsFactory::createContest(null, 0, null, $recommendedContestData['request']['finish_time'] + 1);
     // Get a user for our scenario
     $contestant = UserFactory::createUser();
     // Turn recommended ON
     $r = new Request();
     $r['contest_alias'] = $recommendedContestData['request']['alias'];
     $r['auth_token'] = $this->login(UserFactory::createAdminUser());
     $r['value'] = 1;
     ContestController::apiSetRecommended($r);
     // Get list of contests
     $r['auth_token'] = $this->login($contestant);
     $response = ContestController::apiList($r);
     // Check that recommended contest is earlier in list han not-recommended
     $recommendedPosition = 0;
     $notRecommendedPosition = 0;
     foreach ($response['results'] as $contest) {
         if ($contest['title'] == $recommendedContestData['request']['title']) {
             break;
         }
         $recommendedPosition++;
     }
     foreach ($response['results'] as $contest) {
         if ($contest['title'] == $notRecommendedContestData['request']['title']) {
             break;
         }
         $notRecommendedPosition++;
     }
     $this->assertTrue($recommendedPosition < $notRecommendedPosition);
 }
 /**
  * Details of a scoreboard. Returns a list with all contests that belong to
  * the given scoreboard_alias
  *
  * @param Request $r
  */
 public static function apiDetails(Request $r)
 {
     self::validateGroupScoreboard($r);
     $response = array();
     // Fill contests
     $response['contests'] = array();
     $response['ranking'] = array();
     try {
         $groupScoreboardContestKey = new GroupsScoreboardsContests(array('group_scoreboard_id' => $r['scoreboard']->group_scoreboard_id));
         $r['gscs'] = GroupsScoreboardsContestsDAO::search($groupScoreboardContestKey);
         $i = 0;
         $contest_params = array();
         foreach ($r['gscs'] as $gsc) {
             $contest = ContestsDAO::getByPK($gsc->contest_id);
             $response['contests'][$i] = $contest->asArray();
             $response['contests'][$i]['only_ac'] = $gsc->only_ac;
             $response['contests'][$i]['weight'] = $gsc->weight;
             // Fill contest params to pass to scoreboardMerge
             $contest_params[$contest->alias] = array('only_ac' => $gsc->only_ac == 0 ? false : true, 'weight' => $gsc->weight);
             $i++;
         }
     } catch (ApiException $ex) {
         throw $ex;
     } catch (Exception $ex) {
         throw new InvalidDatabaseOperationException($ex);
     }
     $r['contest_params'] = $contest_params;
     // Fill details of this scoreboard
     $response['scoreboard'] = $r['scoreboard']->asArray();
     // If we have contests, calculate merged&filtered scoreboard
     if (count($response['contests']) > 0) {
         // Get merged scoreboard
         $r['contest_aliases'] = '';
         foreach ($response['contests'] as $contest) {
             $r['contest_aliases'] .= $contest['alias'] . ',';
         }
         $r['contest_aliases'] = rtrim($r['contest_aliases'], ',');
         try {
             $groupUsers = GroupsUsersDAO::search(new GroupsUsers(array('group_id' => $r['scoreboard']->group_id)));
             $r['usernames_filter'] = '';
             foreach ($groupUsers as $groupUser) {
                 $user = UsersDAO::getByPK($groupUser->user_id);
                 $r['usernames_filter'] .= $user->username . ',';
             }
             $r['usernames_filter'] = rtrim($r['usernames_filter'], ',');
         } catch (Exception $ex) {
             throw new InvalidDatabaseOperationException($ex);
         }
         $mergedScoreboardResponse = ContestController::apiScoreboardMerge($r);
         $response['ranking'] = $mergedScoreboardResponse['ranking'];
     }
     $response['status'] = 'ok';
     return $response;
 }
 /**
  * Check that user in private list can view private contest
  */
 public function testNoPrivilegeEscalationOccurs()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest(null, 0);
     // Get some problems into the contest
     $numOfProblems = 3;
     $problems = $this->insertProblemsInContest($contestData, $numOfProblems);
     // Get a user for our scenario
     $contestant = UserFactory::createUser();
     // Prepare our request
     $r = new Request(array('auth_token' => $this->login($contestant), 'contest_alias' => $contestData['request']['alias']));
     // Call api. This should fail.
     try {
         ContestController::apiDetails($r);
         $this->assertTrue(false, 'User with no access could see the contest');
     } catch (ForbiddenAccessException $e) {
         // Pass
     }
     // Get details from a problem in that contest. This should also fail.
     try {
         $problem_request = new Request(array('auth_token' => $this->login($contestant), 'contest_alias' => $contestData['request']['alias'], 'problem_alias' => $problems[0]['request']['alias']));
         ProblemController::apiDetails($problem_request);
         $this->assertTrue(false, 'User with no access could see the problem');
     } catch (ForbiddenAccessException $e) {
         // Pass
     }
     // Call api again. This should (still) fail.
     try {
         $response = ContestController::apiDetails($r);
         $this->assertTrue(false, 'User with no access could see the contest');
     } catch (ForbiddenAccessException $e) {
         // Pass
     }
 }
 /**
  * Basic tests for shareable scoreboard url
  */
 public function testScoreboardUrlNoLogin()
 {
     // Get a private contest with 0% of scoreboard show percentage
     $contestData = ContestsFactory::createContest(null, 0);
     ContestsFactory::setScoreboardPercentage($contestData, 0);
     // Create problem
     $problemData = ProblemsFactory::createProblem();
     ContestsFactory::addProblemToContest($problemData, $contestData);
     // Create our contestant, will submit 1 run
     $contestant = UserFactory::createUser();
     ContestsFactory::addUser($contestData, $contestant);
     $runData = RunsFactory::createRun($problemData, $contestData, $contestant);
     RunsFactory::gradeRun($runData);
     // Get the scoreboard url by using the MyList api being the
     // contest director
     $response = ContestController::apiMyList(new Request(array('auth_token' => $this->login($contestData['director']))));
     // Look for our contest from the list and save the scoreboard tokens
     $scoreboard_url = null;
     $scoreboard_admin_url = null;
     foreach ($response['results'] as $c) {
         if ($c['alias'] === $contestData['request']['alias']) {
             $scoreboard_url = $c['scoreboard_url'];
             $scoreboard_admin_url = $c['scoreboard_url_admin'];
             break;
         }
     }
     $this->assertNotNull($scoreboard_url);
     $this->assertNotNull($scoreboard_admin_url);
     // Call scoreboard api from the user
     $scoreboardResponse = ContestController::apiScoreboard(new Request(array('contest_alias' => $contestData['request']['alias'], 'token' => $scoreboard_url)));
     $this->assertEquals('0', $scoreboardResponse['ranking'][0]['total']['points']);
     // Call scoreboard api from the user with admin token
     $scoreboardResponse = ContestController::apiScoreboard(new Request(array('contest_alias' => $contestData['request']['alias'], 'token' => $scoreboard_admin_url)));
     $this->assertEquals('100', $scoreboardResponse['ranking'][0]['total']['points']);
 }
Example #23
0
 /**
  * Get Contests which a certain user has participated in
  *
  * @param Request $r
  * @return Contests array
  * @throws InvalidDatabaseOperationException
  */
 public static function apiContestStats(Request $r)
 {
     self::authenticateOrAllowUnauthenticatedRequest($r);
     $response = array();
     $response['contests'] = array();
     $user = self::resolveTargetUser($r);
     // Get contests where user had at least 1 run
     try {
         $contestsParticipated = ContestsDAO::getContestsParticipated($user->getUserId());
     } catch (Exception $e) {
         throw new InvalidDatabaseOperationException($e);
     }
     $contests = array();
     foreach ($contestsParticipated as $contest) {
         // Get user ranking
         $scoreboardR = new Request(array('auth_token' => $r['auth_token'], 'contest_alias' => $contest->getAlias(), 'token' => $contest->getScoreboardUrlAdmin()));
         $scoreboardResponse = ContestController::apiScoreboard($scoreboardR);
         // Grab the place of the current user in the given contest
         $contests[$contest->getAlias()]['place'] = null;
         foreach ($scoreboardResponse['ranking'] as $userData) {
             if ($userData['username'] == $user->getUsername()) {
                 $contests[$contest->getAlias()]['place'] = $userData['place'];
                 break;
             }
         }
         $contest->toUnixTime();
         $contests[$contest->getAlias()]['data'] = $contest->asArray();
     }
     $response['contests'] = $contests;
     $response['status'] = 'ok';
     return $response;
 }
 /**
  * Details of a scoreboard. Returns a list with all contests that belong to
  * the given scoreboard_alias
  * 
  * @param Request $r
  */
 public static function apiDetails(Request $r)
 {
     self::validateGroupScoreboard($r);
     $response = array();
     // Fill contests
     $response["contests"] = array();
     $response["ranking"] = array();
     try {
         $groupScoreboardContestKey = new GroupsScoreboardsContests(array("group_scoreboard_id" => $r["scoreboard"]->group_scoreboard_id));
         $r["gscs"] = GroupsScoreboardsContestsDAO::search($groupScoreboardContestKey);
         $i = 0;
         $contest_params = array();
         foreach ($r["gscs"] as $gsc) {
             $contest = ContestsDAO::getByPK($gsc->contest_id);
             $response["contests"][$i] = $contest->asArray();
             $response["contests"][$i]["only_ac"] = $gsc->only_ac;
             $response["contests"][$i]["weight"] = $gsc->weight;
             // Fill contest params to pass to scoreboardMerge
             $contest_params[$contest->alias] = array("only_ac" => $gsc->only_ac == 0 ? false : true, "weight" => $gsc->weight);
             $i++;
         }
     } catch (ApiException $ex) {
         throw $ex;
     } catch (Exception $ex) {
         throw new InvalidDatabaseOperationException($ex);
     }
     $r["contest_params"] = $contest_params;
     // Fill details of this scoreboard
     $response["scoreboard"] = $r["scoreboard"]->asArray();
     // If we have contests, calculate merged&filtered scoreboard
     if (count($response["contests"]) > 0) {
         // Get merged scoreboard
         $r["contest_aliases"] = "";
         foreach ($response["contests"] as $contest) {
             $r["contest_aliases"] .= $contest["alias"] . ",";
         }
         $r["contest_aliases"] = rtrim($r["contest_aliases"], ",");
         try {
             $groupUsers = GroupsUsersDAO::search(new GroupsUsers(array("group_id" => $r["scoreboard"]->group_id)));
             $r["usernames_filter"] = "";
             foreach ($groupUsers as $groupUser) {
                 $user = UsersDAO::getByPK($groupUser->user_id);
                 $r["usernames_filter"] .= $user->username . ",";
             }
             $r["usernames_filter"] = rtrim($r["usernames_filter"], ",");
         } catch (Exception $ex) {
             throw new InvalidDatabaseOperationException($ex);
         }
         $mergedScoreboardResponse = ContestController::apiScoreboardMerge($r);
         $response["ranking"] = $mergedScoreboardResponse["ranking"];
     }
     $response["status"] = "ok";
     return $response;
 }
Example #25
0
<?php

require_once '../../server/bootstrap.php';
$smarty->assign('admin', false);
$smarty->assign('practice', false);
$show_intro = true;
try {
    $r = new Request(array('auth_token' => array_key_exists('ouat', $_REQUEST) ? $_REQUEST['ouat'] : null, 'contest_alias' => $_REQUEST['contest_alias']));
    $show_intro = ContestController::showContestIntro($r);
} catch (Exception $e) {
    header('HTTP/1.1 404 Not Found');
    die(file_get_contents('../404.html'));
}
if ($show_intro) {
    $smarty->display('../../templates/arena.contest.intro.tpl');
} else {
    $smarty->assign('jsfile', '/ux/contest.js');
    $smarty->display('../../templates/arena.contest.tpl');
}
Example #26
0
 /**
  * Add too many problems to a contest.
  */
 public function testAddTooManyProblemsToContest()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest();
     $auth_token = $this->login($contestData["director"]);
     for ($i = 0; $i < MAX_PROBLEMS_IN_CONTEST + 1; $i++) {
         // Get a problem
         $problemData = ProblemsFactory::createProblemWithAuthor($contestData['director']);
         // Build request
         $r = new Request(array("auth_token" => $auth_token, "contest_alias" => $contestData["contest"]->alias, "problem_alias" => $problemData["request"]["alias"], "points" => 100, "order_in_contest" => $i + 1));
         try {
             // Call API
             $response = ContestController::apiAddProblem($r);
             $this->assertLessThan(MAX_PROBLEMS_IN_CONTEST, $i);
             // Validate
             $this->assertEquals("ok", $response["status"]);
             self::assertProblemAddedToContest($problemData, $contestData, $r);
         } catch (ApiException $e) {
             $this->assertEquals($e->getMessage(), "contestAddproblemTooManyProblems");
             $this->assertEquals($i, MAX_PROBLEMS_IN_CONTEST);
         }
     }
 }
 /**
  * Tests remove group admins
  */
 public function testRemoveGroupAdmin()
 {
     // Get a contest
     $contestData = ContestsFactory::createContest();
     // Get users
     $user = UserFactory::createUser();
     $user2 = UserFactory::createUser();
     // Get a group
     $groupData = GroupsFactory::createGroup();
     GroupsFactory::addUserToGroup($groupData, $user);
     GroupsFactory::addUserToGroup($groupData, $user2);
     // Prepare request
     $r = new Request();
     $r['auth_token'] = $this->login($contestData['director']);
     $r['group'] = $groupData['request']['alias'];
     $r['contest_alias'] = $contestData['request']['alias'];
     // Call api
     ContestController::apiAddGroupAdmin($r);
     $contest = $contestData['contest'];
     $this->AssertTrue(Authorization::IsContestAdmin($user->getUserId(), $contest));
     $this->AssertTrue(Authorization::IsContestAdmin($user2->getUserId(), $contest));
     // Prepare request for remove the group
     $r = new Request();
     $r['auth_token'] = $this->login($contestData['director']);
     $r['group'] = $groupData['request']['alias'];
     $r['contest_alias'] = $contestData['request']['alias'];
     // Call api
     ContestController::apiRemoveGroupAdmin($r);
     $this->AssertFalse(Authorization::IsContestAdmin($user->getUserId(), $contest));
     $this->AssertFalse(Authorization::IsContestAdmin($user2->getUserId(), $contest));
 }
 public static function addAdminUser($contestData, $user)
 {
     // Prepare our request
     $r = new Request();
     $r['contest_alias'] = $contestData['request']['alias'];
     $r['usernameOrEmail'] = $user->getUsername();
     // Log in the contest director
     $r['auth_token'] = OmegaupTestCase::login($contestData['director']);
     // Call api
     ContestController::apiAddAdmin($r);
     unset($_REQUEST);
 }
Example #29
0
 /**
  * Get Contests which a certain user has participated in
  * 
  * @param Request $r
  * @return Contests array
  * @throws InvalidDatabaseOperationException
  */
 public static function apiContestStats(Request $r)
 {
     self::authenticateOrAllowUnauthenticatedRequest($r);
     $response = array();
     $response["contests"] = array();
     $user = self::resolveTargetUser($r);
     $contest_user_key = new ContestsUsers();
     $contest_user_key->setUserId($user->getUserId());
     // Get contests where user had at least 1 run
     try {
         $contestsParticipated = ContestsDAO::getContestsParticipated($user->getUserId());
     } catch (Exception $e) {
         throw new InvalidDatabaseOperationException($e);
     }
     $contests = array();
     foreach ($contestsParticipated as $contest) {
         // Get user ranking
         $scoreboardR = new Request(array("auth_token" => $r["auth_token"], "contest_alias" => $contest->getAlias(), "token" => $contest->getScoreboardUrlAdmin()));
         $scoreboardResponse = ContestController::apiScoreboard($scoreboardR);
         // Grab the place of the current user in the given contest
         $contests[$contest->getAlias()]["place"] = null;
         foreach ($scoreboardResponse["ranking"] as $userData) {
             if ($userData["username"] == $user->getUsername()) {
                 $contests[$contest->getAlias()]["place"] = $userData["place"];
                 break;
             }
         }
         $contest->toUnixTime();
         $contests[$contest->getAlias()]["data"] = $contest->asArray();
     }
     $response["contests"] = $contests;
     $response["status"] = "ok";
     return $response;
 }