defs.php3.in 16.5 KB
Newer Older
1 2
<?php
#
Mike Hibler's avatar
Mike Hibler committed
3
# Copyright (c) 2000-2013 University of Utah and the Flux Group.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# 
# {{{EMULAB-LICENSE
# 
# This file is part of the Emulab network testbed software.
# 
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
# 
# This file is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public
# License for more details.
# 
# You should have received a copy of the GNU Affero General Public License
# along with this file.  If not, see <http://www.gnu.org/licenses/>.
# 
# }}}
23
#
24 25 26

#
# Standard definitions.
27
#
28
$TBDIR          = "@prefix@/";
29
$OURDOMAIN      = "@OURDOMAIN@";
30
$BOSSNODE       = "@BOSSNODE@";
31
$USERNODE       = "@USERNODE@";
Leigh B. Stoller's avatar
Leigh B. Stoller committed
32
$CVSNODE	= "cvs.${OURDOMAIN}";
33
$WIKINODE	= $USERNODE;
34
$TBADMINGROUP   = "@TBADMINGROUP@";
35 36 37 38 39 40 41
$WWWHOST	= "@WWWHOST@";
$WWW		= "@WWW@";
$TBAUTHDOMAIN	= "@TBAUTHDOMAIN@";
$TBBASE		= "@TBBASE@";
$TBDOCBASE	= "@TBDOCBASE@";
$TBWWW		= "@TBWWW@";
$THISHOMEBASE	= "@THISHOMEBASE@";
42
$ELABINELAB     = @ELABINELAB@;
43
$PLABSUPPORT    = @PLABSUPPORT@;
44
$PUBSUPPORT     = @PUBSUPPORT@;
45
$WIKISUPPORT    = @WIKISUPPORT@;
46
$TRACSUPPORT    = @TRACSUPPORT@;
47
$BUGDBSUPPORT   = @BUGDBSUPPORT@;
48
$CVSSUPPORT     = @CVSSUPPORT@;
49
$MAILMANSUPPORT = @MAILMANSUPPORT@;
50
$CHATSUPPORT    = @CHATSUPPORT@;
51
$PROTOGENI      = @PROTOGENI_SUPPORT@;
Leigh B Stoller's avatar
Leigh B Stoller committed
52
$GENIRACK       = @PROTOGENI_GENIRACK@;
53
$ISCLRHOUSE     = @PROTOGENI_ISCLEARINGHOUSE@;
54
$EXP_VIS        = @EXP_VIS_SUPPORT@;
55
$ISOLATEADMINS  = @ISOLATEADMINS@;
56
$CONTROL_NETWORK= "@CONTROL_NETWORK@";
57
$CONTROL_NETMASK= "@CONTROL_NETMASK@";
Leigh B. Stoller's avatar
Leigh B. Stoller committed
58 59
$WIKIHOME       = "https://${USERNODE}/twiki";
$WIKIURL        = "${WIKIHOME}/bin/newlogon";
60
$WIKICOOKIENAME = "WikiCookie";
61 62
$BUGDBURL       = "https://${USERNODE}/flyspray";
$BUGDBCOOKIENAME= "FlysprayCookie";
63
$TRACCOOKIENAME = "TracCookie";
64
$MAILMANURL     = "http://${USERNODE}/mailman";
65
$OPSCVSURL      = "http://${USERNODE}/cvsweb/cvsweb.cgi";
66
$OPSJETIURL     = "http://${USERNODE}/jabber/jeti.php";
67
$WIKIDOCURL     = "http://${WIKINODE}/wikidocs/wiki";
68 69
$MIN_UNIX_UID   = @MIN_UNIX_UID@;
$MIN_UNIX_GID   = @MIN_UNIX_GID@;
Leigh B. Stoller's avatar
Leigh B. Stoller committed
70
$EXPOSELINKTEST = 1;
71
$EXPOSESTATESAVE= 0;
72
$EXPOSEARCHIVE  = 0;
73
$EXPOSETEMPLATES= 0;
74
$USERSELECTUIDS = 1;
75
$REMOTEWIKIDOCS = @REMOTEWIKIDOCS@;
76
$GMAP_API_KEY   = "@GMAP_API_KEY@";
77
$NONAMEDSETUP	= @DISABLE_NAMED_SETUP@;
78
$OPS_VM		= @OPSVM_ENABLE@;
79 80
$PORTAL_ENABLE  = @PORTAL_ENABLE@;
$PORTAL_ISPRIMARY = @PORTAL_ISPRIMARY@;
81
$SPEWFROMOPS    = @SPEWFROMOPS@;
82
$BROWSER_CONSOLE_ENABLE = @BROWSER_CONSOLE_ENABLE@;
83

