| <?php | |
| /******************************************************************************* | |
| * Copyright (c) 2006 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: | |
| * Denis Roy (Eclipse Foundation)- initial API and implementation | |
| *******************************************************************************/ | |
| class Friend { | |
| private $friend_id = 0; | |
| private $bugzilla_id = 0; | |
| private $first_name = ""; | |
| private $last_name = ""; | |
| private $date_joined = NULL; | |
| private $benefit_expires = NULL; | |
| private $is_anonymous = 0; | |
| private $is_benefit = 0; | |
| private $uid = NULL; | |
| private $email = ""; | |
| ## FORMAT: ::XX:: where XX is a Foundation role (CM, PL, PM, etc) | |
| private $roles = ""; | |
| ## Concatenate for multiples: ::CM::::PL::::PM:: | |
| private $dn = ""; | |
| private $table_prefix = ''; | |
| public function __construct($testmode = FALSE) { | |
| if ($testmode === TRUE){ | |
| $this->table_prefix = 'testing_'; | |
| } | |
| } | |
| function getFriendID() { | |
| return $this->friend_id; | |
| } | |
| function getBugzillaID() { | |
| return $this->bugzilla_id; | |
| } | |
| function getFirstName() { | |
| return $this->first_name; | |
| } | |
| function getLastName() { | |
| return $this->last_name; | |
| } | |
| function getDateJoined() { | |
| return $this->date_joined; | |
| } | |
| function getIsAnonymous() { | |
| return $this->is_anonymous; | |
| } | |
| function getIsBenefit() { | |
| return $this->is_benefit; | |
| } | |
| /** | |
| * Get Friend LDAP UID. | |
| * | |
| * @return string | |
| */ | |
| function getLDAPUID() { | |
| // This might be empty if the user | |
| // never made a donation and he his | |
| // missing from the friends table. | |
| if (empty($this->uid)) { | |
| $this->getUID(); | |
| } | |
| return $this->uid; | |
| } | |
| function getEmail() { | |
| return $this->email; | |
| } | |
| function getBenefitExpires() { | |
| return $this->benefit_expires; | |
| } | |
| private function getRoles() { | |
| if ( $this->roles === "" ){ | |
| $App= new App(); | |
| # Get user roles | |
| # Committer | |
| $sql = "SELECT /* friend.class.php authenticate */ COUNT(1) AS RecordCount FROM PeopleProjects AS PRJ | |
| INNER JOIN People AS P ON P.PersonID = PRJ.PersonID | |
| WHERE P.EMail = '$this->email' AND PRJ.Relation = 'CM' | |
| AND (LEFT(PRJ.InactiveDate,10) = '0000-00-00' OR PRJ.InactiveDate IS NULL OR PRJ.InactiveDate > NOW())"; | |
| $result = $App->foundation_sql($sql); | |
| if($result && mysql_num_rows($result) > 0) { | |
| $myrow = mysql_fetch_assoc($result); | |
| if($myrow['RecordCount'] > 0) { | |
| $this->roles .= "::CM::"; | |
| } | |
| } | |
| } | |
| return $this->roles; | |
| } | |
| function getDn() { | |
| return $this->dn; | |
| } | |
| function setFriendID($_friend_id) { | |
| $this->friend_id = $_friend_id; | |
| } | |
| function setBugzillaID($_bugzilla_id) { | |
| if (ctype_digit($_bugzilla_id)) { | |
| $this->bugzilla_id = $_bugzilla_id; | |
| } | |
| } | |
| function setFirstName($_first_name) { | |
| $this->first_name = $_first_name; | |
| } | |
| function setLastName($_last_name) { | |
| $this->last_name = $_last_name; | |
| } | |
| function setDateJoined($_date_joined) { | |
| $this->date_joined = $_date_joined; | |
| } | |
| function setIsAnonymous($_is_anonymous) { | |
| $this->is_anonymous = $_is_anonymous; | |
| } | |
| function setIsBenefit($_is_benefit) { | |
| $this->is_benefit = $_is_benefit; | |
| } | |
| function setLDAPUID($_uid) { | |
| $this->uid = $_uid; | |
| } | |
| function setEmail($_email) { | |
| $this->email = $_email; | |
| } | |
| function setBenefitExpires($_benefit_expires) { | |
| $this->benefit_expires = $_benefit_expires; | |
| } | |
| private function setRoles($_roles) { | |
| $this->roles = $_roles; | |
| } | |
| function setDn($_dn) { | |
| $this->dn = $_dn; | |
| } | |
| /** | |
| * Get LDAP UID | |
| * | |
| * This was deprecated until it was discovered | |
| * that a user might not have an entry in the | |
| * friends database. | |
| * | |
| * @return string | |
| */ | |
| function getUID() { | |
| if ($this->dn != "") { | |
| if (preg_match('/uid=(.*),ou=/', $this->dn, $matches)) { | |
| $this->setLDAPUID($matches[1]); | |
| return $matches[1]; | |
| } | |
| } | |
| return FALSE; | |
| } | |
| /** | |
| * getIsCommitter() - return committer status | |
| * @see authenticate() | |
| * @return bool user is a committer | |
| */ | |
| function getIsCommitter() { | |
| $rValue = false; | |
| if(preg_match('/ou=people,/i', $this->getDn())) { | |
| if(strlen($this->roles) == 0) { | |
| $this->setRoles("::CM::"); | |
| } | |
| $rValue = true; | |
| } | |
| return $rValue; | |
| } | |
| /** | |
| * Returns a list of Friend objects that have donated more than $100 | |
| * @param $offset int The result list offset | |
| * @param $num int The number of results to retrieve | |
| * @param $get_anonymous boolean Whether or not to return anonymous friends | |
| */ | |
| function getBestFriends($offset=0, $num=99999, $get_anonymous=TRUE) { | |
| $bestFriends = array(); | |
| $App = new App(); | |
| $count = $offset + $num; | |
| $sql = "SELECT f.friend_id, f.is_anonymous, fc.amount | |
| FROM " . $this->table_prefix . "friends as f | |
| INNER JOIN " . $this->table_prefix . "friends_contributions fc | |
| ON (fc.friend_id = f.friend_id AND date_expired > DATE_SUB(NOW(), INTERVAL 1 YEAR) AND fc.amount >= 100) "; | |
| if (!$get_anonymous) $sql .= "AND f.is_anonymous = 0 "; | |
| $sql .= "LIMIT $offset,$count"; | |
| $result = $App->eclipse_sql($sql); | |
| while ($myrow = mysql_fetch_assoc($result)) { | |
| $newFriend = new Friend(); | |
| $newFriend->selectFriend($myrow['friend_id']); | |
| $bestFriends[] = $newFriend; | |
| } | |
| return $bestFriends; | |
| } | |
| function insertUpdateFriend() { | |
| $retVal = 0; | |
| $App = new App(); | |
| #$ModLog = new ModLog(); | |
| #$ModLog->setLogTable("Person"); | |
| #$ModLog->setPK1($this->getPersonID()); | |
| if ($this->date_joined == NULL) | |
| $default_date_joined = "NOW()"; | |
| else | |
| $default_date_joined = $App->returnQuotedString($this->date_joined); | |
| if($this->selectFriendID("friend_id", $this->getFriendID())) { | |
| # update | |
| $sql = "UPDATE " . $this->table_prefix . "friends SET | |
| bugzilla_id = " . $App->returnQuotedString($App->sqlSanitize($this->getBugzillaID())) . ", | |
| first_name = " . $App->returnQuotedString($App->sqlSanitize($this->getFirstName())) . ", | |
| last_name = " . $App->returnQuotedString($App->sqlSanitize($this->getLastName())) . ", | |
| date_joined = " . $default_date_joined . ", | |
| is_anonymous = " . $App->returnQuotedString($App->sqlSanitize($this->getIsAnonymous())) . ", | |
| is_benefit = " . $App->returnQuotedString($App->sqlSanitize($this->getIsBenefit())) . ", | |
| uid = " . $App->returnQuotedString($App->sqlSanitize($this->getLDAPUID())) . " | |
| WHERE | |
| friend_id = " . $App->sqlSanitize($this->getFriendID()); | |
| $App->eclipse_sql($sql); | |
| $retVal = $this->friend_id; | |
| } | |
| else { | |
| # insert | |
| $sql = "INSERT INTO " . $this->table_prefix . "friends ( | |
| bugzilla_id, | |
| first_name, | |
| last_name, | |
| date_joined, | |
| is_anonymous, | |
| is_benefit, | |
| uid) | |
| VALUES ( | |
| " . $App->returnQuotedString($this->getBugzillaID()) . ", | |
| " . $App->returnQuotedString($this->getFirstName()) . ", | |
| " . $App->returnQuotedString($this->getLastName()) . ", | |
| " . $default_date_joined . ", | |
| " . $App->returnQuotedString($this->getIsAnonymous()) . ", | |
| " . $App->returnQuotedString($this->getIsBenefit()) . ", | |
| " . $App->returnQuotedString($this->getLDAPUID()) . ")"; | |
| $App->eclipse_sql($sql); | |
| $retVal = mysql_insert_id(); | |
| $this->setFriendID($retVal); | |
| } | |
| return $retVal; | |
| } | |
| function selectFriend($_friend_id) { | |
| if($_friend_id != "") { | |
| $App = new App(); | |
| $_friend_id = $App->sqlSanitize($_friend_id); | |
| $sql = "SELECT /* USE MASTER */ f.friend_id, f.bugzilla_id, f.first_name, | |
| f.last_name, f.date_joined, f.is_anonymous, f.is_benefit, f.uid, | |
| fc_temp.date_expired | |
| FROM " . $this->table_prefix . "friends as f | |
| LEFT JOIN (SELECT friend_id, MAX(date_expired) AS date_expired FROM " . $this->table_prefix . "friends_contributions GROUP BY friend_id) fc_temp | |
| ON fc_temp.friend_id = f.friend_id | |
| WHERE f.friend_id = " . $App->returnQuotedString($_friend_id); | |
| $result = $App->eclipse_sql($sql); | |
| if ($myrow = mysql_fetch_array($result)) { | |
| $this->setFriendID ($myrow["friend_id"]); | |
| $this->setBugzillaID ($myrow["bugzilla_id"]); | |
| $this->setFirstName ($myrow["first_name"]); | |
| $this->setLastName ($myrow["last_name"]); | |
| $this->setDateJoined ($myrow["date_joined"]); | |
| $this->setIsAnonymous ($myrow["is_anonymous"]); | |
| $this->setIsBenefit ($myrow["is_benefit"]); | |
| $this->setLDAPUID ($myrow["uid"]); | |
| $this->setBenefitExpires($myrow["date_expired"]); | |
| $this->getRoles(); | |
| return TRUE; | |
| } | |
| } | |
| return FALSE; | |
| } | |
| function selectFriendID($_fieldname, $_searchfor) { | |
| $retVal = 0; | |
| if( ($_fieldname != "") && ($_searchfor != "")) { | |
| $App = new App(); | |
| $_fieldname = $App->sqlSanitize($_fieldname, null); | |
| $_searchfor = $App->sqlSanitize($_searchfor, null); | |
| $sql = "SELECT /* USE MASTER */ friend_id | |
| FROM " . $this->table_prefix . "friends | |
| WHERE $_fieldname = " . $App->returnQuotedString($_searchfor); | |
| $result = $App->eclipse_sql($sql); | |
| if ($result){ | |
| $myrow = mysql_fetch_array($result); | |
| $retVal = $myrow['friend_id']; | |
| } | |
| } | |
| return $retVal; | |
| } | |
| function getBugzillaIDFromEmail($_email, $use_master=false) { | |
| $result = 0; | |
| if($_email != "") { | |
| $App = new App(); | |
| $_email = $App->sqlSanitize($_email); | |
| if ($use_master) { | |
| $sql = "SELECT /* USE MASTER */ userid FROM profiles WHERE login_name = " . $App->returnQuotedString($_email); | |
| } else { | |
| $sql = "SELECT userid FROM profiles WHERE login_name = " . $App->returnQuotedString($_email); | |
| } | |
| $result = $App->bugzilla_sql($sql); | |
| $myrow = mysql_fetch_array($result); | |
| $result = $myrow['userid']; | |
| } | |
| return $result; | |
| } | |
| /** | |
| * authenticate() - Authenticate user using bugzilla credentials | |
| * | |
| * @author droy | |
| * @param string Email address | |
| * @param string password | |
| * @return boolean - auth was successful or not | |
| * @since 2007-11-20 | |
| * @deprecated Use site_login instead, which uses LDAP for everyone | |
| * | |
| * 2009-08-27: Added code for crypt/sha-256 passes | |
| * | |
| */ | |
| function authenticate($email, $password) { | |
| $rValue = false; | |
| $validPaths = array( | |
| "/home/data/httpd/dev.eclipse.org/html/site_login/" | |
| ); | |
| $App = new App(); | |
| if($email != "" && $password != "" && ($App->isValidCaller($validPaths) || $App->devmode)) { | |
| //check if magic quotes is 'off'. If it's on then the sanitizer will extra escape | |
| //the adress which results in valid accounts being rejected. | |
| if(!get_magic_quotes_gpc()) { | |
| $email = $App->sqlSanitize($email, null); | |
| } | |
| else { | |
| $password = stripslashes($password); # 359128 - password didn't work with \ | |
| } | |
| $sql = "SELECT userid, login_name, | |
| LEFT(realname, @loc:=LENGTH(realname) - LOCATE(' ', REVERSE(realname))) AS first_name, | |
| SUBSTR(realname, @loc+2) AS last_name, | |
| cryptpassword | |
| FROM profiles WHERE login_name = '$email' AND disabledtext = ''"; | |
| $result = $App->bugzilla_sql($sql); | |
| if($result && mysql_num_rows($result) > 0) { | |
| $myrow = mysql_fetch_assoc($result); | |
| $db_cryptpassword = $myrow['cryptpassword']; | |
| $pw = "abc12345"; // never allow db == pw by default | |
| # check password | |
| if(preg_match("/{([^}]+)}$/", $db_cryptpassword, $matches)) { | |
| $hash = $matches[0]; | |
| $salt = substr($db_cryptpassword,0,8); | |
| if(function_exists('mhash')) { | |
| $pw = $salt . str_replace("=", "", base64_encode(mhash(MHASH_SHA256,$password . $salt))) . $hash; | |
| } | |
| else { | |
| $pw = $salt . str_replace("=", "", base64_encode(hash("sha256",$password . $salt, true))) . $hash; | |
| } | |
| } | |
| else { | |
| $pw = crypt($password, $db_cryptpassword); | |
| } | |
| if($db_cryptpassword == $pw) { | |
| $rValue = true; | |
| $this->setBugzillaID($myrow['userid']); | |
| $this->setEmail($myrow['login_name']); | |
| # Load up the rest of the Friend record | |
| $friend_id = $this->selectFriendID("bugzilla_id", $this->getBugzillaID()); | |
| if($friend_id > 0) { | |
| $this->selectFriend($friend_id); | |
| } | |
| # Override the friend record with (known good) Bugzilla info | |
| $this->setFirstName($myrow['first_name']); | |
| $this->setLastName($myrow['last_name']); | |
| } | |
| } | |
| } | |
| return $rValue; | |
| } | |
| /** | |
| * Verify if our Friend is a Foundation Staff. | |
| * | |
| * @return boolean | |
| */ | |
| public function checkUserIsFoundationStaff() { | |
| return $this->_checkUserInGroup('www-auth'); | |
| } | |
| /** | |
| * Verify if our Friend is a Webmaster. | |
| * | |
| * @return boolean | |
| */ | |
| public function checkUserIsWebmaster() { | |
| return $this->_checkUserInGroup('admins'); | |
| } | |
| /** | |
| * Verify if a user is in a group | |
| * | |
| * A group name might change in the future, | |
| * we will create a public function for each | |
| * group we need to verify instead of using this | |
| * function directly. | |
| * | |
| * For example, | |
| * checkUserIsFoundationStaff(). | |
| * | |
| * @param string $group | |
| */ | |
| private function _checkUserInGroup($group = '') { | |
| $group = filter_var($group, FILTER_SANITIZE_STRING); | |
| $ldap_uid = $this->getLDAPUID(); | |
| if (empty($ldap_uid)) { | |
| return FALSE; | |
| } | |
| require_once("/home/data/httpd/eclipse-php-classes/system/ldapconnection.class.php"); | |
| $Ldap = new LDAPConnection(); | |
| if ($Ldap->checkUserInGroup($ldap_uid, $group)) { | |
| return TRUE; | |
| } | |
| return FALSE; | |
| } | |
| } |