// set interesting user $User = null; if (isset($_REQUEST["u"]) && !($User = ContactView::prepare_user($_REQUEST["u"]))) { redirectSelf(array("u" => null)); } if (!$Me->isPC || !$User) { $User = $Me; } // check problem set openness $max_pset = $Conf->setting("pset_forwarded"); foreach ($Conf->psets() as $pset) { if (Contact::student_can_see_pset($pset) && $pset->id > $max_pset && !$pset->gitless) { Contact::forward_pset_links($pset->id); } } if (!$Me->is_empty() && ($Me === $User || $Me->isPC) && $Qreq->set_username && check_post() && ($repoclass = RepositorySite::$sitemap[$Qreq->reposite]) && in_array($repoclass, RepositorySite::site_classes($Conf))) { if ($repoclass::save_username($User, $Qreq->username)) { redirectSelf(); } } if (!$Me->is_empty() && $Qreq->set_repo !== null) { ContactView::set_repo_action($User); } if ($Qreq->set_partner !== null) { ContactView::set_partner_action($User); } if ((isset($_REQUEST["set_drop"]) || isset($_REQUEST["set_undrop"])) && $Me->isPC && $User->is_student() && check_post()) { Dbl::qe("update ContactInfo set dropped=? where contactId=?", isset($_REQUEST["set_drop"]) ? $Now : 0, $User->contactId); redirectSelf(); } // download
static function set_repo_action($user) { global $Conf, $Me, $ConfSitePATH; if (!($Me->has_database_account() && check_post() && ($pset = $Conf->pset_by_key(req("pset"))))) { return; } if (!$Me->can_set_repo($pset, $user)) { return Conf::msg_error("You can’t edit repository information for that problem set now."); } // clean up repo url $repo_url = trim(req("repo")); if ($pset->repo_guess_patterns) { for ($i = 0; $i + 1 < count($pset->repo_guess_patterns); $i += 2) { $x = preg_replace('`' . str_replace("`", "\\`", $pset->repo_guess_patterns[$i]) . '`s', $pset->repo_guess_patterns[$i + 1], $repo_url, -1, $nreplace); if ($x !== null && $nreplace) { $repo_url = $x; break; } } } // does it contain odd characters? if (preg_match('_[,;\\[\\](){}\\<>&#=\\000-\\027]_', $repo_url)) { return Conf::msg_error("That repository contains funny characters. Remove them."); } // record interested repositories $try_classes = []; foreach (RepositorySite::site_classes($user->conf) as $sitek) { $sniff = $sitek::sniff_url($repo_url); if ($sniff == 2) { $try_classes = [$sitek]; break; } else { if ($sniff) { $try_classes[] = $sitek; } } } if (empty($try_classes)) { return Conf::msg_error("Invalid repository URL “" . htmlspecialchars($repo_url) . "”."); } // check repositories $working = false; $ms = new MessageSet($user); foreach ($try_classes as $sitek) { $reposite = $sitek::make_url($repo_url, $user->conf); if ($reposite && $reposite->validate_working($ms) > 0) { $working = true; break; } } // if !working, complain if (!$working && !$ms->has_problems()) { return Conf::msg_error("Invalid repository URL “" . htmlspecialchars($repo_url) . "” (tried " . join(", ", array_map(function ($m) { return $m::global_friendly_siteclass(); }, $try_classes)) . ")."); } else { if (!$working) { $msgs = join("<br />", $ms->messages()) ?: "Repository unreachable at the moment."; return Conf::msg_error($msgs); } } // store repo $repo = Repository::find_or_create_url($reposite->url, $user->conf); $repo && $repo->check_open(); if ($user->set_repo($pset, $repo)) { redirectSelf(); } }