84 85 86 87 88 89
$TBMAILADDR_OPS		= "@TBOPSEMAIL_NOSLASH@";
$TBMAILADDR_WWW		= "@TBWWWEMAIL_NOSLASH@";
$TBMAILADDR_APPROVAL	= "@TBAPPROVALEMAIL_NOSLASH@";
$TBMAILADDR_LOGS	= "@TBLOGSEMAIL_NOSLASH@";
$TBMAILADDR_AUDIT	= "@TBAUDITEMAIL_NOSLASH@";

90 91 92 93 94
# Can override this in the defs file. 
$TBAUTHTIMEOUT  = "@TBAUTHTIMEOUT@";
$TBMAINSITE     = "@TBMAINSITE@";
$TBSECURECOOKIES= "@TBSECURECOOKIES@";
$TBCOOKIESUFFIX = "@TBCOOKIESUFFIX@";
95
$FANCYBANNER    = "@FANCYBANNER@";
96

Leigh B. Stoller's avatar
Leigh B. Stoller committed
97 98
$TBWWW_DIR	= "$TBDIR"."www/";
$TBBIN_DIR	= "$TBDIR"."bin/";
99
$TBETC_DIR	= "$TBDIR"."etc/";
100 101 102
$TBLIBEXEC_DIR	= "$TBDIR"."libexec/";
$TBSUEXEC_PATH  = "$TBLIBEXEC_DIR/suexec";
$TBCHKPASS_PATH = "$TBLIBEXEC_DIR/checkpass";
103
$TBCSLOGINS     = "$TBETC_DIR/cslogins";
Mike Hibler's avatar
Mike Hibler committed
104
$UUIDGEN_PATH   = "@UUIDGEN@";
105

106 107
#
# Hardcoded check against $WWWHOST, to prevent anyone from accidentally setting
108
# $TBMAINSITE when it should not be
109 110 111 112 113
#
if ($WWWHOST != "www.emulab.net") {
    $TBMAINSITE = 0;
}

114 115 116 117 118 119 120 121 122 123 124 125 126 127
#
# The wiki docs either come from the local node, or in most cases
# they are redirected back to Utah's emulab.
#
if ($TBMAINSITE) {
    $WIKIDOCURL  = "https://${WIKINODE}/wikidocs/wiki";
}
elseif ($REMOTEWIKIDOCS) {
    $WIKIDOCURL  = "https://wiki.emulab.net/wikidocs/wiki";
}
else {
    $WIKIDOCURL  = "/wikidocs/wiki";
}

128 129 130 131
$TBPROJ_DIR     = "@PROJROOT_DIR@";
$TBUSER_DIR	= "@USERSROOT_DIR@";
$TBGROUP_DIR	= "@GROUPSROOT_DIR@";
$TBSCRATCH_DIR	= "@SCRATCHROOT_DIR@";
132
$TBCVSREPO_DIR  = "$TBPROJ_DIR/cvsrepos";
Leigh B. Stoller's avatar
Leigh B. Stoller committed
133
$TBNSSUBDIR     = "nsdir";
Leigh B. Stoller's avatar
Leigh B. Stoller committed
134

135 136 137 138 139 140 141
$TBVALIDDIRS	  = "$TBPROJ_DIR, $TBUSER_DIR, $TBGROUP_DIR";
$TBVALIDDIRS_HTML = "<code>$TBPROJ_DIR</code>, <code>$TBUSER_DIR</code>, <code>$TBGROUP_DIR</code>";
if ($TBSCRATCH_DIR) {
    $TBVALIDDIRS .= ", $TBSCRATCH_DIR";
    $TBVALIDDIRS_HTML .= ", <code>$TBSCRATCH_DIR</code>";
}

142 143
$TBAUTHCOOKIE   = "NewHashCookie" . $TBCOOKIESUFFIX;
$TBNAMECOOKIE   = "NewMyUidCookie" . $TBCOOKIESUFFIX;
144
$TBEMAILCOOKIE  = "MyEmailCookie" . $TBCOOKIESUFFIX;
145
$TBLOGINCOOKIE  = "NewLoginCookie" . $TBCOOKIESUFFIX;
146

147 148
$HTTPTAG        = "http://";

