blob: a88aade9ff8a306108ba8b7157ebd47ea3b3c598 [file] [log] [blame]
<?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
*******************************************************************************/
// 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 {}
function getForges() {
return array(
'https://projects.eclipse.org',
'https://www.polarsys.org',
'https://www.locationtech.org'
);
}
function getUrlContents($url) {
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$page = curl_exec($ch);
curl_close($ch);
return $page;
}
function findPreviousThursday($start = 'now') {
$date = strtotime($start);
$diff = date('w', $date) - 4; // 4 == Thursday
if ($diff < 0) $diff += 7;
$thursday = $date - ($diff * 24 * 60 * 60);
return date('Y-m-d', $thursday);
}
function findNextWednesday($start = 'now') {
$date = strtotime($start);
$diff = 3 - date('w', $date); // 3 == Wednesday
if ($diff < 0) $diff += 7;
$wednesday = $date + ($diff * 24 * 60 * 60);
return date('Y-m-d', $wednesday);
}
?>