Пример #1
0
 function persist()
 {
     $file = tempnam(fbSystem::tempDirectory(), 'fbo');
     if (!$file) {
         return false;
     }
     $data = serialize($this);
     if (!$data) {
         return false;
     }
     $fp = fopen($file, 'wb');
     if (!$fp) {
         return false;
     }
     if (fwrite($fp, $data) != strlen($data)) {
         fclose($fp);
         @unlink($file);
         return false;
     }
     if (!fclose($fp)) {
         @unlink($file);
         return false;
     }
     return $file;
 }
Пример #2
0
 function init()
 {
     global $_SERVER;
     // < 4.1.0
     if (fbSystem::isCLI()) {
         // Don't turn on output buffering in CLI mode
         return true;
     }
     if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) || !$_SERVER['HTTP_ACCEPT_ENCODING']) {
         // The browser doesn't support compression
         return false;
     }
     if (preg_match('/(gzip|deflate)/i', $_SERVER['HTTP_ACCEPT_ENCODING'])) {
         // The browser doesn't support compression
         return false;
     }
     include_once 'Net/UserAgent/Detect.php';
     $useragent =& new Net_UserAgent_Detect();
     if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' && $useragent->isBrowser('ie')) {
         // IE (at least up to 6.01) fails with output buffering over HTTPS
         return false;
     }
     ob_start('ob_gzhandler');
     return true;
 }
Пример #3
0
 function fbPayment_AuthorizeNet()
 {
     if (!fbSystem::loadExtension('curl')) {
         trigger_error('Payment::AuthorizeNet requires the \'curl\' extension', E_USER_ERROR);
         return;
     }
     $this->_server = FB_PAYMENT_AUTHORIZE_NET_SERVER;
     $this->_port = 443;
 }
Пример #4
0
 function test_strftime_20050103_VGY()
 {
     $fmt = '%V,%G,%Y';
     $date = '01/03/2005';
     $expected = '01,2005,2005';
     if (fbSystem::platform() == 'windows') {
         $expected = '1,2005,2005';
     }
     $rv = fbDateTime::strftime($fmt, strtotime($date));
     $fmt = str_replace($fmt, '%', '%%');
     $this->assertEquals($expected, $rv, "fmt='{$fmt}', date='{$date}'");
 }
Пример #5
0
echo 'isApache=', fbSystem::isApache(), "\n";
echo 'directorySeparator=', fbSystem::directorySeparator(), "\n";
$nl = fbSystem::lineSeparator();
echo 'lineSeparator=';
for ($i = 0; $i < strlen($nl); ++$i) {
    printf("%d: %d ", $i + 1, ord($nl[$i]));
}
echo "\n";
echo 'pathSeparator=', fbSystem::pathSeparator(), "\n";
echo 'tempDirectory=', fbSystem::tempDirectory(), "\n";
echo 'extensionSuffix=', fbSystem::extensionSuffix(), "\n";
echo 'hostname=', fbSystem::hostname(), "\n";
echo 'username='******'include_path=', ini_get('include_path'), "\n";
fbSystem::appendIncludePath('appendme');
echo 'include_path=', ini_get('include_path'), "\n";
fbSystem::prependIncludePath('prependme');
echo 'include_path=', ini_get('include_path'), "\n";
echo 'loadExtension(\'standard\')=', fbSystem::loadExtension('standard'), "\n";
echo 'loadExtension(\'curl\')=', fbSystem::loadExtension('curl'), "\n";
echo 'loadExtension(\'failme\')=', fbSystem::loadExtension('failme'), "\n";
echo 'getLastError()=', fbSystem::getLastError(), "\n";
?>
</pre>
<address>
$CVSHeader: _freebeer/www/demo/System.php,v 1.3 2004/03/07 19:16:21 ross Exp $
</address>

</body>
</html>
Пример #6
0
 function getEntropy()
 {
     /// \todo would implode('~', ...) be quicker?
     $entropy = microtime() . '~' . @getmypid() . '~' . @lcg_value() . '~' . @disk_free_space(fbSystem::tempDirectory());
     if (function_exists('getrusage')) {
         $entropy .= '~' . serialize(@getrusage());
     }
     if (function_exists('memory_get_usage')) {
         $entropy .= '~' . serialize(@memory_get_usage());
     }
     if (function_exists('posix_times')) {
         $entropy .= '~' . serialize(@posix_times());
     }
     global $_SERVER;
     // < 4.1.0
     if (isset($_SERVER)) {
         $entropy .= '~' . serialize($_SERVER);
     }
     return $entropy;
 }
