<?php
/*******************************************************************************
 * Copyright (c) 2010, 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:
 *    Bjorn Freeman-Benson (Eclipse Foundation)- initial API and implementation
 *    Wayne Beaton (Eclipse Foundation)- Bug 240688, 418761
 *******************************************************************************/
 
/* 221934 - this page to remain on eclipse.org */

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(dirname(__FILE__) . "/classes/common.php");

$App = new App();

/*
 * WTB: Define some functions in a particular way depending on mode so that we 
 * don't have to keep checking the "debug" flag.
 */
if (!$App->devmode) {
	function connect() {
	}
	
	function execute($sql) {
		global $App;
		
		$App->portal_sql($sql);
	}
	
	function send_mail($CEMailDest, $CEMailSubject, $cmailstr, $EMailHeaders) {
		mail($CEMailDest, $CEMailSubject, $cmailstr, $EMailHeaders);
	}
} else {
	// TODO Pull the style out of the tags.
	function connect() {
		echo "<div style=\"border-style:solid;border-width:1px\">Running in <em>DEBUG</em> mode. Nothing is written to the database.</div>";		
	}	
	
	function execute($sql) {
		echo "<div style=\"border-style:solid;border-width:1px\">$sql</div>";
		return false;
	}
	
	function send_mail($CEMailDest, $CEMailSubject, $cmailstr, $EMailHeaders) {
		$content = str_replace("\n", "<br/>", $cmailstr);
		echo "<div style=\"border-style:solid;border-width:1px\">The following email was <em>NOT</em> sent since we are in debug mode.
			<p>Destination: $CEMailDest<br/>
			Subject: $CEMailSubject<br/>
			Headers: $EMailHeaders<p/>
			<blockquote>$content</blockquote>
			</div>";
	}
}

$App 	= new App();
$Nav	= new Nav();
$Menu 	= new Menu();

if($_POST['math'] != "2") {
	ob_end_clean();
	echo "<font color='red'>The answer to the mathematical question you entered is not valid. Please go back and try again.</font>";
	end_early();
}

include($App->getProjectCommon());

$pageTitle 		= "New Project Provisioning Request Result";
$pageKeywords	= "projects";
$pageAuthor		= "Bjorn Freeman-Benson Jan 2006";

connect();

function end_early() {
	global $App;
	?>
<?php
	# Paste your HTML content between the EOHTML markers!
	$html = ob_get_contents();
	ob_end_clean();

	# Generate the web page
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
	exit(1);
}

function mysql_error_check($msg) {
	if(mysql_errno() != 0) {
		ob_end_clean();
		echo "<font color='red'>$msg</font>";
		return true;
	}
	return false;
}

function person_exists_in_portal_record($email, $projectid) {
	global $dbh;
	
	// WTB: Protect against SQL injection 
	global $App;
	$email = $App->sqlSanitize($email);
	$projectid = $App->sqlSanitize($projectid);

	$sql = "SELECT count(1) AS found 
			FROM committer_votes 
			WHERE candidateemail = '$email'
				AND projectid = '$projectid'";
	
	$result = execute($sql);
	if (!$result) return false;
	
	$row = mysql_fetch_assoc($result);
	return $row['found'];

}

function notify_portal_about_committer($number) {
	global $dbh;
	
	$email = strtolower(addslashes($_POST["committerEmail".$number]));
	// try very hard to get it right in case javascript validation fails
	// this eventually gets referenced against the Foundation DB so it should be right
	$projectid = strtolower(addslashes($_POST['yourProject']));
	if(!is_valid_project_name($projectid)) {
		$projectid = strtolower($_POST['yourProject']);
		$projectid = str_replace(' ', '', $projectid);
		$projectid = str_replace('_', '-', $projectid);
	}
	
	// Make sure we only make one record even if the form is re-submitted
	if(!person_exists_in_portal_record($email, $projectid)) {
		$name = ucwords(strtolower(addslashes($_POST["committerName".$number])));
		$parentproj = get_project_parent_id($projectid);
		$cvspkgs = strtolower(addslashes($_POST['committerPackages'.$number]));
		
		// WTB: Protect against SQL injection 
		global $App;
		$parentproj = $App->sqlSanitize($parentproj);
		$projectid = $App->sqlSanitize($projectid);
		$name = $App->sqlSanitize($name);
		$email = $App->sqlSanitize($email);
		$cvspkgs = $App->sqlSanitize($cvspkgs);

		$sql = "INSERT INTO committer_votes " .
				"(nominator, status, topid, projectid, candidate, candidateemail, cvspkgs, startdate, enddate) " .
				"VALUES('NPPR_FORM','need_candidate_paperwork'," .
					"'$parentproj'," .
					"'$projectid'," .
					"'$name'," .
					"'$email'," .
					"'$cvspkgs',
					now(),
					now())";
		
		execute($sql);
	}
}

