|  | <?php | 
|  | /******************************************************************************* | 
|  | * Copyright (c) 2008 Eclipse Foundation and others. | 
|  | * All rights reserved. This program and the accompanying materials | 
|  | * are made available under the terms of the Eclipse Public License v1.0 | 
|  | * which accompanies this distribution, and is available at | 
|  | * http://www.eclipse.org/legal/epl-v10.html | 
|  | * | 
|  | * Contributors: | 
|  | *    Bjorn Freeman-Benson (Eclipse Foundation)- initial API and implementation | 
|  | *    Gabe O'Brien (Eclipse Foundation) - various fixes | 
|  | *    Wayne Beaton (Eclipse Foundation) - Bug 354733, 416515 | 
|  | *******************************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | /* 221934 - this page to remain on eclipse.org */ | 
|  |  | 
|  | //	error_reporting(E_ALL); ini_set("display_errors", true); | 
|  |  | 
|  | require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); | 
|  | require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); | 
|  | require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); | 
|  |  | 
|  | require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Project.class.php"); | 
|  | require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/common.php"); | 
|  | require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php"); | 
|  | trace_file_info(__FILE__); | 
|  | $trace = trace("Plan"); | 
|  |  | 
|  |  | 
|  | // ---------------------------------------------------------------------------- | 
|  | // PHOENIX STUFF | 
|  |  | 
|  | $App 	= new App(); | 
|  | $Nav	= new Nav(); | 
|  | $Menu 	= new Menu(); | 
|  | include($App->getProjectCommon()); | 
|  |  | 
|  | $pageTitle 		= "Project Plan - "; | 
|  | $pageAuthor		= "Bjorn Freeman-Benson"; | 
|  | include( '_commonLeftNav.php' ); | 
|  |  | 
|  | // ---------------------------------------------------------------------------- | 
|  | // BEGIN CODE | 
|  |  | 
|  |  | 
|  | // Global Errror Handler Function | 
|  | // This replicates the look/functionality of userErrorHandler from harness.php | 
|  | // but doesn't implement the test-specific checks for global flags. | 
|  | // NOTE:  This is not setup by default.  If you need to enable this, | 
|  | // do something like: $old_error_handler = set_error_handler("globalDisplayErrorHandler"); | 
|  | // external_entry() sets this up if the context calls for it. | 
|  | function globalDisplayErrorHandler($errno, $errmsg, $filename, $linenum, $vars) { | 
|  | $errortype = array ( | 
|  | E_ERROR => 'Error', | 
|  | E_WARNING => 'Warning', | 
|  | E_PARSE => 'Parsing Error', | 
|  | E_NOTICE => 'Notice', | 
|  | E_CORE_ERROR => 'Core Error', | 
|  | E_CORE_WARNING => 'Core Warning', | 
|  | E_COMPILE_ERROR => 'Compile Error', | 
|  | E_COMPILE_WARNING => 'Compile Warning', | 
|  | E_USER_ERROR => 'User Error', | 
|  | E_USER_WARNING => 'User Warning', | 
|  | E_USER_NOTICE => 'User Notice', | 
|  | E_STRICT => 'Runtime Notice', | 
|  | E_RECOVERABLE_ERROR => 'Catchable Fatal Error'); | 
|  | switch($errno) { | 
|  | case E_NOTICE: // discard NOTICEs | 
|  | case E_STRICT: // discard RUNTIME notices for deprecated usages | 
|  | return; | 
|  | default: | 
|  | echo "<p><table cellpadding=10 width=400 bgcolor=#ffcccc><tr><td><font size=+2>Trouble: </font>"; | 
|  | echo "PHP $errortype[$errno]:<br>$errmsg<br>$filename ($linenum)"; | 
|  | $mysql_error_func = 'mysql_error_check'; | 
|  | if(function_exists($mysql_error_func)) { | 
|  | $mysql_error_func(); | 
|  | } | 
|  | echo "</table></p>\n"; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Start Output Buffering | 
|  | ob_start(); | 
|  | ?> | 
|  | <style> | 
|  | h2 { | 
|  | border-bottom: 2px solid gray; | 
|  | } | 
|  | h3 { | 
|  | border-bottom: 1px dotted gray; | 
|  | } | 
|  | </style> | 
|  | <div id="midcolumn"> | 
|  | <div id="homeitem"> | 
|  | <?php | 
|  |  | 
|  | /** | 
|  | * Project plan URLs are specified in all sorts of horrible and devious | 
|  | * ways. Try as hard as possible to sort out a file system local path | 
|  | * from the URL. | 
|  | * | 
|  | * @internal | 
|  | */ | 
|  | function normalizePlanUrl($url) { | 
|  | // Note that this implementation is recursive. The order | 
|  | // in which we do tests may be significant. | 
|  |  | 
|  | // If the URL is specified as a link to this script with | 
|  | // a planurl parameter, use the value of that parameter. | 
|  | if (preg_match('/project\-plan\.php\?(?:plan)?url=(.*)$/', $url, $matches)) | 
|  | return normalizePlanUrl($matches[1]); | 
|  |  | 
|  | // If the URL is specified as a link to this script with | 
|  | // a projectid parameter, then we're probably screwed. | 
|  | if (preg_match('/project\-plan\.php\?(?:project)?id=(.*)$/', $url, $matches)) | 
|  | return null; | 
|  |  | 
|  | // If it looks like they've specified an eclipse.org URL, | 
|  | // just grab the resource part. | 
|  | if (preg_match('/eclipse\.org\/(.*)$/', $url, $matches)) | 
|  | return normalizePlanUrl($matches[1]); | 
|  |  | 
|  | // If we've got this far and it still looks like an absolute | 
|  | // URL, then we're looking in the wrong place. | 
|  | if (preg_match('/^https?:', $url)) return null; | 
|  |  | 
|  | return normalizeFilePathUrl($url); | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Must have a ?projectid=xxx or ?planurl=http://www.eclipse.org/xxx | 
|  | */ | 
|  |  | 
|  | $matches = array(); | 
|  | if(isset($_REQUEST['projectid'])) { | 
|  | preg_match('/^([a-z.0-9\-_]+)$/', $_REQUEST['projectid'], $matches); | 
|  | } | 
|  | // Should handle empty or missing projectid and planurl parameters | 
|  | if(!isset($matches[1]) && (!isset($_REQUEST['planurl']) || $_REQUEST['planurl'] === '')) { | 
|  | ?><span style="background-color: #FFCCCC; font-weight: bold; font-size: 150%">Error: unable to display project plan without a ?projectid=xxx or ?planurl=xxx</span><?php | 
|  | } else { | 
|  | if( isset($_REQUEST['projectid']) ) { | 
|  | $projectid = $matches[1]; | 
|  | $project = get_project_from_pmi($projectid); // WTB Bug 416515 | 
|  | $pageTitle .= $projectid; | 
|  |  | 
|  | if(!$project){ | 
|  | show_error_page( 'the project does not exist in our records.', $projectid ); | 
|  | } else { | 
|  | /* | 
|  | * If the parameter is a projectid, look up the url in the meta-data database | 
|  | */ | 
|  | $url = $project->getPlanUrl(); | 
|  | // Bug 438683 If the plan URL is not specified, let the PMI figure it out. | 
|  | if (!$url) { | 
|  | header("Location: https://projects.eclipse.org/projects/$projectid/current-release"); | 
|  | exit; | 
|  | } | 
|  | } | 
|  | } else { | 
|  | $url = $_REQUEST['planurl']; | 
|  | } | 
|  |  | 
|  | $url = normalizePlanUrl($url); | 
|  | $trace->trace("The plan URL was normalized to: $url"); | 
|  |  | 
|  | /* | 
|  | * Verify that the url is pointing to eclipse.org to prevent cross-site attacks | 
|  | */ | 
|  | if (!$url) { | 
|  | show_error_page( 'the path to a valid plan document cannot be determined.', $projectid ); | 
|  | } else if (!file_exists($url)) { | 
|  | show_error_page( 'the plan document (' . $url . ') does not exist.', $projectid ); | 
|  | } else { | 
|  |  | 
|  | /* | 
|  | * If the request is for raw format | 
|  | */ | 
|  | if( isset($_REQUEST['raw']) ) { | 
|  | $contents = @file_get_contents( $url ); | 
|  | ?> | 
|  | <div style="margin-left: 10px; margin-top: 10px"> | 
|  | <b>Location: </b><?= $url ?><br> | 
|  | <b>Meta-data Tag: </b>projectplanurl<br> | 
|  | <b>Raw: </b><p> | 
|  | <pre> | 
|  | <?php echo htmlspecialchars($contents) ?> | 
|  | </pre> | 
|  | </div> | 
|  | <?php | 
|  | } else { | 
|  | /* | 
|  | * Load the XML file | 
|  | */ | 
|  |  | 
|  | //$url = normalizeFilePathUrl($url); | 
|  | $trace->trace("Loading plan from: $url"); | 
|  |  | 
|  | $xml = new DomDocument(); | 
|  | $xml->load($url); | 
|  | if( $xml === false ) { | 
|  | $contents = @file_get_contents( $url ); | 
|  | if( !$contents ) { | 
|  | show_error_page( 'the project meta-data "planurl" (' . $url . ') points to an empty file.', $projectid ); | 
|  | } else { | 
|  | if( preg_match( "/&(?<!amp;)/", $contents ) ) { | 
|  | show_error_page( 'the file appears to have at least one naked &s in bugzilla urls: &s must be escaped as &amp; to be valid XML.', $projectid ); | 
|  | } else { | 
|  | show_error_page( 'the planurl is not a valid project plan XML file. See <a href="http://wiki.eclipse.org/Development_Resources/Project_Plan">the documentation</a> for details.', $projectid ); | 
|  | } | 
|  | } | 
|  | } else if( $xml->textContent === "" ) { | 
|  | show_error_page( 'the planurl was not found.', $projectid ); | 
|  | } else { | 
|  | if (isset($_REQUEST['planurl'])) { | 
|  | $releases = $xml->getElementsByTagName( "release" ); | 
|  | if ($releases) { | 
|  | $top = $releases->item(0); | 
|  | if ($top) { | 
|  | $projectid = $top->getAttribute( "projectid" ); | 
|  | $project = get_project_from_pmi($projectid); | 
|  | $pageTitle .= $projectid; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | $projectname = $project->getName();; | 
|  |  | 
|  | $trace->trace("Project id: $projectid"); | 
|  | $trace->trace("Project name: $projectname"); | 
|  |  | 
|  | if (isset($_REQUEST['component'])) { | 
|  | $projectname .=  " [" . $_REQUEST['component'] . "]"; | 
|  | } | 
|  |  | 
|  | // ---------------------------------------------------------------------------- | 
|  | // OUTPUT | 
|  | $old_error_handler = set_error_handler("globalDisplayErrorHandler"); | 
|  | /* create the processor and import the stylesheet */ | 
|  | $xsl = new DomDocument(); | 
|  | $xsl->load("project-plan-render.xsl"); | 
|  |  | 
|  | $proc = new XsltProcessor(); | 
|  | $xsl = $proc->importStylesheet($xsl); | 
|  | $proc->setParameter(null, "projectName", $projectname); | 
|  | $proc->setParameter(null, "projectId", $projectid); | 
|  |  | 
|  | /* transform and output the xml document */ | 
|  | $echo = $proc->transformToXML($xml); | 
|  | if($echo === false){ | 
|  | show_error_page( 'the project XML file loaded but was not able to be transformed by our XSL. Please confirm that your XML is valid.', $projectid ); | 
|  | }else{ | 
|  | echo $echo; | 
|  | } | 
|  | restore_error_handler(); | 
|  | ?> | 
|  | <div style="float: right; text-align: right"><a href="?projectid=<?= $projectid ?>&raw=1">view raw xml of project plan</a><br> | 
|  | <a href="/projects/dev_process/project-status-infrastructure.php">from project meta-data key "projectplanurl"</a></div> | 
|  | <?php | 
|  | }// if( have xml ) | 
|  | }// if( !raw ) | 
|  | }// if( !cross site attack ) | 
|  | }// if( !$url ) | 
|  | ?> | 
|  |  | 
|  | <?php echo get_trace_html(); ?> | 
|  |  | 
|  | </div> | 
|  | </div> <!-- midcolumn --> | 
|  | <?php | 
|  | $html = ob_get_contents(); | 
|  | ob_end_clean(); | 
|  |  | 
|  | # Generate the web page | 
|  | $pageKeywords = ''; | 
|  | $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html); | 
|  |  | 
|  |  | 
|  | function report_bugzillas( $param ) { | 
|  | $url = '' . $param; | 
|  | $url = trim( $url ); | 
|  | if( !$url ) { | 
|  | ?><ul><li><em>no items</em></li></ul><?php | 
|  | return; | 
|  | } | 
|  | if( substr($url,0,25) == 'https://bugs.eclipse.org/' ) { | 
|  | $url = 'https://bugs.eclipse.org/' . substr($url,25); | 
|  | } elseif( substr($url,0,24) == 'http://bugs.eclipse.org/' ) { | 
|  | $url = 'http://bugs.eclipse.org/' . substr($url,24); | 
|  | } else { | 
|  | ?><ul><li><span style="background-color: #FFCCCC; font-weight: bold; font-size: 150%;">Error: url is not a bugs.eclipse.org url</span></li></ul><?php | 
|  | return; | 
|  | } | 
|  | $url = $url . "&ctype=rdf"; | 
|  | $url = $url . "&columnlist=bug_id,short_desc,target_milestone,bug_status"; | 
|  | /* | 
|  | * For some reason, simplexml doesn't handle the RDF with namespaces, | 
|  | * so we just remove all the namespace stuff here. | 
|  | */ | 
|  | $text = file_get_contents( $url ); | 
|  | $text = preg_replace( "/bz:/", '', $text ); | 
|  | $text = preg_replace( "/rdf:/", '', $text ); | 
|  | $text = preg_replace( "/nc:/", '', $text ); | 
|  | /* */ | 
|  | $rdf = simplexml_load_string( $text ); | 
|  | //	echo "<pre>url=/"; print_r($url); | 
|  | //	echo "/<br>text=/"; print_r($text); | 
|  | //	echo "/<br>rdf=/"; print_r($rdf); | 
|  | //	echo "/</pre>"; | 
|  |  | 
|  | ?><ul><?php | 
|  | foreach( $rdf->result->bugs->Seq->li as $each ) { | 
|  | $status_begin = ''; | 
|  | $status_end = ''; | 
|  | if( $each->bug->bug_status == 'RESOLVED' | 
|  | || $each->bug->bug_status == 'VERIFIED' | 
|  | || $each->bug->bug_status == 'CLOSED' ) { | 
|  | $status_begin = '<strike>'; | 
|  | $status_end = '</strike>'; | 
|  | } | 
|  | ?><li><?= $each->bug->short_desc ?> | 
|  | [<a href="http://bugs.eclipse.org/<?= $each->bug->id ?>"><?= $each->bug->id ?></a>] | 
|  | <?= $status_begin ?>(target milestone: <?= $each->bug->target_milestone ?>) | 
|  | <?= $status_end ?></li><?php | 
|  | } | 
|  | ?></ul><?php | 
|  | } | 
|  |  | 
|  | function show_error_page( $errormsg, $projectid ) { | 
|  | global $App; | 
|  | $leaders = array(); | 
|  |  | 
|  | $result = $App->foundation_sql(" | 
|  | SELECT DISTINCT(People.PersonID), FName, LName | 
|  | FROM PeopleProjects, Projects, People | 
|  | WHERE PeopleProjects.Relation in ('PL','PD') | 
|  | AND InactiveDate is NULL | 
|  | AND People.PersonID = PeopleProjects.PersonID | 
|  | AND Projects.ProjectID = PeopleProjects.ProjectID | 
|  | AND Projects.ProjectID = '$projectid' | 
|  | ORDER BY LName"); | 
|  |  | 
|  | while( $row = mysql_fetch_assoc($result) ) { | 
|  | $leaders[] = $row['FName'] . ' ' . $row['LName']; | 
|  | } | 
|  |  | 
|  | if( count($leaders) == 0 ) { | 
|  | $leaderstr = "project leader(s)"; | 
|  | } else { | 
|  | if( count($leaders) == 1 ) { | 
|  | $leaderstr = "project leader (" . $leaders[0] . ")"; | 
|  | } else { | 
|  | $t1 = array_pop( $leaders ); | 
|  | $leaderstr = "project leaders (" . implode( ", ", $leaders ) . " and " . $t1 . ")"; | 
|  | } | 
|  | } | 
|  | ?> | 
|  | <div style="margin-top: 60px; margin-left: 50px; width: 400px"> | 
|  | <center> | 
|  | <img src="/projects/images/no-plan.jpg"> | 
|  | <p style="margin-top: 40px;">Unable to display the <?= $projectid ?> project plan because <?= $errormsg ?></p> | 
|  | <?php if(count($leaders) != 0 ){ ?> | 
|  | <p style="margin-bottom: 60px;">The project team and <?= $leaderstr ?> are responsible for the project plan. You can contact them via the <a href="http://www.eclipse.org/mail/">project's developer mailing list</a>.</p> | 
|  | <?php } ?> | 
|  | </center> | 
|  | </div> | 
|  | <?php | 
|  | } | 
|  | ?> |