<?php
/*******************************************************************************
 * Copyright (c) 2010, 2011 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
 *******************************************************************************/

// TODO Merge with web-api/common.inc

require_once(dirname(__FILE__) . "/debug.php");
trace_file_info(__FILE__);

/*
 * The regular expression pattern that is used to determine whether
 * or not a project id is valid.
 * 
 * PRIVATE: THIS FIELD IS NOT API.
 */
$projectNameSegmentPattern = "[a-zA-Z0-9\\-]+";
$projectNamePattern = "$projectNameSegmentPattern(\\.$projectNameSegmentPattern){0,2}";
define('ProjectNamePattern', $projectNamePattern);

/**
 * Answers <code>true</code> if $id represents a valid project id; 
 * <code>false</code> otherwise.
 * 
 * @param string $id Must not be <code>null</code>
 * @return bool
 */
function isValidProjectId($id) {
	global $projectNamePattern;
	
	return preg_match("/^$projectNamePattern$/", $id);
}

/**
 * Answers <code>true</code> if $name represents a valid project name; 
 * <code>false</code> otherwise.
 * 
 * @deprecated use isValidProjectId($id) instead.
 * @param string $name Must not be <code>null</code>
 * @return bool
 */
function isValidProjectName($name) {
	return isValidProjectId($name);
}

/**
 * Answers <code>true</code> if $name represents a valid project name; 
 * <code>false</code> otherwise.
 * 
 * @deprecated use isValidProjectId($id) instead.
 * @param string $name Must not be <code>null</code>
 * @return bool
 */
function is_valid_project_name($name) {
	return isValidProjectId($name);
}

/**
 * Returns the name of the parent project, or <code>null</code> is there
 * is no parent project. Current implementation infers the name of the parent
 * from the given name by lopping off the last segment. e.g.
 * 
 * getParentProjectId('eclipse.jdt.debugging') return 'eclipse.jdt'
 * .
 * @param string $name Must not be <code>null</code>
 * @return string
 */
function getParentProjectId($name) {
	if (!$name) return null;
	global $projectNamePattern, $projectNameSegmentPattern;
	if (preg_match("/^($projectNamePattern)\\.$projectNameSegmentPattern$/", $name, $matches))
		return $matches[1];
	return null;
}

/**
 * @deprecated
 * @see getParentProjectId()
 * @param string $name
 */
function get_project_parent_id($name) {
	return getParentProjectId($name);
}

/**
 * Returns <code>true</code> if the second parameter represents a
 * valid subproject of the first parameter. Note that this only checks
 * to see if the names are compatible; no check is done to confirm that
 * either parameter represents the name of an actual existing project.

 * @param string $parent Must not be <code>null</code>
 * @param string $name Must not be <code>null</code>
 * @return bool
 */
function is_valid_subproject_id($parent, $name) {
	return preg_match("/^$parent\\./", $name);
}

/**
 * This function normalizes the provided URL to a valid 'eclipse.org' HTTP
 * form. Input should be a valid eclipse.org URL or a relative URL 
 * (with or without a leading slash). Note that URLs that do not correspond 
 * to an eclipse.org addresses, will result in a <code>null</code> result.
 * 
 * Note that this is more about normalization than actual full validation;
 * only the scheme and domain are considered. The current implementation
 * only supports the http/https schemes; the specification of a port
 * is not supported. This may change in the future.
 * 
 * e.g. The following URLs are all considered valid and returned in the
 * the form they are provided.
 * - http://www.eclipse.org/woolsey/para.html
 * - http://eclipse.org/woolsey/para.html
 * - http://download.eclipse.org/woolsey/para.html
 * - http://git.eclipse.org/c/jetty/org.eclipse.jetty.admin.git/plain/jetty-project-plan.xml
 * 
 * e.g. The following URLs will be returned as http://eclipse.org/woolsey/para.html
 * - woolsey/para.html 
 * - /woolsey/para.html 
 * 
 * Usage: 
 * 
 * normalizeHttpUrl('http://www.eclipse.org/woolsey/para.html');
 * 
 * @param string $url Must not be <code>null</code>
 * @return string
 */
function normalizeHttpUrl($url) {
	if (preg_match('/^https?:\/\/(\w+\.)?eclipse\.org(\/.*)?$/', $url)) return $url;
	if (preg_match('/^https?:\/\/(\w+\.)?locationtech\.org(\/.*)?$/', $url)) return $url;
	if (preg_match('/^https?:\/\/(\w+\.)?polarsys\.org(\/.*)?$/', $url)) return $url;
	
	$relative = normalizeRelativeUrl($url, 'www');
	if ($relative) return 'http://www.eclipse.org' . $relative;
	
	return null;
}

