<?php
/*******************************************************************************
 * Copyright (c) 2010, 2015 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:
 *    Wayne Beaton (Eclipse Foundation)- initial API and implementation
 ******************************************************************************/

require_once(dirname(__FILE__) . "../../eclipse.org-common/system/app.class.php");
require_once(dirname(__FILE__)) . '/classes/Project.class.php';
require_once(dirname(__FILE__) . "/classes/common.php");
require_once(dirname(__FILE__) . "/classes/debug.php");

mustBeEclipseFoundationCaller();
//mustBeFoundationEmployee();

$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 execute($sql) {
		global $App;
		
		$App->portal_sql($sql);
	}
	
	function send_mail($CEMailDest, $CEMailSubject, $cmailstr, $EMailHeaders) {
		mail($CEMailDest, $CEMailSubject, $cmailstr, $EMailHeaders);
	}
} else {
	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>";
	}
}

function person_exists_in_portal_record($project, $email) {
	global $App;
	$email = $App->sqlSanitize($email);
	$projectid = $project->getId();

	$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($project, $name, $email) {
	$email = strtolower(addslashes($email));
	$projectid = $project->getId();
	
	// Make sure we only make one record even if the form is re-submitted
	if(!person_exists_in_portal_record($project, $email)) {
		$name = ucwords(strtolower(addslashes($name)));
		$parentproj = $project->getTopLevelProject()->getId();
		
		// WTB: Protect against SQL injection 
		global $App;
		$parentproj = $App->sqlSanitize($parentproj);
		$projectid = $App->sqlSanitize($projectid);
		$name = $App->sqlSanitize($name);
		$email = $App->sqlSanitize($email);

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

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

function email_committer($project, $name, $email){
  global $EMailHeaders;

$cmailstr = "
Dear " . $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: " . $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

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

Name: " . $name . "
Project: " . $project->getId() . "
Email: " . $email;
  $CEMailDest = "emo-records@eclipse.org";
  if ($email != ""){
    $CEMailDest .= "," . $email;
  }
  $CEMailSubject = $name . " - New Committer Request Form";
  send_mail($CEMailDest, $CEMailSubject, $cmailstr, $EMailHeaders);
}

class CommitterInfo {
	var $project, $name, $email;
	
	function __construct($project, $name, $email) {
		$this->project = $project;
		$this->name = $name;
		$this->email = $email;
	}
}

function getCommitterInfo() {
	if (!$project = get_project_from_pmi($_GET['id'])) return null;
	if (!$name = htmlentities($_GET['name'])) return null;
	if (!$email = htmlentities($_GET['email'])) return null;
	
	return new CommitterInfo($project, $name, $email);
}


if ($info = getCommitterInfo()) {
	if (!person_exists_in_portal_record($info->project, $info->email)) {
		email_committer($info->project, $info->name, $info->email);
		notify_portal_about_committer($info->project, $info->name, $info->email);
		echo "Committer paperwork request submitted.";
	} else {
		echo "Record exists. No action has been taken.";
	}
} else {
	echo "Eclipse Foundation use only. Submit paperwork request for new committer.";
	echo "<form>";
	echo "Project Id: <input type=text name=id /><br/>";
	echo "Committer name: <input type=text name=name /><br/>";
	echo "Committer email: <input type=text name=email /><br/>";
	echo "Committer name: <input type=submit />";
	echo "</form>";
}

?>