ob_start();
?>
    <div id="maincontent">
	<div id="midcolumn">
        <h1><?= $pageTitle ?></h1>

<?php
$EMailHeaders = "From: \"Eclipse WebMaster (Automated)\"<webmaster@eclipse.org>\n";
$EMailHeaders .= "X-Mailer: Eclipse.org automailer process\n";

function mail_string($committer_number){
  $committer_name     = "committerName"     . $committer_number;
  $committer_email    = "committerEmail"    . $committer_number;
  $committer_website  = "committerWebsite"  . $committer_number;
  $committer_packages = "committerPackages" . $committer_number;
  $committer_lead     = "committerLead"     . $committer_number;
  $committer_download = "committerDownloadPrivileges" . $committer_number;

  $tmp_str = "
    Name: " . $_POST[$committer_name] . "
    Email: " . $_POST[$committer_email] . "
    ";
  if ($_POST[$committer_lead] != ""){
    $tmp_str .= "Project Lead: " . $_POST[$committer_lead] . "
    ";
  }
  if ($_POST[$committer_website] != ""){
    $tmp_str .= "Website: " . $_POST[$committer_website] . "
    ";
  }
  if ($_POST[$committer_download] != ""){
    $tmp_str .= "Download: " . $_POST[$committer_download] . "
    ";
  }
  $tmp_str .= "Packages: " . $_POST[$committer_packages] . "
  ";

  return $tmp_str;
}

function mail_committers($committer_number){
  global $EMailHeaders;
  $committer_name = "committerName"         . $committer_number;
  $committer_email = "committerEmail"       . $committer_number;
  $committer_packages = "committerPackages" . $committer_number;
  $committer_website = "committerWebsite"   . $committer_number;

$cmailstr = "
Dear " . $_POST[$committer_name] . ",
If you do not already have a dev.eclipse.org unix account,
please do the following:

1. Create a Bugzilla account for yourself using your same
   email address: " . $_POST[$committer_email] . "
   If you do not use this same email address, your Bugzilla
   permissions will not be set correctly.

2. Follow the instructions in item 5 \"Paperwork\" of:
     http://www.eclipse.org/projects/dev_process/new-committer.php
   If you have not already done so, you need to fill out a web
   form questionnaire and possibly one or two paper agreements.
   Your committer account cannot be processed until these
   forms are received.
   
If you are currently an Eclipse committer, you need not do anything at
this time.  If further paperwork is required to cover these subsequent
rights, you will be contacted shortly.

                              Thank you.

-------------------------------------------------

New Committer Request

PMC Member: " . $_POST['yourName'] . "
Email: " . $_POST['yourEmail'] . "

New Committer Info: 
===================
initial project creation

Name: " . $_POST[$committer_name] . "
Project: " . $_POST['yourProject'] . "
Email: " . $_POST[$committer_email] . "

Source Code Repository: " . $_POST['source_code_repository'] . "

";
  $CEMailDest = "emo-records@eclipse.org";
  if ($_POST[$committer_email] != ""){
    $CEMailDest .= "," . $_POST[$committer_email];
  }
  $CEMailSubject = $_POST[$committer_name] . " - New Committer Request Form";
  send_mail($CEMailDest, $CEMailSubject, $cmailstr, $EMailHeaders);
}

function committers(){
  for($i=1;$i<=50;$i++){
    $committer_name = "committerName".$i;
    if ($_POST[$committer_name] != ""){
      $tmp_str .= mail_string($i);
      mail_committers($i);
      notify_portal_about_committer($i);
    }else
       if (($_POST[$committer_name] == "") && ($i == 1)){
         $tmp_str .= "* ERROR: No committers listed *
         ";
       }
  }

  return $tmp_str;
}

function mailing_lists(){
  for($i=1;$i<=5;$i++){
    $mailing_list = "mailingList".$i;
    $short_description = "shortDescription".$i;

    if ($_POST[$mailing_list] != ""){
      $tmp_str .= "
      Name: " . $_POST[$mailing_list] . "
      Short Description: " . $_POST[$short_description] . "
      ";
    }else
       if (($_POST[$mailing_list] == "") && ($i == 1)){
         $tmp_str .= "* ERROR: No mailing lists specified *
         ";
       }
  }

  return $tmp_str;
}

