<?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] . ",

You have been nominated as a committer on the {$_POST['yourProject']}
Eclipse Project. Before we can grant you access, we need some
documentation from you.

1. If you have not already done so, create an
   Eclipse Foundation account for yourself using this
   email address: " . $_POST[$committer_email] . "

     https://accounts.eclipse.org/

   If you do not use this email address, your commit
   permissions will not be set correctly.

   If you already have an Eclipse Foundation Account with
   a different email address, please contact webmaster@eclipse.org.

2. Login to the \"Developer Portal\" using your Eclipse Foundation
   account and complete the \"Committer Questionnaire\" there.

     http://portal.eclipse.org

   Following that, you may be required to complete and send
   a paper agreement.

   If you work for a member company that has provided the
   Eclipse Foundation with a Member Committer Agreement, then
   no further paperwork is required.

   Otherwise, you will need to send a signed copy of the
   Individual Committer Agreement to emo-records@eclipse.org

     http://eclip.se/1v

   Your committer account cannot be processed until this
   agreement is 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.

Contact emo@eclipse.org if you have any questions regarding
this process.

                              Thank you.

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

New Committer Request

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

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

";
  $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);
?>
