| <?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 |
| } |
| ?> |