function AJeditResource() { $imageid = processInputVar('rscid', ARG_NUMERIC); $images = getUserResources(array("imageAdmin"), array('administer'), 0, 1); if (!array_key_exists($imageid, $images['image'])) { $ret = array('status' => 'noaccess'); sendJSON($ret); return; } $tmp = $this->getData(array('includedeleted' => 0, 'rscid' => $imageid)); $data = $tmp[$imageid]; $extra = getImageNotes($imageid); $extra['description'] = htmlspecialchars_decode($extra['description']); $extra['usage'] = htmlspecialchars_decode($extra['usage']); $data = array_merge($data, $extra); $cdata = $this->basecdata; $cdata['imageid'] = $imageid; $cdata['olddata'] = $data; if ($data['minram'] < 512) { $data['minram'] = 512; } # revisions $data['revisionHTML'] = $this->getRevisionHTML($imageid); # subimage url $cdata2 = array('obj' => $this, 'imageid' => $imageid); $cont = addContinuationsEntry('subimageDialogContent', $cdata2); $data['subimageurl'] = BASEURL . SCRIPT . "?continuation={$cont}"; # connect method url $cdata2['curmethods'] = $data['connectmethods']; #$cdata2['newimage'] = $state; $cont = addContinuationsEntry('connectmethodDialogContent', $cdata2); $data['connectmethodurl'] = BASEURL . SCRIPT . "?continuation={$cont}"; $data['connectmethods'] = array_values($data['connectmethods']); # save continuation $cont = addContinuationsEntry('AJsaveResource', $cdata); $ret = array('title' => i("Edit {$this->restypename}"), 'cont' => $cont, 'resid' => $imageid, 'data' => $data, 'status' => 'success'); sendJSON($ret); }
function jsonGetGroupInfo() { $groupid = processInputVar('groupid', ARG_NUMERIC); $mousex = processInputVar('mousex', ARG_NUMERIC); $mousey = processInputVar('mousey', ARG_NUMERIC); $userresources = getUserResources(array("groupAdmin"), array("manageGroup"), 1); $found = 0; foreach (array_keys($userresources) as $type) { if (array_key_exists($groupid, $userresources[$type])) { $found = 1; break; } } if (!$found || $mousex < 0 || $mousex > 5000 || $mousey < 0 || $mousey > 500000) { header('Content-Type: text/json; charset=utf-8'); print '{} && {"items":' . json_encode(array()) . '}'; return; } $members = getResourceGroupMembers($type); $data = ''; if (!empty($members[$type][$groupid])) { uasort($members[$type][$groupid], "sortKeepIndex"); foreach ($members[$type][$groupid] as $mem) { $data .= "{$mem['name']}<br>"; } } else { $data = '(empty group)'; } $arr = array('members' => $data, 'x' => $mousex, 'y' => $mousey, 'groupid' => $groupid); header('Content-Type: text/json-comment-filtered; charset=utf-8'); print '{} && {"items":' . json_encode($arr) . '}'; }
function getUserComputerMetaData() { $key = getKey(array('getUserComputerMetaData')); if (array_key_exists($key, $_SESSION['usersessiondata'])) { return $_SESSION['usersessiondata'][$key]; } $computers = getComputers(); $resources = getUserResources(array("computerAdmin"), array("administer", "manageGroup"), 0, 1); $return = array("platforms" => array(), "schedules" => array()); foreach (array_keys($resources["computer"]) as $compid) { if (!array_key_exists($compid, $computers)) { continue; } if (!in_array($computers[$compid]["platform"], $return["platforms"])) { $return["platforms"][$computers[$compid]["platformid"]] = $computers[$compid]["platform"]; } if (!in_array($computers[$compid]["schedule"], $return["schedules"])) { $return["schedules"][$computers[$compid]["scheduleid"]] = $computers[$compid]["schedule"]; } } uasort($return["platforms"], "sortKeepIndex"); uasort($return["schedules"], "sortKeepIndex"); $_SESSION['usersessiondata'][$key] = $return; return $return; }
function processBlockRequestInput($checks = 1) { global $submitErr, $submitErrMsg, $mode, $user, $days; $return = array(); $return['blockname'] = getContinuationVar("blockname", processInputVar("blockname", ARG_STRING)); $return['imageid'] = getContinuationVar("imageid", processInputVar("imageid", ARG_NUMERIC)); $return['machinecnt'] = getContinuationVar("machinecnt", processInputVar("machinecnt", ARG_NUMERIC, 0)); $return['swhour'] = getContinuationVar("swhour", processInputVar("swhour", ARG_MULTINUMERIC)); $return['swminute'] = getContinuationVar("swminute", processInputVar("swminute", ARG_MULTINUMERIC)); $return['swmeridian'] = getContinuationVar("swmeridian", processInputVar("swmeridian", ARG_MULTISTRING)); $return['ewhour'] = getContinuationVar("ewhour", processInputVar("ewhour", ARG_MULTINUMERIC)); $return['ewminute'] = getContinuationVar("ewminute", processInputVar("ewminute", ARG_MULTINUMERIC)); $return['ewmeridian'] = getContinuationVar("ewmeridian", processInputVar("ewmeridian", ARG_MULTISTRING)); $return['smhour'] = getContinuationVar("smhour", processInputVar("smhour", ARG_MULTINUMERIC)); $return['smminute'] = getContinuationVar("smminute", processInputVar("smminute", ARG_MULTINUMERIC)); $return['smmeridian'] = getContinuationVar("smmeridian", processInputVar("smmeridian", ARG_MULTISTRING)); $return['emhour'] = getContinuationVar("emhour", processInputVar("emhour", ARG_MULTINUMERIC)); $return['emminute'] = getContinuationVar("emminute", processInputVar("emminute", ARG_MULTINUMERIC)); $return['emmeridian'] = getContinuationVar("emmeridian", processInputVar("emmeridian", ARG_MULTISTRING)); $return['slhour'] = getContinuationVar("slhour", processInputVar("slhour", ARG_MULTINUMERIC)); $return['slminute'] = getContinuationVar("slminute", processInputVar("slminute", ARG_MULTINUMERIC)); $return['slmeridian'] = getContinuationVar("slmeridian", processInputVar("slmeridian", ARG_MULTISTRING)); $return['elhour'] = getContinuationVar("elhour", processInputVar("elhour", ARG_MULTINUMERIC)); $return['elminute'] = getContinuationVar("elminute", processInputVar("elminute", ARG_MULTINUMERIC)); $return['elmeridian'] = getContinuationVar("elmeridian", processInputVar("elmeridian", ARG_MULTISTRING)); $return['weeknum'] = getContinuationVar("weeknum", processInputVar("weeknum", ARG_NUMERIC)); $return['day'] = getContinuationVar("day", processInputVar("day", ARG_NUMERIC)); $return['date'] = getContinuationVar("date", processInputVar("date", ARG_MULTISTRING)); $return['available'] = getContinuationVar("available", processInputVar("available", ARG_STRING, 'weekly')); $return['usergroupid'] = getContinuationVar("usergroupid", processInputVar("usergroupid", ARG_NUMERIC)); $return['admingroupid'] = getContinuationVar("admingroupid", processInputVar("admingroupid", ARG_NUMERIC)); $return['swdate'] = getContinuationVar("swdate", processInputVar("swdate", ARG_STRING)); $return['ewdate'] = getContinuationVar("ewdate", processInputVar("ewdate", ARG_STRING)); $return['smdate'] = getContinuationVar("smdate", processInputVar("smdate", ARG_STRING)); $return['emdate'] = getContinuationVar("emdate", processInputVar("emdate", ARG_STRING)); $return['wdays'] = getContinuationVar("wdays", processInputVar("wdays", ARG_MULTISTRING)); $return['state'] = getContinuationVar("state", 0); $return['blockRequestid'] = getContinuationVar("blockRequestid", processInputVar("blockRequestid", ARG_NUMERIC)); $return['wdayschecked'] = array(); foreach ($days as $day) { if (in_array($day, $return['wdays'])) { $return['wdayschecked'][$day] = 'checked'; } else { $return['wdayschecked'][$day] = ''; } } if (!$checks) { return $return; } if (!preg_match('/^([-a-zA-Z0-9\\. ]){3,80}$/', $return["blockname"])) { $submitErr |= BLOCKNAMEERR; $submitErrMsg[BLOCKNAMEERR] = "Name can only contain letters, numbers, spaces, dashes(-),<br>and periods(.) and can be from 3 to 80 characters long"; } $resources = getUserResources(array("imageAdmin", "imageCheckOut")); $resources["image"] = removeNoCheckout($resources["image"]); if (!in_array($return['imageid'], array_keys($resources['image']))) { $submitErr |= IMAGEIDERR; $submitErrMsg[IMAGEIDERR] = "The submitted image is invalid."; } if ($return['machinecnt'] < MIN_BLOCK_MACHINES) { $submitErr |= BLOCKCNTERR; $submitErrMsg[BLOCKCNTERR] = "You must request at least " . MIN_BLOCK_MACHINES . " machines"; } elseif ($return['machinecnt'] > MAX_BLOCK_MACHINES) { $submitErr |= BLOCKCNTERR; $submitErrMsg[BLOCKCNTERR] = "You cannot request more than " . MAX_BLOCK_MACHINES . " machines"; } // FIXME should we limit the course groups that show up? $groups = getUserGroups(); if (!array_key_exists($return['usergroupid'], $groups)) { $submitErr |= USERGROUPIDERR; $submitErrMsg[USERGROUPIDERR] = "The submitted user group is invalid."; } if (!array_key_exists($return['admingroupid'], $groups) && $return['admingroupid'] != 0) { $submitErr |= ADMINGROUPIDERR; $submitErrMsg[ADMINGROUPIDERR] = "The submitted user group is invalid."; } if ($return['available'] == 'weekly') { $keys = array('1' => 'swhour', '2' => 'ewhour', '3' => 'swminute', '4' => 'ewminute', '5' => 'swmeridian', '6' => 'ewmeridian', '7' => 'swdate', '8' => 'ewdate'); // check days of week foreach ($return['wdays'] as $index => $day) { if (!in_array($day, $days)) { unset($return['wdays'][$index]); } } /*foreach($days as $day) { if(in_array($day, $return['wdays'])) $return['wdayschecked'][$day] = 'checked'; }*/ if (!count($return['wdays'])) { $submitErr |= STARTDAYERR; $submitErrMsg[STARTDAYERR] = "You must select at least one day of the week"; } } elseif ($return['available'] == 'monthly') { $keys = array('1' => 'smhour', '2' => 'emhour', '3' => 'smminute', '4' => 'emminute', '5' => 'smmeridian', '6' => 'emmeridian', '7' => 'smdate', '8' => 'emdate'); // check weeknum if ($return['weeknum'] < 1 || $return['weeknum'] > 5) { $submitErr |= WEEKNUMERR; $submitErrMsg[WEEKNUMERR] = "Invalid week of the month submitted"; } // check day if ($return['day'] < 1 || $return['day'] > 7) { $submitErr |= DAYERR; $submitErrMsg[DAYERR] = "Invalid day of the week submitted"; } } elseif ($return['available'] == 'list') { $keys = array('1' => 'slhour', '2' => 'elhour', '3' => 'slminute', '4' => 'elminute', '5' => 'slmeridian', '6' => 'elmeridian'); } // check each timeslot for ($i = 0; $i < 4; $i++) { $submitErrMsg[STARTHOURERR][$i] = ""; $submitErrMsg[ENDHOURERR][$i] = ""; // start hour if ($return[$keys[1]][$i] < 1 || $return[$keys[1]][$i] > 12) { $submitErr |= STARTHOURERR; $submitErrMsg[STARTHOURERR][$i] = "The start hour must be between 1 and 12."; } // end hour if ($return[$keys[2]][$i] < 1 || $return[$keys[2]][$i] > 12) { $submitErr |= ENDHOURERR; $submitErrMsg[ENDHOURERR][$i] = " The end hour must be between 1 and 12."; } // start minute if ($return[$keys[3]][$i] < 0 || $return[$keys[3]][$i] > 59) { $submitErr |= STARTHOURERR; // we reuse STARTHOURERR here, it overwrites the last one, but oh well $submitErrMsg[STARTHOURERR][$i] = "The start minute must be between 0 and 59."; } // end minute if ($return[$keys[4]][$i] < 0 || $return[$keys[4]][$i] > 59) { $submitErr |= ENDHOURERR; $submitErrMsg[ENDHOURERR][$i] = " The end minute must be between 0 and 59."; } // start meridian if ($return[$keys[5]][$i] != 'am' && $return[$keys[5]][$i] != 'pm') { $return[$keys[5]][$i] = 'pm'; // just set it to one of them } // end meridian if ($return[$keys[6]][$i] != 'am' && $return[$keys[6]][$i] != 'pm') { $return[$keys[6]][$i] = 'am'; // just set it to one of them } // check that start is before end $return['stime'][$i] = minuteOfDay2("{$return[$keys[1]][$i]}:{$return[$keys[3]][$i]} {$return[$keys[5]][$i]}"); $return['etime'][$i] = minuteOfDay2("{$return[$keys[2]][$i]}:{$return[$keys[4]][$i]} {$return[$keys[6]][$i]}"); if ($return['stime'][$i] > $return['etime'][$i]) { $submitErr |= STARTHOURERR; // we reuse STARTHOURERR here, it overwrites the last one, but oh well $submitErrMsg[STARTHOURERR][$i] = "The start time must be before the end time (or be equal to ignore this slot)"; } } if ($return['available'] == 'weekly' || $return['available'] == 'monthly') { // check that timeslots do not overlap if (!($submitErr & STARTHOURERR) && !($submitErr & ENDHOURERR)) { for ($i = 0; $i < 4; $i++) { for ($j = $i + 1; $j < 4; $j++) { if ($return['etime'][$i] > $return['stime'][$j] && $return['stime'][$i] < $return['etime'][$j]) { $submitErr |= STARTHOURERR; $submitErrMsg[STARTHOURERR][$i] = "This timeslot overlaps with Slot" . ($j + 1); } } } } // check that start date is valid $startarr = split('/', $return[$keys[7]]); if (!preg_match('/^((\\d){1,2})\\/((\\d){1,2})\\/(\\d){2}$/', $return[$keys[7]])) { $submitErr |= STARTDATEERR; $submitErrMsg[STARTDATEERR] = "The start date must be in the form mm/dd/yy."; } elseif (!checkdate($startarr[0], $startarr[1], $startarr[2])) { $submitErr |= STARTDATEERR; $submitErrMsg[STARTDATEERR] = "This is an invalid date."; } elseif (datetimeToUnix("{$startarr[2]}-{$startarr[0]}-{$startarr[1]} 23:59:59") < time()) { $submitErr |= STARTDATEERR; $submitErrMsg[STARTDATEERR] = "The start date must be today or later."; } // check that end date is valid $endarr = split('/', $return[$keys[8]]); if (!preg_match('/^((\\d){1,2})\\/((\\d){1,2})\\/(\\d){2}$/', $return[$keys[8]])) { $submitErr |= ENDDATEERR; $submitErrMsg[ENDDATEERR] = "The end date must be in the form mm/dd/yy."; } elseif (!checkdate($endarr[0], $endarr[1], $endarr[2])) { $submitErr |= ENDDATEERR; $submitErrMsg[ENDDATEERR] = "This is an invalid date."; } elseif (datetimeToUnix("{$startarr[2]}-{$startarr[0]}-{$startarr[1]} 00:00:00") > datetimeToUnix("{$endarr[2]}-{$endarr[0]}-{$endarr[1]} 00:00:00")) { $submitErr |= ENDDATEERR; $submitErrMsg[ENDDATEERR] = "The end date must be later than the start date."; } } elseif ($return['available'] == 'list') { if (!($submitErr & STARTHOURERR) && !($submitErr & ENDHOURERR)) { // check date[1-n] for ($i = 0; $i < 4; $i++) { $submitErrMsg[STARTDATEERR][$i] = ""; if ($return['stime'][$i] == $return['etime'][$i]) { continue; } $submitErrMsg[STARTDATEERR][$i] = ""; $datearr = split('/', $return['date'][$i]); if (!preg_match('/^((\\d){1,2})\\/((\\d){1,2})\\/(\\d){2}$/', $return['date'][$i])) { $submitErr |= STARTDATEERR; $submitErrMsg[STARTDATEERR][$i] = "The date must be in the form mm/dd/yy."; } elseif (!checkdate($datearr[0], $datearr[1], $datearr[2])) { $submitErr |= STARTDATEERR; $submitErrMsg[STARTDATEERR][$i] = "Invalid date submitted."; } elseif (datetimeToUnix("{$datearr[2]}-{$datearr[0]}-{$datearr[1]} 23:59:59") < time()) { $submitErr |= STARTDATEERR; $submitErrMsg[STARTDATEERR][$i] = "The date must be today or later."; } } } } if (0) { # FIXME $submitErr |= AVAILABLEERR; $submitErrMsg[AVAILABLEERR] = "The submitted availability selection is invalid."; } return $return; }
function processBlockAllocationInput() { global $user; $return = array(); $method = getContinuationVar('method'); $return['name'] = processInputVar('name', ARG_STRING); $return['owner'] = processInputVar('owner', ARG_STRING); $return['imageid'] = processInputVar('imageid', ARG_NUMERIC); $return['seats'] = processInputVar('seats', ARG_NUMERIC); $return['groupid'] = processInputVar('groupid', ARG_NUMERIC); $override = getContinuationVar('override', 0); $type = processInputVar('type', ARG_STRING); $err = 0; if ($method != 'request' && !preg_match('/^([-a-zA-Z0-9\\. \\(\\)]){3,80}$/', $return['name'])) { $errmsg = i("The name can only contain letters, numbers, spaces, dashes(-), and periods(.) and can be from 3 to 80 characters long"); $err = 1; } $resources = getUserResources(array("imageAdmin", "imageCheckOut")); $resources["image"] = removeNoCheckout($resources["image"]); if (!array_key_exists($return['imageid'], $resources['image'])) { $errmsg = i("The submitted image is invalid."); $err = 1; } if (!$err && $method != 'request' && !validateUserid($return['owner'])) { $errmsg = i("The submitted owner is invalid."); $err = 1; } else { $return['ownerid'] = getUserlistID($return['owner']); } $groups = getUserGroups(0, $user['affiliationid']); $extragroups = getContinuationVar('extragroups'); if (!$err && !array_key_exists($return['groupid'], $groups) && !array_key_exists($return['groupid'], $extragroups) && $return['groupid'] != 0) { $errmsg = i("The submitted user group is invalid."); $err = 1; } if (!$err && $return['groupid'] == 0) { $return['groupid'] = 'NULL'; } if (!$err && ($return['seats'] < MIN_BLOCK_MACHINES || $return['seats'] > MAX_BLOCK_MACHINES)) { $errmsg = sprintf(i("The submitted number of seats must be between %d and %d."), MIN_BLOCK_MACHINES, MAX_BLOCK_MACHINES); $err = 1; } if (!$err) { $imgdata = getImages(0, $return['imageid']); $concur = $imgdata[$return['imageid']]['maxconcurrent']; if (!is_null($concur) && $concur != 0 && $return['seats'] > $concur) { $errmsg = sprintf(i("The selected image can only have %d concurrent reservations. Please reduce the number of requested seats to %d or less."), $concur, $concur); $err = 1; } } $dooverride = 0; # check user group access to image if (($method == 'new' || $method == 'edit') && !$err && !$override) { $groupresources = getUserResources(array("imageAdmin", "imageCheckOut"), array("available"), 0, 0, 0, $return['groupid']); if (!array_key_exists($return['imageid'], $groupresources['image'])) { $dooverride = 1; $errmsg = i("WARNING - The selected user group does not currently have access to the selected environment. You can submit the Block Allocation again to ignore this warning."); $err = 1; } } if (!$err && $type != 'weekly' && $type != 'monthly' && $type != 'list') { $errmsg = i("You must select one of \"Repeating Weekly\", \"Repeating Monthly\", or \"List of Dates/Times\"."); $err = 1; } if (!$err) { if ($type == 'list') { $slots = processInputVar('slots', ARG_STRING); $return['slots'] = explode(',', $slots); $return['times'] = array(); $lastdate = array('day' => '', 'ts' => 0); foreach ($return['slots'] as $slot) { $tmp = explode('|', $slot); if (count($tmp) != 3) { $errmsg = i("Invalid date/time submitted."); $err = 1; break; } $date = $tmp[0]; if (!$err) { $datets = strtotime($date); if ($method != 'edit' && $datets < time() - SECINDAY) { $errmsg = i("The date must be today or later."); $err = 1; break; } } $return['times'][] = "{$tmp[1]}|{$tmp[2]}"; if ($datets > $lastdate['ts']) { $lastdate['ts'] = $datets; $lastdate['day'] = $date; } } if (!$err) { $expirets = strtotime("{$lastdate['day']} 23:59:59"); $return['expiretime'] = unixToDatetime($expirets); } } if ($type == 'weekly' || $type == 'monthly') { $return['startdate'] = processInputVar('startdate', ARG_NUMERIC); $return['enddate'] = processInputVar('enddate', ARG_NUMERIC); $times = processInputVar('times', ARG_STRING); $return['startts'] = strtotime($return['startdate']); $return['endts'] = strtotime($return['enddate']); if ($return['startts'] > $return['endts']) { $errmsg = i("The Last Date of Usage must be the same or later than the First Date of Usage."); $err = 1; } elseif ($method != 'edit' && $return['startts'] < time() - SECINDAY) { $errmsg = i("The start date must be today or later."); $err = 1; } $expirets = strtotime("{$return['enddate']} 23:59:59"); $return['expiretime'] = unixToDatetime($expirets); $return['times'] = explode(',', $times); } foreach ($return['times'] as $time) { $tmp = explode('|', $time); if (count($tmp) != 2) { $errmsg = i("Invalid start/end time submitted"); $err = 1; break; } $start = explode(':', $tmp[0]); if (count($start) != 2 || !is_numeric($start[0]) || !is_numeric($start[1]) || $start[0] < 0 || $start[0] > 23 || $start[1] < 0 || $start[1] > 59) { $errmsg = i("Invalid start time submitted"); $err = 1; break; } $end = explode(':', $tmp[1]); if (count($end) != 2 || !is_numeric($end[0]) || !is_numeric($end[1]) || $end[0] < 0 || $end[0] > 23 || $end[1] < 0 || $end[1] > 59) { $errmsg = i("Invalid end time submitted"); $err = 1; break; } $start = minuteOfDay($start[0], $start[1]); $end = minuteOfDay($end[0], $end[1]); if ($start >= $end) { $errmsg = i("Each start time must be less than the corresponding end time."); $err = 1; break; } } if ($type == 'weekly') { $validdays = 0; $errmsg = ''; for ($day = $return['startts'], $i = 0; $i < 7, $day < $return['endts'] + SECINDAY; $i++, $day += SECINDAY) { $daynum = date('w', $day); $validdays |= 1 << $daynum; } $days = processInputVar('days', ARG_STRING); $dayscheck = processInputVar('days', ARG_NUMERIC); if ($days == '' && $dayscheck == '0') { $days = 0; } $return['daymask'] = 0; if (!$err) { foreach (explode(',', $days) as $day) { if ($day == '' || $day < 0 || $day > 6) { $errmsg = i("Invalid day submitted."); $err = 1; break; } $return['daymask'] |= 1 << $day; } } if (!$err && ($return['daymask'] & $validdays) == 0) { $errmsg = i("No valid days submitted for the specified date range."); $err = 1; } } if ($type == 'monthly') { $return['weeknum'] = processInputVar('weeknum', ARG_NUMERIC); $return['day'] = processInputVar('day', ARG_NUMERIC); if (!$err && ($return['weeknum'] < 1 || $return['weeknum'] > 5)) { $errmsg = i("Invalid week number submitted."); $err = 1; } if (!$err && ($return['day'] < 1 || $return['day'] > 7)) { $errmsg = i("Invalid day of week submitted."); $err = 1; } $times = getMonthlyBlockTimes('', $return['startts'], $return['endts'], $return['day'], $return['weeknum'], $return['times']); if (!$err && empty($times)) { $errmsg = i("Specified day of month not found in date range."); $err = 1; } } } if ($method == 'request') { $return['comments'] = processInputVar('comments', ARG_STRING); if (get_magic_quotes_gpc()) { $return['comments'] = stripslashes($return['comments']); } if (!$err && preg_match('/[<>]/', $return['comments'])) { $errmsg = i("<>\\'s are not allowed in the comments."); $err = 1; } } if ($err) { print "clearHideConfirmForm();"; print "alert('{$errmsg}');"; $data = array('extragroups' => $extragroups, 'method' => $method); if ($method == 'edit') { $data['blockid'] = getContinuationVar('blockid'); } $cont = addContinuationsEntry('AJblockAllocationSubmit', $data, SECINWEEK, 1, 0); print "dojo.byId('submitcont').value = '{$cont}';"; if ($dooverride) { $data['override'] = 1; $cont = addContinuationsEntry('AJblockAllocationSubmit', $data, SECINWEEK, 1, 0); print "dojo.byId('submitcont2').value = '{$cont}';"; } else { print "dojo.byId('submitcont2').value = '';"; } } $return['type'] = $type; $return['err'] = $err; return $return; }
function validateResourceData() { global $user; $return = array('error' => 0); $return['rscid'] = getContinuationVar('rscid', 0); $return['name'] = processInputVar('name', ARG_STRING); $return['owner'] = processInputVar('owner', ARG_STRING, "{$user['unityid']}@{$user['affiliation']}"); $return['ipaddress'] = processInputVar('ipaddress', ARG_STRING); $return['stateid'] = processInputVar('stateid', ARG_NUMERIC); $return['sysadminemail'] = processInputVar('sysadminemail', ARG_STRING); $return['sharedmailbox'] = processInputVar('sharedmailbox', ARG_STRING); $return['installpath'] = processInputVar('installpath', ARG_STRING); $return['timeservers'] = processInputVar('timeservers', ARG_STRING); $return['keys'] = processInputVar('keys', ARG_STRING); $return['sshport'] = processInputVar('sshport', ARG_NUMERIC); $return['imagelibenable'] = processInputVar('imagelibenable', ARG_NUMERIC); $return['imagelibgroupid'] = processInputVar('imagelibgroupid', ARG_NUMERIC); $return['imagelibuser'] = processInputVar('imagelibuser', ARG_STRING); $return['imagelibkey'] = processInputVar('imagelibkey', ARG_STRING); $return['publicIPconfig'] = processInputVar('publicIPconfig', ARG_STRING); $return['publicnetmask'] = processInputVar('publicnetmask', ARG_STRING); $return['publicgateway'] = processInputVar('publicgateway', ARG_STRING); $return['publicdnsserver'] = processInputVar('publicdnsserver', ARG_STRING); $return['checkininterval'] = processInputVar('checkininterval', ARG_NUMERIC); $return['availablenetworks'] = processInputVar('availablenetworks', ARG_STRING); $return['federatedauth'] = processInputVar('federatedauth', ARG_STRING); $return['nathostenabled'] = processInputVar('nathostenabled', ARG_NUMERIC); $return['natpublicIPaddress'] = processInputVar('natpublicipaddress', ARG_STRING); $return['natinternalIPaddress'] = processInputVar('natinternalipaddress', ARG_STRING); if (get_magic_quotes_gpc()) { $return['sysadminemail'] = stripslashes($return['sysadminemail']); $return['sharedmailbox'] = stripslashes($return['sharedmailbox']); } $olddata = getContinuationVar('olddata'); if ($return['rscid'] == 0) { $return['mode'] = 'add'; } else { $return['mode'] = 'edit'; } $errormsg = array(); # hostname if (!preg_match('/^[a-zA-Z0-9_][-a-zA-Z0-9_\\.]{1,49}$/', $return['name'])) { $return['error'] = 1; $errormsg[] = "Hostname can only contain letters, numbers, dashes(-), periods(.), and underscores(_). It can be from 1 to 50 characters long"; } elseif ($this->checkForMgmtnodeHostname($return['name'], $return['rscid'])) { $return['error'] = 1; $errormsg[] = "A node already exists with this hostname."; } # owner if (!validateUserid($return['owner'])) { $return['error'] = 1; $errormsg[] = "Submitted owner is not valid"; } # ipaddress if (!validateIPv4addr($return['ipaddress'])) { $return['error'] = 1; $errormsg[] = "Invalid IP address. Must be w.x.y.z with each of " . "w, x, y, and z being between 1 and 255 (inclusive)"; } # sysadminemail if ($return['sysadminemail'] != '') { $addrs = explode(',', $return['sysadminemail']); foreach ($addrs as $addr) { if (!validateEmailAddress($addr)) { $return['error'] = 1; $errormsg[] = "Invalid email address entered for SysAdmin Email Address(es)"; break; } } } # sharedmailbox if ($return['sharedmailbox'] != '' && !validateEmailAddress($return['sharedmailbox'])) { $return['error'] = 1; $errormsg[] = "Invalid email address entered for Shadow Emails"; } # installpath if ($return['installpath'] != '' && !preg_match('/^([-a-zA-Z0-9_\\.\\/]){2,100}$/', $return['installpath'])) { $return['error'] = 1; $errormsg[] = "Install Path must be empty or only contain letters, numbers, dashes(-), periods(.), underscores(_), and forward slashes(/) and be from 2 to 100 characters long"; } # timeservers if ($return['timeservers'] != '') { if (strlen($return['timeservers']) > 1000) { $return['error'] = 1; $errormsg[] = "Too much data entered for Time Server(s)"; } else { $hosts = explode(',', $return['timeservers']); foreach ($hosts as $host) { if (preg_match('/^([0-9]{1,3}(\\.?))+$/', $host) && !validateIPv4addr($host) || !preg_match('/^[a-zA-Z0-9_][-a-zA-Z0-9_\\.]{1,50}$/', $host)) { $return['error'] = 1; $errormsg[] = "Time servers must be an IP address or a hostname containing only letters, numbers, dashes(-), periods(.), and underscores(_). Each host can be up to 50 characters long"; break; } } } } # keys if ($return['keys'] != '' && !preg_match('/^([-a-zA-Z0-9_\\.\\/,]){2,1024}$/', $return['keys'])) { $return['error'] = 1; $errormsg[] = "End Node SSH Identity Key Files can only contain letters, numbers, dashes(-), periods(.), underscores(_), forward slashes(/), and commas(,). It can be from 2 to 1024 characters long"; } # imagelibenable if ($return['imagelibenable'] == 1) { # imagelibgroupid $validgroups = getUserResources(array('mgmtNodeAdmin'), array('manageGroup'), 1); if (!array_key_exists($return['imagelibgroupid'], $validgroups['managementnode'])) { $return['error'] = 1; $errormsg[] = "The group selected for Image Library Management Node Group is not valid"; } # imagelibuser if (!preg_match('/^([-a-zA-Z0-9_\\.\\/,]){2,20}$/', $return['imagelibuser'])) { $return['error'] = 1; $errormsg[] = "Image Library User can only contain letters, numbers, and dashes(-) and can be from 2 to 20 characters long"; } # imagelibkey if (!preg_match('/^([-a-zA-Z0-9_\\.\\/,]){2,100}$/', $return['imagelibkey'])) { $return['error'] = 1; $errormsg[] = "Image Library SSH Identity Key File can only contain letters, numbers, dashes(-), periods(.), underscores(_), and forward slashes(/). It can be from 2 to 100 characters long"; } } else { $return['imagelibenable'] = 0; if ($return['mode'] == 'edit') { $return['imagelibgroupid'] = $olddata['imagelibgroupid']; $return['imagelibuser'] = $olddata['imagelibuser']; $return['imagelibkey'] = $olddata['imagelibkey']; } else { $return['imagelibgroupid'] = ''; $return['imagelibuser'] = ''; $return['imagelibkey'] = ''; } } # publicIPconfig if (!preg_match('/^(dynamicDHCP|manualDHCP|static)$/', $return['publicIPconfig'])) { $return['publicIPconfig'] = 'dynamicDHCP'; } if ($return['publicIPconfig'] == 'static') { # publicnetmask $bnetmask = ip2long($return['publicnetmask']); if (!preg_match('/^[1]+0[^1]+$/', sprintf('%032b', $bnetmask))) { $return['error'] = 1; $errormsg[] = "Invalid value specified for Public Netmask"; } # publicgateway if (preg_match('/^([0-9]{1,3}(\\.?))+$/', $return['publicgateway']) && !validateIPv4addr($return['publicgateway'])) { $return['error'] = 1; $errormsg[] = "Invalid value specified for Public Gateway"; } elseif (!preg_match('/^[a-zA-Z0-9_][-a-zA-Z0-9_\\.]{1,56}$/', $return["publicgateway"])) { $return['error'] = 1; $errormsg[] = "Public gateway must be an IP address or a hostname containing only letters, numbers, dashes(-), periods(.), and underscores(_). It can be up to 56 characters long"; } # publicdnsserver $servers = explode(',', $return['publicdnsserver']); if (empty($servers)) { $return['error'] = 1; $errormsg[] = "Please enter at least one Public DNS server"; } else { foreach ($servers as $server) { if (!validateIPv4addr($server)) { $return['error'] = 1; $errormsg[] = "Invalid IP address entered for Public DNS Server"; break; } } } } else { $return['publicnetmask'] = $olddata['publicnetmask']; $return['publicgateway'] = $olddata['publicgateway']; } # stateid 2 - available, 5 - failed, 10 - maintenance if (!preg_match('/^(2|5|10)$/', $return['stateid'])) { $return['error'] = 1; $errormsg[] = "Invalid value submitted for State"; } # checkininterval if ($return['checkininterval'] < 5) { $return['checkininterval'] = 5; } elseif ($return['checkininterval'] > 30) { $return['checkininterval'] = 30; } # sshport if ($return['sshport'] < 1 || $return['sshport'] > 65535) { $return['sshport'] = 22; } # availablenetworks if ($return['availablenetworks'] != '') { if (strpos("\n", $return['availablenetworks'])) { $return['availablenetworks'] = preg_replace("/(\r)?\n/", ',', $return['availablenetworks']); } $return['availablenetworks2'] = explode(',', $return['availablenetworks']); foreach ($return['availablenetworks2'] as $key => $net) { $net = trim($net); if ($net == '') { unset($return['availablenetworks2'][$key]); $return['availablenetworks'] = implode("\n", $return['availablenetworks2']); continue; } $return['availablenetworks2'][$key] = $net; if (!preg_match('/^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\/([0-9]{2})$/', $net, $matches) || $matches[1] < 0 || $matches[1] > 255 || $matches[2] < 0 || $matches[2] > 255 || $matches[3] < 0 || $matches[3] > 255 || $matches[4] < 0 || $matches[4] > 255 || $matches[5] < 1 || $matches[5] > 32) { $return['error'] = 1; $errormsg[] = "Invalid network entered for Available Public Networks; must be comma delimited list of valid networks in the form of x.x.x.x/yy"; } } } # federatedauth if ($return['federatedauth'] != '') { $affils = getAffiliations(); $fedarr = explode(',', $return['federatedauth']); $test = array_udiff($fedarr, $affils, 'strcasecmp'); if (!empty($test)) { $new = array(); foreach ($test as $affil) { if (preg_match('/^[-0-9a-zA-Z_\\.:;,]*$/', $affil)) { $new[] = $affil; } } if (count($test) == count($new)) { $errormsg[] = "These affiliations do not exist: " . implode(', ', $new); } else { $errormsg[] = "Invalid data entered for Affiliations using Federated Authentication for Linux Images"; } $return['error'] = 1; } } $nathosterror = 0; # nathostenabled if ($return['nathostenabled'] != 0 && $return['nathostenabled'] != 1) { $return['error'] = 1; $errormsg[] = "Invalid value for Use as NAT Host"; $nathosterror = 1; } # natpublicIPaddress if ($return['nathostenabled']) { if (!validateIPv4addr($return['natpublicIPaddress'])) { $return['error'] = 1; $errormsg[] = "Invalid NAT Public IP address. Must be w.x.y.z with each of " . "w, x, y, and z being between 1 and 255 (inclusive)"; $nathosterror = 1; } # natinternalIPaddress if (!validateIPv4addr($return['natinternalIPaddress'])) { $return['error'] = 1; $errormsg[] = "Invalid NAT Internal IP address. Must be w.x.y.z with each of " . "w, x, y, and z being between 1 and 255 (inclusive)"; $nathosterror = 1; } } # nat host change - check for active reservations if (!$nathosterror && $return['mode'] == 'edit') { if ($olddata['nathostenabled'] != $return['nathostenabled'] || $olddata['natpublicIPaddress'] != $return['natpublicIPaddress'] || $olddata['natinternalIPaddress'] != $return['natinternalIPaddress']) { $vclreloadid = getUserlistID('vclreload@Local'); $query = "SELECT rq.id " . "FROM request rq, " . "reservation rs, " . "nathostcomputermap nhcm, " . "nathost nh " . "WHERE rs.requestid = rq.id AND " . "rs.computerid = nhcm.computerid AND " . "nhcm.nathostid = nh.id AND " . "nh.resourceid = {$olddata['resourceid']} AND " . "rq.start <= NOW() AND " . "rq.end > NOW() AND " . "rq.stateid NOT IN (1,5,11,12) AND " . "rq.laststateid NOT IN (1,5,11,12) AND " . "rq.userid != {$vclreloadid}"; $qh = doQuery($query); if (mysql_num_rows($qh)) { $return['error'] = 1; $errormsg[] = "This management node is the NAT host for computers that have active reservations. NAT host<br>settings cannot be changed while providing NAT for active reservations."; } } } if ($return['error']) { $return['errormsg'] = implode('<br>', $errormsg); } return $return; }
function userLookup() { global $user, $viewmode; $userid = processInputVar("userid", ARG_STRING); print "<div align=center>\n"; print "<H2>User Lookup</H2>\n"; print "<FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n"; print "<TABLE>\n"; print " <TR>\n"; print " <TH>User ID:</TH>\n"; print " <TD><INPUT type=text name=userid value=\"{$userid}\" size=25></TD>\n"; print " </TR>\n"; print " <TR>\n"; print " <TD></TD>\n"; print " <TD align=right><INPUT type=submit value=Submit>\n"; print " </TR>\n"; print "</TABLE>\n"; $cont = addContinuationsEntry('submitUserLookup'); print "<INPUT type=hidden name=continuation value=\"{$cont}\">\n"; print "</FORM>\n"; if (!empty($userid)) { $loginid = $userid; getAffilidAndLogin($loginid, $affilid); if (empty($affilid)) { print "{$matches[2]} is an unknown affiliation<br>\n"; return; } if ($viewmode != ADMIN_DEVELOPER && $user['affiliationid'] != $affilid) { print "You are only allowed to look up users from your own affiliation.<br>\n"; return; } $query = "SELECT id " . "FROM user " . "WHERE unityid = '{$loginid}' AND " . "affiliationid = {$affilid}"; $qh = doQuery($query, 101); if (!mysql_num_rows($qh)) { print "<font color=red>{$userid} not currently found in VCL user database, will try to add...</font><br>\n"; } $userdata = getUserInfo($userid); if (is_null($userdata)) { print "<font color=red>{$userid} not found in any known systems</font><br>\n"; return; } print "<TABLE>\n"; print " <TR>\n"; print " <TH align=right>First Name:</TH>\n"; print " <TD>{$userdata["firstname"]}</TD>\n"; print " </TR>\n"; print " <TR>\n"; print " <TH align=right>Last Name:</TH>\n"; print " <TD>{$userdata["lastname"]}</TD>\n"; print " </TR>\n"; print " <TR>\n"; print " <TH align=right>Preferred Name:</TH>\n"; print " <TD>{$userdata["preferredname"]}</TD>\n"; print " </TR>\n"; print " <TR>\n"; print " <TH align=right>Email:</TH>\n"; print " <TD>{$userdata["email"]}</TD>\n"; print " </TR>\n"; print " <TR>\n"; print " <TH align=right>Admin Level:</TH>\n"; print " <TD>{$userdata["adminlevel"]}</TD>\n"; print " </TR>\n"; print " <TR>\n"; print " <TH align=right style=\"vertical-align: top\">Groups:</TH>\n"; print " <TD>\n"; uasort($userdata["groups"], "sortKeepIndex"); foreach ($userdata["groups"] as $group) { print " {$group}<br>\n"; } print " </TD>\n"; print " </TR>\n"; print " <TR>\n"; print " <TH align=right style=\"vertical-align: top\">Privileges (found somewhere in the tree):</TH>\n"; print " <TD>\n"; uasort($userdata["privileges"], "sortKeepIndex"); foreach ($userdata["privileges"] as $priv) { if ($priv == "block" || $priv == "cascade") { continue; } print " {$priv}<br>\n"; } print " </TD>\n"; print " </TR>\n"; print "</TABLE>\n"; # get user's resources $userResources = getUserResources(array("imageCheckOut"), array("available"), 0, 0, $userdata['id']); # find nodes where user has privileges $query = "SELECT p.name AS privnode, " . "upt.name AS userprivtype, " . "up.privnodeid " . "FROM userpriv up, " . "privnode p, " . "userprivtype upt " . "WHERE up.privnodeid = p.id AND " . "up.userprivtypeid = upt.id AND " . "up.userid = {$userdata['id']} " . "ORDER BY p.name, " . "upt.name"; $qh = doQuery($query, 101); if (mysql_num_rows($qh)) { print "Nodes where user is granted privileges:<br>\n"; print "<TABLE>\n"; $privnodeid = 0; while ($row = mysql_fetch_assoc($qh)) { if ($privnodeid != $row['privnodeid']) { if ($privnodeid) { print " </TD>\n"; print " </TR>\n"; } print " <TR>\n"; $privnodeid = $row['privnodeid']; print " <TH align=right>{$row['privnode']}</TH>\n"; print " <TD>\n"; } print " {$row['userprivtype']}<br>\n"; } print " </TD>\n"; print " </TR>\n"; print "</TABLE>\n"; } # find nodes where user's groups have privileges if (!empty($userdata['groups'])) { $query = "SELECT DISTINCT p.name AS privnode, " . "upt.name AS userprivtype, " . "up.privnodeid " . "FROM userpriv up, " . "privnode p, " . "userprivtype upt " . "WHERE up.privnodeid = p.id AND " . "up.userprivtypeid = upt.id AND " . "upt.name != 'cascade' AND " . "upt.name != 'block' AND " . "up.usergroupid IN (" . implode(',', array_keys($userdata['groups'])) . ") " . "ORDER BY p.name, " . "upt.name"; $qh = doQuery($query, 101); if (mysql_num_rows($qh)) { print "Nodes where user's groups are granted privileges:<br>\n"; print "<TABLE>\n"; $privnodeid = 0; while ($row = mysql_fetch_assoc($qh)) { if ($privnodeid != $row['privnodeid']) { if ($privnodeid) { print " </TD>\n"; print " </TR>\n"; } print " <TR>\n"; $privnodeid = $row['privnodeid']; print " <TH align=right>{$row['privnode']}</TH>\n"; print " <TD>\n"; } print " {$row['userprivtype']}<br>\n"; } print " </TD>\n"; print " </TR>\n"; print "</TABLE>\n"; } } print "<table>\n"; print " <tr>\n"; print " <th>Images User Has Access To:<th>\n"; print " <td>\n"; foreach ($userResources['image'] as $img) { print " {$img}<br>\n"; } print " </td>\n"; print " </tr>\n"; print "</table>\n"; $requests = array(); $query = "SELECT l.start AS start, " . "l.finalend AS end, " . "c.hostname, " . "i.prettyname AS prettyimage, " . "l.ending " . "FROM log l, " . "image i, " . "computer c, " . "sublog s " . "WHERE l.userid = {$userdata["id"]} AND " . "s.logid = l.id AND " . "i.id = s.imageid AND " . "c.id = s.computerid " . "ORDER BY l.start DESC " . "LIMIT 5"; $qh = doQuery($query, 290); while ($row = mysql_fetch_assoc($qh)) { array_push($requests, $row); } $requests = array_reverse($requests); if (!empty($requests)) { print "<h3>User's last " . count($requests) . " reservations:</h3>\n"; print "<table>\n"; $first = 1; foreach ($requests as $req) { $thisstart = str_replace(' ', ' ', prettyDatetime($req["start"])); $thisend = str_replace(' ', ' ', prettyDatetime($req["end"])); if ($first) { $first = 0; } else { print " <tr>\n"; print " <td colspan=2><hr></td>\n"; print " </tr>\n"; } print " <tr>\n"; print " <th align=right>Image:</th>\n"; print " <td>{$req['prettyimage']}</td>\n"; print " </tr>\n"; print " <tr>\n"; print " <th align=right>Computer:</th>\n"; print " <td>{$req['hostname']}</td>\n"; print " </tr>\n"; print " <tr>\n"; print " <th align=right>Start:</th>\n"; print " <td>{$thisstart}</td>\n"; print " </tr>\n"; print " <tr>\n"; print " <th align=right>End:</th>\n"; print " <td>{$thisend}</td>\n"; print " </tr>\n"; print " <tr>\n"; print " <th align=right>Ending:</th>\n"; print " <td>{$req['ending']}</td>\n"; print " </tr>\n"; } print "</table>\n"; } else { print "User made no reservations in the past week.<br>\n"; } } print "</div>\n"; }
function processMappingInput($maptypes) { # configid $return['configid'] = processInputVar('configid', ARG_NUMERIC); $tmp = getUserResources(array("configAdmin"), array("administer")); # TODO is this the criteria we want for which configs can be selected? if (!array_key_exists($return['configid'], $tmp['config'])) { $this->errmsg = "Invalid config submitted"; return 0; } # maptypeid $return['maptypeid'] = processInputVar('maptypeid', ARG_NUMERIC); if (!array_key_exists($return['maptypeid'], $maptypes)) { $this->errmsg = "Invalid map type submitted"; return 0; } # subid $return['subid'] = processInputVar('subid', ARG_NUMERIC); if ($maptypes[$return['maptypeid']] == 'Image') { $tmp = getUserResources(array("imageAdmin"), array("administer")); # TODO is this the criteria we want for which images can be selected? if (!array_key_exists($return['subid'], $tmp['image'])) { $this->errmsg = "Invalid image submitted"; return 0; } $return['mapto'] = $tmp['image'][$return['subid']]; } elseif ($maptypes[$return['maptypeid']] == 'OS Type') { $ostypes = getOStypes(); if (!array_key_exists($return['subid'], $ostypes)) { $this->errmsg = "Invalid os type submitted"; return 0; } $return['mapto'] = $ostypes[$return['subid']]; } elseif ($maptypes[$return['maptypeid']] == 'OS') { $oses = getOSList(); if (!array_key_exists($return['subid'], $oses)) { $this->errmsg = "Invalid OS submitted"; return 0; } $return['mapto'] = $oses[$return['subid']]['prettyname']; } elseif ($maptypes[$return['maptypeid']] == 'Config') { $tmp = getUserResources(array("configAdmin"), array("administer")); # TODO is this the criteria we want for which configs can be selected? $configs = $this->getUserConfigsNoCluster($tmp['config']); if (!array_key_exists($return['subid'], $configs)) { $this->errmsg = "Invalid config submitted"; return 0; } $return['mapto'] = $configs[$return['subid']]; } elseif ($maptypes[$return['maptypeid']] == 'Subimage') { $configsubimages = getConfigSubimages($tmp['config']); if (!array_key_exists($return['subid'], $configsubimages)) { $this->errmsg = "Invalid cluster submitted"; return 0; } $return['mapto'] = $configsubimages[$return['subid']]; } elseif ($maptypes[$return['maptypeid']] == 'Management Node') { $managementnodes = getManagementNodes(); if (!array_key_exists($return['subid'], $managementnodes)) { $this->errmsg = "Invalid managementnode submitted"; return 0; } $return['mapto'] = $managementnodes[$return['subid']]['hostname']; } # check for creating a loop - cannot have a parent that maps to # submitted config if ($maptypes[$return['maptypeid']] == 'Config' || $maptypes[$return['maptypeid']] == 'Subimage') { $rc = $this->mappingLoopCheck($maptypes[$return['maptypeid']], $return['configid'], $return['subid']); if ($rc != '') { $this->errmsg = "This mapping would create a loop. {$rc} is a<br>" . "parent/grandparent and is mapped to the selected config."; return 0; } } # affiliationid $return['affiliationid'] = processInputVar('affiliationid', ARG_NUMERIC); $affils = getAffiliations(); if (!array_key_exists($return['affiliationid'], $affils)) { $this->errmsg = "Invalid affiliation submitted"; return 0; } # stageid $return['stageid'] = processInputVar('stageid', ARG_NUMERIC); $stages = $this->getConfigMapStages(); if (!array_key_exists($return['stageid'], $stages)) { $this->errmsg = "Invalid stage submitted"; return 0; } # duplicate check # TODO do we also need to check the disabled field? $configmapid = getContinuationVar('configmapid', 0); $query = "SELECT id " . "FROM configmap " . "WHERE configid = {$return['configid']} AND " . "configmaptypeid = {$return['maptypeid']} AND " . "subid = {$return['subid']} AND " . "affiliationid = {$return['affiliationid']} AND " . "configstageid = {$return['stageid']} AND " . "id != {$configmapid}"; $qh = doQuery($query); if (mysql_num_rows($qh)) { $this->errmsg = "The specified mapping already exists."; return 0; } return $return; }
function AJsubmitAddResourcePriv() { global $user; $node = processInputVar("activeNode", ARG_NUMERIC); if (!checkUserHasPriv("resourceGrant", $user["id"], $node)) { $text = "You do not have rights to add new resource groups at this node."; print "addResourceGroupPaneHide(); "; print "alert('{$text}');"; return; } $newgroupid = processInputVar("newgroupid", ARG_NUMERIC); $privs = array("computerAdmin", "mgmtNodeAdmin", "imageAdmin", "scheduleAdmin", "serverProfileAdmin"); $resourcegroups = getUserResources($privs, array("manageGroup"), 1); $groupdata = getResourceGroups('', $newgroupid); if (empty($groupdata)) { $text = "Invalid resource group submitted."; print "addResourceGroupPaneHide(); "; print "alert('{$text}');"; return; } list($newtype, $tmp) = explode('/', $groupdata[$newgroupid]['name']); if (!array_key_exists($newgroupid, $resourcegroups[$newtype])) { $text = "You do not have rights to manage the specified resource group."; print "addResourceGroupPaneHide(); "; print "alert('{$text}');"; return; } $perms = explode(':', processInputVar('perms', ARG_STRING)); $privtypes = getResourcePrivs(); $newgroupprivs = array(); foreach ($privtypes as $type) { if (in_array($type, $perms)) { array_push($newgroupprivs, $type); } } if (empty($newgroupprivs) || count($newgroupprivs) == 1 && in_array("cascade", $newgroupprivs)) { $text = "<font color=red>No resource group privileges were specified</font>"; print setAttribute('addResourceGroupPrivStatus', 'innerHTML', $text); return; } updateResourcePrivs($newgroupid, $node, $newgroupprivs, array()); clearPrivCache(); print "refreshPerms(); "; print "addResourceGroupPaneHide(); "; }
function submitScheduleGroups() { $groupinput = processInputVar("schedulegroup", ARG_MULTINUMERIC); $schedules = getSchedules(); # build an array of memberships currently in the db $tmp = getUserResources(array("groupAdmin"), array("administer"), 1); $schedulegroupsIDs = array_keys($tmp["schedule"]); // ids of groups that user can administer $resources = getUserResources(array("scheduleAdmin"), array("administer"), 0, 0); $userScheduleIDs = array_keys($resources["schedule"]); // ids of schedules that user can administer $schedulemembership = getResourceGroupMemberships("schedule"); $baseschedulegroups = $schedulemembership["schedule"]; // all schedule group memberships $schedulegroups = array(); foreach (array_keys($baseschedulegroups) as $scheduleid) { if (in_array($scheduleid, $userScheduleIDs)) { foreach ($baseschedulegroups[$scheduleid] as $grpid) { if (in_array($grpid, $schedulegroupsIDs)) { if (array_key_exists($scheduleid, $schedulegroups)) { array_push($schedulegroups[$scheduleid], $grpid); } else { $schedulegroups[$scheduleid] = array($grpid); } } } } } # build an array of posted in memberships $newmembers = array(); foreach (array_keys($groupinput) as $key) { list($scheduleid, $grpid) = explode(':', $key); if (array_key_exists($scheduleid, $newmembers)) { array_push($newmembers[$scheduleid], $grpid); } else { $newmembers[$scheduleid] = array($grpid); } } $adds = array(); $removes = array(); foreach (array_keys($schedules) as $scheduleid) { $id = $schedules[$scheduleid]["resourceid"]; // if $scheduleids not in $userScheduleIds, don't bother with it if (!in_array($scheduleid, $userScheduleIDs)) { continue; } // if $scheduleid is not in $newmembers or $schedulegroups, do nothing if (!array_key_exists($scheduleid, $newmembers) && !array_key_exists($scheduleid, $schedulegroups)) { continue; } // check that $scheduleid is in $newmembers, if not, remove it from all groups if (!array_key_exists($scheduleid, $newmembers)) { $removes[$id] = $schedulegroups[$scheduleid]; continue; } // check that $scheduleid is in $schedulegroups, if not, add all groups in // $newmembers if (!array_key_exists($scheduleid, $schedulegroups)) { $adds[$id] = $newmembers[$scheduleid]; continue; } // adds are groupids that are in $newmembers, but not in $schedulegroups $adds[$id] = array_diff($newmembers[$scheduleid], $schedulegroups[$scheduleid]); if (count($adds[$id]) == 0) { unset($adds[$id]); } // removes are groupids that are in $schedulegroups, but not in $newmembers $removes[$id] = array_diff($schedulegroups[$scheduleid], $newmembers[$scheduleid]); if (count($removes[$id]) == 0) { unset($removes[$id]); } } foreach (array_keys($adds) as $scheduleid) { foreach ($adds[$scheduleid] as $grpid) { $query = "INSERT INTO resourcegroupmembers " . "(resourceid, resourcegroupid) " . "VALUES ({$scheduleid}, {$grpid})"; doQuery($query, 291); } } foreach (array_keys($removes) as $scheduleid) { foreach ($removes[$scheduleid] as $grpid) { $query = "DELETE FROM resourcegroupmembers " . "WHERE resourceid = {$scheduleid} AND " . "resourcegroupid = {$grpid}"; doQuery($query, 292); } } viewSchedules(); }
function XMLRPCaddRequest($imageid, $start, $length, $foruser = '') { global $user; $imageid = processInputData($imageid, ARG_NUMERIC); $start = processInputData($start, ARG_STRING, 1); $length = processInputData($length, ARG_NUMERIC); #$foruser = processInputData($foruser, ARG_STRING, 1); // make sure user didn't submit a request for an image he // doesn't have access to $resources = getUserResources(array("imageAdmin", "imageCheckOut")); $validImageids = array_keys($resources['image']); if (!in_array($imageid, $validImageids)) { return array('status' => 'error', 'errorcode' => 3, 'errormsg' => "access denied to {$imageid}"); } # validate $start if ($start != 'now' && !is_numeric($start)) { return array('status' => 'error', 'errorcode' => 4, 'errormsg' => "received invalid input"); } # validate $length $maxtimes = getUserMaxTimes(); if ($maxtimes['initial'] < $length) { return array('status' => 'error', 'errorcode' => 6, 'errormsg' => "max allowed initial length is {$maxtimes['initial']} minutes"); } $nowfuture = 'future'; if ($start == 'now') { $start = time(); $nowfuture = 'now'; } else { if ($start < time() - 30) { return array('status' => 'error', 'errorcode' => 5, 'errormsg' => "start time is in the past"); } } $start = unixFloor15($start); $end = $start + $length * 60; if ($end % (15 * 60)) { $end = unixFloor15($end) + 15 * 60; } $max = getMaxOverlap($user['id']); if (checkOverlap($start, $end, $max)) { return array('status' => 'error', 'errorcode' => 7, 'errormsg' => "reservation overlaps with another one you " . "have, and you are allowed {$max} " . "overlapping reservations at a time"); } $images = getImages(); $rc = isAvailable($images, $imageid, $start, $end, ''); if ($rc < 1) { addLogEntry($nowfuture, unixToDatetime($start), unixToDatetime($end), 0, $imageid); return array('status' => 'notavailable'); } $return['requestid'] = addRequest(); $return['status'] = 'success'; return $return; }
function AJremProfileFromGroup() { $groupid = processInputVar('id', ARG_NUMERIC); $groups = getUserResources(array("serverProfileAdmin"), array("manageGroup"), 1); if (!array_key_exists($groupid, $groups['serverprofile'])) { $arr = array('profiles' => array(), 'addrem' => 0); sendJSON($arr); return; } $resources = getUserResources(array("serverProfileAdmin"), array("manageGroup")); $tmp = processInputVar('listids', ARG_STRING); $tmp = explode(',', $tmp); $profileids = array(); foreach ($tmp as $id) { if (!is_numeric($id)) { continue; } if (!array_key_exists($id, $resources['serverprofile'])) { $arr = array('profiles' => array(), 'addrem' => 0, 'id' => $id, 'extra' => $resources['serverprofile']); sendJSON($arr); return; } $profileids[] = $id; } $allprofiles = getServerProfiles(); foreach ($profileids as $id) { $query = "DELETE FROM resourcegroupmembers " . "WHERE resourceid = {$allprofiles[$id]['resourceid']} AND " . "resourcegroupid = {$groupid}"; doQuery($query, 288); } $arr = array('profiles' => $profileids, 'addrem' => 0, 'removedaccess' => 0); $_SESSION['userresources'] = array(); $_SESSION['usersessiondata'] = array(); $resources = getUserResources(array("serverProfileAdmin"), array("manageGroup")); foreach ($profileids as $id) { if (!array_key_exists($id, $resources['serverprofile'])) { $arr['removedaccess'] = 1; $arr['remprofileids'][] = $id; } } sendJSON($arr); }
function XMLRPCblockAllocation($imageid, $start, $end, $numMachines, $usergroupid, $ignoreprivileges = 0) { global $user, $xmlrpcBlockAPIUsers; if (!in_array($user['id'], $xmlrpcBlockAPIUsers)) { return array('status' => 'error', 'errorcode' => 34, 'errormsg' => 'access denied for managing block allocations'); } # valid $imageid $resources = getUserResources(array("imageAdmin", "imageCheckOut")); $resources["image"] = removeNoCheckout($resources["image"]); if (!array_key_exists($imageid, $resources['image'])) { return array('status' => 'error', 'errorcode' => 3, 'errormsg' => "access denied to {$imageid}"); } # validate $start and $end $dtreg = '([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})'; $startts = datetimeToUnix($start); $endts = datetimeToUnix($end); $maxend = datetimeToUnix("2038-01-01 00:00:00"); if (!preg_match("/^{$dtreg}\$/", $start) || $startts < 0 || $startts > $maxend) { return array('status' => 'error', 'errorcode' => 4, 'errormsg' => "received invalid input for start"); } if (!preg_match("/^{$dtreg}\$/", $end) || $endts < 0 || $endts > $maxend) { return array('status' => 'error', 'errorcode' => 36, 'errormsg' => "received invalid input for end"); } # validate $numMachines if (!is_numeric($numMachines) || $numMachines < MIN_BLOCK_MACHINES || $numMachines > MAX_BLOCK_MACHINES) { return array('status' => 'error', 'errorcode' => 64, 'errormsg' => 'The submitted number of seats must be between ' . MIN_BLOCK_MACHINES . ' and ' . MAX_BLOCK_MACHINES . '.'); } # validate $usergroupid $groups = getUserGroups(); if (!array_key_exists($usergroupid, $groups)) { return array('status' => 'error', 'errorcode' => 67, 'errormsg' => 'Submitted user group does not exist'); } # validate ignoreprivileges if (!is_numeric($ignoreprivileges) || $ignoreprivileges < 0 || $ignoreprivileges > 1) { return array('status' => 'error', 'errorcode' => 86, 'errormsg' => 'ignoreprivileges must be 0 or 1'); } $ownerid = getUserlistID('vclreload@Local'); $name = "API:{$start}"; $managementnodes = getManagementNodes('future'); if (empty($managementnodes)) { return array('status' => 'error', 'errorcode' => 12, 'errormsg' => 'could not allocate a management node to handle block allocation'); } $mnid = array_rand($managementnodes); $query = "INSERT INTO blockRequest " . "(name, " . "imageid, " . "numMachines, " . "groupid, " . "repeating, " . "ownerid, " . "managementnodeid, " . "expireTime, " . "status) " . "VALUES " . "('{$name}', " . "{$imageid}, " . "{$numMachines}, " . "{$usergroupid}, " . "'list', " . "{$ownerid}, " . "{$mnid}, " . "'{$end}', " . "'accepted')"; doQuery($query, 101); $brid = dbLastInsertID(); $query = "INSERT INTO blockTimes " . "(blockRequestid, " . "start, " . "end) " . "VALUES " . "({$brid}, " . "'{$start}', " . "'{$end}')"; doQuery($query, 101); $btid = dbLastInsertID(); $query = "INSERT INTO blockWebDate " . "(blockRequestid, " . "start, " . "end, " . "days) " . "VALUES " . "({$brid}, " . "'{$start}', " . "'{$end}', " . "0)"; doQuery($query); $sh = date('g', $startts); $smi = date('i', $startts); $sme = date('a', $startts); $eh = date('g', $startts); $emi = date('i', $startts); $eme = date('a', $startts); $query = "INSERT INTO blockWebTime " . "(blockRequestid, " . "starthour, " . "startminute, " . "startmeridian, " . "endhour, " . "endminute, " . "endmeridian, " . "`order`) " . "VALUES " . "({$brid}, " . "{$sh}," . "{$smi}," . "'{$sme}'," . "{$eh}," . "{$emi}," . "'{$eme}'," . "0)"; doQuery($query); $return = XMLRPCprocessBlockTime($btid, $ignoreprivileges); $return['blockTimesid'] = $btid; return $return; }
function AJaddRemGroupResource() { $newids = getContinuationVar('newids'); if (is_null($newids)) { $rscid = processInputVar('id', ARG_NUMERIC); $resources = getUserResources(array($this->restype . "Admin"), array("manageGroup")); if (!array_key_exists($rscid, $resources[$this->restype])) { $arr = array('status' => 'noaccess'); sendJSON($arr); return; } } $groups = getUserResources(array($this->restype . "Admin"), array("manageGroup"), 1); $tmp = processInputVar('listids', ARG_STRING); $tmp = explode(',', $tmp); $groupids = array(); foreach ($tmp as $id) { if (!is_numeric($id)) { continue; } if (!array_key_exists($id, $groups[$this->restype])) { $arr = array('status' => 'noaccess'); sendJSON($arr); return; } $groupids[] = $id; } $args = $this->defaultGetDataArgs; if (is_null($newids)) { $args['rscid'] = $rscid; } $resdata = $this->getData($args); $mode = getContinuationVar('mode'); if ($mode == 'add') { $adds = array(); if (is_null($newids)) { foreach ($groupids as $id) { $adds[] = "({$resdata[$rscid]['resourceid']}, {$id})"; } } else { foreach ($newids as $newrscid) { foreach ($groupids as $id) { $adds[] = "({$resdata[$newrscid]['resourceid']}, {$id})"; } } } $query = "INSERT IGNORE INTO resourcegroupmembers " . "(resourceid, resourcegroupid) VALUES "; $query .= implode(',', $adds); doQuery($query); } else { $rems = implode(',', $groupids); if (is_null($newids)) { $query = "DELETE FROM resourcegroupmembers " . "WHERE resourceid = {$resdata[$rscid]['resourceid']} AND " . "resourcegroupid IN ({$rems})"; } else { $allrscids = array(); foreach ($newids as $newrscid) { $allrscids[] = $resdata[$newrscid]['resourceid']; } $allrscids = implode(',', $allrscids); $query = "DELETE FROM resourcegroupmembers " . "WHERE resourceid IN ({$allrscids}) AND " . "resourcegroupid IN ({$rems})"; } doQuery($query); } $_SESSION['userresources'] = array(); $regids = "^" . implode('$|^', $groupids) . "\$"; $arr = array('status' => 'success', 'regids' => $regids, 'inselobj' => 'ingroups', 'outselobj' => 'outgroups'); sendJSON($arr); }
function AJremImgGrpFromCompGrp() { $compgrpid = processInputVar('id', ARG_NUMERIC); $resources = getUserResources(array("computerAdmin"), array("manageGroup"), 1); if (!array_key_exists($compgrpid, $resources['computer'])) { $arr = array('groups' => array(), 'addrem' => 0); header('Content-Type: text/json-comment-filtered; charset=utf-8'); print '/*{"items":' . json_encode($arr) . '}*/'; return; } $imagegroups = getUserResources(array("imageAdmin"), array("manageGroup"), 1); $tmp = processInputVar('listids', ARG_STRING); $tmp = explode(',', $tmp); $imagegroupids = array(); foreach ($tmp as $id) { if (!is_numeric($id)) { continue; } if (!array_key_exists($id, $imagegroups['image'])) { $arr = array('groups' => array(), 'addrem' => 0); header('Content-Type: text/json-comment-filtered; charset=utf-8'); print '/*{"items":' . json_encode($arr) . '}*/'; return; } $imagegroupids[] = $id; } foreach ($imagegroupids as $id) { $query = "DELETE FROM resourcemap " . "WHERE resourcegroupid1 = {$id} AND " . "resourcetypeid1 = 13 AND " . "resourcegroupid2 = {$compgrpid} AND " . "resourcetypeid2 = 12"; doQuery($query, 288); } $_SESSION['userresources'] = array(); $arr = array('groups' => $imagegroupids, 'addrem' => 0); header('Content-Type: text/json-comment-filtered; charset=utf-8'); print '/*{"items":' . json_encode($arr) . '}*/'; }
function RESTresourceDetail() { $type = validatetype(processRESTarg(1, ARG_STRING)); $deleted = processInputVar('deleted', ARG_NUMERIC, 0); if ($deleted != 0 && $deleted != 1) { $deleted = 0; } $name = processInputVar('name', ARG_STRING, '*'); $tmp = processInputVar('prettyname', ARG_STRING, '*'); if ($name == '*' && $tmp != '*') { $name = $tmp; } if (is_null($type)) { RESTresponse(404, "invalid resource type"); return; } $subid = processRESTarg(2, ARG_NUMERIC, 0); if ($type == 'image') { $resources = getUserResources(array("imageAdmin", "imageCheckOut"), array('available'), 0, $deleted); } elseif ($type == 'computer') { $resources = getUserResources(array("computerAdmin"), array("administer"), 0, $deleted); } elseif ($type == 'config') { $resources = getUserResources(array("configAdmin"), array('available'), 0, $deleted); } # TODO #elseif ... if ($subid && !array_key_exists($subid, $resources[$type])) { RESTresponse(404, "specified resource does not exist"); printArray($resources[$type]); return; } if ($_SERVER['REQUEST_METHOD'] == 'DELETE') { if (RESTdeleteResource($type, $subid)) { RESTresponse(204); } else { RESTresponse(404, "specified resource does not exist 2"); } return; } if ($type == 'image') { $items = getImages($deleted, $subid); $data = array(); foreach (array_keys($resources[$type]) as $id) { if ($name != '*' && !preg_match("/^{$name}\$/i", $items[$id]['prettyname'])) { continue; } if (array_key_exists($id, $items)) { $data[$id] = $items[$id]; } } } elseif ($type == 'computer') { $data = getComputers(1, 0, $subid); } elseif ($type == 'config') { $cluster = processInputVar('cluster', ARG_NUMERIC, -1); $cfg = new Config(); $items = $cfg->getData($cfg->defaultGetDataArgs); $data = array(); foreach (array_keys($resources[$type]) as $id) { if ($name != '*' && !preg_match("/^{$name}\$/i", $items[$id]['name'])) { continue; } if (array_key_exists($id, $items)) { if ($cluster == -1 || $cluster == 0 && $items[$id]['configtype'] != 'Cluster' || $cluster == 1 && $items[$id]['configtype'] == 'Cluster') { $data[$id] = $items[$id]; } } } } #elseif ... if ($subid == 0) { sendREST(dataToJSON($data)); return; } sendREST(dataToJSON($data[$subid], 1)); }
function AJcancelVMmove() { $hostid = processInputVar('hostid', ARG_NUMERIC); $hostdata = getVMHostData($hostid); $resources = getUserResources(array("computerAdmin"), array("administer")); if (!array_key_exists($hostdata[$hostid]['computerid'], $resources['computer'])) { $arr = array('failed' => 'nohostaccess'); header('Content-Type: text/json-comment-filtered; charset=utf-8'); print '/*{"items":' . json_encode($arr) . '}*/'; return; } $fails = array(); $requestids = processInputVar('listids', ARG_STRING); $now = time(); $msg = 'FAIL'; foreach (explode(',', $requestids) as $reqid) { $request = getRequestInfo($reqid); if (!array_key_exists($request['reservations'][0]['computerid'], $resources['computer'])) { $fails[] = array('id' => $request['reservations'][0]['computerid'], 'name' => $request['reservations'][0]['hostname'], 'reason' => 'noaccess'); continue; } if (datetimeToUnix($request["start"]) < $now) { # set stateid and laststateid for each request to deleted $query = "UPDATE request " . "SET stateid = 1, " . "laststateid = 1 " . "WHERE id = {$reqid}"; doQuery($query, 101); } else { $query = "DELETE FROM request WHERE id = {$reqid}"; doQuery($query, 101); $query = "DELETE FROM reservation WHERE requestid = {$reqid}"; doQuery($query, 101); } $msg = 'SUCCESS'; } header('Content-Type: text/json-comment-filtered; charset=utf-8'); $cont = addContinuationsEntry('vmhostdata'); $arr = array('msg' => $msg, 'cont' => $cont, 'fails' => $fails); print '/*{"items":' . json_encode($arr) . '}*/'; }
function processRequestInput() { global $user; $baseaccess = getContinuationVar('baseaccess', 0); $imagingaccess = getContinuationVar('imagingaccess', 0); $serveraccess = getContinuationVar('serveraccess', 0); $openend = getContinuationVar('openend', 0); $nousercheck = getContinuationVar('nousercheck', 0); $return['imaging'] = getContinuationVar('imaging', 0); $maxinitial = getContinuationVar('maxinitial', 0); $noimaging = getContinuationVar('noimaging', array()); $return = array('err' => 0); # type $return['type'] = processInputVar('type', ARG_STRING); if (!preg_match('/^basic|imaging|server$/', $return['type'])) { $return['err'] = 1; $return['errmsg'] = i('Invalid data submitted'); return $return; } if ($return['type'] == 'basic' && !$baseaccess || $return['type'] == 'imaging' && !$imagingaccess || $return['type'] == 'server' && !$serveraccess) { $return['err'] = 1; $return['errmsg'] = i('No access to submitted reservation type'); return $return; } # ending $return['ending'] = processInputVar('ending', ARG_STRING); if (!preg_match('/^indefinite|endat|duration$/', $return['ending'])) { $return['err'] = 1; $return['errmsg'] = i('Invalid data submitted'); return $return; } if ($return['ending'] == 'duration' && !$baseaccess || $return['ending'] == 'indefinite' && !$serveraccess || $return['ending'] == 'endat' && !$openend && !$serveraccess) { $return['err'] = 1; $return['errmsg'] = i('No access to submitted end type'); return $return; } # imageid $return['imageid'] = processInputVar('imageid', ARG_NUMERIC); $resources = getUserResources(array("imageAdmin", "imageCheckOut")); $withnocheckout = $resources['image']; $images = removeNoCheckout($resources["image"]); $extraimages = getServerProfileImages($user['id']); if (!array_key_exists($return['imageid'], $images) && ($return['type'] != 'server' || !array_key_exists($return['imageid'], $extraimages)) && ($return['type'] != 'imaging' || !array_key_exists($return['imageid'], $withnocheckout)) || $return['type'] == 'imaging' && array_key_exists($return['imageid'], $noimaging)) { $return['err'] = 1; $return['errmsg'] = i('No access to submitted environment'); return $return; } # nousercheck $return['nousercheck'] = processInputVar('nousercheck', ARG_NUMERIC); if (!$nousercheck || $return['nousercheck'] != 1) { $return['nousercheck'] = 0; } # revisionid $revids = processInputVar("revisionid", ARG_STRING); $revids = explode(':', $revids); $images = getImages(0, $return['imageid']); $return['revisionids'] = array(); if (array_key_exists('subimages', $images[$return['imageid']])) { $subimages = $images[$return['imageid']]['subimages']; array_unshift($subimages, $return['imageid']); foreach ($subimages as $key => $imgid) { $revisions = getImageRevisions($imgid); if (!array_key_exists($key, $revids) || !is_numeric($revids[$key]) || !array_key_exists($revids[$key], $revisions)) { $revid = getProductionRevisionid($imgid); } else { $revid = $revids[$key]; } if (!array_key_exists($imgid, $return['revisionids'])) { $return['revisionids'][$imgid] = array(); } $return['revisionids'][$imgid][] = $revid; } } elseif ($revids[0] != '' && is_numeric($revids[0])) { $return['revisionids'][$return['imageid']][] = $revids[0]; } else { $return['revisionids'][$return['imageid']][] = getProductionRevisionid($return['imageid']); } # duration if ($return['ending'] == 'duration') { $return['duration'] = processInputVar('duration', ARG_NUMERIC, 0); if ($return['duration'] > $maxinitial) { $return['duration'] = $maxinitial; } } # start/end $return['start'] = processInputVar('start', ARG_NUMERIC); $return['end'] = processInputVar('end', ARG_NUMERIC, 0); $now = time(); if ($return['start'] == 0) { $start = $now; } else { $start = $return['start']; } if ($return['ending'] == 'endat') { $end = $return['end']; } if ($return['ending'] == 'indefinite') { $end = datetimeToUnix('2038-01-01 00:00:00'); } elseif ($return['ending'] == 'duration') { $end = $start + $return['duration'] * 60; } if ($start < $now) { $return['err'] = 1; $return['errmsg'] = i('The submitted start time is in the past.'); return $return; } if ($start + 900 > $end) { $return['err'] = 1; $return['errmsg'] = i('The end time must be at least 15 minutes later than the start time.'); return $return; } $return['ipaddr'] = ''; $return['macaddr'] = ''; # server specific input if ($return['type'] == 'server') { # name $return['name'] = processInputVar('name', ARG_STRING); if (!preg_match('/^([-a-zA-Z0-9_\\. ]){0,255}$/', $return['name'])) { $return['err'] = 1; $return['errmsg'] = i('The reservation name can only contain letters, numbers, spaces, dashes(-), underscores(_), and periods(.) and can be up to 255 characters long'); return $return; } # ipaddr $return['ipaddr'] = processInputVar('ipaddr', ARG_STRING); if ($return['ipaddr'] != '') { # validate fixed IP address if (!validateIPv4addr($return['ipaddr'])) { $return['err'] = 1; $return['errmsg'] = i('Invalid IP address. Must be w.x.y.z with each of w, x, y, and z being between 1 and 255 (inclusive)'); return $return; } # validate netmask $return['netmask'] = processInputVar('netmask', ARG_STRING); $bnetmask = ip2long($return['netmask']); if (!preg_match('/^[1]+0[^1]+$/', sprintf('%032b', $bnetmask))) { $return['err'] = 1; $return['errmsg'] = i('Invalid netmask specified'); return $return; } # validate router $return['router'] = processInputVar('router', ARG_STRING); if (!validateIPv4addr($return['router'])) { $return['err'] = 1; $return['errmsg'] = i('Invalid router address. Must be w.x.y.z with each of w, x, y, and z being between 1 and 255 (inclusive)'); return $return; } $return['network'] = ip2long($return['ipaddr']) & $bnetmask; if ($return['network'] != (ip2long($return['router']) & $bnetmask)) { $return['err'] = 1; $return['errmsg'] = i('IP address and router are not on the same subnet based on the specified netmask.'); return $return; } # validate dns server(s) $dns = processInputVar('dns', ARG_STRING); $tmp = explode(',', $dns); $cnt = 0; $return['dnsArr'] = array(); foreach ($tmp as $dnsaddr) { if ($cnt && $dnsaddr == '') { continue; } if ($cnt == 3) { $return['err'] = 1; $return['errmsg'] = i('Too many DNS servers specified - up to 3 are allowed.'); return $return; } if (!validateIPv4addr($dnsaddr)) { $return['err'] = 1; $return['errmsg'] = i('Invalid DNS server specified.'); return $return; } $return['dnsArr'][] = $dnsaddr; $cnt++; } # check that a management node can handle the network $mappedmns = getMnsFromImage($return['imageid']); $mnnets = checkAvailableNetworks($return['ipaddr']); $intersect = array_intersect($mappedmns, $mnnets); if (empty($intersect)) { $return['err'] = 1; $return['errmsg'] = i('There are no management nodes that can deploy the selected image with the specified IP address.'); return $return; } } # macaddr $return['macaddr'] = processInputVar('macaddr', ARG_STRING); if ($return['macaddr'] != '' && !preg_match('/^(([A-Fa-f0-9]){2}:){5}([A-Fa-f0-9]){2}$/', $return['macaddr'])) { $return['err'] = 1; $return['errmsg'] = i('Invalid MAC address. Must be XX:XX:XX:XX:XX:XX with each pair of XX being from 00 to FF (inclusive)'); return $return; } # profileid $return['profileid'] = processInputVar('profileid', ARG_NUMERIC, 0); $resources = getUserResources(array("serverCheckOut", "serverProfileAdmin"), array("available", "administer")); if (!array_key_exists($return['profileid'], $resources['serverprofile'])) { $return['profileid'] = 0; } elseif ($return['profileid'] != 0) { $tmp = getServerProfiles($return['profileid']); $tmp = $tmp[$return['profileid']]; if ($tmp['imageid'] != $return['imageid'] && ($tmp['fixedIP'] != $return['ipaddr'] && $tmp['fixedMAC'] != $return['macaddr'] || $tmp['fixedIP'] == $return['ipaddr'] && $return['ipaddr'] == '' && $tmp['fixedMAC'] == $return['macaddr'] && $return['macaddr'] == '')) { $return['profileid'] = 0; } } # admingroupid $usergroups = getUserGroups(); $return['admingroupid'] = processInputVar('admingroupid', ARG_NUMERIC); if ($return['admingroupid'] != 0 && !array_key_exists($return['admingroupid'], $usergroups)) { $return['err'] = 1; $return['errmsg'] = i('You do not have access to use the specified admin user group.'); return $return; } # logingroupid $return['logingroupid'] = processInputVar('logingroupid', ARG_NUMERIC); if ($return['logingroupid'] != 0 && !array_key_exists($return['logingroupid'], $usergroups)) { $return['err'] = 1; $return['errmsg'] = i('You do not have access to use the specified access user group.'); return $return; } # monitored $return['monitored'] = processInputVar('monitored', ARG_NUMERIC, 0); if ($return['monitored'] != 0 && $return['monitored'] != 1) { $return['monitored'] = 0; } # configs # TODO configs /*$tmp = getUserResources(array("configAdmin")); $userconfigs = $tmp['config']; $initconfigs = getMappedConfigs($return['imageid']); if(array_key_exists('configdata', $_POST)) { if(get_magic_quotes_gpc()) $_POST['configdata'] = stripslashes($_POST['configdata']); $configdata = json_decode($_POST['configdata']); } if(array_key_exists('configdata', $_POST) && isset($configdata->configs)) $configs = $configdata->configs; else $configs = (object)array(); $return['configs'] = array(); foreach($initconfigs as $id => $config) { if(isset($configs->{$id}) && isset($configs->{$id}->applied) && $configs->{$config['id']}->applied != 'true' && $configs->{$config['id']}->applied != 'false') unset($configs->{$config['id']}); if($config['optional'] && (! isset($configs->{$id}) || ! $configs->{$id}->applied)) continue; $return['configs'][$id] = array('configid' => $config['configid'], 'configmapid' => $config['configmapid'], 'imageid' => $config['subimageid']); if(isset($configs->{$id})) unset($configs->{$id}); } $rescfgmapids = array(); foreach($configs as $id => $config) { if(! array_key_exists($config->configid, $userconfigs)) continue; $return['configs'][$id] = array('configid' => $config->configid, 'configstageid' => $config->configstageid, 'imageid' => $config->imageid); $tmp = explode('/', $id); $rescfgmapids[$tmp[1]] = 1; } # configvars $tmp = array_splice($initconfigs, 0); $initconfigvars = getImageConfigVariables($tmp); if(array_key_exists('configdata', $_POST) && isset($configdata->configvars)) $configvars = $configdata->configvars; else $configvars = (object)array(); #print "/*"; #printArray($initconfigvars); #printArray($configvars); #print "*" . "/"; $return['configvars'] = array(); foreach($initconfigvars as $id => $configvar) { $tmp = explode('/', $id); $cfgid = "{$tmp[0]}/{$tmp[1]}"; $varid = $tmp[2]; if($configvar['ask'] == 0 || ! isset($configvars->{$id}) || ! isset($configvars->{$id}->value)) { $return['configvars'][$cfgid][$varid] = array('value' => $configvar['defaultvalue']); } else { switch($configvar['datatype']) { case 'bool': case 'int': case 'float': $value = processInputData($configvars->{$id}->value, ARG_NUMERIC); break; default: $value = processInputData($configvars->{$id}->value, ARG_STRING); break; } $return['configvars'][$cfgid][$varid] = array('value' => $value); } if(isset($configvars->{$id})) unset($configvars->{$id}); }*/ /*print "/*"; printArray($rescfgmapids); foreach($configvars as $id => $var) { $cfgid = explode('/', $id); print "cfgid: {$cfgid[1]}\n"; if(! array_key_exists($cfgid[1], $rescfgmapids)) continue; // TODO validate based on var type $value = processInputData($configvars->{$id}->value, ARG_STRING); $return['configvars']["{$cfgid[0]}/{$cfgid[1]}"][$cfgid[2]] = array('value' => $value); } printArray($configvars);*/ #print "*/"; } return $return; }
function AJeditResource() { $rscid = processInputVar('rscid', ARG_NUMERIC); $resources = getUserResources(array($this->restype . 'Admin'), array('administer'), 0, 1); if (!array_key_exists($rscid, $resources[$this->restype])) { $ret = array('status' => 'noaccess'); sendJSON($ret); return; } $args = $this->defaultGetDataArgs; $args['rscid'] = $rscid; $tmp = $this->getData($args); $data = $tmp[$rscid]; $cdata = $this->basecdata; $cdata['rscid'] = $rscid; $cdata['olddata'] = $data; # save continuation $cont = addContinuationsEntry('AJsaveResource', $cdata); $ret = $this->jsondata; $ret['title'] = "Edit {$this->restypename}"; $ret['cont'] = $cont; $ret['resid'] = $rscid; $ret['data'] = $data; $ret['status'] = 'success'; sendJSON($ret); }
function processMgmtnodeInput($checks = 1) { global $submitErr, $submitErrMsg, $user, $mode; $return = array(); $mgmtnodes = getManagementNodes(); $return["mgmtnodeid"] = getContinuationVar("mgmtnodeid"); $return["hostname"] = getContinuationVar("hostname", processInputVar("hostname", ARG_STRING)); $return["IPaddress"] = getContinuationVar("IPaddress", processInputVar("IPaddress", ARG_STRING)); $return["owner"] = getContinuationVar("owner", processInputVar("owner", ARG_STRING, $user["unityid"])); $return["stateid"] = getContinuationVar("stateid", processInputVar("stateid", ARG_STRING)); $return["premoduleid"] = getContinuationVar("premoduleid", processInputVar("premoduleid", ARG_NUMERIC)); $return["checkininterval"] = getContinuationVar("checkininterval", processInputVar("checkininterval", ARG_NUMERIC)); $return["installpath"] = getContinuationVar("installpath", processInputVar("installpath", ARG_STRING)); $return["keys"] = getContinuationVar("keys", processInputVar("keys", ARG_STRING)); $return["sshport"] = getContinuationVar("sshport", processInputVar("sshport", ARG_NUMERIC)); $return["imagelibenable"] = getContinuationVar("imagelibenable", processInputVar("imagelibenable", ARG_NUMERIC)); $return["imagelibgroupid"] = getContinuationVar("imagelibgroupid", processInputVar("imagelibgroupid", ARG_NUMERIC)); $return["imagelibuser"] = getContinuationVar("imagelibuser", processInputVar("imagelibuser", ARG_STRING)); $return["imagelibkey"] = getContinuationVar("imagelibkey", processInputVar("imagelibkey", ARG_STRING)); if ($return['checkininterval'] < 5) { $return['checkininterval'] = 5; } if ($return['checkininterval'] > 30) { $return['checkininterval'] = 30; } if ($return['sshport'] < 1 || $return['sshport'] > 65535) { $return['sshport'] = 22; } if ($return['imagelibenable'] != '' && $return['imagelibenable'] != 1) { $return['imagelibenable'] = ''; } if ($return['imagelibenable'] != 1) { $return["imagelibgroupid"] = 'NULL'; $return["imagelibuser"] = '******'; $return["imagelibkey"] = 'NULL'; } if (!$checks) { return $return; } if (!ereg('^[a-zA-Z0-9_][-a-zA-Z0-9_\\.]{1,49}$', $return["hostname"])) { $submitErr |= MNHOSTNAMEERR; $submitErrMsg[MNHOSTNAMEERR] = "Hostname can only contain letters, numbers, dashes(-), periods(.), and underscores(_). It can be from 1 to 50 characters long"; } if (!($submitErr & MNHOSTNAMEERR) && $mode != "confirmEditMgmtnode" && checkForMgmtnodeHostname($return["hostname"])) { $submitErr |= MNHOSTNAMEERR; $submitErrMsg[MNHOSTNAMEERR] = "A node already exists with this hostname."; } $ipaddrArr = explode('.', $return["IPaddress"]); if (!ereg('^(([0-9]){1,3}\\.){3}([0-9]){1,3}$', $return["IPaddress"]) || $ipaddrArr[0] < 1 || $ipaddrArr[0] > 255 || $ipaddrArr[1] < 0 || $ipaddrArr[1] > 255 || $ipaddrArr[2] < 0 || $ipaddrArr[2] > 255 || $ipaddrArr[3] < 1 || $ipaddrArr[3] > 255) { $submitErr |= IPADDRESSERR; $submitErrMsg[IPADDRESSERR] = "Invalid IP address. Must be w.x.y.z with each of " . "w, x, y, and z being between 1 and 255 (inclusive)"; } if ($mode != "confirmEditMgmtnode" && !($submitErr & IPADDRESSERR) && checkForMgmtnodeIPaddress($return["IPaddress"])) { $submitErr |= IPADDRESSERR; $submitErrMsg[IPADDRESSERR] = "A node already exists with this IP address."; } if (!validateUserid($return["owner"])) { $submitErr |= MNOWNERERR; $submitErrMsg[MNOWNERERR] = "Submitted ID is not valid"; } if (!preg_match('/^([-a-zA-Z0-9_\\.\\/]){2,100}$/', $return["installpath"])) { $submitErr |= MNINSTPATHERR; $submitErrMsg[MNINSTPATHERR] = "This can only contain letters, numbers, dashes(-), periods(.), underscores(_), and forward slashes(/). It can be from 2 to 100 characters long"; } if (!empty($return['keys']) && !preg_match('/^([-a-zA-Z0-9_\\.\\/,]){2,1024}$/', $return["keys"])) { $submitErr |= MNSSHIDKEYSERR; $submitErrMsg[MNSSHIDKEYSERR] = "This can only contain letters, numbers, dashes(-), periods(.), underscores(_), forward slashes(/), and commas(,). It can be from 2 to 1024 characters long"; } if ($return['imagelibenable'] == 1) { $validgroups = getUserResources(array('mgmtNodeAdmin'), array("manageGroup"), 1); if (!in_array($return['imagelibgroupid'], array_keys($validgroups['managementnode']))) { $submitErr |= MNIMGLIBGRPIDERR; $submitErrMsg[MNIMGLIBGRPIDERR] = "The selected group was invalid"; } if (!preg_match('/^([-a-zA-Z0-9_\\.\\/,]){2,20}$/', $return["imagelibuser"])) { $submitErr |= MNIMGLIBUSERERR; $submitErrMsg[MNIMGLIBUSERERR] = "This can only contain letters, numbers, and dashes(-) and can be from 2 to 20 characters long"; } if (!preg_match('/^([-a-zA-Z0-9_\\.\\/,]){2,100}$/', $return["imagelibkey"])) { $submitErr |= MNIMGLIBKEYERR; $submitErrMsg[MNIMGLIBKEYERR] = "This can only contain letters, numbers, dashes(-), periods(.), underscores(_), and forward slashes(/). It can be from 2 to 100 characters long"; } } else { $return["imagelibgroupid"] = 'NULL'; $return["imagelibuser"] = '******'; $return["imagelibkey"] = 'NULL'; } return $return; }
function AJsaveResource() { $add = getContinuationVar('add', 0); $data = $this->validateResourceData(); if ($data['error']) { $ret = array('status' => 'error', 'msg' => $data['errormsg']); sendJSON($ret); return; } if ($add) { if (!($data['rscid'] = $this->addResource($data))) { sendJSON(array('status' => 'adderror', 'errormsg' => 'Error encountered while trying to create new schedule.<br>Please contact an admin for assistance.')); return; } } else { $ownerid = getUserlistID($data['owner']); $query = "UPDATE schedule " . "SET name = '{$data['name']}', " . "ownerid = {$ownerid} " . "WHERE id = {$data['rscid']}"; doQuery($query); } if (!$add) { $query = "DELETE FROM scheduletimes WHERE scheduleid = {$data['rscid']}"; doQuery($query, 101); } $qvals = array(); foreach ($data['times'] as $time) { $qvals[] = "({$data['rscid']}, {$time['start']}, {$time['end']})"; } $allvals = implode(',', $qvals); $query = "INSERT INTO scheduletimes " . "(scheduleid, start, end) " . "VALUES {$allvals}"; doQuery($query, 101); # clear user resource cache for this type $key = getKey(array(array($this->restype . "Admin"), array("administer"), 0, 1, 0, 0)); unset($_SESSION['userresources'][$key]); $key = getKey(array(array($this->restype . "Admin"), array("administer"), 0, 0, 0, 0)); unset($_SESSION['userresources'][$key]); $key = getKey(array(array($this->restype . "Admin"), array("manageGroup"), 0, 1, 0, 0)); unset($_SESSION['userresources'][$key]); $key = getKey(array(array($this->restype . "Admin"), array("manageGroup"), 0, 0, 0, 0)); unset($_SESSION['userresources'][$key]); $tmp = $this->getData(array('includedeleted' => 0, 'rscid' => $data['rscid'])); $data = $tmp[$data['rscid']]; $arr = array('status' => 'success'); if ($add) { $arr['action'] = 'add'; $arr['nogroups'] = 0; $groups = getUserResources(array($this->restype . 'Admin'), array('manageGroup'), 1); if (count($groups[$this->restype])) { $arr['groupingHTML'] = $this->groupByResourceHTML(); } else { $arr['nogroups'] = 1; } } else { $arr['action'] = 'edit'; } $arr['data'] = $data; sendJSON($arr); }