149 150 151 152 153
$TBMAIL_OPS		= "Testbed Ops <$TBMAILADDR_OPS>";
$TBMAIL_WWW		= "Testbed WWW <$TBMAILADDR_WWW>";
$TBMAIL_APPROVAL	= "Testbed Approval <$TBMAILADDR_APPROVAL>";
$TBMAIL_LOGS		= "Testbed Logs <$TBMAILADDR_LOGS>";
$TBMAIL_AUDIT		= "Testbed Audit <$TBMAILADDR_AUDIT>";
154
$TBMAIL_NOREPLY		= "no-reply@$OURDOMAIN";
155

156
#
157 158 159
# This just spits out an email address in a page, so it does not need
# to be configured per development tree. It could be though ...
# 
160 161
$TBMAILADDR     = "<a href=\"mailto:$TBMAILADDR_OPS\">
                      Testbed Operations ($TBMAILADDR_OPS)</a>";
162

163 164 165
# So subscripts always know ...
putenv("HTTP_SCRIPT=1");

166 167 168 169 170 171
#
# Special headers alterting browsers to the fact that there's an RSS feed
# available for the page. Intended to be passed as an $extra_headers argument
# to PAGEHEADER
#
$RSS_HEADER_NEWS = "<link rel=\"alternate\" type=\"application/rss+xml\" " .
172
           "title=\"Emulab News\" href=\"$TBDOCBASE/news-rss.php3?protogeni=0\" />";
173

174 175 176
$RSS_HEADER_PGENINEWS =
   "<link rel=\"alternate\" type=\"application/rss+xml\" " .
   "title=\"ProtoGeni News\" href=\"$TBDOCBASE/news-rss.php3?protogeni=1\"/>";
177

178 179 180 181
#
# Database constants and the like.
#
include("dbdefs.php3");
182
include("url_defs.php");
183 184 185
include("user_defs.php");
include("group_defs.php");
include("project_defs.php");
186
include("experiment_defs.php");
187

188 189 190 191 192 193 194 195
#
# Control how error messages are returned to the user. If the session is
# not actually "interactive" then do not send any output to the browser.
# Just save it up and let the page deal with it. 
#
$session_interactive  = 1;
$session_errorhandler = 0;

196 197 198 199 200 201 202 203 204 205 206 207
#
# Wrap up the mail function so we can prepend a tag to the subject
# line that indicates what testbed. Useful when multiple testbed
# email to the same list.
#
# 
function TBMAIL($to, $subject, $message, $headers = 0)
{
    global $THISHOMEBASE;

    $subject = strtoupper($THISHOMEBASE) . ": $subject";

208
    $tag = "X-NetBed: " . basename($_SERVER["SCRIPT_NAME"]);
209 210 211 212 213 214 215 216
    
    if ($headers) {
	$headers = "$headers\n" . $tag;
    }
    else {
	$headers = $tag;
    }
    return mail($to, $subject, $message, $headers);
217 218
}

219 220 221 222 223 224 225 226
#
#
# Identical to perl function of the same name
#
#
function SendProjAdminMail($proj, $from, $to, $subject, $message, $headers = "")
{
    global $MAILMANSUPPORT, $TBMAIL_APPROVAL, $TBMAIL_AUDIT, $OURDOMAIN, $TBMAIL_WWW;
227 228
    $projadminmail = 0 && $MAILMANSUPPORT ?
	"$proj-admin@$OURDOMAIN" : $TBMAIL_APPROVAL;
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
    if ($headers) {
        $headers .= "\n";
    }
    if ($from == 'ADMIN') {
	$from = $projadminmail;
	$headers .= "Bcc: $projadminmail\n";
    } elseif ($to == 'ADMIN') {
	$to = $projadminmail;
	$headers .= "Reply-To: $projadminmail\n";
    } else {
	$headers .= "Bcc: $projadminmail\n";
    }
    $headers .= "From: $from\n";
    if ($from == 'AUDIT') {
	$from = $TBMAIL_AUDIT;
	$headers .= "Bcc: $TBMAIL_AUDIT\n";
    } elseif ($to == "AUDIT") {
	$to = $TBMAIL_AUDIT;
    } else {
	$headers .= "Bcc: $TBMAIL_AUDIT\n";
    }
    $headers .= "Errors-To: $TBMAIL_WWW\n"; # FIXME: Why?
    $headers = substr($headers, 0, -1);
    TBMAIL($to, $subject, $message, $headers);
}

