| <?php |
| /******************************************************************************* |
| * Copyright (c) 2006-2013 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: |
| * Matt Ward (Eclipse Foundation) - initial API and implementation |
| * Denis Roy (Eclipse Foundation) - 2013 update |
| *******************************************************************************/ |
| |
| 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'] . "/eclipse.org-common/system/evt_log.class.php"); |
| |
| # Add'l requires for Bugzilla |
| require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection.class.php"; |
| require_once("/home/data/httpd/eclipse-php-classes/system/dbconnection_bugs_rw.class.php"); |
| require_once("/home/data/httpd/eclipse-php-classes/system/dbconnection_foundation_ro.class.php"); |
| |
| $App = new App(); $Menu = new Menu(); |
| $App->runStdWebAppCacheable(); |
| include("_projectCommon.php"); |
| $Menu->addMenuItem("Return to project overview", "edit_bugzilla_project.php", "_self"); |
| |
| //turn on/off verbose debuging |
| define("DEBUG",0); |
| //turn on(1) or off(0) actual inserts |
| define("do_inserts",1); |
| |
| $Session = $App->useSession(true); |
| $pageTitle = "Bugzilla Manager"; |
| $pageKeywords = ""; |
| $pageAuthor = "Eclipse Foundation, Inc."; |
| |
| # Begin buffered output |
| ob_start(); |
| |
| ?> |
| <link rel="stylesheet" type="text/css" href="../css/stylesheet.css" /> |
| <div id="maincontent" style="padding:8px;"> |
| <h1 style="padding-top:10px; padding-bottom:20px;"><?= $pageTitle ?></h1> |
| <?php |
| include "details.html"; |
| |
| |
| if ( checkpost($App->getHTTPParameter('submit')) || checkpost($App->getHTTPParameter('edit')) ) { |
| $Menu->addMenuItem("Show all components", "edit_bugzilla_components.php", "_self"); |
| } |
| |
| //connect to the foundation db in |
| $fdbc = new DBConnectionFoundation(); |
| $fdbh = $fdbc->connect(); |
| $bdbc = new DBConnectionBugsRW(); |
| $bdbh = $bdbc->connect(); |
| |
| //global error var |
| $global_error = 0; |
| //set the global log options |
| $evt_log = new EvtLog(); |
| $evt_log->setLogTable("__bugs"); |
| $evt_log->setLogAction("EDIT_COMPONENT"); |
| $evt_log->setuid($_SESSION['uid']); |
| $evt_log->setPK2($_SESSION['project']); |
| |
| /****************** |
| *name: getlogin |
| *function: given a bugzill user id returns the email address(login_name) |
| *I/O: takes the id, returns the address |
| * |
| *Date: Feb 14/06 |
| *By: M. Ward. |
| *******************/ |
| function getlogin( $id, $dbh ){ |
| //if there is nothing in the id then exit now. |
| if( !checkpost($id)) |
| return ""; |
| $loginquery = "select login_name from profiles where userid=\"" . $id . "\";"; |
| debug_msg($loginquery,3); |
| $loginresult = mysql_query($loginquery, $dbh); |
| if($loginresult == FALSE){ |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| return "NA"; |
| } |
| $data = mysql_fetch_array($loginresult); |
| return $data['login_name']; |
| } |
| /****************** |
| *name: checklogin |
| *function: given an email address check that bugzilla has a corresponding login |
| *I/O: takes the email, returns 1 on true, 0 on fail |
| * |
| *Date: Feb 15/06 |
| *By: M. Ward. |
| *******************/ |
| function checklogin( $address, $dbh ){ |
| $loginquery = "select userid from profiles where login_name=\"" . $address . "\";"; |
| debug_msg($loginquery,3); |
| $loginresult = mysql_query($loginquery, $dbh); |
| if($loginresult == FALSE){ |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| return "0"; |
| } |
| $data = mysql_fetch_array($loginresult); |
| return $data['userid']; |
| } |
| |
| /***************************** |
| * |
| * Name: do_postwork |
| * Function: does the checks and data inserts. Putting this stuff here lets me use the return function without screwing up the page. |
| * |
| * I/O: needs to be passed the db handle. |
| * |
| * By: M. Ward |
| * Date: Feb 22/06 |
| * |
| ******************************/ |
| function do_postwork( ) { |
| global $bdbh; |
| global $fdbh; |
| global $evt_log; |
| |
| //clear these vars |
| $new_owner = "NULL"; |
| $new_qacontact = "NULL"; |
| |
| debug_msg("In save edit section",2); |
| //need to check that the email addresses are 'valid' syntacticly |
| if ( checkpost($_POST['owner']) ) { |
| //check that the owner has a valid bugs login |
| if( ($new_owner = checklogin($_POST['owner'], $bdbh ) ) <= 0 ) { |
| $global_error = 1; |
| debug_msg("<h3>The default owner must have a valid bugzilla account</h3>", 0); |
| debug_msg("Use your browsers back button to correct the entry",0); |
| return; |
| } |
| } else { |
| debug_msg("<h3>You must enter an initial owner.</h3>",0); |
| debug_msg("Use your browsers back button to correct the entry",0); |
| return; |
| } |
| //need to check that the email addresses are 'valid' syntacticly |
| if ( checkpost($_POST['qaowner']) ) { |
| //check that the owner has a valid bugs login |
| if( ($new_qacontact = checklogin($_POST['qaowner'], $bdbh ) ) <= 0 ) { |
| $global_error = 1; |
| debug_msg("<h3>The default Q&A contact must have a valid bugzilla account</h3>", 0); |
| debug_msg("Use your browsers back button to correct the entry",0); |
| return; |
| } |
| } else { //clear the default qa contact |
| $new_qacontact = "NULL"; |
| } |
| //need to check that there is a description |
| if ( !checkpost($_POST['component_description']) ) { |
| $global_error = 1; |
| debug_msg("<h3>You must provide a description for your component</h3>", 0); |
| debug_msg("Use your browsers back button to correct the entry",0); |
| return; |
| } |
| //check the default cc list |
| if ( checkpost($_POST['assigned_cc']) ) { |
| //replace \r with , |
| $cc_bulk = ereg_replace("\r\n",",", $_POST['assigned_cc'] ); |
| $cc_bulk = ereg_replace(" ","", $cc_bulk ); |
| $cc_email = split(",",$cc_bulk); |
| debug_msg("CC Email[0]: " . $cc_email[0], 4); |
| //loop through and check for bugzilla accounts and add those that are into a list |
| foreach( $cc_email as $address) { |
| if ( ($cc_user_id = checklogin($address, $bdbh ) ) >= 1 ) { |
| debug_msg("Checking if I should add " . $cc_user_id . " to the cc list",4); |
| //remove(fail to add duplicate users |
| if( in_array( $cc_user_id,$cc_insert_list) === FALSE ){ |
| $cc_insert_list[]=$cc_user_id; |
| debug_msg("Added " . $cc_insert_list[0] . " to the cc list",4); |
| debug_msg("Size of CC list: " . count($cc_insert_list), 4); |
| } |
| } |
| } |
| } |
| //change up the project settings, in case this is a special project |
| if( checkpost($_SESSION['projisclass'] ) ) { |
| $workingproject = $_SESSION['projisclass']; |
| //check that the user is associated with this project |
| $query = "SELECT count(*) ProjectID FROM Projects WHERE ( ProjectID IN (SELECT ProjectID FROM PeopleProjects WHERE PersonID ='" . $_SESSION['uid'] . "' AND"; |
| $query .= " ( Relation IN ('PM','PD','PL' ) OR ( Relation='CM' AND EditBugs=1 ) ) AND ProjectID like'" . $workingproject . "%' AND (InactiveDate is NULL OR InactiveDate >= CURRENT_DATE()) ) OR "; |
| $query .= " ( ParentProjectID IN (SELECT ProjectID FROM PeopleProjects WHERE PersonID = '" . $_SESSION['uid'] . "' AND Relation IN ('PM','PD') AND "; |
| $query .= " (InactiveDate is NULL OR InactiveDate >= CURRENT_DATE())) AND ProjectID like '" . $workingproject . "%' ) ) AND BugsName IS NOT NULL; "; |
| } else { |
| $workingproject = $_SESSION['project']; |
| //check that the user is associated with this project |
| $query = "SELECT count(*) ProjectID FROM Projects WHERE ( ProjectID IN (SELECT ProjectID FROM PeopleProjects WHERE PersonID ='" . $_SESSION['uid'] . "' AND"; |
| $query .= " ( Relation IN ('PM','PD','PL' ) OR ( Relation='CM' AND EditBugs=1 ) ) AND ProjectID='" . $workingproject . "' AND (InactiveDate is NULL OR InactiveDate >= CURRENT_DATE()) ) OR "; |
| $query .= " ( ParentProjectID IN (SELECT ProjectID FROM PeopleProjects WHERE PersonID = '" . $_SESSION['uid'] . "' AND Relation IN ('PM','PD') AND "; |
| $query .= " (InactiveDate is NULL OR InactiveDate >= CURRENT_DATE())) AND ProjectID='" . $workingproject . "' ) ) AND BugsName IS NOT NULL; "; |
| |
| } |
| |
| debug_msg($query,3); |
| $result = mysql_query($query, $fdbh); |
| if($result == FALSE) { |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| return; |
| } |
| $data = mysql_fetch_array($result); |
| |
| if( $data['ProjectID'] >= 1) { |
| if( checkpost($_POST['basename'] ) && $_POST['basename'] != "new" ) { |
| debug_msg("Updating the component.",1); |
| //build the update command |
| $bugsquery = "update components "; |
| $bugsquery .= "set description=\"" . $_POST['component_description'] ."\","; |
| $bugsquery .= " initialowner=\"" . $new_owner . "\""; |
| //The 3.4 Innodb tables don't like it when you explicitly set NULL in quotes |
| if ( $new_qacontact != "NULL") { |
| $bugsquery .= ", initialqacontact=\"" . $new_qacontact . "\" "; |
| } |
| $bugsquery .= "where product_id=\"" . $_SESSION['main_product_id'] ."\""; |
| $bugsquery .= " AND id=\"" . $_POST['localid'] ."\";"; |
| //set a key for the logs |
| $evt_log->setPK1($_POST['basename']); |
| $cc_query = "select id from components where id=\"" . $_POST['localid'] . "\" AND product_id=\"" . $_SESSION['main_product_id'] . "\";"; |
| } else { |
| debug_msg("Adding the component.",3); |
| //build the insert command |
| $bugsquery = "insert into components (name,description,initialowner,initialqacontact,product_id) "; |
| $bugsquery .= " VALUES ("; |
| $bugsquery .= "\"" . $_POST['name'] . "\","; |
| $bugsquery .= "\"" . $_POST['component_description'] . "\","; |
| $bugsquery .= $new_owner . ","; |
| $bugsquery .= $new_qacontact . ","; |
| $bugsquery .= "\"" . $_SESSION['main_product_id'] . "\""; |
| $bugsquery .= ");"; |
| //set a key for the logs |
| $evt_log->setPK1($_POST['name']); |
| $cc_query = "select id from components where name=\"" . $_POST['name'] . "\" AND product_id=\"" . $_SESSION['main_product_id'] . "\";"; |
| } |
| debug_msg($bugsquery,3); |
| |
| if( do_inserts == 1) { |
| $result = mysql_query($bugsquery,$bdbh); |
| if( $result == FALSE ){ |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| return; |
| } |
| //clear the current cc list, this needs to be done everytime. If there were people in the list, |
| //and to delete the entry box than the input var is 'unset' so it didn't get into this when it was |
| //below |
| debug_msg($cc_query,3); |
| $result = mysql_query($cc_query,$bdbh); |
| if( $result == FALSE ){ |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| return; |
| } |
| $component = mysql_fetch_array($result); |
| $cc_query = "delete from component_cc where component_id=" .$component['id'] . ";"; |
| debug_msg($cc_query,3); |
| $result = mysql_query($cc_query,$bdbh); |
| if( $result == FALSE ){ |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| return; |
| } |
| //Added for the default component cc list in bugz 3.0, this is done here since it has to be done |
| //here for any new components. |
| $cc_count = count( $cc_insert_list ); |
| if ( $cc_count > 0 ) { |
| //build new cc list |
| $cc_query = "insert into component_cc (user_id,component_id) VALUES "; |
| //loop through the list created above and insert stuff |
| foreach( $cc_insert_list as $cc_member ) { |
| debug_msg("In CClist loop, adding: ". $cc_member, 4); |
| $cc_query .= "(" . $cc_member . "," . $component['id'] . ")"; |
| if ( $cc_count > 1 ){ |
| $cc_query .=","; |
| $cc_count--; |
| } |
| } |
| $cc_query .=";"; |
| debug_msg($cc_query,3); |
| //now run the cc list insert query |
| $result = mysql_query($cc_query,$bdbh); |
| if( $result == FALSE ){ |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| return; |
| } |
| } |
| //log the event |
| $evt_log->insertModLog($_SESSION['uid']); |
| } else { |
| debug_msg("If I was doing inserts I would have done: " . $bugsquery, 0 ); |
| } |
| //write out a done message |
| if( $_POST['basename'] != "new" ) |
| $html = "</br><h3>Updated component.</h3>"; |
| else |
| $html = "</br><h3>Added component.</h3>"; |
| } |
| $html .="</br><a href=\"edit_bugzilla_components.php\">Return to the list of components</a>"; |
| $html .="</br><a href=\"edit_bugzilla_components.php?edit=new\">Add another Component</a>"; |
| } |
| |
| |
| if ( $App->getDBReadOnly() ) { |
| $html = "<h3>The database is currently offline for maintanence. Please try again later</h3>"; |
| } else { |
| |
| debug_msg("Session project:" . $_SESSION['project'] ." ", 1 ); |
| |
| //check to see if this page is being called due to an internal post command. |
| if( checkpost($App->getHTTPParameter('submit')) ){ |
| do_postwork(); |
| } else if ( checkpost($App->getHTTPParameter('edit')) ) { //have we been asked to add a new component? |
| debug_msg("In add new section",2); |
| |
| showwarning(); |
| |
| if($_GET['edit'] != 'new' ){ |
| $html = "<h3>Edit component</h3></br>"; |
| //insert the white space back into the name, since we had to take it out earlier. |
| $name = $_GET['edit']; |
| debug_msg("Decoded name is: ". $name,4); |
| //load specific component data |
| $bugsquery = "select * from components where name=\"" . $name . "\""; |
| $bugsquery .= "AND product_id=\"" . $_SESSION['main_product_id'] . "\";"; |
| debug_msg($bugsquery,3); |
| $result = mysql_query($bugsquery, $bdbh); |
| if($result == FALSE ) { |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| return; |
| } |
| $data = mysql_fetch_array($result); |
| $name = $data['name']; |
| $description = $data['description']; |
| $assigned_to = getlogin( $data['initialowner'], $bdbh); |
| $assigned_toqa = getlogin( $data['initialqacontact'], $bdbh); |
| $component_id = $data['id']; |
| //Added for the default component cc list in bugz 3.0 |
| $cc_query = "select user_id from component_cc where component_id = \"" . $component_id ."\";"; |
| debug_msg($cc_query,3); |
| $cc_result = mysql_query($cc_query, $bdbh); |
| if($cc_result === FALSE) { |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| } |
| //Check if there is actually anything to show |
| $cc_rows = mysql_num_rows($cc_result); |
| if ( $cc_rows >= 1) { |
| while($cc_row = mysql_fetch_array($cc_result)) { |
| $cc_list .= getlogin($cc_row['user_id'], $bdbh ); |
| if ( $cc_rows > 1 ) { |
| $cc_list .= ","; |
| $cc_rows--; |
| } |
| } |
| } |
| debug_msg("CC_list: " . $cc_list,4); |
| } else |
| $html = "<h3>Add a new component for " . $_SESSION['project_name'] . "</h3></br>"; |
| //now if we're sending this back at ourselves because something was fucked up |
| //reset the php vars to match the post vars |
| if( checkpost($_POST['name']) ) |
| $name = $_POST['name']; |
| if( checkpost($_POST['component_description']) ) |
| $description = $_POST['component_description']; |
| if( checkpost($_POST['owner']) ) |
| $assigned_to = $_POST['owner']; |
| if( checkpost($_POST['assigned_cc']) ) |
| $cc_list = $_POST['assigned_cc']; |
| |
| $html .= "<p> Fields marked with an <font face=\"Arial\" color=\"#FF0000\">*</font> are required </p>\n\r"; |
| //build the input form |
| $html .= "<form name=\"new_component\" method=\"post\" action=\"edit_bugzilla_components.php\" >\n\r"; |
| $html .= "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" >\n\r"; |
| if($_GET['edit'] != 'new') |
| $html .= "<tr><td>Name</td><td>". $name . "</td></tr>\n\r"; |
| else |
| $html .= "<tr><td><font face=\"Arial\" color=\"#FF0000\">*</font> Name</td><td><input type=\"text\" name=\"name\" value=\"\"></td></tr>\n\r"; |
| $html .= "<tr><td>Description </td><td><textarea rows=\"5\" cols=\"40\" name=\"component_description\">" . $description ."</textarea></td></tr>\n\r"; |
| $html .= "<tr><td><font face=\"Arial\" color=\"#FF0000\">*</font> Default Assignee </td><td><input type=\"text\" size=\"30\" name=\"owner\" value=\"" . $assigned_to . "\"></td></tr>\n\r"; |
| $html .= "<tr><td></td><td class=\"micro\">If you wish to use an generic inbox with an @eclipse.org address for the default assignee,</br> please contact Webmaster@eclipse.org to have the inbox created first.</br> Note the default assignee MUST be a valid bugzilla account</td></tr>\n\r"; |
| $html .= "<tr><td>Default Q&A Contact </td><td><input type=\"text\" size=\"30\" name=\"qaowner\" value=\"" . $assigned_toqa . "\"></td></tr>\n\r"; |
| $html .= "<tr><td>Default CC list </td><td><textarea rows=\"5\" cols=\"40\" name=\"assigned_cc\">" . $cc_list ."</textarea></td></tr>\n\r"; |
| $html .= "<tr><td></td><td class=\"micro\">Note the cc users MUST have a valid bugzilla account. </br> Separate entries with a , ie: someuser@bar.com,otheruser@foo.com</td></tr>\n\r"; |
| $html .= "</table>\n\r<input type=\"submit\" name=\"submit\" value=\"Save Component\" >\n\r"; |
| $html .= "<input type=\"hidden\" name=\"saveedit\" value=\"" . $_SESSION['secondary_product_id'] . "\">"; |
| $html .= "<input type=\"hidden\" name=\"basename\" value=\"" . $_GET['edit'] . "\">"; |
| $html .= "<input type=\"hidden\" name=\"localid\" value=\"" . $component_id . "\">"; |
| $html .= "</form>\n\r"; |
| |
| $html .= "</br><a href=\"edit_bugzilla_components.php\">View all components</a>"; |
| |
| } else { |
| |
| debug_msg("bypassing post section", 2); |
| //get the info from the bugs database |
| $bugsquery = "select * from components where product_id = \"" . $_SESSION['main_product_id'] ."\";"; |
| debug_msg($bugsquery,3); |
| $result = mysql_query($bugsquery, $bdbh); |
| if($result == FALSE) { |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| } |
| //now build the html |
| $html = "<h3>Bugzilla components for " . $_SESSION['project_name'] . "</h3></br>"; |
| $html .="<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"normal\">\n\r"; |
| $html .="<tr class=\"list_column_header\" height=\" " . $App->getDefaultRowHeight() . " \">\n\r"; |
| $html .="<td align=\"left\"><b>Name</b></td>\n\r<td align=\"left\"><b>Description</b></td>\n\r"; |
| $html .="<td align=\"left\"><b>Default owner</b></td>\n\r<td nowrap='nowrap'><b>Default Q&A contact</b></td>\n\r<td nowrap='nowrap'><b>Default CC list</b></td></tr>\n\r"; |
| |
| $count = 0; |
| while($row = mysql_fetch_array($result)) { |
| //clean whitespace out of the name |
| $name = urlencode( $row['name'] ); |
| debug_msg(" cleaned name is: " .$name, 4); |
| $html .="<tr height=\" " . $App->getDefaultRowHeight() . "\" class=\"data" . $count % 2 ."\">\n\r"; |
| $html .="<td><a href=edit_bugzilla_components.php?edit=" . $name .">" . $row['name'] ."</a></td>\n\r"; |
| $html .="<td>" . $row['description'] ."</td> \n\r"; |
| $html .="<td nowrap='nowrap'>" . getlogin($row['initialowner'], $bdbh ) . "</td>\n\r"; |
| $html .="<td nowrap='nowrap'>" . getlogin($row['initialqacontact'], $bdbh ) . "</td>\n\r"; |
| //Added for the default component cc list in bugz 3.0 |
| $cc_query = "select user_id from component_cc where component_id = \"" . $row['id'] ."\";"; |
| debug_msg($cc_query,3); |
| $cc_result = mysql_query($cc_query, $bdbh); |
| if($cc_result === FALSE) { |
| debug_msg(mysql_error(), 0); |
| debug_msg("Please contact the Webmaster about this error. Thank you.",0); |
| } |
| //Check if there is actually anything to show |
| $cc_rows = mysql_num_rows($cc_result); |
| $html .="<td nowrap='nowrap'>" ; |
| if ( $cc_rows >= 1) { |
| while($cc_row = mysql_fetch_array($cc_result)) { |
| $html .= getlogin($cc_row['user_id'], $bdbh ); |
| //append a , between entries |
| if ( $cc_rows > 1 ) { |
| $html .= " </br> "; |
| $cc_rows--; |
| } |
| } |
| } |
| $html .=" </td></tr>\n\r"; |
| $count++; |
| } |
| $html .= "</table>\n\r</br><a href=\"edit_bugzilla_components.php?edit=new\">Add New Component</a>"; |
| } //end of default section |
| |
| //add a link for the 'other products' |
| if( checkpost($_SESSION['projisclass'] ) == 1 ){ |
| $html .="</br><a href=\"edit_bugzilla_project.php?issp=1\">Return to product overview</a>"; |
| $html .="</br><a href=\"edit_bugzilla_project.php\">Select another product</a>"; |
| } else { |
| $html .="</br><a href=\"edit_bugzilla_project.php?issp=1\">Return to project overview</a>"; |
| } |
| } |
| |
| echo $html; |
| |
| |
| echo "</div>"; |
| |
| $html = ob_get_contents(); |
| ob_end_clean(); |
| |
| $App->generatePage($theme, $Menu, null, $pageAuthor, $pageKeywords, $pageTitle, $html); |
| |
| ?> |