<?php
/*****************************************************************************************
 * X2Engine Open Source Edition is a customer relationship management program developed by
 * X2Engine, Inc. Copyright (C) 2011-2014 X2Engine Inc.
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by the
 * Free Software Foundation with the addition of the following permission added
 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
 * IN WHICH THE COPYRIGHT IS OWNED BY X2ENGINE, X2ENGINE DISCLAIMS THE WARRANTY
 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Affero General Public License along with
 * this program; if not, see http://www.gnu.org/licenses or write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 * 
 * You can contact X2Engine, Inc. P.O. Box 66752, Scotts Valley,
 * California 95067, USA. or at email address contact@x2engine.com.
 * 
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 * 
 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
 * these Appropriate Legal Notices must retain the display of the "Powered by
 * X2Engine" logo. If the display of the logo is not reasonably feasible for
 * technical reasons, the Appropriate Legal Notices must display the words
 * "Powered by X2Engine".
 *****************************************************************************************/

/**
 * The data needed to identity a user.
 * 
 * It contains the authentication method that checks if the provided data can 
 * identity the user.
 * @package application.components
 */
class UserIdentity extends CUserIdentity {

	private $_id;
	private $_name;

	public function authenticate($google=false) {
		$user = X2Model::model('User')->findByAttributes(array('username' => $this->username));

		if(isset($user))
			$this->username = $user->username;
		if ($user === null || $user->status < 1) {				// username not found, or is disabled
			$this->errorCode = self::ERROR_USERNAME_INVALID;
		} elseif($google) {
			$this->errorCode = self::ERROR_NONE;
			$this->_id = $user->id;
			return !$this->errorCode;
		} else {
			$isMD5 = (strlen($user->password) == 32);
			if($isMD5)
				$isValid = ($user->password == md5($this->password));	// if 32 characters, it's an MD5 hash
			else
				$isValid = (crypt($this->password,'$5$rounds=32678$'.$user->password) == '$5$rounds=32678$'.$user->password);	// otherwise, 2^15 rounds of sha256
		
			if($isValid) {
				$this->errorCode = self::ERROR_NONE;
				$this->_id = $user->id;
				//$this->setState('lastLoginTime', $user->lastLoginTime); //not yet set up
				
				if(version_compare(PHP_VERSION,'5.3') >= 0) {	// regenerate a more secure hash and nonce
					$nonce = '';
					for($i = 0; $i<16; $i++)	// generate a random 16 character nonce with the Mersenne Twister
						$nonce .= substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./', mt_rand(0, 63), 1); 

					$user->password = substr(crypt($this->password,'$5$rounds=32678$'.$nonce),16);
					$user->update(array('password'));
				}
				
			} else {
				$this->errorCode = self::ERROR_PASSWORD_INVALID;
			}
		}

		return !$this->errorCode;
	}
	
	public function getId() {
		return $this->_id;
	}
}