255 256 257 258 259
#
# Internal errors should be reported back to the user simply. The actual 
# error information should be emailed to the list for action. The script
# should then terminate if required to do so.
#
260
function TBERROR ($message, $death, $xmp = 0) {
261 262 263
    global $TBMAIL_WWW, $TBMAIL_OPS, $TBMAILADDR, $TBMAILADDR_OPS;
    global $session_interactive, $session_errorhandler;
    $script = urldecode($_SERVER['REQUEST_URI']);
264

265 266
    CLEARBUSY();

267 268
    TBMAIL($TBMAIL_OPS,
         "WEB ERROR REPORT",
269
         "\n".
270
	 "In $script\n\n".
271 272 273
         "$message\n\n".
         "Thanks,\n".
         "Testbed WWW\n",
274
         "From: $TBMAIL_OPS\n".
275
         "Errors-To: $TBMAIL_WWW");
276

277
    if ($death) {
278 279 280 281 282 283 284
	if ($session_interactive)
	    PAGEERROR("Could not continue. Please contact $TBMAILADDR");
	elseif ($session_errorhandler) {
	    $session_errorhandler("Could not continue. ".
				  "Please contact $TBMAILADDR_OPS", $death);
	}
	exit(1);
285 286 287
    }
    return 0;
}
Leigh B. Stoller's avatar
Leigh B. Stoller committed
288 289

#
290 291 292 293 294
# General user errors should print something warm and fuzzy.  If a
# header is not already printed and the dealth paramater is true, then
# assume the error is a precheck error and send an appropriate HTTP
# response to prevent robots from indexing the page.  This currently
# defaults to a "400 Bad Request", but that may change in the future.
Leigh B. Stoller's avatar
Leigh B. Stoller committed
295
#
296 297
function USERERROR($message, $death = 1, 
	           $status_code = HTTP_400_BAD_REQUEST) {
298
    global $TBMAILADDR;
299 300
    global $session_interactive, $session_errorhandler;

301 302
    CLEARBUSY();

303 304 305 306 307 308 309 310 311 312
    if (! $session_interactive) {
	if ($session_errorhandler)
	    $session_errorhandler($message, $death);
	else
	    echo "$message";

	if ($death)
	    exit(1);
	return;
    }
313

314
    $msg = "<font size=+1><br>
315
            $message
316
      	    </font>
317
            <br><br><br>
318 319 320
            <font size=-1>
            Please contact $TBMAILADDR if you feel this message is an error.
            </font>\n";
321

Leigh B. Stoller's avatar
Leigh B. Stoller committed
322
    if ($death) {
323
	PAGEERROR($msg, $status_code);
Leigh B. Stoller's avatar
Leigh B. Stoller committed
324
    }
325 326
    else
        echo "$msg\n";
Leigh B. Stoller's avatar
Leigh B. Stoller committed
327 328
}

329 330 331 332 333 334 335 336
#
# A form error.
#
function FORMERROR($field) {
    USERERROR("Missing field; ".
              "Please go back and fill out the \"$field\" field!", 1);
}

337 338 339
#
# A page argument error. 
# 
340
function PAGEARGERROR($msg = 0) {
341 342
    $default = "Invalid page arguments: " .
          	htmlspecialchars($_SERVER['REQUEST_URI']);
343 344 345 346

    if ($msg) {
	$default = "$default<br><br>$msg";
    }
347
    USERERROR($default, 1, HTTP_400_BAD_REQUEST);
348 349
}

350
#
351
# SUEXEC stuff.
352
#
353 354
# Save this stuff so we can generate better error messages and such.
# 
355 356 357 358
$suexec_cmdandargs   = "";
$suexec_retval       = 0;
$suexec_output       = "";
$suexec_output_array = null;
359

360 361 362 363 364 365 366
#
# Actions for suexec. 
#
define("SUEXEC_ACTION_CONTINUE",	0);
define("SUEXEC_ACTION_DIE",		1);
define("SUEXEC_ACTION_USERERROR",	2);
define("SUEXEC_ACTION_IGNORE",		3);
367
define("SUEXEC_ACTION_DUPDIE",		4);
368 369
# SUEXEC_ACTION_MAIL_TBLOGS to be ored with one of the above actions
define("SUEXEC_ACTION_MAIL_TBLOGS",     64);
370

