mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-11 05:32:39 +01: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;
|
|
}
|
|
}
|