/**
 * This function normalizes the provided URL to valid file path on the
 * eclipse.org web directory. Input should be a valid eclipse.org URL 
 * or a relative URL (with or without a leading slash).
 * 
 * e.g. The following URLs will all normalize to 
 * /home/local/data/httpd/www.eclipse.org/html/woolsey/para.html
 * 
 * - http://www.eclipse.org/woolsey/para.html
 * - http://eclipse.org/woolsey/para.html
 * - http://localhost/woolsey/para.html
 * - woolsey/para.html 
 * - /woolsey/para.html)
 * 
 * Note that URLs that do not correspond to eclipse.org addresses, will
 * result in a <code>null</code> result.
 * 
 * Usage: 
 * 
 * normalizeFilePathUrl('http://www.eclipse.org/woolsey/para.html');
 * 
 * @param string $url Must not be <code>null</code>
 * @return string
 */
function normalizeFilePathUrl($url) {
	global $_SERVER;
	
	$relative = normalizeRelativeUrl($url);
	if (!$relative) return null;
	
	return $_SERVER['DOCUMENT_ROOT'] . $relative;
}
	
/**
 * This function normalizes the provided URL to a relative path. 
 * Input should be a valid eclipse.org URL or a relative URL 
 * (with or without a leading slash).
 * 
 * e.g. The following URLs will all normalize to 
 * /woolsey/para.html
 * 
 * - http://www.eclipse.org/woolsey/para.html
 * - http://eclipse.org/woolsey/para.html
 * - http://localhost/woolsey/para.html
 * - woolsey/para.html 
 * - /woolsey/para.html)
 * 
 * Note that URLs that do not correspond to eclipse.org addresses, will
 * result in a <code>null</code> result.
 * 
 * Usage: 
 * 
 * extractcRelativeUrl('http://www.eclipse.org/woolsey/para.html');
 * 
 * @param string $url Must not be <code>null</code>
 * @return string
 */
function normalizeRelativeUrl($url) {		
	if (!$url) return null;
	
	$url = trim($url);
	
	$pattern_word = '\w[\w-]*';
	$pattern_segment = "$pattern_word(\\.$pattern_word)*";		
	$pattern_relative_part = "$pattern_segment(\\/$pattern_segment)*\\/?"; 
	$pattern_relative_url = "/^\\/?($pattern_relative_part)$/";
	$pattern_http_url = "/^http:\\/\\/(www\\.)?eclipse\\.org\\/($pattern_relative_part)$/";
	$pattern_http_local_url = "/^http:\\/\\/localhost\\/($pattern_relative_part)$/";
	
	if (preg_match($pattern_relative_url, $url, $matches1)) {
		return '/' . $matches1[1];
	} else if (preg_match($pattern_http_url, $url, $matches2)) {
		return '/' . $matches2[2]; 
	} else if (preg_match($pattern_http_local_url, $url, $matches3)) {
		return '/' . $matches3[1];
	} else {
		trace("The url ($url) cannot be normalized.");
		return null;
	}
}
	
/**
 * @deprecated use #mustBeCommitter() instead.
 * @return Friend
 */
function login_committer() {
	return mustBeCommitter();
}

/**
 * This function forces a login event if the current user is not
 * already logged in or is logged in as a non-committer. If the
 * logged in user is not a committer, they are redirected to the
 * /projects/ page. It must be called before any HTML is written to the 
 * output stream. 
 * 
 * This function assumes that the $App variable exists and has been
 * assigned an instance of the App class (from app.class.php).
 * 
 * @param Tracer $trace (optional)
 * @return Friend
 */
function mustBeCommitter($trace = null) {
	global $App;		
	if ($App->devmode) return;
		
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/friends/friend.class.php");
	
	$Session = $App->useSession("optional"); 
    $friend	 = $Session->getFriend();
    
    if (!$friend->getBugzillaID()) {
    	header("Location: " . LOGINPAGE . "?takemeback=" . $_SERVER['SCRIPT_URI']);
    	exit;
    }
	
    if (!$trace) $trace = trace("Must be committer");
    $trace->trace("Bugzilla ID: " . $Session->getBugzillaID());
		
    if (!$friend->getIsCommitter()) {	    	
    	header("Location: /projects");
    	exit;
    }
    
    $trace->trace("User is a committer.");
    
    return $friend;
}

/**
 * This function forces a login event if the current user is not
 * logged in. If the logged in user is not an Eclipse Foundation
 * employee, they are redirected to the /projects/ page. It must 
 * be called before any HTML is written to the output stream. 
 * 
 * This function assumes that the $App variable exists and has been
 * assigned an instance of the App class (from app.class.php).
 * 
 * @return Friend
 */
function mustBeFoundationEmployee() {
	global $App;		
	if ($App->devmode) return;
	
	$trace = trace("Must be Foundation Employee");
	$friend = mustBeCommitter($trace);
	
	// TODO There may be a better way to do this.
	if (!preg_match('/^.+@eclipse\.org$/', $friend->getEmail())) {  	
    	header("Location: /projects");
    	exit;
	}
	
	return $friend;
}

