function password($email, $iscdb = false) { global $Conf; $dblink = $iscdb ? Contact::contactdb() : $Conf->dblink; $result = Dbl::qe($dblink, "select password from ContactInfo where email=?", $email); $row = Dbl::fetch_first_row($result); return $row[0]; }
function fix_one_delegation() { global $Conf; $row = Dbl::fetch_first_row("select r.paperId, r.contactId, u.email, q.ct, q.cs, r.reviewNeedsSubmit\n from PaperReview r\n left join (select paperId, requestedBy, count(reviewId) ct, count(reviewSubmitted) cs\n from PaperReview where reviewType<" . REVIEW_SECONDARY . "\n group by paperId, requestedBy) q\n on (q.paperId=r.paperId and q.requestedBy=r.contactId)\n left join ContactInfo u on (u.contactId=r.contactId)\n where r.reviewType=" . REVIEW_SECONDARY . " and r.reviewSubmitted is null\n and if(coalesce(q.ct,0)=0,1,if(q.cs=0,-1,0))!=r.reviewNeedsSubmit\n limit 1"); if (!$row) { return false; } $pid = (int) $row[0]; $req_cid = (int) $row[1]; $req_email = $row[2]; $prow = $Conf->paperRow(["paperId" => $pid], null); fwrite(STDERR, "Problem: #{$pid} review by {$req_email}\n"); fwrite(STDERR, " reviewNeedsSubmit {$row['5']}, " . plural($row[3] ?: 0, "delegate") . ", " . plural($row[4] ?: 0, "submitted delegate") . "\n"); $result = Dbl::qe("select l.* from ActionLog l where paperId=? order by logId asc", $pid); $proposals = $confirmations = []; while ($row = edb_orow($result)) { if ($row->contactId == $req_cid && preg_match('/\\ALogged proposal for (\\S+) to review/', $row->action, $m) && ($xid = Contact::id_by_email($m[1]))) { $proposals[$xid] = true; } else { if (preg_match('/\\AAdded External review by (\\S+)/', $row->action, $m) && ($pc = pcByEmail($m[1])) && $pc->can_administer($prow)) { $confirmations[$row->contactId] = $pc->contactId; } } } Dbl::free($result); foreach ($proposals as $xid => $x) { if (isset($confirmations[$xid])) { $result1 = Dbl::qe("update PaperReview set requestedBy=? where paperId=? and contactId=? and requestedBy=?", $req_cid, $pid, $xid, $confirmations[$xid]); $result2 = Dbl::qe("update PaperReview r, PaperReview q set r.reviewNeedsSubmit=0 where r.paperId=? and r.contactId=? and q.paperId=? and q.contactId=? and q.reviewSubmitted is not null", $pid, $req_cid, $pid, $xid); if ($result1->affected_rows || $result2->affected_rows) { return true; } } } error_log("Failed to resolve paper #{$pid} review by {$req_email}"); return false; }
function load_pset_info() { global $ConfSitePATH, $Conf, $PsetInfo, $PsetOverrides, $Opt; // read initial messages Messages::$main = new Messages(); $x = json_decode(file_get_contents("{$ConfSitePATH}/src/messages.json")); foreach ($x as $j) { Messages::$main->add($j); } // read psets $PsetInfo = load_psets_json(false); // parse psets foreach ($PsetInfo as $pk => $p) { if (!is_object($p) || !isset($p->psetid)) { continue; } object_merge_recursive($p, $PsetInfo->_defaults); try { $pset = new Pset($pk, $p); Pset::register($pset); } catch (Exception $exception) { // Want to give a good error message, so discover where the error is. // - create pset landmark object $locinfo = (object) array(); foreach (psets_json_data(false) as $fname => $data) { $x = Json::decode_landmarks($data, $fname); object_replace_recursive($locinfo, $x); } $locp = $locinfo->{$pk}; if (isset($locinfo->_defaults)) { object_merge_recursive($locp, $locinfo->_defaults); } // - lookup exception path in landmark object $path = $exception instanceof PsetConfigException ? $exception->path : array(); for ($pathpos = 0; $pathpos < count($path) && $locp && !is_string($locp); ++$pathpos) { $component = $path[$pathpos]; $locp = is_array($locp) ? $locp[$component] : $locp->{$component}; } // - report error if (is_object($locp) && @$locp->__LANDMARK__) { $locp = $locp->__LANDMARK__; } else { if (!is_string($locp)) { $locp = $locinfo->{$pk}->__LANDMARK__; } } Multiconference::fail_message($locp . ": Configuration error: " . $exception->getMessage()); } } // read message data if (!@$PsetInfo->_messagedefs) { $PsetInfo->_messagedefs = (object) array(); } if (!@$PsetInfo->_messagedefs->SYSTEAM) { $PsetInfo->_messagedefs->SYSTEAM = "cs61-staff"; } foreach ($PsetInfo->_messagedefs as $k => $v) { Messages::$main->define($k, $v); } // also create log/ and repo/ directories foreach (array("{$ConfSitePATH}/log", "{$ConfSitePATH}/repo") as $d) { if (!is_dir($d) && !mkdir($d, 02770, true)) { $e = error_get_last(); Multiconference::fail_message("`{$d}` missing and cannot be created (" . $e["message"] . ")."); } if (!file_exists("{$d}/.htaccess") && ($x = file_get_contents("{$ConfSitePATH}/src/.htaccess")) !== false && file_put_contents("{$d}/.htaccess", $x) != strlen($x)) { Multiconference::fail_message("Error creating `{$d}/.htaccess`"); } } // if any anonymous problem sets, create anonymous usernames foreach (Pset::$all as $p) { if (!$p->disabled && $p->anonymous) { while ($row = Dbl::fetch_first_row(Dbl::qe("select contactId from ContactInfo where anon_username is null limit 1"))) { Dbl::q("update ContactInfo set anon_username='******' where contactId=?", $row[0]); } } } }
static function unsubmit_review_row($rrow) { $needsSubmit = 1; if ($rrow->reviewType == REVIEW_SECONDARY) { $row = Dbl::fetch_first_row("select count(reviewSubmitted), count(reviewId) from PaperReview where paperId={$rrow->paperId} and requestedBy={$rrow->contactId} and reviewType<" . REVIEW_SECONDARY); if ($row && $row[0]) { $needsSubmit = 0; } else { if ($row && $row[1]) { $needsSubmit = -1; } } } return Dbl::qe("update PaperReview set reviewSubmitted=null, reviewNeedsSubmit={$needsSubmit} where reviewId={$rrow->reviewId}"); }
$papers = isset($arg["p"]) || isset($arg["papers"]); $collaborators = isset($arg["collaborators"]); if (!$users && !$papers && !$collaborators) { $users = $papers = true; } if ($users) { $result = Dbl::ql($Conf->dblink, "select ContactInfo.contactId, email from ContactInfo\n left join PaperConflict on (PaperConflict.contactId=ContactInfo.contactId and PaperConflict.conflictType>=" . CONFLICT_AUTHOR . ")\n left join PaperReview on (PaperReview.contactId=ContactInfo.contactId)\n where roles!=0 or PaperConflict.conflictType is not null\n or PaperReview.reviewId is not null\n group by ContactInfo.contactId"); while ($row = edb_row($result)) { $contact = Contact::find_by_id($row[0]); $contact->contactdb_update(); } Dbl::free($result); } if ($papers) { $result = Dbl::ql(Contact::contactdb(), "select confid from Conferences where `dbname`=?", $Opt["dbName"]); $row = Dbl::fetch_first_row($result); if (!$row) { fwrite(STDERR, "Conference is not recored in contactdb\n"); exit(1); } $confid = $row[0]; $result = Dbl::ql($Conf->dblink, "select paperId, title from Paper"); $q = array(); while ($row = edb_row($result)) { $q[] = "(" . $confid . "," . $row[0] . ",'" . sqlq($row[1]) . "')"; } Dbl::free($result); for ($i = 0; $i < count($q); $i += 25) { $xq = array_slice($q, $i, 25); Dbl::ql_raw(Contact::contactdb(), "insert into ConferencePapers (confid,paperId,title) values " . join(",", $xq) . " on duplicate key update title=values(title)"); }
function __construct($contact, $type, $papersel, $newrev_since) { global $Conf, $Now; $this->contact = $contact; assert(!!$contact->isPC); $any_newpcrev = $any_lead = $any_shepherd = 0; if ($contact->is_manager()) { $this->defsel("s", "Contact authors of submitted papers"); $this->defsel("unsub", "Contact authors of unsubmitted papers"); $this->defsel("au", "All contact authors"); // map "somedec:no"/"somedec:yes" to real decisions $result = Dbl::qe("select outcome, count(*) from Paper where timeSubmitted>0 group by outcome"); $dec_pcount = edb_map($result); $dec_tcount = array(0 => 0, 1 => 0, -1 => 0); foreach ($dec_pcount as $dnum => $dcount) { $dec_tcount[$dnum > 0 ? 1 : ($dnum < 0 ? -1 : 0)] += $dcount; } if ($type == "somedec:no" || $type == "somedec:yes") { $dmaxcount = -1; foreach ($dec_pcount as $dnum => $dcount) { if (($type[8] == "n" ? $dnum < 0 : $dnum > 0) && $dcount > $dmaxcount && ($dname = $Conf->decision_name($dnum))) { $type = "dec:{$dname}"; $dmaxcount = $dcount; } } } $by_dec = array(); foreach ($Conf->decision_map() as $dnum => $dname) { $k = "dec:{$dname}"; if ($dnum && (@$dec_pcount[$dnum] > 0 || $type == $k)) { $by_dec[$k] = "Contact authors of " . htmlspecialchars($dname) . " papers"; } } if ($dec_tcount[1] > 0 || $type == "dec:yes") { $by_dec["dec:yes"] = "Contact authors of accept-class papers"; } if ($dec_tcount[-1] > 0 || $type == "dec:no") { $by_dec["dec:no"] = "Contact authors of reject-class papers"; } if ($dec_tcount[0] > 0 || $type == "dec:none") { $by_dec["dec:none"] = "Contact authors of undecided papers"; } if ($type == "dec:any") { $by_dec["dec:any"] = "Contact authors of decided papers"; } if (count($by_dec)) { $this->sel["bydec_group"] = array("optgroup", "Contact authors by decision"); foreach ($by_dec as $k => $v) { $this->defsel($k, $v); } $this->sel["bydec_group_end"] = array("optgroup"); } $this->sel["rev_group"] = array("optgroup", "Reviewers"); $this->defsel("rev", "Reviewers"); $this->defsel("crev", "Reviewers with complete reviews"); $this->defsel("uncrev", "Reviewers with incomplete reviews"); $this->defsel("allcrev", "Reviewers with no incomplete reviews"); $this->defsel("pcrev", "PC reviewers"); $this->defsel("uncpcrev", "PC reviewers with incomplete reviews"); // new assignments query // XXX this exposes information about PC review assignments // for conflicted papers to the chair; not worth worrying about $aq = "select PaperReview.paperId any_newpcrev from PaperReview"; if (!$contact->privChair) { $aq .= " join Paper on (Paper.paperId=PaperReview.paperId and Paper.managerContactId=" . $contact->contactId . ")"; } $aq .= "\n\twhere reviewType>=" . REVIEW_PC . " and reviewSubmitted is null and reviewNeedsSubmit!=0 and timeRequested>timeRequestNotified limit 1"; $bcq_manager = ""; if (!$contact->privChair) { $bcq_manager = " and managerContactId=" . $contact->contactId; } $q = "select any_newpcrev, any_lead, any_shepherd\n\tfrom ({$aq}) a\n\tleft join (select paperId any_lead from Paper where timeSubmitted>0 and leadContactId!=0{$bcq_manager} limit 1) b on (true)\n\tleft join (select paperId any_shepherd from Paper where timeSubmitted>0 and shepherdContactId!=0{$bcq_manager} limit 1) c on (true)"; if ($row = Dbl::fetch_first_row($q)) { list($any_newpcrev, $any_lead, $any_shepherd) = $row; } $this->defsel("newpcrev", "PC reviewers with new review assignments"); $this->defsel("extrev", "External reviewers"); $this->defsel("uncextrev", "External reviewers with incomplete reviews"); $this->sel["rev_group_end"] = array("optgroup"); } $this->defsel_nm("myextrev", "Your requested reviewers"); $this->defsel_nm("uncmyextrev", "Your requested reviewers with incomplete reviews"); $this->sel["pc_group"] = array("optgroup", "Program committee"); if ($contact->is_manager()) { if ($any_lead || $type == "lead") { $this->defsel("lead", "Discussion leads"); } if ($any_shepherd || $type == "shepherd") { $this->defsel("shepherd", "Shepherds"); } } $this->defsel_nm("pc", "Program committee"); foreach (pcTags() as $t) { if ($t != "pc") { $this->defsel_nm("pc:{$t}", "PC members tagged “{$t}”"); } } $this->sel["pc_group_end"] = array("optgroup"); if ($contact->privChair) { $this->defsel("all", "All users"); } if (isset($this->sel[$type])) { $this->type = $type; } else { if ($type == "myuncextrev" && isset($this->sel["uncmyextrev"])) { $this->type = "uncmyextrev"; } else { $this->type = key($this->sel); } } $this->papersel = $papersel; if ($this->type == "newpcrev") { $t = @trim($newrev_since); if (preg_match(',\\A(?:|n/a|[(]?all[)]?|0)\\z,i', $t)) { $this->newrev_since = 0; } else { if (($this->newrev_since = $Conf->parse_time($t)) !== false) { if ($this->newrev_since > $Now) { $Conf->warnMsg("That time is in the future."); } } else { Conf::msg_error("Invalid date."); $this->error = true; } } } }