Пример #7
0
 function _error_log($s)
 {
     static $file;
     if (!$file) {
         $file = fbSystem::tempDirectory() . '/phpdebug.log';
         if (!is_file($file)) {
             @error_log('', 3, $file);
             $old_umask = @umask(0);
             @chmod($file, 0666);
             @umask($old_umask);
         }
     }
     @error_log($s, 3, $file);
 }
Пример #8
0
Windows:
DEFAULT_INCLUDE_PATH	=> .;c:\php4\pear
PEAR_EXTENSION_DIR	=> c:\php4
PEAR_INSTALL_DIR	=> c:\php4\pear
Debian GNU/Linux:
DEFAULT_INCLUDE_PATH	=> .:/usr/share/php:/usr/share/pear
PEAR_EXTENSION_DIR	=> /usr/lib/php4/20020429
PEAR_INSTALL_DIR	=> /usr/share/php
*/
if (@is_dir(FREEBEER_BASE . '/opt/pear')) {
    require_once FREEBEER_BASE . '/lib/System.php';
    fbSystem::appendIncludePath(FREEBEER_BASE . '/opt/pear');
}
if (defined('PEAR_INSTALL_DIR') && @is_dir(PEAR_INSTALL_DIR)) {
    require_once FREEBEER_BASE . '/lib/System.php';
    fbSystem::appendIncludePath(PEAR_INSTALL_DIR);
}
/*!
	\class fbPear
	\brief PEAR support class
*/
class fbPear
{
    /*!
    		\return \c bool
    		\static
    	*/
    function isAvailable()
    {
        static $rv = null;
        if (is_null($rv)) {
Пример #9
0
 function test_putenv_1()
 {
     $rv = fbSystem::putEnv('PHPRC', 'C:\\PHP');
     $this->assertTrue($rv, "rv='{$rv}'");
     $rv = fbSystem::putEnv('PHP_TZ', 'PST8PDT');
     $this->assertTrue($rv, "rv='{$rv}'");
 }
Пример #10
0
 function _getTempName()
 {
     return tempnam(fbSystem::tempDirectory(), 'fbt');
 }
Пример #11
0
 function putEnv($var, $value, $case_sensitive = false)
 {
     static $warned = array();
     $rv = fbSystem::getEnvVar($var, $case_sensitive);
     if ($value == $rv) {
         return $rv;
     }
     if (isset($warned[$var])) {
         return false;
     }
     $track_errors = @ini_set('track_errors', true);
     $php_errormsg = '';
     @putenv($var . '=' . $value);
     if ($php_errormsg) {
         $warned[$var] = true;
         $rv = false;
         $php_ini = get_cfg_var('cfg_file_path') ? get_cfg_var('cfg_file_path') : 'php.ini';
         $safe_mode_allowed_env_vars = ini_get('safe_mode_allowed_env_vars');
         if ($safe_mode_allowed_env_vars) {
             $safe_mode_allowed_env_vars .= ',';
         }
         $safe_mode_allowed_env_vars .= $var;
         $msg = sprintf("%s\n" . "To correct, add (or edit) one of the following in the [PHP] section of %s:\n" . "  safe_mode = Off\n" . "  safe_mode_allowed_env_vars = \n" . "  safe_mode_allowed_env_vars = %s\n", $php_errormsg, $php_ini, $safe_mode_allowed_env_vars);
         trigger_error($msg, E_USER_NOTICE);
     }
     if (!$track_errors) {
         @ini_set('track_errors', $track_errors);
     }
     return getenv($var);
 }
Пример #12
0
 function setLocale($category, $locales)
 {
     fbDebug::enter();
     assert('$category == LC_ALL   || $category == LC_COLLATE ||' . '$category == LC_CTYPE || $category == LC_MONETARY ||' . '$category == LC_NUMERIC  || $category == LC_TIME');
     static $locale_map = array();
     /*
     		// \todo get serialize working
     		$locale_key = is_array($locales) ? serialize($locales) : $locales;
     
     fbDebug::dump($locale_key, '$locale_key');
     
     		if (!isset($locale_map[$locale_key])) {
     			$locale_map[$locale_key] = fbLocale::getNearestLocale($locales);
     fbDebug::dump($locale_map, '$locale_map');
     		}
     
     		$locale = $locale_map[$locale_key];
     
     		if (!$locale) {
     			return setlocale($category, $locales);
     		}
     */
     $locale = $locales;
     // this appears to be required in order for the gettext functions to work
     fbSystem::putEnv('LANG', $locale);
     // it's been reported that this is needed to on some systems
     fbSystem::putEnv('LANGUAGE', $locale);
     if (!preg_match('/^win/i', PHP_OS)) {
         $rv = fbLocale::_setLocale($category, $locale);
     } else {
         $rv = fbLocale::_setLocaleWindows($category, $locale);
     }
     $_locale_cache =& fbLocale::_locale_cache();
     if ($rv && !isset($_locale_cache[$category][$rv])) {
         $a = fbLocale::_parseLocale($rv);
         $iso_locale = $a['locale'];
         $_locale_cache[$category][$rv] = $a;
         $_locale_cache[$category][$iso_locale] = $a;
     }
     fbDebug::leave($rv);
     return $rv;
 }
Пример #13
0
 function errorHandler($code, $error, $file, $line, $context)
 {
     global $_SERVER;
     // < 4.1.0
     static $error_type = array(E_ERROR => 'error', E_WARNING => 'warning', E_PARSE => 'parse error', E_NOTICE => 'notice', E_CORE_ERROR => 'core error', E_CORE_WARNING => 'core warning', E_COMPILE_ERROR => 'compile error', E_COMPILE_WARNING => 'compile warning', E_USER_ERROR => 'user error', E_USER_WARNING => 'user warning', E_USER_NOTICE => 'user notice', E_STRICT => 'strict');
     /*
     		static $error_prefixes = array(
     			// do not localize
     			'Error',
     			'Warning',
     			'Parse error',
     			'Notice',
     			'Core error',
     			'Core warning',
     			'Compile error',
     			'Compile warning',
     			'User error',
     			'User warning',
     			'User notice',
     			'Strict',
     		);
     
     		$ignorable_error = true;
     		foreach ($error_prefixes as $error_prefix) {
     			if (preg_match("/$error_prefix:/i", $error)) {
     				$ignorable_error = false;
     				break;
     			}
     		}
     
     		if ($ignorable_error) {
     //echo "ignoring error '$error'\n<br/>\n";
     			return;
     		}
     */
     $action = fbErrorHandler::getAction($code);
     if (error_reporting() == 0) {
         // @ errors
         if (!($action & FB_ERROR_HANDLER_SHOW_HIDDEN_ERRORS)) {
             return;
         }
     }
     $type = isset($error_type[$code]) ? $error_type[$code] : 'error ' . $code;
     $errmsg = sprintf('%s(%s): %s (%s)', basename($file), $line, ucfirst($type) . ': ' . $error, $file);
     $date = date('D M d H:i:s Y');
     // \q should we localize?
     // $date = strftime('%a %b %d %H:%M:%S %Y');
     // $date .= ' ' . date('O');
     $logmsg = sprintf("[php %s] [%s] %s\n", $date, $type, $errmsg);
     // \todo use better CLI/Web determination
     $cli = fbSystem::isCLI();
     if ($action & FB_ERROR_HANDLER_LOG) {
         if (!$cli) {
             // write to web server's error log
             @fwrite(STDERR, $logmsg);
         } else {
             /// \todo write to separate log file?
         }
     }
     if ($action & FB_ERROR_HANDLER_IGNORE) {
         return;
     }
     if (!ini_get('display_errors')) {
         // \todo display default error page
         echo $logmsg;
         echo "\n\todo Display default error page\n";
         exit;
     }
     if (!$cli) {
         $s = "\n<pre>\n";
     }
     $s .= $errmsg;
     $s .= "\n";
     if ($action & (FB_ERROR_HANDLER_NORMAL | FB_ERROR_HANDLER_VERBOSE)) {
         // \todo if isset($_SERVER['REMOTE_ADDR'])
         //	echo "\n</pre>\n";
         /// \todo print stack trace
         if (function_exists('debug_backtrace')) {
             $stack = debug_backtrace();
             $s .= !$cli ? '<hr />' : "\n";
             $s .= "Call Stack:";
             $s .= !$cli ? '<hr />' : "\n";
             /// \todo
             /*
             						[class] => anotherclass
             						[type] => ::
             */
             #print_r($stack);
             #exit;
             array_shift($stack);
             // fbErrorHandler frame
             //		array_shift($stack);	// original error frame
             foreach ($stack as $frame) {
                 // \todo change extract() to hash
                 extract($frame);
                 if (!isset($args)) {
                     continue;
                 }
                 $a = array();
                 foreach ($args as $key => $value) {
                     if (is_array($value)) {
                         $a[] = 'Array[' . sizeof($value) . ']';
                         continue;
                     }
                     if (is_bool($value)) {
                         $a[] = $value ? 'true' : 'false';
                         continue;
                     }
                     if (is_null($value)) {
                         $a[] = 'null';
                         continue;
                     }
                     if (is_object($value)) {
                         $a[] = get_class($value) . ' object';
                         continue;
                     }
                     if (is_resource($value)) {
                         $a[] = get_resource_type($value) . ' resource';
                         continue;
                     }
                     if (is_string($value)) {
                         if (!$cli) {
                             $a[] = "'" . htmlspecialchars($value) . "'";
                         } else {
                             $a[] = "'{$value}'";
                         }
                         continue;
                     }
                     $a[] = $value;
                 }
                 $frame = $function . '(' . implode(', ', $a) . ')';
                 if (isset($class)) {
                     $frame = $class . $type . $frame;
                 }
                 if (!$cli) {
                     $file = htmlspecialchars($file);
                 }
                 $fileline = $file . '(' . $line . ')';
                 $baseline = basename($file) . '(' . $line . ')';
                 if (!$cli) {
                     $root_dir = FREEBEER_BASE;
                     // \todo move to config file
                     $cvsurl = 'http://cvs.netebb.com/horde/chora/annotate.php/_freebeer';
                     $path = str_replace($root_dir, '', $file);
                     $url = sprintf("%s%s#%d", $cvsurl, $path, $line);
                     // \todo clean this up
                     // turn open into function call:
                     // return fbOpenWindow($url);
                     $js = "open('{$url}', '', 'screenX=640,screenY=480,resizeable=yes,left=0,top=0,width=640,height=480,scrollbars=yes,status=yes,toolbar=yes,location=yes,menubar=yes,maximized=yes'); return false;";
                     $url = '#';
                     $link = sprintf('<a href="%s" onclick="%s">%s</a>', $url, $js, $fileline);
                     $baselink = sprintf('<a href="%s" onclick="%s">%s</a>', $url, $js, $baseline);
                     $spaces = str_repeat(' ', 30 - strlen($baseline));
                     $s .= sprintf("\t%s: %s %s\t(%s)\n", $baselink, $spaces, $frame, $link, $file);
                 } else {
                     $s .= sprintf("\t%s: %s\t(%s)\n", $baseline, $spaces, $frame, $file);
                 }
                 /*
                 			foreach ($args as $key => $value) {
                 				if (is_object($value)) {
                 					echo sprintf("param %d:\n", $key + 1);
                 					print_r($value);
                 					continue;
                 				}
                 
                 				if (is_resource($value)) {
                 					echo sprintf("param %d:\n", $key + 1);
                 					echo get_resource_type($value), ' resource ';
                 					switch (get_resource_type($value)) {
                 						case 'stream':
                 							print_r(stream_get_meta_data($value));
                 							break;
                 					}
                 					continue;
                 				}
                 			}
                 */
             }
             // foreach ($stack as $frame)
         }
         // if (function_exists('debug_backtrace'))
         $s .= !$cli ? '<hr />' : "\n";
         $s .= "Context:";
         $s .= !$cli ? '<hr />' : "\n";
         fbErrorHandler::_recursiveSort($context);
         $s .= var_export($context, true);
     }
     if ($action & FB_ERROR_HANDLER_VERBOSE) {
         $s .= !$cli ? '<hr />' : "\n";
         $s .= "Globals:";
         $s .= !$cli ? '<hr />' : "\n";
         $uvars = array('HTTP_COOKIE_VARS', 'HTTP_ENV_VARS', 'HTTP_GET_VARS', 'HTTP_POST_FILES', 'HTTP_POST_VARS', 'HTTP_SERVER_VARS', 'HTTP_SESSION_VARS');
         $_vars = array('_REQUEST', '_SESSION', '_COOKIE', '_GET', '_POST', '_SERVER', '_ENV', '_FILES');
         $g = array();
         foreach ($GLOBALS as $key => $value) {
             if (in_array($key, $uvars)) {
                 continue;
             }
             if (in_array($key, $_vars)) {
                 continue;
             }
             $g[$key] = $GLOBALS[$key];
         }
         fbErrorHandler::_recursiveSort($g);
         $s .= var_export($g, true);
         unset($g);
         $s .= !$cli ? '<hr />' : "\n";
         $s .= "Super Globals:";
         $s .= !$cli ? '<hr />' : "\n";
         $_g = array();
         foreach ($_vars as $key) {
             if (isset($GLOBALS[$key]) && count($GLOBALS[$key])) {
                 $_g[$key] = $GLOBALS[$key];
                 fbErrorHandler::_recursiveSort($_g[$key]);
             }
         }
         $s .= var_export($_g, true);
         // PHP 4.3.1 defaults on Windows
         static $default_ini_values = array('SMTP' => 'localhost', 'allow_call_time_pass_reference' => 1, 'allow_url_fopen' => 1, 'always_populate_raw_post_data' => 0, 'arg_separator.input' => '&', 'arg_separator.output' => '&', 'asp_tags' => 0, 'assert.active' => 1, 'assert.bail' => 0, 'assert.callback' => '', 'assert.quiet_eval' => 0, 'assert.warning' => 1, 'auto_append_file' => '', 'auto_detect_line_endings' => 0, 'auto_prepend_file' => '', 'browscap' => '', 'child_terminate' => 0, 'com.allow_dcom' => 0, 'com.autoregister_casesensitive' => 1, 'com.autoregister_typelib' => 0, 'com.autoregister_verbose' => 0, 'com.typelib_file' => '', 'default_charset' => '', 'default_mimetype' => 'text/html', 'default_socket_timeout' => 60, 'define_syslog_variables' => 0, 'disable_functions' => '', 'display_errors' => 1, 'display_startup_errors' => 0, 'doc_root' => '', 'docref_ext' => '', 'docref_root' => 'http://www.php.net/', 'enable_dl' => 1, 'engine' => 1, 'error_append_string' => '', 'error_log' => '', 'error_prepend_string' => '', 'error_reporting' => '', 'expose_php' => 1, 'extension_dir' => 'c:\\php4', 'file_uploads' => 1, 'gpc_order' => 'GPC', 'highlight.bg' => '#FFFFFF', 'highlight.comment' => '#FF8000', 'highlight.default' => '#0000BB', 'highlight.html' => '#000000', 'highlight.keyword' => '#007700', 'highlight.string' => '#DD0000', 'html_errors' => 1, 'ignore_repeated_errors' => 0, 'ignore_repeated_source' => 0, 'ignore_user_abort' => 0, 'implicit_flush' => 0, 'include_path' => '.;c:\\php4\\pear', 'last_modified' => 0, 'log_errors' => 0, 'log_errors_max_len' => 1024, 'magic_quotes_gpc' => 1, 'magic_quotes_runtime' => 0, 'magic_quotes_sybase' => 0, 'max_execution_time' => 30, 'max_input_time' => -1, 'mysql.allow_persistent' => 1, 'mysql.connect_timeout' => -1, 'mysql.default_host' => '', 'mysql.default_password' => '', 'mysql.default_port' => '', 'mysql.default_socket' => '', 'mysql.default_user' => '', 'mysql.max_links' => -1, 'mysql.max_persistent' => -1, 'mysql.trace_mode' => 0, 'odbc.allow_persistent' => 1, 'odbc.check_persistent' => 1, 'odbc.default_db' => '', 'odbc.default_pw' => '', 'odbc.default_user' => '', 'odbc.defaultbinmode' => 1, 'odbc.defaultlrl' => 4096, 'odbc.max_links' => -1, 'odbc.max_persistent' => -1, 'open_basedir' => '', 'output_buffering' => 0, 'output_handler' => '', 'post_max_size' => '8M', 'precision' => 14, 'register_argc_argv' => 1, 'register_globals' => 0, 'report_memleaks' => 1, 'safe_mode' => 0, 'safe_mode_allowed_env_vars' => 'PHP_', 'safe_mode_exec_dir' => 1, 'safe_mode_gid' => 0, 'safe_mode_include_dir' => '', 'safe_mode_protected_env_vars' => 'LD_LIBRARY_PATH', 'sendmail_from' => '', 'sendmail_path' => '', 'session.auto_start' => 0, 'session.bug_compat_42' => 1, 'session.bug_compat_warn' => 1, 'session.cache_expire' => 180, 'session.cache_limiter' => 'nocache', 'session.cookie_domain' => '', 'session.cookie_lifetime' => 0, 'session.cookie_path' => '/', 'session.cookie_secure' => '', 'session.entropy_file' => '', 'session.entropy_length' => 0, 'session.gc_dividend' => 100, 'session.gc_maxlifetime' => 1440, 'session.gc_probability' => 1, 'session.name' => 'PHPSESSID', 'session.referer_check' => '', 'session.save_handler' => 'files', 'session.save_path' => '/tmp', 'session.serialize_handler' => 'php', 'session.use_cookies' => 1, 'session.use_only_cookies' => 0, 'session.use_trans_sid' => 0, 'short_open_tag' => 1, 'smtp_port' => 25, 'sql.safe_mode' => 0, 'track_errors' => 0, 'unserialize_callback_func' => '', 'upload_max_filesize' => '2M', 'upload_tmp_dir' => '', 'url_rewriter.tags' => 'a=href,area=href,frame=src,form=,fieldset=', 'user_agent' => '', 'user_dir' => '', 'variables_order' => '', 'xbithack' => 0, 'xmlrpc_error_number' => 0, 'xmlrpc_errors' => 0, 'y2k_compliance' => 1, 'zlib.output_compression' => 0, 'zlib.output_compression_level' => -1, 'zlib.output_handler' => '');
         if (function_exists('ini_get_all')) {
             $a = ini_get_all();
             $same = array();
             $diff = array();
             $diff_default = array();
             foreach ($a as $key => $value) {
                 unset($value['access']);
                 if ($value['global_value'] === $value['local_value']) {
                     if (isset($default_ini_values[$key]) && $value['local_value'] != $default_ini_values[$key]) {
                         $value['global_value'] = $default_ini_values[$key];
                         $diff_default[$key] = $value;
                     } else {
                         $same[$key] = $value['global_value'];
                     }
                 } else {
                     $diff[$key] = $value;
                 }
             }
             ksort($same);
             ksort($diff);
             $s .= !$cli ? '<hr />' : "\n";
             $php_ini = get_cfg_var('cfg_file_path') ? get_cfg_var('cfg_file_path') : 'php.ini';
             $s .= "Configuration options (modified from current {$php_ini} values):";
             $s .= !$cli ? '<hr />' : "\n";
             $s .= var_export($diff, true);
             $s .= !$cli ? '<hr />' : "\n";
             $s .= "Configuration options (current {$php_ini} values that are different than default values):";
             $s .= !$cli ? '<hr />' : "\n";
             $s .= var_export($diff_default, true);
             /*	// why bother
             				echo !$cli ? '<hr />' : "\n";
             				echo "php.ini options (unmodified):";
             				echo !$cli ? '<hr />' : "\n";
             				print_r($same);
             	*/
         }
         $type = strtr($type, ' ', '_');
         if (!$cli) {
             $s .= "\n</pre>\n";
         }
     }
     if ($action & FB_ERROR_HANDLER_STDOUT) {
         echo $s;
     }
     if ($action & FB_ERROR_HANDLER_STDERR) {
         @fwrite(STDERR, $s);
     }
     if ($action & FB_ERROR_HANDLER_EMAIL) {
         /// \todo add support for FB_ERROR_HANDLER_EMAIL option
     }
     if ($action == FB_ERROR_HANDLER_FAIL) {
         if (!$cli) {
             echo "</body>\n</html>\n";
         }
         exit(1);
     }
 }
Пример #14
0
 function submit()
 {
     static $parameter_map = array('ACCT' => 'card_number', 'AMT' => 'amount', 'AUTHCODE' => 'auth_code', 'CITY' => 'city', 'COMMENT1' => 'description', 'COMMENT2' => 'invoice_number', 'COMPANYNAME' => 'company', 'COUNTRY' => 'country', 'EMAIL' => 'email', 'EXPDATE' => 'expiration', 'FIRSTNAME' => 'first_name', 'LASTNAME' => 'last_name', 'NAME' => 'name', 'PARTNER' => 'partner', 'PONUM' => 'po_number', 'DESC' => 'description', 'DESC1' => 'description1', 'DESC2' => 'description2', 'DESC3' => 'description3', 'DESC4' => 'description4', 'PWD' => 'password', 'STATE' => 'state', 'STREET' => 'address', 'USER' => 'login', 'VENDOR' => 'login', 'ZIP' => 'zip', 'MICR' => 'micr', 'CHKNUM' => 'check_number');
     static $required_fields = array('AMT', 'USER', 'VENDOR', 'PARTNER', 'PWD', 'TRXTYPE', 'TENDER', 'ACCT', 'EXPDATE');
     /// \todo implement:
     static $required_fields_cc = array('ACCT', 'EXPDATE');
     static $required_fields_echeck = array('CHKNUM', 'MICR', 'NAME', 'DL', 'CITY', 'EMAIL', 'STATE', 'STREET', 'ZIP');
     static $required_fields_ach = array('ABA', 'ACCT', 'ACCTTYPE', 'NAME');
     if (!getenv('PFPRO_CERT_PATH')) {
         if (defined('PFPRO_CERT_PATH') && strlen(PFPRO_CERT_PATH)) {
             if (!@is_dir(PFPRO_CERT_PATH)) {
                 trigger_error(sprintf("Directory not found: '%s'", PFPRO_CERT_PATH), E_USER_ERROR);
                 return false;
             }
             fbSystem::putenv('PFPRO_CERT_PATH', PFPRO_CERT_PATH);
         }
     }
     pfpro_init();
     $fields = $this->_fields;
     //fbDebug::dump($fields, 	'$fields');
     if ($this->_test_mode) {
         if ($this->_test_card_type) {
             switch ($this->_test_card_type) {
                 case FB_PAYMENT_CREDIT_CARD_TYPE_VISA:
                     switch ($this->_test_response_type) {
                         case FB_PAYMENT_RESPONSE_TYPE_APPROVED:
                             $fields['card_number'] = '4111111111111111';
                             break;
                         default:
                             $fields['card_number'] = '4242424242424242';
                             // always declines
                             break;
                     }
                     break;
                 case FB_PAYMENT_CREDIT_CARD_TYPE_MASTERCARD:
                     $fields['card_number'] = '5105105105105100';
                     //$fields['card_number'] = '5555555555551111'; // Invalid account number
                     break;
                 case FB_PAYMENT_CREDIT_CARD_TYPE_AMERICAN_EXPRESS:
                     $fields['card_number'] = '378282246310005';
                     break;
                 case FB_PAYMENT_CREDIT_CARD_TYPE_DISCOVER:
                     $fields['card_number'] = '6011111111111117';
                     break;
                 default:
                     trigger_error(sprintf("Invalid card type: '%s'", $this->_test_card_type), E_USER_WARNING);
                     return false;
             }
         }
         if (!isset($fields['expiration']) || !$fields['expiration']) {
             $fields['expiration'] = strftime('%m%y', time());
         }
         if ($this->_test_response_type) {
             switch ($this->_test_response_type) {
                 case FB_PAYMENT_RESPONSE_TYPE_APPROVED:
                     $fields['amount'] = 1.0;
                     break;
                 case FB_PAYMENT_RESPONSE_TYPE_DECLINED:
                     $fields['amount'] = 1000.01;
                     break;
                 case FB_PAYMENT_RESPONSE_TYPE_REFERRAL:
                     $fields['amount'] = 100.01;
                     break;
                 case FB_PAYMENT_RESPONSE_TYPE_BAD_EXPIRATION:
                     $fields['expiration'] = '9999';
                     break;
                 default:
                     trigger_error(sprintf("Invalid response type: '%s'", $this->_test_response_type), E_USER_WARNING);
                     return false;
             }
         }
         if ($this->_test_transaction_type && (!isset($this->_fields['action']) || !$this->_fields['action'])) {
             $this->_fields['action'] = $this->_test_transaction_type;
         }
     }
     if (isset($fields['expiration']) && is_int($fields['expiration'])) {
         // assume numeric expiration's are a UNIX timestamp
         // convert UNIX timestamp to MMYY
         $fields['expiration'] = strftime('%m%y', $fields['expiration']);
     }
     $parameter_flipped = array_flip($parameter_map);
     $parameters = array();
     $fields = $fields;
     foreach ($fields as $key => $value) {
         if (array_key_exists($key, $parameter_flipped)) {
             $key = $parameter_flipped[$key];
         }
         $parameters[$key] = $value;
     }
     foreach ($parameter_map as $key => $value) {
         if (array_key_exists($value, $fields)) {
             $parameters[$key] = $fields[$value];
         }
     }
     if (isset($fields['type']) && $fields['type']) {
         switch ($fields['type']) {
             case FB_PAYMENT_METHOD_TYPE_CREDIT_CARD:
                 $parameters['TENDER'] = 'C';
                 break;
             case FB_PAYMENT_METHOD_TYPE_ELECTRONIC_CHECK:
                 $parameters['TENDER'] = 'K';
                 break;
             case FB_PAYMENT_METHOD_TYPE_ACH_TRANSACTION:
                 $parameters['TENDER'] = 'A';
                 break;
             default:
                 trigger_error(sprintf("Unknown payment method type: '%s'", $fields['type']), E_USER_WARNING);
                 return false;
         }
     }
     if (isset($fields['action']) && $fields['action']) {
         switch ($fields['action']) {
             case FB_PAYMENT_TRANSACTION_TYPE_SALE:
                 $parameters['TRXTYPE'] = 'S';
                 break;
             case FB_PAYMENT_TRANSACTION_TYPE_AUTHORIZATION:
                 $parameters['TRXTYPE'] = 'A';
                 break;
             case FB_PAYMENT_TRANSACTION_TYPE_CREDIT:
                 $parameters['TRXTYPE'] = 'C';
                 break;
             case FB_PAYMENT_TRANSACTION_TYPE_POST_AUTHORIZATION:
                 $parameters['TRXTYPE'] = 'D';
                 // Delayed Capture
                 break;
             case FB_PAYMENT_TRANSACTION_TYPE_POST_VOID:
                 $parameters['TRXTYPE'] = 'V';
                 break;
             case FB_PAYMENT_TRANSACTION_TYPE_INQUIRY:
                 $parameters['TRXTYPE'] = 'I';
                 break;
             default:
                 trigger_error(sprintf("Unknown payment method type: '%s'", $fields['type']), E_USER_WARNING);
                 return false;
         }
     }
     unset($parameters['type']);
     unset($parameters['action']);
     if (!isset($parameters['PARTNER']) || !$parameters['PARTNER']) {
         $parameters['PARTNER'] = 'VeriSign';
     }
     if (!isset($parameters['TRXTYPE']) || !$parameters['TRXTYPE']) {
         $parameters['TRXTYPE'] = 'S';
         // Sale
     }
     if (!isset($parameters['TENDER']) || !$parameters['TENDER']) {
         $parameters['TENDER'] = 'C';
         // Credit card
     }
     // check for all required fields
     $errors = '';
     foreach ($required_fields as $required_field) {
         if (!isset($parameters[$required_field]) || !$parameters[$required_field]) {
             $errors .= sprintf("Required field '%s' ('%s') not found in field list.\n", $parameter_map[$required_field], $required_field);
         }
     }
     if ($errors) {
         //fbDebug::dump($fields, 	'$fields');
         //fbDebug::dump($parameters, '$parameters');
         trigger_error($errors, E_USER_WARNING);
         return false;
     }
     $parameters['AMT'] = sprintf("%.2f", floatval($parameters['AMT']));
     //fbDebug::dump($parameters, '$parameters');
     if ($this->proxy_password and strlen($this->proxy_password)) {
         $response = pfpro_process($parameters, $this->_server, $this->_port, $this->timeout, $this->proxy, $this->proxy_port, $this->proxy_user, $this->proxy_password);
     } elseif ($this->proxy_user and strlen($this->proxy_user)) {
         $response = pfpro_process($parameters, $this->_server, $this->_port, $this->timeout, $this->proxy, $this->proxy_port, $this->proxy_user);
     } elseif ($this->proxy_port and strlen($this->proxy_port)) {
         $response = pfpro_process($parameters, $this->_server, $this->_port, $this->timeout, $this->proxy, $this->proxy_port);
     } elseif ($this->proxy and strlen($this->proxy)) {
         $response = pfpro_process($parameters, $this->_server, $this->_port, $this->timeout, $this->proxy);
     } elseif ($this->timeout and strlen($this->timeout)) {
         $response = pfpro_process($parameters, $this->_server, $this->_port, $this->timeout);
     } elseif ($this->_port and strlen($this->_port)) {
         $response = pfpro_process($parameters, $this->_server, $this->_port);
     } elseif ($this->_server and strlen($this->_server)) {
         $response = pfpro_process($parameters, $this->_server);
     } else {
         $response = pfpro_process($parameters);
     }
     //fbDebug::dump($response, 	'$response');
     $this->_response = $response;
     if (!$response) {
         trigger_error('No response received from credit card payment processor!', E_USER_WARNING);
         return false;
     }
     if (!is_array($response)) {
         trigger_error(sprintf('Invalid response received from credit card payment processor: \'%s\'', $response), E_USER_WARNING);
         return false;
     }
     $this->_transaction_id = isset($response['PNREF']) ? $response['PNREF'] : '';
     $this->_result_code = isset($response['RESULT']) ? intval($response['RESULT']) : FB_PAYMENT_PAYFLOWPRO_NO_RESULT;
     $this->_approved = $this->_result_code == 0;
     $this->_declined = $this->_result_code == 12;
     // 'Declined. Check the credit card number and transaction information to make sure they were entered correctly. If this does not resolve the problem, have the customer call the credit card issuer to resolve.',
     if (isset($response['RESPMSG'])) {
         $this->_result_message = $response['RESPMSG'];
     } else {
         $result_messages = $this->result_messages();
         $this->_result_message = isset($result_messages[$this->_result_code]) ? $result_messages[$this->_result_code] : sprintf('Unknown error %d', $this->_result_code);
     }
     $this->_authorization = isset($response['AUTHCODE']) ? $response['AUTHCODE'] : '';
     $this->_avs_address = isset($response['AVSADDR']) ? $response['AVSADDR'] : '';
     $this->_avs_zip = isset($response['AVSZIP']) ? $response['AVSZIP'] : '';
     /// \todo Should pfpro_cleanup() be called on failures?
     pfpro_cleanup();
     return true;
 }