/**
* This function basically throws a fit if the caller is
* coming from anywhere outside of the EF. It determines
* whether or not to grant access based on the IP Address.
*/
function mustBeEclipseFoundationCaller() {
	$patterns = array(
			'198.41.30.', // 198.41.30.192/26
			'99.240.80.',
			'172.25.', // 172.25.0.0/16
			'172.30.', // 172.30.0.0/16
			'127.0.0.1'
	);
	$match = preg_replace('/\./', '\.', implode('|', $patterns));
	if(preg_match("/^($match)/", $_SERVER['REMOTE_ADDR'])) return;
//	if(preg_match('/209\.217\.126\.125|206\.191\.52\.\d+|172\.25\.25\.\d+|172\.30\.206\.\d+|127\.0\.0\.1/', $_SERVER['REMOTE_ADDR'])) return;

	//	$log = fopen( $logfile, "a" );
	//	fwrite( $log, date('Y-m-d.H:i:s') . " " . $_SERVER['REMOTE_ADDR'] . " is an invalid caller\n" );
	//	fclose( $log );

	echo $_SERVER['REMOTE_ADDR'] . " is an invalid caller<br>\n";
	exit;
}

/**
 * This function returns an instance of Friend corresponding to the
 * currently logged in committer, or null if nobody is logged in or
 * the currently logged in user is not a committer. Note that this
 * function may return a different instance of Friend on subsequent
 * calls (i.e. do not assume that the instance is cached; don't assume
 * that it isn't cached either, these things change).
 *  
 * This function assumes that the $App variable exists and has been
 * assigned an instance of the App class (from app.class.php).
 * 
 * @return Friend
 */
function get_committer() {
	global $App;
	
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/friends/friend.class.php");
	
	if ($App->devmode) {		
		$friend = new Friend();
		//$friend->setBugzillaID(12345);
		$friend->setFirstName("John");
		$friend->setLastName("Smith");
		
		return $friend;
	}
	
	$Session = $App->useSession("optional"); 
    $friend	 = $Session->getFriend();
    
    if (!$friend->getBugzillaID()) return null;
    if (!$friend->getIsCommitter()) return null;
    
    return $friend;
}

/**
 * This function returns a string that describes the current
 * "login" state, e.g. "You are logged in as Wayne Beaton."
 *
 * @return string
 */
function user_info_html() {
	
	$friend = get_committer();
	
	// TODO Need to sort out how to avoid hard-coding the URL.
	// There's a bit of a chicken-and-egg issue here. We don't get the
	// LOGINPAGE constant until the session.class.php file is loaded.
	// We don't load that file until we log in. That file can't load
	// in development mode. Yikes.
	$login = "https://dev.eclipse.org/site_login?takemeback=" . $_SERVER['SCRIPT_URI'];
	$logout = "https://dev.eclipse.org/site_login?submit=Logout&takemeback=" . $_SERVER['SCRIPT_URI'];
	
	if (!$friend) return "You must <a href=\"$login\">log in</a> as a committer (using Bugzilla credentials) to use these tools.";
	
	$first = $friend->getFirstName();
	$last = $friend->getLastName();
	$message = $friend->getIsCommitter() 
		? "<a href=\"$logout\">Log out</a>" 
		: " You are not a committer; you must <a href=\"$login\">log in</a> as a committer to use these tools";
	
	return "You are logged in as $first $last. $message."; 
}

/**
 * This function extracts the bundle name from the provided file name.
 * 
 * Example:
 * 
 * extract_bundle_name_and_version('javax.persistence.source_2.0.1.v201006031150.jar')
 *  returns 'javax.persistence.source_2.0.1'
 *  
 * Returns <code>null</code> if the bundle name cannot be determined.
 * 
 * @param string $name name of the file to extract from
 * @return string
 */
function extract_bundle_name_and_version($name) {
	if (preg_match('/^([a-zA-Z0-9\.-_]+[_-](\d+\.){3}).*\\.jar/', $name, $matches)) {
		return $matches[1];
	}
	if (preg_match('/^([a-zA-Z0-9\.-_]+[_-]([\d\.]*))[-_].*\\.jar/', $name, $matches)) {
		return $matches[1];
	}
	return null;
}

/**
 * The xmlentities function performs a similar function to the
 * htmlentities function, but with XML in mind. The current
 * implementation runs the string through htmlentities and--
 * from the result--prunes out any entity that should no be
 * in the result. A future version of this function will be
 * smarter.
 * 
 * @param string $string
 * @return string
 */
function xmlentities($string) {
	$html = htmlentities($string, ENT_QUOTES, 'UTF-8');
	return preg_replace_callback('/&[\w]+;/', '_xmlentitiescallback', $html);
}

/**
 * @internal
 * @param string[] $matches
 */
function _xmlentitiescallback($matches) {
	if (in_array($matches[0], array('&amp;', '&lt;', '&gt;', '&quot;', '&apos;'))) return $matches[0];
	return '';
}

function requiresGoogleChartsSupport() {
	require_once dirname(__FILE__) . '/util/google-charts.php';
}

/**
 * This function tests the provided value to determine whether or
 * not is represents a well-formed project id. If the value fails the
 * test, a ValidationException is thrown. Callers can use this method
 * to make sure that their parameter values are reasonable.
 * 
 * @param string $id
 * @throws ValidationException
 * @return void
 */
function mustBeValidProjectId($id) {
	if (!is_valid_project_name($id)) throw new ValidationException("Valid project id expected.");
}

class ValidationException extends Exception {}

?>