function check_contest($data, $keydata = null) { if (isset($data['shortname']) && !preg_match(ID_REGEX, $data['shortname'])) { ch_error("Contest shortname may only contain characters " . IDENTIFIER_CHARS . "."); } // are these dates valid? foreach (array('starttime', 'endtime', 'freezetime', 'unfreezetime', 'activatetime', 'deactivatetime') as $f) { // The true input date/time strings are preserved in the // *_string variables, since these may be relative times // that need to be kept as is. $data[$f] = $data[$f . '_string']; $data[$f] = check_relative_time($data[$f], $data['starttime'], $f); } // are required times specified? foreach (array('activatetime', 'starttime', 'endtime') as $f) { if (empty($data[$f])) { ch_error("Contest {$f} is empty"); return $data; } } // the ordering of times is: // activatetime <= starttime <= freezetime < endtime <= unfreezetime <= deactivatetime // are contest start/end times in order? if (difftime($data['endtime'], $data['starttime']) <= 0) { ch_error('Contest ends before it even starts'); } if (!empty($data['freezetime'])) { if (difftime($data['freezetime'], $data['endtime']) > 0 || difftime($data['freezetime'], $data['starttime']) < 0) { ch_error('Freezetime is out of start/endtime range'); } } if (difftime($data['activatetime'], $data['starttime']) > 0) { ch_error('Activate time is later than starttime'); } if (!empty($data['unfreezetime'])) { if (empty($data['freezetime'])) { ch_error('Unfreezetime set but no freeze time. That makes no sense.'); } if (difftime($data['unfreezetime'], $data['endtime']) < 0) { ch_error('Unfreezetime must be larger than endtime.'); } if (difftime($data['deactivatetime'], $data['unfreezetime']) < 0) { ch_error('Deactivatetime must be larger than unfreezetime.'); } } else { if (!empty($data['deactivatetime']) && difftime($data['deactivatetime'], $data['endtime']) < 0) { ch_error('Deactivatetime must be larger than endtime.'); } } return $data; }
requireAdmin(); $docid = $_POST['cid']; $time = key($_POST['donow']); if (!in_array($time, $times)) { error("Unknown value for timetype"); } $now = floor($now); $nowstring = strftime('%Y-%m-%d %H:%M:%S', $now); auditlog('contest', $docid, $time . ' now', $nowstring); // starttime is special because other, relative times depend on it. if ($time == 'start') { $docdata = $cdatas[$docid]; $docdata['starttime'] = $now; $docdata['starttime_string'] = $nowstring; foreach (array('endtime', 'freezetime', 'unfreezetime', 'activatetime', 'deactivatetime') as $f) { $docdata[$f] = check_relative_time($docdata[$f . '_string'], $docdata['starttime'], $f); } $DB->q('UPDATE contest SET starttime = %s, starttime_string = %s, endtime = %s, freezetime = %s, unfreezetime = %s, activatetime = %s, deactivatetime = %s WHERE cid = %i', $docdata['starttime'], $docdata['starttime_string'], $docdata['endtime'], $docdata['freezetime'], $docdata['unfreezetime'], $docdata['activatetime'], $docdata['deactivatetime'], $docid); header("Location: ./contests.php?edited=1"); } else { $DB->q('UPDATE contest SET ' . $time . 'time = %s, ' . $time . 'time_string = %s WHERE cid = %i', $now, $nowstring, $docid); header("Location: ./contests.php"); } exit; } $title = 'Contests'; require LIBWWWDIR . '/header.php';