371 372 373 374 375
#
# An suexec error.
#
function SUEXECERROR($action)
{
376
    global $suexec_cmdandargs, $suexec_retval;
377
    global $suexec_output;
378

379 380
    $foo  = "Shell Program Error. Exit status: $suexec_retval\n";
    $foo .= "  '$suexec_cmdandargs'\n";
381 382 383
    $foo .= "\n";
    $foo .= $suexec_output;

384 385
    switch ($action) {
    case SUEXEC_ACTION_CONTINUE:
386
	TBERROR($foo, 0, 1);
387 388 389 390 391 392 393 394 395
        break;
    case SUEXEC_ACTION_DIE:
	TBERROR($foo, 1, 1);
        break;
    case SUEXEC_ACTION_USERERROR:
	USERERROR("<XMP>$foo</XMP>", 1);
        break;
    case SUEXEC_ACTION_IGNORE:
	break;
396 397 398 399
    case SUEXEC_ACTION_DUPDIE:
	TBERROR($foo, 0, 1);
	USERERROR("<XMP>$foo</XMP>", 1);
        break;
400 401 402 403 404 405 406 407 408 409
    default:
	TBERROR($foo, 1, 1);
    }
}

#
# Run a program as a user.
#
function SUEXEC($uid, $gid, $cmdandargs, $action) {
    global $TBSUEXEC_PATH;
410 411
    global $suexec_cmdandargs, $suexec_retval;
    global $suexec_output, $suexec_output_array;
412 413 414 415 416 417 418
    global $TBMAIL_LOGS;

    $mail_tblog = 0;
    if ($action & SUEXEC_ACTION_MAIL_TBLOGS) {
	$action &= ~SUEXEC_ACTION_MAIL_TBLOGS;
	$mail_tblog = 1;
    }
419 420 421

    ignore_user_abort(1);

422 423 424 425
    $suexec_cmdandargs   = "$uid $gid $cmdandargs";
    $suexec_output_array = array();
    $suexec_output       = "";
    $suexec_retval       = 0;
426
    
427 428 429 430 431 432 433 434 435 436 437 438 439
    exec("$TBSUEXEC_PATH $suexec_cmdandargs",
	 $suexec_output_array, $suexec_retval);

    # Yikes! Something is not doing integer conversion properly!
    if ($suexec_retval == 255) {
	$suexec_retval = -1;
    }

    if (count($suexec_output_array)) {
	for ($i = 0; $i < count($suexec_output_array); $i++) {
	    $suexec_output .= "$suexec_output_array[$i]\n";
	}
    }
440

441 442 443 444 445 446 447 448 449
    if ($mail_tblog) {
	$mesg  = "$TBSUEXEC_PATH $suexec_cmdandargs\n";
	$mesg .= "Return Value: $suexec_retval\n\n";
	$mesg .= "--------- OUTPUT ---------\n";
	$mesg .= $suexec_output;
	
	TBMAIL($TBMAIL_LOGS, "suexec: $cmdandargs", $mesg);
    }

450 451 452 453 454 455 456
    #
    # The output is still available of course, via $suexec_output.
    # 
    if ($suexec_retval == 0 || $action == SUEXEC_ACTION_IGNORE) {
	return $suexec_retval;
    }
    SUEXECERROR($action);
457 458
    # Must return the shell value!
    return $suexec_retval;
459 460
}

461 462 463 464 465 466
#
# We invoke addpubkey as user nobody all the time. The implied user is passed
# along in an HTTP_ variable (see tbauth). This avoids a bunch of confusion
# that results from new users who do not have a context yet. 
#
function ADDPUBKEY($cmdandargs) {
467 468
    global $TBSUEXEC_PATH;

469 470
    return SUEXEC("nobody", "nobody", "webaddpubkey $cmdandargs",
		  SUEXEC_ACTION_CONTINUE);
471 472
}

473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
#
# Verify a URL.
#
function CHECKURL($url, &$error) {
    global $HTTPTAG;

    if (strlen($url)) {
	if (strstr($url, " ")) {
	    $error = "URL is malformed; spaces are not allowed!";
	    return 0;
	}
	
	if (strcmp($HTTPTAG, substr($url, 0, strlen($HTTPTAG)))) {
	    $error = "URL is malformed; must begin with $HTTPTAG!";
	    return 0;
	}
489

490
	$fp = @fopen($url, "r");
Leigh B. Stoller's avatar
Leigh B. Stoller committed
491 492 493
	if (!$fp) {
	    $error = "URL is not valid; Cannot be accessed!";
	    return 0;
494
	}
Leigh B. Stoller's avatar
Leigh B. Stoller committed
495
	fclose($fp);
496 497 498 499 500 501 502 503 504 505
    }
    return 1;
}