function components(){
  for($i=1;$i<=6;$i++){
    $component = "component".$i;
    $component_description = "componentDescription".$i;
    $component_owner = "componentOwner".$i;

    if ($_POST[$component] != ""){
      $tmp_str .= "
      Name: " . $_POST[$component] . "
      Description: " . $_POST[$component_description] . "
      Owner: " . $_POST[$component_owner] . "
      ";
    }else
       if (($_POST[$component] == "") && ($i == 1)){
         $tmp_str .= "* ERROR: No Bugzilla components specified *
         ";
       }
  }

  return $tmp_str;
}

#############
# Main Code #
#############

$EMailDest = "webmaster@eclipse.org,emo-records@eclipse.org";
$EMailSubject = "New Project Validation Phase Provisioning Request Form";

$_STATE = $_POST['state'];

if ($_STATE == "submit"){
  if( $_POST['yourName'] == "" ) {
    echo "The form was blank. Please go back and try again.";
  } else {
	ob_start();
    echo "
Thank you for submitting this form.  You have submitted the following.
There are TODO items in this email for:
   1. the webmaster
   2. EMO legal
   3. EMO process
   4. You, the submitter
Note that your project will not be completely provisioned until you
have finished your to do items.
";

$mailStr = "
New Project Validation Phase Provisioning Request

Name: " . $_POST['yourName'] . "
Email: " . $_POST['yourEmail'] . "
Phone: " . $_POST['yourPhone'] . "
Process: " . $_POST['yourDevelopmentProcess'] . "

New Project: " . $_POST['yourProject'] . "

_____ Committers _____
1. This is the list of committers. They will be provisioned with
   UNIX accounts after they have filled out the online and paper
   forms and agreements.
2. [webmaster] Use this list to create the unix groups.
3. [EMO legal] Use this list to mark project leads.
";

$mailStr .= committers();

$mailStr .= "
_____ Initial SCM Components _____
[Repository Type: " . $_POST['source_code_repository'] . "]
";

if ($_POST['source_code_repository'] == 'GitHub') {
    if (!$github = trim($_POST['github_repositories']))
        $github = 'None specified';
    
    $mailStr .= "
      Existing repository locations:
      $github
";
}

$mailStr .= "
1. [webmaster] Create the repository.
2. [webmaster] Grant access to all project committers.
";

####################
# Project Websites #
####################

$mailStr .= "
_____ Project Database ______
1. [EMO process] Set the proposal database to 'creation review successful'
2. [EMO process] Create the project entry in the Foundation database

_____ Project Website ______
1. [webmaster] Create the website repository.
2. [webmaster] Create the initial \"intentionally blank\" default index.php file in that component.
3. [webmaster] Create the www.eclipse.org/[shortname] directory
4. [webmaster] Set up the auto-update mechanism from the repository to the www.eclipse.org directory
5. [webmaster] Grant access for the website to all project committers.
";

#############
# Downloads #
#############

$mailStr .= "
_____ Downloads ______
1. [webmaster] Create a downloads area. 
2. [webmaster] Grant access to all project committers.";

#################
# Mailing Lists #
#################

$mailStr .= "
_____ Newsgroups ____
1. [webmaster] If the project-specific newsgroup has not been
   created, please do so now.

_____ Mailing Lists _____
1. [webmaster] Create these mailing lists.";

$mailStr .= mailing_lists();

#######################
# Bugzilla Components #
#######################

$mailStr .= "
_____ Bugzilla Components _____
1. [webmaster] Create these bugzilla components.";


$mailStr .= components();

$mailStr .= "
_____ Project Status Information _____
1. [" . $_POST['yourName'] . "] After the project website is provisioned,
   configure the project data in the Eclipse Developer Portal.  See
   http://www.eclipse.org/projects/dev_process/project-status-infrastructure.php
   These files are used to surface the newsgroups, mailing lists, and other
   information on the eclipse.org website.
2. [webmaster] Update the project's Archived/Active status in the Foundation Database records. 
";

$EMailSubject = $EMailSubject . " (" . $_POST['yourProject'] . ")";

if ($_POST['yourEmail'] != ""){
  $EMailDest .= "," . $_POST['yourEmail'];
}

send_mail($EMailDest, $EMailSubject, $mailStr, $EMailHeaders);

echo "<pre>
" . $mailStr . "
</pre>
";
  ob_end_flush();
  }
}

?>
</div></div>
<?php
	# Paste your HTML content between the EOHTML markers!
	$html = ob_get_contents();
	ob_end_clean();

	# Generate the web page
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
