mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-03 22:57:32 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			254 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			254 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
 | 
						|
class Payment_Utility 
 | 
						|
{
 | 
						|
	public function __construct(){}
 | 
						|
 | 
						|
	/*
 | 
						|
	* Checks classes which are attempted to autoload, ensures they are not ignored (ie to prevent conflict with frameworks)
 | 
						|
	*/
 | 
						|
	public static $autoload_ignore = array();
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Autoloader.  Allows us to call classes without a require or include statement - lookups are referred here
 | 
						|
	*/
 | 
						|
	public function class_autoload($class)
 | 
						|
	{
 | 
						|
		//If a class name is not going to match, don't bother looking for it - we'll just end up with an exception
 | 
						|
		if(strpos($class, 'Payment') === false && strpos($class, 'Driver') === false && strpos($class, 'Method') === false) return;
 | 
						|
 | 
						|
		//Ignore classes that should be ignored
 | 
						|
		foreach(static::$autoload_ignore as $ignore)
 | 
						|
		{
 | 
						|
			if(strpos($class, $ignore) !== false) return;
 | 
						|
		}
 | 
						|
 | 
						|
		$class = strtolower($class);
 | 
						|
		$base_dir = __DIR__.'/';
 | 
						|
 | 
						|
		if(file_exists($base_dir.$class.'.php'))
 | 
						|
		{
 | 
						|
			include_once($base_dir.$class.'.php');
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		else if(file_exists($base_dir.'payment_drivers/'.$class.'.php'))
 | 
						|
		{
 | 
						|
			include_once($base_dir.'payment_drivers/'.$class.'.php');
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		else if(file_exists($base_dir.'payment_methods/'.$class.'.php'))
 | 
						|
		{
 | 
						|
			include_once($base_dir.'payment_methods/'.$class.'.php');
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			throw new Exception("Could not find class");
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	  * Load a resource.  Alternative to include / require / etc.  Passing a key will return a specific entry in a config / lang array.
 | 
						|
	*/
 | 
						|
	public static function load($type, $file, $key = null)
 | 
						|
	{
 | 
						|
		$base_dir = dirname(__DIR__);
 | 
						|
 | 
						|
		switch($type)
 | 
						|
		{
 | 
						|
			case $type == 'config':
 | 
						|
				$ob = false;
 | 
						|
				$path = $base_dir.'/config/'.$file.'.php';
 | 
						|
				break;
 | 
						|
 | 
						|
			case $type == 'file':
 | 
						|
				$ob = true;
 | 
						|
				$path = $base_dir.'/'.$file.'.php';
 | 
						|
				break;
 | 
						|
			
 | 
						|
			case $type == 'lang':
 | 
						|
				$ob = false;
 | 
						|
				$path = $base_dir.'/language/'.$file.'_lang.php';
 | 
						|
				break;
 | 
						|
 | 
						|
			default:
 | 
						|
				die("$type is not a valid filetype to load for Payments");
 | 
						|
		}
 | 
						|
 | 
						|
		if(!is_file($path)) die("$path does not exist.");
 | 
						|
 | 
						|
		if($ob)
 | 
						|
		{
 | 
						|
			ob_start();
 | 
						|
				include_once($path);
 | 
						|
			return ob_get_clean();	
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			$f = include $path;
 | 
						|
			return (isset($f[$key])) ? $f[$key] : $f;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Loads all files in a particular directory
 | 
						|
	 *
 | 
						|
	 * @param	string	A dir to load from
 | 
						|
	*/
 | 
						|
	public static function load_all_files($dir)
 | 
						|
	{
 | 
						|
		$base_dir = dirname(__DIR__);
 | 
						|
		foreach(scandir($base_dir.'/'.$dir) as $k=>$v){
 | 
						|
			//Ignore swap files, directory files, etc.
 | 
						|
			if($v[0] !== '.' && (substr($v, -3, 3) == 'php') )
 | 
						|
			{
 | 
						|
				$file = str_replace('.php', '', $v);
 | 
						|
				self::load('file', $dir.'/'.$file);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Arrayize an object
 | 
						|
	 *
 | 
						|
	 * @param	object	the object to convert to an array
 | 
						|
	 * @return	array	a converted array
 | 
						|
	*/
 | 
						|
	public static function arrayize_object($input)
 | 
						|
	{
 | 
						|
		if(!is_object($input))
 | 
						|
		{
 | 
						|
			return $input;
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			$final = array();
 | 
						|
			$vars = get_object_vars($input);
 | 
						|
			foreach($vars as $k=>$v)
 | 
						|
			{
 | 
						|
				if(is_object($v))
 | 
						|
				{
 | 
						|
					$final[$k] = self::arrayize_object($v);
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					$final[$k] = $v;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	
 | 
						|
		return $final;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
 	 * Sort an array by an array.  Modified example from StackOverflow: http://stackoverflow.com/questions/348410/sort-an-array-based-on-another-array
 | 
						|
	 *
 | 
						|
	 * @param	array	An array to sort
 | 
						|
	 * @param	array	An array to sort by
 | 
						|
	 * @return	array	A sorted array
 | 
						|
     */
 | 
						|
	public static function sort_array_by_array($array, $order) {
 | 
						|
    	$ordered = array();
 | 
						|
    	foreach($order as $key) {
 | 
						|
       		if(array_key_exists($key,$array)) {
 | 
						|
       	   		$ordered[$key] = $array[$key];
 | 
						|
                unset($array[$key]);
 | 
						|
        	}
 | 
						|
    	}
 | 
						|
 | 
						|
		return $ordered;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Parses an XML response and creates an object using SimpleXML
 | 
						|
	 *
 | 
						|
	 * @param 	string	raw xml string
 | 
						|
	 * @return	object	response SimpleXMLElement object
 | 
						|
	*/		
 | 
						|
	public static function parse_xml($xml_str)
 | 
						|
	{
 | 
						|
		$xml_str = trim($xml_str);
 | 
						|
		$xml_str = preg_replace('/xmlns="(.+?)"/', '', $xml_str);
 | 
						|
		if($xml_str[0] != '<')
 | 
						|
		{
 | 
						|
			$xml_str = explode('<', $xml_str);
 | 
						|
			if(count($xml_str) > 1)
 | 
						|
			{
 | 
						|
				unset($xml_str[0]);
 | 
						|
				$xml_str = '<'.implode('<', $xml_str);
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				$xml_str = $xml_str[0];
 | 
						|
			}
 | 
						|
		}
 | 
						|
	
 | 
						|
		try {
 | 
						|
			$xml = @new SimpleXMLElement($xml_str);
 | 
						|
		}
 | 
						|
		catch(Exception $e) {
 | 
						|
			return Payment_Response::instance()->local_response(
 | 
						|
				'failure',
 | 
						|
				'invalid_xml',
 | 
						|
				$xml_str
 | 
						|
			);
 | 
						|
		}
 | 
						|
 | 
						|
		return $xml;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Sanitizes XML params so they will not cause parsing errors on remote end
 | 
						|
	 *
 | 
						|
	 * @param	array	Reference to XML params
 | 
						|
	*/
 | 
						|
	public static function sanitize_xml_params(&$params)
 | 
						|
	{
 | 
						|
		if(!function_exists('array_walk_sanitize_callback'))
 | 
						|
		{
 | 
						|
			function array_walk_sanitize_callback(&$v, $k)
 | 
						|
			{
 | 
						|
				if(strpos($v, '&') !== false) $v = str_replace('&', '&', $v);
 | 
						|
				if(strpos($v, '<') !== false) $v = str_replace('<', '<', $v);
 | 
						|
				if(strpos($v, '>') !== false) $v = str_replace('>', '>', $v);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		array_walk_recursive($params, 'array_walk_sanitize_callback');
 | 
						|
	}
 | 
						|
	
 | 
						|
	/**
 | 
						|
	 * Connection is Secure
 | 
						|
	 * 
 | 
						|
	 * Checks whether current connection is secure and will redirect
 | 
						|
	 * to secure version of page if 'force_secure_connection' is TRUE
 | 
						|
	 * 
 | 
						|
	 * To Force HTTPS for your entire website, use a .htaccess like the following:
 | 
						|
	 *
 | 
						|
	 *  RewriteEngine On
 | 
						|
	 *  RewriteCond %{SERVER_PORT} 80
 | 
						|
	 *  RewriteRule ^(.*)$ https://domain.com/$1 [R,L]
 | 
						|
	 * 
 | 
						|
	 * @link http://davidwalsh.name/force-secure-ssl-htaccess
 | 
						|
	 * @return	bool
 | 
						|
	 */
 | 
						|
	public static function connection_is_secure($config)
 | 
						|
	{
 | 
						|
		// Check whether secure connection is required
 | 
						|
		if($config['force_secure_connection'] === FALSE) 
 | 
						|
		{
 | 
						|
			error_log('WARNING!! Using Payment Gateway without Secure Connection!', 0);
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		
 | 
						|
		// Redirect if NOT secure and forcing a secure connection.
 | 
						|
		if(($_SERVER['SERVER_PORT'] === '443' && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') === FALSE)
 | 
						|
		{
 | 
						|
			$loc = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
 | 
						|
			header($loc);
 | 
						|
			exit;
 | 
						|
		}
 | 
						|
		
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
}
 |