blob: ba1e2d1b34e3e25cb40771c4345dcf5ef81e5dfe [file] [log] [blame]
<?php
/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* \file
*/
/// signifies an error with the submitted name
define("IDNAMEERR", 1);
/// signifies an error with the submitted group name
define("GRPNAMEERR", 1 << 1);
/// signifies an error with the submitted owner
define("GRPOWNER", 1 << 2);
/// signifies an error with the submitted initial max time
define("INITIALMAXERR", 1 << 3);
/// signifies an error with the submitted total max time
define("TOTALMAXERR", 1 << 4);
/// signifies an error with the submitted max extend time
define("MAXEXTENDERR", 1 << 5);
/// signifies an error with the submitted max overlapping reservations
define("MAXOVERLAPERR", 1 << 6);
////////////////////////////////////////////////////////////////////////////////
///
/// \fn viewGroups()
///
/// \brief prints a page to view group information
///
////////////////////////////////////////////////////////////////////////////////
function viewGroups() {
global $viewmode, $user, $mode;
$modetype = getContinuationVar("type");
$usergroups = getUserGroups(1);
unset($usergroups[82]); // remove None group
if($user['showallgroups'])
$affilusergroups = $usergroups;
else
$affilusergroups = getUserGroups(1, $user['affiliationid']);
$resourcetypes = getTypes("resources");
$resourcegroups = getResourceGroups();
$resources = array();
$userresources = getUserResources(array("groupAdmin"),
array("manageGroup"), 1);
foreach(array_keys($userresources) as $type) {
foreach($userresources[$type] as $id => $group) {
if(array_key_exists($id, $resourcegroups)) { // have to make sure it exists in case something was deleted from the session priv cache
$resources[$id]["type"] = $type;
$resources[$id]["name"] = $group;
$resources[$id]["owner"] = $resourcegroups[$id]["owner"];
}
}
}
print "<H2>User Groups</H2>\n";
if($modetype == "user") {
if($mode == "submitAddGroup") {
print "<font color=\"#008000\">User group successfully added";
print "</font><br><br>\n";
}
elseif($mode == "submitDeleteGroup") {
print "<font color=\"#008000\">User group successfully deleted";
print "</font><br><br>\n";
}
elseif($mode == "submitEditGroup") {
print "<font color=\"#008000\">User group successfully updated";
print "</font><br><br>\n";
}
}
print "<TABLE class=usergrouptable border=1>\n";
print " <TR>\n";
print " <TD></TD>\n";
print " <TD></TD>\n";
print " <TH>Name</TH>\n";
print " <TH>Owner</TH>\n";
print " <TH>Editable by</TH>\n";
print " <TH>Initial Max Time (minutes)</TH>\n";
print " <TH>Total Max Time (minutes)</TH>\n";
print " <TH>Max Extend Time (minutes)</TH>\n";
if($viewmode == ADMIN_DEVELOPER)
print " <TH>Max Overlapping Reservations</TH>\n";
print " </TR>\n";
print " <TR>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
print " <TD></TD>\n";
print " <TD><INPUT type=submit value=Add></TD>\n";
if($user['showallgroups']) {
$affils = getAffiliations();
print " <TD nowrap><INPUT type=text name=name maxlength=30 size=10>";
print "@";
printSelectInput("affiliationid", $affils, $user['affiliationid']);
}
else
print " <TD nowrap><INPUT type=text name=name maxlength=30 size=20>";
print "</TD>\n";
print " <TD><INPUT type=text name=owner size=15></TD>\n";
print " <TD>\n";
printSelectInput("editgroupid", $affilusergroups, 82);
print " </TD>\n";
print " <TD><INPUT type=text name=initialmax maxlength=4 size=4 ";
print "value=240></TD>\n";
print " <TD><INPUT type=text name=totalmax maxlength=4 size=4 value=360>";
print "</TD>\n";
print " <TD><INPUT type=text name=maxextend maxlength=4 size=4 value=30>";
print "</TD>\n";
if($viewmode == ADMIN_DEVELOPER) {
print " <TD><INPUT type=text name=overlap maxlength=4 size=4 value=0>";
print "</TD>\n";
}
$cont = addContinuationsEntry('submitAddGroup', array('type' => 'user'));
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " </FORM>\n";
print " </TR>\n";
$dispUserGrpIDs = array();
foreach(array_keys($usergroups) as $id) {
if($usergroups[$id]["name"] == " None")
continue;
# figure out if user is owner or in editor group
$owner = 0;
$editor = 0;
if($usergroups[$id]["ownerid"] == $user["id"])
$owner = 1;
if(array_key_exists("editgroup", $usergroups[$id]) &&
in_array($usergroups[$id]["editgroup"], $user["groups"]))
$editor = 1;
if(! $owner && ! $editor)
continue;
if($user['showallgroups'])
$dispUserGrpIDs[$id] = $usergroups[$id]['name'];
elseif($usergroups[$id]['groupaffiliation'] == $user['affiliation'] &&
array_key_exists($id, $affilusergroups))
$dispUserGrpIDs[$id] = $affilusergroups[$id]['name'];
print " <TR>\n";
print " <TD>\n";
if($owner) {
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>";
$cdata = array('type' => 'user',
'groupid' => $id);
$cont = addContinuationsEntry('confirmDeleteGroup', $cdata);
print " <INPUT type=hidden name=continuation value=\"$cont\">";
print " <INPUT type=submit value=Delete>";
print " </FORM>";
}
print " </TD>\n";
print " <TD>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
$cdata = array('type' => 'user',
'groupid' => $id,
'isowner' => $owner);
$cont = addContinuationsEntry('editGroup', $cdata);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " <INPUT type=submit value=Edit>\n";
print " </FORM>\n";
print " </TD>\n";
print " <TD valign=bottom>{$usergroups[$id]["name"]}</TD>\n";
print " <TD>{$usergroups[$id]["owner"]}</TD>\n";
print " <TD>{$usergroups[$id]["editgroup"]}@";
print "{$usergroups[$id]['editgroupaffiliation']}</TD>\n";
print " <TD align=center>{$usergroups[$id]["initialmaxtime"]}</TD>\n";
print " <TD align=center>{$usergroups[$id]["totalmaxtime"]}</TD>\n";
print " <TD align=center>{$usergroups[$id]["maxextendtime"]}</TD>\n";
if($viewmode == ADMIN_DEVELOPER)
print " <TD align=center>{$usergroups[$id]["overlapResCount"]}</TD>\n";
print " </TR>\n";
}
print "</TABLE>\n";
print "<a name=resources></a>\n";
print "<H2>Resource Groups</H2>\n";
if($modetype == "resource") {
if($mode == "submitAddGroup") {
print "<font color=\"#008000\">Resource group successfully added";
print "</font><br><br>\n";
}
elseif($mode == "submitDeleteGroup") {
print "<font color=\"#008000\">Resource group successfully deleted";
print "</font><br><br>\n";
}
elseif($mode == "submitEditGroup") {
print "<font color=\"#008000\">Resource group successfully updated";
print "</font><br><br>\n";
}
}
print "<TABLE class=resourcegrouptable border=1>\n";
print " <TR>\n";
print " <TD></TD>\n";
print " <TD></TD>\n";
print " <TH>Type</TH>\n";
print " <TH>Name</TH>\n";
print " <TH>Owning User Group</TH>\n";
print " <TD><a onmouseover=\"mouseoverHelp();\" ";
print "onmouseout=\"clearGroupPopups();\">";
print "<img alt=\"\" src=\"images/list.gif\"></a></TD>\n";
print " </TR>\n";
if(! empty($dispUserGrpIDs)) {
print " <TR>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "#resources\" method=post>\n";
print " <TD></TD>\n";
print " <TD><INPUT type=submit value=Add></TD>\n";
print " <TD>\n";
printSelectInput("resourcetypeid", $resourcetypes["resources"]);
print " </TD>\n";
print " <TD><INPUT type=text name=name maxlength=30 size=10></TD>\n";
print " <TD>\n";
# remove the "None" group
unset($usergroups[82]);
# find a custom group the user is in and make it the default
$defaultgroupkey = "";
foreach(array_keys($user["groups"]) as $grpid) {
if(array_key_exists($grpid, $usergroups)) {
$defaultgroupkey = $grpid;
break;
}
}
printSelectInput("ownergroup", $dispUserGrpIDs, $defaultgroupkey);
print " </TD>\n";
$cdata = array('type' => 'resource'/*,
'dispUserGrpIDs' => $dispUserGrpIDs*/);
$cont = addContinuationsEntry('submitAddGroup', $cdata);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " </FORM>\n";
print " </TR>\n";
}
$jscont = addContinuationsEntry('jsonGetGroupInfo');
foreach(array_keys($resources) as $id) {
print " <TR>\n";
print " <TD>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
$cdata = array('type' => 'resource',
'groupid' => $id);
$cont = addContinuationsEntry('confirmDeleteGroup', $cdata);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " <INPUT type=submit value=Delete>\n";
print " </FORM>\n";
print " </TD>\n";
print " <TD>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
$cdata = array('type' => 'resource',
'groupid' => $id,
'dispUserGrpIDs' => $dispUserGrpIDs);
$cont = addContinuationsEntry('editGroup', $cdata);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " <INPUT type=submit value=Edit>\n";
print " </FORM>\n";
print " </TD>\n";
print " <TD>" . $resources[$id]["type"] . "</TD>\n";
print " <TD>" . $resources[$id]["name"] . "</TD>\n";
print " <TD>" . $resources[$id]["owner"] . "</TD>\n";
print " <TD><a onmouseover=\"getGroupInfo('$jscont', $id);\" ";
print "onmouseout=\"clearGroupPopups();\">";
print "<img alt=\"mouseover for list of resources in the group\" ";
print "title=\"\" src=\"images/list.gif\"></a></TD>\n";
print " </TR>\n";
}
print "</TABLE>\n";
print "<div id=listitems onmouseover=\"blockClear();\" onmouseout=\"clearGroupPopups2(0);\"></div>\n";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn editOrAddGroup($state)
///
/// \param $state - 0 for edit, 1 for add
///
/// \brief prints a form for editing a group
///
////////////////////////////////////////////////////////////////////////////////
function editOrAddGroup($state) {
global $submitErr, $user, $mode, $viewmode;
$usergroups = getUserGroups(1);
if($user['showallgroups'])
$affilusergroups = $usergroups;
else
$affilusergroups = getUserGroups(1, $user['affiliationid']);
$resourcegroups = getResourceGroups();
$affils = getAffiliations();
$resourcetypes = getTypes("resources");
if($submitErr) {
$data = processGroupInput(0);
$newuser = processInputVar("newuser", ARG_STRING);
if($mode == "submitEditGroup") {
$id = $data["groupid"];
if($data["type"] == "resource") {
list($grouptype, $junk) = explode('/', $resourcegroups[$id]["name"]);
$ownerid = $resourcegroups[$id]["ownerid"];
}
}
else {
if($data["type"] == "resource") {
if($state)
$grouptype = $resourcetypes['resources'][$data['resourcetypeid']];
else
list($grouptype, $junk) =
explode('/', $resourcegroups[$data['groupid']]["name"]);
$ownerid = $data["ownergroup"];
}
else {
$selectAffil = getContinuationVar('selectAffil');
if(empty($selectAffil) && $user['showallgroups'])
$selectAffil = 1;
}
}
}
else {
$newuser = processInputVar("newuser", ARG_STRING);
$data["groupid"] = getContinuationVar("groupid");
$data["type"] = getContinuationVar("type");
$data["isowner"] = getContinuationVar("isowner");
$id = $data["groupid"];
if($data["type"] == "user") {
$data["name"] = $usergroups[$id]["name"];
$data["affiliationid"] = $usergroups[$id]["groupaffiliationid"];
$data["owner"] = $usergroups[$id]["owner"];
$data["editgroupid"] = $usergroups[$id]["editgroupid"];
$data["initialmax"] = $usergroups[$id]["initialmaxtime"];
$data["totalmax"] = $usergroups[$id]["totalmaxtime"];
$data["maxextend"] = $usergroups[$id]["maxextendtime"];
$data["overlap"] = $usergroups[$id]["overlapResCount"];
$tmp = explode('@', $data['name']);
$data['name'] = $tmp[0];
if($user['showallgroups'] ||
(array_key_exists(1, $tmp) && $tmp[1] != $user['affiliation']))
$selectAffil = 1;
else
$selectAffil = 0;
}
else {
list($grouptype, $data["name"]) =
explode('/', $resourcegroups[$id]["name"]);
$ownerid = $resourcegroups[$id]["ownerid"];
}
}
$editusergroup = 0;
if($data['type'] != 'user')
print "<FORM action=\"" . BASEURL . SCRIPT . "#resources\" method=post>\n";
else
print "<FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
print "<DIV align=center>\n";
if($state) {
if($data["type"] == "user")
print "<H2>Add User Group</H2>\n";
else
print "<H2>Add Resource Group</H2>\n";
}
else {
if($data["type"] == "user") {
print "<H2>Edit User Group</H2>\n";
print "{$usergroups[$data['groupid']]['name']}<br>\n";
$editusergroup = 1;
}
else
print "<H2>Edit Resource Group</H2>\n";
}
if(($state && $data["type"] == "user") || $data["isowner"] ||
$data["type"] == "resource") {
print "<TABLE>\n";
if($data["type"] == "resource") {
print " <TR>\n";
print " <TH align=right>Type:</TH>\n";
print " <TD>\n";
if($state && $submitErr)
$resourcetypeid = $data['resourcetypeid'];
else
$resourcetypeid = array_search($grouptype, $resourcetypes["resources"]);
if($state)
printSelectInput("resourcetypeid", $resourcetypes["resources"], $resourcetypeid);
else
print " $grouptype\n";
print " </TD>\n";
print " <TD></TD>\n";
print " </TR>\n";
}
print " <TR>\n";
print " <TH align=right>Name:</TH>\n";
print " <TD><INPUT type=text name=name value=\"{$data['name']}\" ";
print "maxlength=30>";
if($data['type'] == 'user' && $selectAffil) {
print "@";
printSelectInput('affiliationid', $affils, $data['affiliationid']);
}
print "</TD>\n";
print " <TD>";
printSubmitErr(GRPNAMEERR);
print "</TD>\n";
print " </TR>\n";
if($data["type"] == "user") {
print " <TR>\n";
print " <TH align=right>Owner:</TH>\n";
print " <TD><INPUT type=text name=owner value=\"" . $data["owner"];
print "\"></TD>\n";
print " <TD>";
printSubmitErr(GRPOWNER);
print "</TD>\n";
print " </TR>\n";
print " <TR>\n";
print " <TH align=right>Editable by:</TH>\n";
print " <TD>\n";
if(! empty($data['editgroupid']) &&
! array_key_exists($data['editgroupid'], $affilusergroups)) {
$affilusergroups[$data['editgroupid']] =
array('name' => getUserGroupName($data['editgroupid'], 1));
uasort($affilusergroups, "sortKeepIndex");
}
printSelectInput("editgroupid", $affilusergroups, $data["editgroupid"]);
print " </TD>\n";
print " <TD></TD>";
print " </TR>\n";
print " <TR>\n";
print " <TH align=right>Initial Max Time (minutes):</TH>\n";
print " <TD><INPUT type=text name=initialmax value=\"";
print $data["initialmax"] . "\" maxlength=4></TD>\n";
print " <TD>";
printSubmitErr(INITIALMAXERR);
print "</TD>\n";
print " </TR>\n";
print " <TR>\n";
print " <TH align=right>Total Max Time (minutes):</TH>\n";
print " <TD><INPUT type=text name=totalmax value=\"";
print $data["totalmax"] . "\" maxlength=4></TD>\n";
print " <TD>";
printSubmitErr(TOTALMAXERR);
print "</TD>\n";
print " </TR>\n";
print " <TR>\n";
print " <TH align=right>Max Extend Time (minutes):</TH>\n";
print " <TD><INPUT type=text name=maxextend value=\"";
print $data["maxextend"] . "\" maxlength=4></TD>\n";
print " <TD>";
printSubmitErr(MAXEXTENDERR);
print "</TD>\n";
print " </TR>\n";
if($viewmode == ADMIN_DEVELOPER) {
print " <TR>\n";
print " <TH align=right>Max Overlapping Reservations:</TH>\n";
print " <TD><INPUT type=text name=overlap value=\"";
print $data["overlap"] . "\" maxlength=4></TD>\n";
print " <TD>";
printSubmitErr(MAXOVERLAPERR);
print "</TD>\n";
print " </TR>\n";
}
}
else {
print " <TR>\n";
print " <TH align=right>Owning User Group:</TH>\n";
print " <TD>\n";
if(! array_key_exists($ownerid, $affilusergroups)) {
$affilusergroups[$ownerid] = $usergroups[$ownerid];
uasort($affilusergroups, "sortKeepIndex");
}
printSelectInput("ownergroup", $affilusergroups, $ownerid);
print " </TD>\n";
print " <TD></TD>\n";
print " </TR>\n";
}
print "</TABLE>\n";
print "<TABLE>\n";
print " <TR valign=top>\n";
print " <TD>\n";
if($state) {
$cdata = array('type' => $data['type'],
'isowner' => $data['isowner']);
$cont = addContinuationsEntry('submitAddGroup', $cdata);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " <INPUT type=submit value=\"Add Group\">\n";
}
else {
$cdata = array('type' => $data['type'],
'groupid' => $data['groupid'],
'isowner' => $data['isowner']);
if($data['type'] == 'resource')
$cdata['resourcetypeid'] = $resourcetypeid;
else
$cdata['selectAffil'] = $selectAffil;
$cont = addContinuationsEntry('confirmEditGroup', $cdata);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " <INPUT type=submit value=\"Confirm Changes\">\n";
}
print " </FORM>\n";
print " </TD>\n";
print " <TD>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
print " <INPUT type=hidden name=mode value=viewGroups>\n";
print " <INPUT type=submit value=Cancel>\n";
print " </FORM>\n";
print " </TD>\n";
print " </TR>\n";
print "</TABLE>\n";
}
if($data["type"] != "user")
return;
if($editusergroup) {
print "<H3>Group Membership</H3>\n";
if($mode == "addGroupUser" && ! ($submitErr & IDNAMEERR)) {
print "<font color=\"#008000\">$newuser successfully added to group";
print "</font><br><br>\n";
}
if($mode == "deleteGroupUser") {
print "<font color=\"#008000\">$newuser successfully deleted from ";
print "group</font><br><br>\n";
}
$groupmembers = getUserGroupMembers($data["groupid"]);
print "<TABLE border=1>\n";
print " <TR>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
print " <TD align=right><INPUT type=submit value=Add></TD>\n";
print " <TD><INPUT type=text name=newuser maxlength=80 size=40 ";
if($submitErr & IDNAMEERR)
print "value=\"$newuser\"></TD>\n";
else
print "></TD>\n";
if($submitErr) {
print " <TD>\n";
printSubmitErr(IDNAMEERR);
print " </TD>\n";
}
$cont = addContinuationsEntry('addGroupUser', $data);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " </FORM>\n";
print " </TR>\n";
foreach($groupmembers as $id => $login) {
print " <TR>\n";
print " <TD>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
print " <INPUT type=submit value=Delete>\n";
$data['userid'] = $id;
$data['newuser'] = $login;
$cont = addContinuationsEntry('deleteGroupUser', $data);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " </FORM>\n";
print " </TD>\n";
print " <TD>$login</TD>\n";
print " </TR>\n";
}
print "</TABLE>\n";
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn processGroupInput($checks)
///
/// \param $checks - (optional) 1 to perform validation, 0 not to
///
/// \return an array with the following indexes:\n
/// groupid, name, prettyname, platformid, osid
///
/// \brief validates input from the previous form; if anything was improperly
/// submitted, sets submitErr and submitErrMsg
///
////////////////////////////////////////////////////////////////////////////////
function processGroupInput($checks=1) {
global $submitErr, $submitErrMsg, $user, $viewmode;
$return = array();
$return["groupid"] = getContinuationVar("groupid");
$return["type"] = getContinuationVar("type");
$return["name"] = getContinuationVar('name', processInputVar("name", ARG_STRING));
$return["affiliationid"] = getContinuationVar('affiliationid', processInputVar("affiliationid", ARG_NUMERIC, $user['affiliationid']));
$return["resourcetypeid"] = getContinuationVar('resourcetypeid', processInputVar("resourcetypeid", ARG_NUMERIC));
$return["owner"] = getContinuationVar('owner', processInputVar("owner", ARG_STRING));
$return["ownergroup"] = processInputVar("ownergroup", ARG_NUMERIC);
$return["editgroupid"] = getContinuationVar('editgroupid', processInputVar("editgroupid", ARG_NUMERIC));
$return["isowner"] = getContinuationVar("isowner");
$return["initialmax"] = getContinuationVar('initialmax', processInputVar("initialmax", ARG_NUMERIC));
$return["totalmax"] = getContinuationVar('totalmax', processInputVar("totalmax", ARG_NUMERIC));
$return["maxextend"] = getContinuationVar('maxextend', processInputVar("maxextend", ARG_NUMERIC));
$return["overlap"] = getContinuationVar('overlap', processInputVar("overlap", ARG_NUMERIC, 0));
$affils = getAffiliations();
if(! array_key_exists($return['affiliationid'], $affils))
$return['affiliationid'] = $user['affiliationid'];
if(! $checks) {
return $return;
}
if(! ereg('^[-a-zA-Z0-9_\.: ]{3,30}$', $return["name"])) {
$submitErr |= GRPNAMEERR;
$submitErrMsg[GRPNAMEERR] = "Name must be between 3 and 30 characters "
. "and can only contain letters, numbers, and "
. "these characters: - _ . :";
}
if(! empty($return["type"]) && ! empty($return["name"]) &&
! ($submitErr & GRPNAMEERR) &&
checkForGroupName($return["name"], $return["type"], $return["groupid"],
$return["resourcetypeid"])) {
$submitErr |= GRPNAMEERR;
$submitErrMsg[GRPNAMEERR] = "A group already exists with this name.";
}
if($return["type"] == "user" && ! validateUserid($return["owner"])) {
$submitErr |= GRPOWNER;
$submitErrMsg[GRPOWNER] = "Submitted ID is not valid";
}
if($return["type"] == "user" && $return["initialmax"] < 30) {
$submitErr |= INITIALMAXERR;
$submitErrMsg[INITIALMAXERR] = "Initial max time must be at least 30 "
. "minutes";
}
if($return["type"] == "user" && $return["totalmax"] < 30) {
$submitErr |= TOTALMAXERR;
$submitErrMsg[TOTALMAXERR] = "Total max time must be at least 30 "
. "minutes";
}
if($return["type"] == "user" && $return["maxextend"] < 15) {
$submitErr |= MAXEXTENDERR;
$submitErrMsg[MAXEXTENDERR] = "Max extend time must be at least 15 "
. "minutes";
}
if($viewmode == ADMIN_DEVELOPER &&
$return["type"] == "user" &&
($return["overlap"] < 0 ||
$return["overlap"] == 1)) {
$submitErr |= MAXOVERLAPERR;
$submitErrMsg[MAXOVERLAPERR] = "Overlap can be 0 or greater than or equal to 2";
}
return $return;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn checkForGroupName($name, $type, $id, $resourcetypeid)
///
/// \param $name - the name of a group
/// \param $type - user or resource
/// \param $id - id of a group to ignore
/// \param $resourcetypeid - a resource type
///
/// \return 1 if $name is already in the associated table, 0 if not
///
/// \brief checks for $name being in usergroup/resource group (based on $type)
/// except for $id
///
////////////////////////////////////////////////////////////////////////////////
function checkForGroupName($name, $type, $id, $resourcetypeid) {
if($type == "user")
$query = "SELECT id FROM usergroup "
. "WHERE name = '$name'";
else
$query = "SELECT id FROM resourcegroup "
. "WHERE name = '$name' AND "
. "resourcetypeid = $resourcetypeid";
if(! empty($id))
$query .= " AND id != $id";
$qh = doQuery($query, 101);
if(mysql_num_rows($qh))
return 1;
return 0;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn updateGroup($data)
///
/// \param $data - an array returned from processGroupInput
///
/// \return number of rows affected by the update\n
/// \b NOTE: mysql reports that no rows were affected if none of the fields
/// were actually changed even if the update matched a row
///
/// \brief performs a query to update the group with data from $data
///
////////////////////////////////////////////////////////////////////////////////
function updateGroup($data) {
global $viewmode;
if($data["type"] == "user") {
$ownerid = getUserlistID($data["owner"]);
$query = "UPDATE usergroup "
. "SET name = '{$data["name"]}', "
. "affiliationid = {$data['affiliationid']}, "
. "ownerid = $ownerid, "
. "editusergroupid = {$data["editgroupid"]}, "
. "initialmaxtime = {$data["initialmax"]}, "
. "totalmaxtime = {$data["totalmax"]}, ";
if($viewmode == ADMIN_DEVELOPER)
$query .= "overlapResCount = {$data["overlap"]}, ";
$query .= "maxextendtime = {$data["maxextend"]} "
. "WHERE id = {$data["groupid"]}";
}
else {
$query = "UPDATE resourcegroup "
. "SET name = '{$data["name"]}', "
. "ownerusergroupid = {$data["ownergroup"]} "
. "WHERE id = {$data["groupid"]}";
}
$qh = doQuery($query, 300);
return mysql_affected_rows($GLOBALS["mysql_link_vcl"]);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn addGroup($data)
///
/// \param $data - an array returned from processGroupInput
///
/// \return number of rows affected by the insert\n
///
/// \brief performs a query to insert the group with data from $data
///
////////////////////////////////////////////////////////////////////////////////
function addGroup($data) {
global $viewmode;
if($data["type"] == "user") {
$ownerid = getUserlistID($data["owner"]);
$query = "INSERT INTO usergroup "
. "(name, "
. "affiliationid, "
. "ownerid, "
. "editusergroupid, "
. "custom, "
. "initialmaxtime, "
. "totalmaxtime, ";
if($viewmode == ADMIN_DEVELOPER)
$query .= "overlapResCount, ";
$query .= "maxextendtime) "
. "VALUES ('{$data["name"]}', "
. "{$data["affiliationid"]}, "
. "$ownerid, "
. "{$data["editgroupid"]}, "
. "1, "
. "{$data["initialmax"]}, "
. "{$data["totalmax"]}, ";
if($viewmode == ADMIN_DEVELOPER)
$query .= "{$data["overlap"]}, ";
$query .= "{$data["maxextend"]})";
}
else {
$query = "INSERT INTO resourcegroup "
. "(name, "
. "ownerusergroupid, "
. "resourcetypeid) "
. "VALUES ('" . $data["name"] . "', "
. $data["ownergroup"] . ", "
. "'" . $data["resourcetypeid"] . "')";
}
$qh = doQuery($query, 305);
clearPrivCache();
return mysql_affected_rows($GLOBALS["mysql_link_vcl"]);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn checkForGroupUsage($groupid, $type)
///
/// \param $groupid - id of an group
/// \param $type - group type: "user" or "resource"
///
/// \return 0 if group is not used, 1 if it is
///
/// \brief checks for $groupid being in the priv table corresponding to $type
///
////////////////////////////////////////////////////////////////////////////////
function checkForGroupUsage($groupid, $type) {
if($type == "user")
$query = "SELECT id FROM userpriv WHERE usergroupid = $groupid";
else
$query = "SELECT id FROM resourcepriv WHERE resourcegroupid = $groupid";
$qh = doQuery($query, 310);
if(mysql_num_rows($qh)) {
return 1;
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn confirmEditOrAddGroup($state)
///
/// \param $state - 0 for edit, 1 for add
///
/// \brief prints a form for confirming changes to an group
///
////////////////////////////////////////////////////////////////////////////////
function confirmEditOrAddGroup($state) {
global $submitErr, $user, $viewmode;
$data = processGroupInput(1);
if($submitErr) {
editOrAddGroup($state);
return;
}
$resourcetypes = getTypes("resources");
$usergroups = getUserGroups(1);
$affils = getAffiliations();
if($state) {
if($data["type"] == "user") {
$title = "Add User Group";
$question = "Add the following user group?";
$target = "";
}
else {
$title = "Add Resource Group";
$question = "Add the following resource group?";
$target = "#resources";
}
$nextmode = "submitAddGroup";
}
else {
if($data["type"] == "user") {
$title = "Edit User Group";
$question = "Submit changes to the user group?";
$target = "";
}
else {
$title = "Edit Resource Group";
$question = "Submit changes to the resource group?";
$target = "#resources";
}
$nextmode = "submitEditGroup";
}
print "<DIV align=center>\n";
print "<H2>$title</H2>\n";
print "$question<br><br>\n";
print "<TABLE>\n";
if($data["type"] == "resource") {
print " <TR>\n";
print " <TH align=right>Type:</TH>\n";
print " <TD>" . $resourcetypes["resources"][$data["resourcetypeid"]];
print "</TD>\n";
print " </TR>\n";
}
print " <TR>\n";
print " <TH align=right>Name:</TH>\n";
if($data['type'] == 'user' && ($user['showallgroups'] ||
$data['affiliationid'] != $user['affiliationid']))
print " <TD>{$data["name"]}@{$affils[$data['affiliationid']]}</TD>\n";
else
print " <TD>{$data["name"]}</TD>\n";
print " </TR>\n";
if($data["type"] == "user") {
print " <TR>\n";
print " <TH align=right>Owner:</TH>\n";
print " <TD>" . $data["owner"] . "</TD>\n";
print " </TR>\n";
print " <TR>\n";
print " <TH align=right>Editable by:</TH>\n";
if(! $user['showallgroups']) {
$tmp = explode('@', $usergroups[$data["editgroupid"]]["name"]);
if($tmp[1] == $user['affiliation'])
$usergroups[$data["editgroupid"]]["name"] = $tmp[0];
}
print " <TD>" . $usergroups[$data["editgroupid"]]["name"] . "</TD>\n";
print " </TR>\n";
print " <TR>\n";
print " <TH align=right>Initial Max Time (minutes):</TH>\n";
print " <TD>{$data["initialmax"]}</TD>\n";
print " </TR>\n";
print " <TR>\n"; print " <TH align=right>Total Max Time (minutes):</TH>\n";
print " <TD>{$data["totalmax"]}</TD>\n";
print " </TR>\n";
print " <TR>\n";
print " <TH align=right>Max Extend Time (minutes):</TH>\n";
print " <TD>{$data["maxextend"]}</TD>\n";
print " </TR>\n";
if($viewmode == ADMIN_DEVELOPER) {
print " <TR>\n";
print " <TH align=right>Max Overlapping Reservations:</TH>\n";
print " <TD>{$data["overlap"]}</TD>\n";
print " </TR>\n";
}
}
else {
print " <TR>\n";
print " <TH align=right>Owning User Group:</TH>\n";
if(! $user['showallgroups'] &&
preg_match("/^(.+)@{$user['affiliation']}$/",
$usergroups[$data['ownergroup']]['name'], $matches))
print " <TD>{$matches[1]}";
else
print " <TD>" . $usergroups[$data["ownergroup"]]["name"];
print "</TD>\n";
print " </TR>\n";
}
print "</TABLE>\n";
print "<TABLE>\n";
print " <TR valign=top>\n";
print " <TD>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "$target\" method=post>\n";
$cont = addContinuationsEntry($nextmode, $data, SECINDAY, 0, 0);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " <INPUT type=submit value=Submit>\n";
print " </FORM>\n";
print " </TD>\n";
print " <TD>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
print " <INPUT type=hidden name=mode value=viewGroups>\n";
print " <INPUT type=submit value=Cancel>\n";
print " </FORM>\n";
print " </TD>\n";
print " </TR>\n";
print "</TABLE>\n";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitEditGroup()
///
/// \brief submits changes to group and notifies user
///
////////////////////////////////////////////////////////////////////////////////
function submitEditGroup() {
$data = getContinuationVar();
updateGroup($data);
$_SESSION['userresources'] = array();
$_SESSION['nodeprivileges'] = array();
#$_SESSION['cascadenodeprivileges'] = array(); // might need this uncommented
viewGroups();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitAddGroup()
///
/// \brief adds the group and notifies user
///
////////////////////////////////////////////////////////////////////////////////
function submitAddGroup() {
global $submitErr;
$data = processGroupInput(1);
if($submitErr) {
editOrAddGroup(1);
return;
}
if(! addGroup($data))
abort(10);
viewGroups();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn confirmDeleteGroup()
///
/// \brief prints a form to confirm the deletion of an group
///
////////////////////////////////////////////////////////////////////////////////
function confirmDeleteGroup() {
$groupid = getContinuationVar("groupid");
$type = getContinuationVar("type");
$usergroups = getUserGroups(1);
$resourcegroups = getResourceGroups();
if($type == "user") {
$title = "Delete User Group";
$question = "Delete the following user group?";
$name = $usergroups[$groupid]["name"];
$target = "";
}
else {
$title = "Delete Resource Group";
$question = "Delete the following resource group?";
list($resourcetype, $name) =
split('/', $resourcegroups[$groupid]["name"]);
$target = "#resources";
}
if(checkForGroupUsage($groupid, $type)) {
print "<H2 align=center>$title</H2>\n";
print "This group is currently assigned to at least one node in the ";
print "privilege tree. You cannot delete it until it is no longer ";
print "in use.";
return;
}
print "<DIV align=center>\n";
print "<H2>$title</H2>\n";
print "$question<br><br>\n";
print "<TABLE>\n";
if($type == "resource") {
print " <TR>\n";
print " <TH align=right>Type:</TH>\n";
print " <TD>$resourcetype</TD>\n";
print " </TR>\n";
}
print " <TR>\n";
print " <TH align=right>Name:</TH>\n";
print " <TD>$name</TD>\n";
print " </TR>\n";
if($type == "resource") {
print " <TR>\n";
print " <TH align=right>Owning User Group:</TH>\n";
print " <TD>" . $resourcegroups[$groupid]["owner"] . "</TD>\n";
print " </TR>\n";
}
print "</TABLE>\n";
print "<TABLE>\n";
print " <TR valign=top>\n";
print " <TD>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "$target\" method=post>\n";
$cdata = array('groupid' => $groupid,
'type' => $type);
$cont = addContinuationsEntry('submitDeleteGroup', $cdata);
print " <INPUT type=hidden name=continuation value=\"$cont\">\n";
print " <INPUT type=submit value=Submit>\n";
print " </FORM>\n";
print " </TD>\n";
print " <TD>\n";
print " <FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
print " <INPUT type=hidden name=mode value=viewGroups>\n";
print " <INPUT type=submit value=Cancel>\n";
print " </FORM>\n";
print " </TD>\n";
print " </TR>\n";
print "</TABLE>\n";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn submitDeleteGroup()
///
/// \brief deletes an group from the database and notifies the user
///
////////////////////////////////////////////////////////////////////////////////
function submitDeleteGroup() {
$groupid = getContinuationVar("groupid");
$type = getContinuationVar("type");
if($type == "user")
$table = "usergroup";
else
$table = "resourcegroup";
$query = "DELETE FROM $table "
. "WHERE id = $groupid";
doQuery($query, 315);
clearPrivCache();
viewGroups();
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn addGroupUser()
///
/// \brief adds a user to a group
///
////////////////////////////////////////////////////////////////////////////////
function addGroupUser() {
global $submitErr, $submitErrMsg;
$groupid = getContinuationVar("groupid");
$newuser = processInputVar("newuser", ARG_STRING);
if(! validateUserid($newuser)) {
$submitErr |= IDNAMEERR;
$submitErrMsg[IDNAMEERR] = "Invalid login ID";
editOrAddGroup(0);
return;
}
addUserGroupMember($newuser, $groupid);
editOrAddGroup(0);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn deleteGroupUser()
///
/// \brief deletes a user from a group
///
////////////////////////////////////////////////////////////////////////////////
function deleteGroupUser() {
$groupid = getContinuationVar("groupid");
$userid = getContinuationVar("userid");
$test = getUserUnityID($userid);
if(! empty($test))
deleteUserGroupMember($userid, $groupid);
editOrAddGroup(0);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \fn jsonGetGroupInfo()
///
/// \brief
///
////////////////////////////////////////////////////////////////////////////////
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-comment-filtered; charset=utf-8');
print '/*{"items":' . json_encode(array()) . '}*/';
return;
}
$members = getResourceGroupMembers($type);
$data = array();
if(! empty($members[$type][$groupid])) {
uasort($members[$type][$groupid], "sortKeepIndex");
foreach($members[$type][$groupid] as $mem) {
$data[] = $mem['name'];
}
}
else
$data[] = '(empty group)';
$arr = array('members' => $data, 'x' => $mousex, 'y' => $mousey);
header('Content-Type: text/json-comment-filtered; charset=utf-8');
print '/*{"items":' . json_encode($arr) . '}*/';
}
?>