#
# Check a password.
#
function CHECKPASSWORD($uid, $password, $name, $email, &$error)
{
    global $TBCHKPASS_PATH;
506

507 508 509 510 511
    # Watch for caller errors since this calls to the shell.
    if (empty($uid) || empty($password) || empty($name) || empty($email)) {
	$error = "";
	return 0;
    }
512 513 514 515 516
    # Ascii only.
    if (! TBvalid_userdata($password)) {
	$error = "Invalid characters; ascii only please";
	return 0;
    }
517

518 519 520
    $uid      = escapeshellarg($uid);
    $password = escapeshellarg($password);
    $stuff    = escapeshellarg("$name:$email");
521
    
522
    $mypipe = popen("$TBCHKPASS_PATH $password $uid $stuff", "w+");
523 524 525 526 527 528 529 530 531 532 533 534 535
    
    if ($mypipe) { 
        $retval=fgets($mypipe, 1024);
        if (strcmp($retval,"ok\n") != 0) {
	    $error = "$retval";
	    return 0;
	}
	return 1;
    }
    TBERROR("Checkpass Failure! Returned '$mypipe'.\n\n".
	    "$TBCHKPASS_PATH $password $uid '$name:$email'", 1);
}

536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
#
# Grab a UUID (universally unique identifier).
#
function NewUUID()
{
    global $UUIDGEN_PATH;

    $uuid = shell_exec($UUIDGEN_PATH);
    
    if (isset($uuid) && $uuid != "") {
	return rtrim($uuid);
    }
    TBERROR("$UUIDGEN_PATH Failure", 1);
}

551 552 553 554
function LASTNODELOGIN($node)
{
}

555 556 557 558 559 560 561 562
function VALIDUSERPATH($path, $uid="", $pid="", $gid="", $eid="")
{
    global $TBPROJ_DIR, $TBUSER_DIR, $TBGROUP_DIR, $TBSCRATCH_DIR;

    #
    # No ids specified, just make sure it starts with an appropriate prefix.
    #
    if (!$uid && !$pid && !$gid && !$eid) {
Mike Hibler's avatar
Mike Hibler committed
563 564 565
	if (preg_match("#^$TBPROJ_DIR/.*#", $path) ||
	    preg_match("#^$TBUSER_DIR/.*#", $path) ||
	    preg_match("#^$TBGROUP_DIR/.*#", $path)) {
566 567
	    return 1;
	}
Mike Hibler's avatar
Mike Hibler committed
568
	if ($TBSCRATCH_DIR && preg_match("#^$TBSCRATCH_DIR/.*#", $path)) {
569 570 571 572 573 574 575 576 577
	    return 1;
	}
	return 0;
    }

    # XXX for now, see tbsetup/libtestbed.pm for what should happen
    return 0;
}

578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593
#
# A function to print the contents of an array (recursively).
# Mostly useful for debugging.
#
function ARRAY_PRINT($arr) {
  if (!is_array($arr)) { echo "non-array '$arr'\n"; }
  foreach ($arr as $i => $val) {
    echo("'$i' - '$val'\n");
    if (is_array($val)) {
      echo "Sub-array $i:\n";
      array_print($val);
      echo "End Sub-array $i.\n";
    }
  }
}

594 595 596 597 598 599 600
#
# Return Yes or No given boolean
#
function YesNo($bool) {
    return ($bool ? "Yes" : "No");
}

601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618
#
# If the page was accessed via http redirect to https and exit
# otherwise do nothing
#
function RedirectHTTPS() {
    global $WWWHOST,$drewheader;
    if ($drewheader) {
	trigger_error(
	    "PAGEHEADER called before RedirectHTTPS ".
	    "Won't be able to redirect to HTTPS if necessary ".
	    "in ". $_SERVER['SCRIPT_FILENAME'] . ",",
	    E_USER_WARNING);
    } else if (!@$_SERVER['HTTPS'] && $_SERVER['REQUEST_METHOD'] == 'GET') {
	header("Location: https://$WWWHOST". $_SERVER['REQUEST_URI']);
	exit;
    }
}

619 620 621 622 623 624 625 626
#
# Clean out going string to be html safe.
#
function CleanString($string)
{
    return htmlspecialchars($string, ENT_QUOTES);
}

627 628 629 630
#
# Beware empty spaces (cookies)!
# 
require("tbauth.php3");
631 632 633 634

#
# Okay, this is what checks the login and spits out the menu.
#
635
require("Sajax.php");
636
require("menu.php3");
637
?>