php_version = PHP_VERSION;
$this->user_agent = $_SERVER['HTTP_USER_AGENT'];
$this->configKeys = (isset($_SESSION['installerConfigKeys'])) ? $_SESSION['installerConfigKeys'] : array();
if (isset($_POST['zcinst'])) $this->readConfigKeysFromPost();
$this->configFiles = array();
}
function test_admin_configure($zp_error_text, $zp_error_code, $zp_fatal = false) {
if (!file_exists('../admin/includes/configure.php')) {
@chmod('../admin/includes', 0777);
@touch('../admin/includes/configure.php');
@chmod('../admin/includes', 0755);
if (!file_exists('../admin/includes/configure.php')) {
$this->setError($zp_error_text, $zp_error_code, $zp_fatal);
return false;
}
} else {
return true;
}
}
function test_admin_configure_write($zp_error_text, $zp_error_code, $zp_fatal = true) {
$fp = @fopen('../admin/includes/configure.php', 'a');
if (!is_writeable('../admin/includes/configure.php') || (!$fp) ) {
$this->setError($zp_error_text, $zp_error_code, $zp_fatal);
$this->admin_config_writable=false;
} else {
$this->admin_config_writable=true;
}
if ($fp) @fclose($fp);
}
function test_store_configure_write($zp_error_text, $zp_error_code, $zp_fatal = true) {
$fp = @fopen('../includes/configure.php', 'a');
if (!is_writeable('../includes/configure.php') || (!$fp) ) {
$this->setError($zp_error_text, $zp_error_code, $zp_fatal);
$this->store_config_writable=false;
} else {
$this->store_config_writable=true;
}
if ($fp) @fclose($fp);
}
function test_store_configure($zp_error_text, $zp_error_code, $zp_fatal = true) {
if (!file_exists('../includes/configure.php')) {
@chmod('../includes', 0777);
@touch('../includes/configure.php');
@chmod('../includes', 0755);
if (!file_exists('../includes/configure.php')) {
$this->setError($zp_error_text, $zp_error_code, $zp_fatal);
return false;
}
} else {
return true;
}
}
function test_php_version ($zp_test, $test_version, $zp_error_text='', $zp_error_code='', $zp_fatal=false) {
if (isset($_GET['ignorephpver']) && $_GET['ignorephpver']=='1') return false;
$string = explode('.',substr($this->php_version,0,6));
foreach ($string as $key=>$value) {
$string[$key] = str_pad((int)$value, 2, '0', STR_PAD_LEFT);
}
$myver_string = implode('',$string);
$string = explode('.',$test_version);
foreach ($string as $key=>$value) {
$string[$key] = str_pad($value, 2, '0', STR_PAD_LEFT);
}
$test_version = implode('',$string);
$zp_error_text = $this->php_version . ' ' . $zp_error_text;
//echo '
$myver='.$myver_string . ' $test_ver = ' . $test_version . ' TEST: ' . $zp_test . ' error-text: ' . $zp_error_text;
switch ($zp_test) {
case '=':
if ($myver_string == $test_version) {
$this->setError($zp_error_text, $zp_error_code, $zp_fatal);
return true;
}
break;
case '<':
if ($myver_string < $test_version) {
$this->setError($zp_error_text, $zp_error_code, $zp_fatal);
return true;
}
break;
}
return false;
}
function isEmpty($zp_test, $zp_error_text, $zp_error_code) {
if (!$zp_test || $zp_test=='http://' || $zp_test=='https://' ) {
$this->setError($zp_error_text, $zp_error_code, true);
}
return $zp_test;
}
function checkPrefix($zp_test, $zp_error_text, $zp_error_code) {
if (preg_replace('/[^0-9a-zA-Z_]/', '_', $zp_test) != $zp_test) {
$this->setError($zp_error_text, $zp_error_code, true);
}
}
function fileExists($zp_file, $zp_error_text, $zp_error_code) {
if (!file_exists($zp_file)) {
$this->setError($zp_error_text, $zp_error_code, true);
}
}
function isDir($zp_file, $zp_error_text, $zp_error_code) {
if (!is_dir($zp_file)) {
$this->setError($zp_error_text, $zp_error_code, true);
}
}
function isWriteable($zp_file, $zp_error_text='', $zp_error_code='') {
$retVal = true;
if (is_dir($zp_file)) $zp_file .= '/test_writable.txt';
$fp = @fopen($zp_file, 'a');
if (!is_writeable($zp_file) || (!$fp) ) {
if ($zp_error_code !='') $this->setError($zp_error_text, $zp_error_code, true);
$retVal = false;
}
@fclose($fp);
if (file_exists($zp_file) && !strstr($zp_file, 'configure.php')) @unlink($zp_file);
return $retVal;
}
function functionExists($zp_type, $zp_error_text, $zp_error_code) {
if ($zp_type == 'mysql') {
$function = 'mysql_connect';
}
if (!function_exists($function)) {
$this->setError($zp_error_text, $zp_error_code, true);
}
}
function dbConnect($zp_type, $zp_host, $zp_database, $zp_username, $zp_pass, $zp_error_text, $zp_error_code, $zp_error_text2=ERROR_TEXT_DB_NOTEXIST, $zp_error_code2=ERROR_CODE_DB_NOTEXIST) {
if ($this->error == false) {
if ($zp_type == 'mysql') {
if (@mysql_connect($zp_host, $zp_username, $zp_pass) == false ) {
$this->setError($zp_error_text.'
'.@mysql_error(), $zp_error_code, true);
} else {
if (!@mysql_select_db($zp_database)) {
$this->setError($zp_error_text2.'
'.@mysql_error(), $zp_error_code2, true);
} else {
@mysql_close();
}
}
}
}
}
function dbCreate($zp_create, $zp_type, $zp_name, $zp_error_text, $zp_error_code) {
if ($zp_create == 'true' && $this->error == false) {
if ($zp_type == 'mysql' && (@mysql_query('CREATE DATABASE ' . $zp_name) == false)) {
$this->setError($zp_error_text, $zp_error_code, true);
}
}
}
function dbExists($zp_create, $zp_type, $zp_host, $zp_username, $zp_pass, $zp_name, $zp_error_text, $zp_error_code) {
// echo $zp_create;
if ($zp_create != 'true' && $this->error == false) {
if ($zp_type == 'mysql') {
@mysql_connect($zp_host, $zp_username, $zp_pass);
if (@mysql_select_db($zp_name) == false) {
$this->setError($zp_error_text.'
'.@mysql_error(), $zp_error_code, true);
}
@mysql_close();
}
}
}
function isEmail($zp_param, $zp_error_text, $zp_error_code) {
if (zen_validate_email($zp_param) == false) {
$this->setError($zp_error_text, $zp_error_code, true);
}
}
function isEqual($zp_param1, $zp_param2, $zp_error_text, $zp_error_code) {
if ($zp_param1 != $zp_param2) {
$this->setError($zp_error_text, $zp_error_code, true);
}
}
function setError($zp_error_text, $zp_error_code, $zp_fatal = false) {
$this->error = true;
$this->fatal_error = $zp_fatal;
$this->error_array[] = array('text'=>$zp_error_text, 'code'=>$zp_error_code);
$this->throwException(($zp_fatal ? 'FATAL: ' : '') . str_replace('
', ' - ', $zp_error_text));
$this->logDetails(($zp_fatal ? 'FATAL: ' : '') . str_replace('
', ' - ', $zp_error_text));
}
/**
* Test CURL communications
*
* returns string
*/
function test_curl($mode='NONSSL', $proxy = false, $proxyAddress = '') {
if (!function_exists('curl_init')) {
$this->setError(ERROR_TEXT_CURL_NOT_COMPILED, ERROR_CODE_CURL_SUPPORT, false);
return ERROR_TEXT_CURL_NOT_COMPILED;
}
$url = ($mode == 'NONSSL') ? "http://www.zen-cart.com/testcurl.php" : "https://www.zen-cart.com/testcurl.php";
$data = "installertest=checking";
if ($proxy && $proxyAddress == '') $proxyAddress = 'proxy.shr.secureserver.net:3128';
// Send CURL communication
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); /* compatibility for SSL communications on some Windows servers (IIS 5.0+) */
if ($proxy) {
curl_setopt ($ch, CURLOPT_HTTPPROXYTUNNEL, true);
@curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt ($ch, CURLOPT_PROXY, $proxyAddress);
}
$result = curl_exec($ch);
$errtext = curl_error($ch);
$errnum = curl_errno($ch);
$commInfo = @curl_getinfo($ch);
curl_close ($ch);
if (isset($_GET['debug'])) echo $mode . ($proxy ? ' (proxy)': '') . ' CURL RESULTS: ' . $errnum . ' => ' . $errtext . (trim($result) != '' ? ' [' . $result . ']' : '') . '
' . print_r($commInfo, true) . '
';
if ($errnum != 0 || trim($result) != 'PASS') {
$response = $errnum . ' => ' . $errtext . (trim($result) != '' ? ' [' . $result . ']' : '');
$this->setError(($mode == 'NONSSL' ? ERROR_TEXT_CURL_PROBLEM_GENERAL : ERROR_TEXT_CURL_SSL_PROBLEM) . ' ' . $response, ERROR_CODE_CURL_SUPPORT, false);
return ($mode == 'NONSSL' ? ERROR_TEXT_CURL_PROBLEM_GENERAL : ERROR_TEXT_CURL_SSL_PROBLEM) . ' ' . $response;
}
return OKAY; // yes, this is an intentional constant
}
function trimTrailingSlash($string) {
return (substr($string,-1)=='/') ? substr($string,0,(strlen($string)-1)) : $string;
}
function resetConfigInfo() {
$this->configInfo = array();
$_SESSION['installerConfigInfo'] = $this->configInfo;
}
function setConfigInfo($key, $val) {
if ($val == 'unset_this') {
unset($this->configInfo[$key]);
} else {
$this->configInfo[$key] = $val;
}
$_SESSION['installerConfigInfo'] = $this->configInfo;
}
function getConfigInfo($key = '*', $printable = false) {
if ($key == '*') {
return ($printable) ? print_r($this->configInfo, true) : $this->configInfo;
} else {
return (isset($this->configInfo[$key])) ? $this->configInfo[$key] : '';
}
}
function resetConfigKeys() {
$this->configKeys = array();
$_SESSION['installerConfigKeys'] = $this->configKeys;
}
function setConfigKey($key, $val) {
if ($val == 'unset_this') {
unset($this->configKeys[$key]);
} else {
if ($key == 'DB_SERVER_PASSWORD') $val = $this->obfuscate($val);
$this->configKeys[$key] = $val;
}
$_SESSION['installerConfigKeys'] = $this->configKeys;
}
function setConfigKeyMulti($key_array) {
foreach($key_array as $key=>$val) {
$this->configKeys[$key] = $val;
if ($val == 'unset_this') unset($this->configKeys[$key]);
}
$_SESSION['installerConfigKeys'] = $this->configKeys;
}
function getConfigKey($key = '*', $printable = false) {
if ($key == '*') {
return ($printable) ? print_r($this->configKeys, true) : $this->configKeys;
} else if ($key == '-') {
$cleanKeys = $this->configKeys;
if (isset($cleanKeys['DB_SERVER_PASSWORD'])) $cleanKeys['DB_SERVER_PASSWORD'] = '***private***';
return ($printable) ? print_r($cleanKeys, true) : $cleanKeys;
} else {
$retVal = (isset($this->configKeys[$key])) ? $this->configKeys[$key] : '';
if ($key == 'DB_SERVER_PASSWORD') $retVal = $this->obfuscate($retVal, 'out');
return $retVal;
}
}
function getConfigKeysAsPost() {
$string = '';
foreach($this->configKeys as $key => $value) {
$string .= '' . "\n";
}
return $string;
}
function readConfigKeysFromPost() {
$postArray = $_POST['zcinst'];
foreach($postArray as $key => $value) {
if ($key == 'DB_SERVER_PASSWORD') $value = $this->obfuscate($value, 'out');
$this->setConfigKey($key, $value);
}
return $this->configKeys;
}
function obfuscate($var, $mode='in') {
if ($mode == 'in') return base64_encode(base64_encode($var));
if ($mode == 'out') return base64_decode(base64_decode($var));
return $var;
}
function throwException($details, $moreinfo = '', $location = '', $fname = '') {
global $current_page;
$fname = ($fname == '') ? date('M-d-Y_h-i') : $fname;
$location = ($location == '') ? $current_page : $location;
if ($fp = @fopen(DEBUG_LOG_FOLDER . '/zcInstallExceptionDetails_' . $fname . '.log', 'a')) {
fwrite($fp, '---------------' . "\n" . date('M d Y G:i') . ' -- ' . $location . "\n" . $details . "\n\n");
fclose($fp);
}
}
function logDetails($details, $location = '', $fname = '') {
global $current_page;
$fname = ($fname == '') ? date('M-d-Y_h') : $fname;
$location = ($location == '') ? $current_page : $location;
if ($fp = @fopen(DEBUG_LOG_FOLDER . '/zcInstallLog_' . $fname . '.log', 'a')) {
fwrite($fp, '---------------' . "\n" . date('M d Y G:i') . ' -- ' . $location . "\n" . $details . "\n\n");
fclose($fp);
}
}
// Determine Document Root
function detectDocumentRoot() {
$dir_fs_www_root = realpath(dirname(basename(__FILE__)) . "/..");
if ($dir_fs_www_root == '') $dir_fs_www_root = '/';
$dir_fs_www_root = str_replace(array('\\','//'), '/', $dir_fs_www_root);
return $dir_fs_www_root;
}
// OLD METHOD ... should be removed
function detectDocumentRoot_OLD() {
// old method:
$realPath = realpath(dirname(basename(__FILE__)));
$script_filename = (isset($_SERVER['PATH_TRANSLATED'])) ? $_SERVER['PATH_TRANSLATED'] : (isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : $realPath);
$script_filename = str_replace(array('\\','//'), '/', $script_filename);
// split into an array in order to read its parts
$dir_fs_www_root_array = explode('/', dirname($script_filename));
// re-assemble with all except the last part
$dir_fs_www_root_tmp = array();
for ($i=0, $n=sizeof($dir_fs_www_root_array)-1; $i<$n; $i++) {
$dir_fs_www_root_tmp[] = $dir_fs_www_root_array[$i];
}
$dir_fs_www_root = implode('/', $dir_fs_www_root_tmp);
// if blank, at least give it a single slash /
if ($dir_fs_www_root == '') $dir_fs_www_root = '/';
return $dir_fs_www_root;
}
function writeConfigFiles() {
$virtual_http_path = parse_url($this->getConfigKey('virtual_http_path'));
$http_server = $virtual_http_path['scheme'] . '://' . $virtual_http_path['host'];
$http_catalog = (isset($virtual_http_path['path'])) ? $virtual_http_path['path'] : '';
if (isset($virtual_http_path['port']) && !empty($virtual_http_path['port'])) {
$http_server .= ':' . $virtual_http_path['port'];
}
if (substr($http_catalog, -1) != '/') {
$http_catalog .= '/';
}
$sql_cache_dir = (int)$this->getConfigKey('DIR_FS_SQL_CACHE');
$cache_type = $this->getConfigKey('SQL_CACHE_METHOD');
$https_server = $this->getConfigKey('virtual_https_server');
$https_catalog = $this->getConfigKey('virtual_https_path');
//if the https:// entries were left blank, use non-SSL versions instead of blank
if ($https_server=='' || $https_server=='https://' || $https_server=='://') $https_server=$http_server;
if ($https_catalog=='') $https_catalog=$http_catalog;
$https_catalog_path = ereg_replace($https_server,'',$https_catalog) . '/';
$https_catalog = $https_catalog_path;
//now let's write the files
// Catalog version first:
require('includes/store_configure.php');
$config_file_contents_catalog = $file_contents;
$fp = @fopen($this->getConfigKey('DIR_FS_CATALOG') . '/includes/configure.php', 'w');
if ($fp) {
fputs($fp, $file_contents);
fclose($fp);
@chmod($this->getConfigKey('DIR_FS_CATALOG') . '/includes/configure.php', 0644);
}
// now Admin version:
require('includes/admin_configure.php');
$config_file_contents_admin = $file_contents;
$fp = @fopen($this->getConfigKey('DIR_FS_CATALOG') . '/admin/includes/configure.php', 'w');
if ($fp) {
fputs($fp, $file_contents);
fclose($fp);
@chmod($this->getConfigKey('DIR_FS_CATALOG') . '/admin/includes/configure.php', 0644);
}
$this->configFiles = array('catalog' => $config_file_contents_catalog, 'admin' => $config_file_contents_admin);
return $this->validateConfigFiles($http_server);
}
function validateConfigFiles($http_server) {
// test whether the files were written successfully
$ztst_http_server = zen_read_config_value('HTTP_SERVER');
$ztst_db_server = zen_read_config_value('DB_SERVER');
$ztst_sqlcachedir = zen_read_config_value('DIR_FS_SQL_CACHE');
if ($ztst_http_server != $http_server || $ztst_db_server != $this->getConfigKey('DB_SERVER') || $ztst_sqlcachedir != $this->getConfigKey('DIR_FS_SQL_CACHE') || $this->getConfigKey('DB_SERVER') == '') {
$this->setError(ERROR_TEXT_COULD_NOT_WRITE_CONFIGURE_FILES, ERROR_CODE_COULD_NOT_WRITE_CONFIGURE_FILES, true);
$this->throwException('Failed writing configure.php file: Found in config file: [' . $ztst_http_server . '], expecting [' . $http_server . ']');
$this->throwException('Failed writing configure.php file: Found in config file: [' . $ztst_db_server . '], expecting [' . $this->getConfigKey('DB_SERVER') . ']');
$this->throwException('Failed writing configure.php file: Found in config file: [' . $ztst_sqlcachedir . '], expecting [' . $this->getConfigKey('DIR_FS_SQL_CACHE') . ']');
$retVal = false;
} else {
$retVal = true;
}
return $retVal;
}
function validateDatabaseSetup($data) {
if ($data['db_type'] != 'mysql') $data['db_prefix'] = ''; // if not using mysql, don't support prefixes because we don't trap for them
if ($data['db_sess'] != 'true' || $data['cache_type'] == 'file') { //if not storing sessions in database, or if caching to file, check folder
$this->isEmpty($data['sql_cache_dir'], ERROR_TEXT_CACHE_DIR_ISEMPTY, ERROR_CODE_CACHE_DIR_ISEMPTY);
$this->isDir($data['sql_cache_dir'], ERROR_TEXT_CACHE_DIR_ISDIR, ERROR_CODE_CACHE_DIR_ISDIR);
$this->isWriteable($data['sql_cache_dir'], ERROR_TEXT_CACHE_DIR_ISWRITEABLE, ERROR_CODE_CACHE_DIR_ISWRITEABLE);
}
//$this->checkPrefix($data['db_prefix'], ERROR_TEXT_DB_PREFIX_NODOTS, ERROR_CODE_DB_PREFIX_NODOTS);
$data['db_prefix'] == preg_replace('/[^0-9a-zA-Z_]/', '_', $data['db_prefix']);
$this->isEmpty($data['db_host'], ERROR_TEXT_DB_HOST_ISEMPTY, ERROR_CODE_DB_HOST_ISEMPTY);
$this->isEmpty($data['db_username'], ERROR_TEXT_DB_USERNAME_ISEMPTY, ERROR_CODE_DB_USERNAME_ISEMPTY);
$this->isEmpty($data['db_name'], ERROR_TEXT_DB_NAME_ISEMPTY, ERROR_CODE_DB_NAME_ISEMPTY);
$this->fileExists('sql/' . $data['db_type'] . '_zencart.sql', ERROR_TEXT_DB_SQL_NOTEXIST, ERROR_CODE_DB_SQL_NOTEXIST);
$this->functionExists($data['db_type'], ERROR_TEXT_DB_NOTSUPPORTED, ERROR_CODE_DB_NOTSUPPORTED);
$this->dbConnect($data['db_type'], $data['db_host'], $data['db_name'], $data['db_username'], $data['db_pass'], ERROR_TEXT_DB_CONNECTION_FAILED, ERROR_CODE_DB_CONNECTION_FAILED,ERROR_TEXT_DB_NOTEXIST, ERROR_CODE_DB_NOTEXIST);
$this->dbExists(false, $data['db_type'], $data['db_host'], $data['db_username'], $data['db_pass'], $data['db_name'], ERROR_TEXT_DB_NOTEXIST, ERROR_CODE_DB_NOTEXIST);
$data['db_sess'] = ($data['db_sess'] == 'true') ? 'db' : '';
$this->setConfigKey('DB_TYPE', $data['db_type']);
$this->setConfigKey('DB_PREFIX', $data['db_prefix']);
$this->setConfigKey('DB_SERVER', $data['db_host']);
$this->setConfigKey('DB_SERVER_USERNAME', $data['db_username']);
$this->setConfigKey('DB_SERVER_PASSWORD', $data['db_pass']);
$this->setConfigKey('DB_DATABASE', $data['db_name']);
$this->setConfigKey('STORE_SESSIONS', $data['db_sess']);
$this->setConfigKey('USE_PCONNECT', @$data['db_conn']);
$this->setConfigKey('SQL_CACHE_METHOD', $data['cache_type']);
$this->setConfigKey('DIR_FS_SQL_CACHE', $this->trimTrailingSlash($data['sql_cache_dir']));
}
function dbActivate() {
if (isset($this->db)) return;
if ($this->getConfigKey('DB_TYPE') == '') $this->setConfigKey('DB_TYPE', zen_read_config_value('DB_TYPE'));
if ($this->getConfigKey('DB_PREFIX') == '') $this->setConfigKey('DB_PREFIX', zen_read_config_value('DB_PREFIX'));
if ($this->getConfigKey('DB_SERVER') == '') $this->setConfigKey('DB_SERVER', zen_read_config_value('DB_SERVER'));
if ($this->getConfigKey('DB_SERVER_USERNAME') == '') $this->setConfigKey('DB_SERVER_USERNAME', zen_read_config_value('DB_SERVER_USERNAME'));
if ($this->getConfigKey('DB_SERVER_PASSWORD') == '') $this->setConfigKey('DB_SERVER_PASSWORD', zen_read_config_value('DB_SERVER_PASSWORD'));
if ($this->getConfigKey('DB_DATABASE') == '') $this->setConfigKey('DB_DATABASE', zen_read_config_value('DB_DATABASE'));
include_once('../includes/classes/db/' . $this->getConfigKey('DB_TYPE') . '/query_factory.php');
$this->db = new queryFactory;
$this->db->Connect($this->getConfigKey('DB_SERVER'), $this->getConfigKey('DB_SERVER_USERNAME'), $this->getConfigKey('DB_SERVER_PASSWORD'), $this->getConfigKey('DB_DATABASE'), true);
}
function dbLoadProcedure() {
$this->dbActivate(); // can likely remove this line for v1.4
global $db;
$db = $this->db;
executeSql('sql/' . $this->getConfigKey('DB_TYPE') . '_zencart.sql', $this->getConfigKey('DB_DATABASE'), $this->getConfigKey('DB_PREFIX'));
//update the cache folder setting:
$this->dbAfterLoadActions();
if (file_exists('includes/local/developers_' . $this->getConfigKey('DB_TYPE') . '.sql')) {
executeSql('includes/local/developers_' . $this->getConfigKey('DB_TYPE') . '.sql', $this->getConfigKey('DB_DATABASE'), $this->getConfigKey('DB_PREFIX'));
}
// process any plugin SQL scripts
$this->dbHandleSQLPlugins();
// Close the database connection
$this->db->Close();
}
/**
* Support for SQL Plugins in installer
*/
function dbHandleSQLPlugins() {
$sqlpluginsdir = 'sql/plugins/';
if ($dir = @dir($sqlpluginsdir)) {
while ($file = $dir->read()) {
if (!is_dir($sqlpluginsdir . $file)) {
if (ZC_UPG_DEBUG3) echo '
checking file: ' . $sqlpluginsdir . $file;
if (preg_match('/^' . $this->getConfigKey('DB_TYPE') . '.*\.sql$/', $file) > 0) {
$directory_array[] = $file;
}
}
}
if (sizeof($directory_array)) {
sort($directory_array);
}
$dir->close();
}
for ($i = 0, $n = sizeof($directory_array); $i < $n; $i++) {
$file = $directory_array[$i];
if (file_exists($sqlpluginsdir . $file)) {
echo '
Processing Plugin: ' . $sqlpluginsdir . $file . '
';
executeSql($sqlpluginsdir . $file, $this->getConfigKey('DB_DATABASE'), $this->getConfigKey('DB_PREFIX'));
}
}
}
function dbAfterLoadActions() {
$this->dbActivate(); // can likely remove this line for v1.4
//update the cache folder setting:
$sql = "update ". $this->getConfigKey('DB_PREFIX') ."configuration set configuration_value='". $this->getConfigKey('DIR_FS_SQL_CACHE') ."' where configuration_key = 'SESSION_WRITE_DIRECTORY'";
$this->db->Execute($sql);
//update the logging_folder setting:
$sql = "update ". $this->getConfigKey('DB_PREFIX') ."configuration set configuration_value='". $this->getConfigKey('DIR_FS_SQL_CACHE') ."/page_parse_time.log' where configuration_key = 'STORE_PAGE_PARSE_TIME_LOG'";
$this->db->Execute($sql);
//update the phpbb setting:
$sql = "update ". $this->getConfigKey('DB_PREFIX') ."configuration set configuration_value='". $this->getConfigKey('PHPBB_ENABLE') ."' where configuration_key = 'PHPBB_LINKS_ENABLED'";
$this->db->Execute($sql);
}
function dbDemoDataInstall() {
$this->dbActivate(); // can likely remove this line for v1.4
global $db;
$db = $this->db;
executeSql('demo/' . DB_TYPE . '_demo.sql', DB_DATABASE, DB_PREFIX);
}
function validateStoreSetup($data) {
$this->configInfo['store_name'] = $this->isEmpty(zen_db_prepare_input($data['store_name']), ERROR_TEXT_STORE_NAME_ISEMPTY, ERROR_CODE_STORE_NAME_ISEMPTY);
$this->configInfo['store_owner'] = $this->isEmpty(zen_db_prepare_input($data['store_owner']), ERROR_TEXT_STORE_OWNER_ISEMPTY, ERROR_CODE_STORE_OWNER_ISEMPTY);
$this->configInfo['store_owner_email'] = $this->isEmpty(zen_db_prepare_input($data['store_owner_email']), ERROR_TEXT_STORE_OWNER_EMAIL_ISEMPTY, ERROR_CODE_STORE_OWNER_EMAIL_ISEMPTY);
$this->configInfo['store_owner_email'] = $this->isEmpty(zen_db_prepare_input($data['store_owner_email']), ERROR_TEXT_STORE_OWNER_EMAIL_NOTEMAIL, ERROR_CODE_STORE_OWNER_EMAIL_NOTEMAIL);
$this->configInfo['store_address'] = $this->isEmpty(zen_db_prepare_input($data['store_address']), ERROR_TEXT_STORE_ADDRESS_ISEMPTY, ERROR_CODE_STORE_ADDRESS_ISEMPTY);
$this->configInfo['store_country'] = zen_db_prepare_input($data['store_country']);
$this->configInfo['store_zone'] = zen_db_prepare_input($data['store_zone']);
$this->configInfo['store_default_language'] = zen_db_prepare_input($data['store_default_language']);
$this->configInfo['store_default_currency'] = zen_db_prepare_input($data['store_default_currency']);
}
function dbStoreSetup() {
$this->dbActivate(); // can likely remove this line for v1.4
$sql = "update " . DB_PREFIX . "configuration set configuration_value = '" . $this->db->prepare_input($this->configInfo['store_name']) . "' where configuration_key = 'STORE_NAME'";
$this->db->Execute($sql);
$sql = "update " . DB_PREFIX . "configuration set configuration_value = '" . $this->db->prepare_input($this->configInfo['store_owner']) . "' where configuration_key = 'STORE_OWNER'";
$this->db->Execute($sql);
$sql = "update " . DB_PREFIX . "configuration set configuration_value = '" . $this->db->prepare_input($this->configInfo['store_owner_email']) . "' where configuration_key in
('STORE_OWNER_EMAIL_ADDRESS', 'EMAIL_FROM', 'SEND_EXTRA_ORDER_EMAILS_TO', 'SEND_EXTRA_CREATE_ACCOUNT_EMAILS_TO', 'SEND_EXTRA_LOW_STOCK_EMAILS_TO', 'SEND_EXTRA_GV_CUSTOMER_EMAILS_TO', 'SEND_EXTRA_GV_ADMIN_EMAILS_TO', 'SEND_EXTRA_DISCOUNT_COUPON_ADMIN_EMAILS_TO', 'SEND_EXTRA_ORDERS_STATUS_ADMIN_EMAILS_TO', 'SEND_EXTRA_TELL_A_FRIEND_EMAILS_TO', 'SEND_EXTRA_REVIEW_NOTIFICATION_EMAILS_TO', 'MODULE_PAYMENT_CC_EMAIL')";
$this->db->Execute($sql);
$sql = "update " . DB_PREFIX . "configuration set configuration_value = '" . $this->db->prepare_input($this->configInfo['store_country']) . "' where configuration_key in ('STORE_COUNTRY', 'SHIPPING_ORIGIN_COUNTRY')";
$this->db->Execute($sql);
$sql = "update " . DB_PREFIX . "configuration set configuration_value = '" . $this->db->prepare_input($this->configInfo['store_zone']) . "' where configuration_key = 'STORE_ZONE'";
$this->db->Execute($sql);
$sql = "update " . DB_PREFIX . "configuration set configuration_value = '" . $this->db->prepare_input($this->configInfo['store_address']) . "' where configuration_key = 'STORE_NAME_ADDRESS'";
$this->db->Execute($sql);
$sql = "update " . DB_PREFIX . "configuration set configuration_value = '" . $this->db->prepare_input($this->configInfo['store_default_language']) . "' where configuration_key = 'DEFAULT_LANGUAGE'";
$this->db->Execute($sql);
$sql = "update " . DB_PREFIX . "configuration set configuration_value = '" . $this->db->prepare_input($this->configInfo['store_default_currency']) . "' where configuration_key = 'DEFAULT_CURRENCY'";
$this->db->Execute($sql);
$sql = "update " . DB_PREFIX . "currencies set value = 1 where code = '" . $this->db->prepare_input($this->configInfo['store_default_currency']) . "'";
$this->db->Execute($sql);
}
function validateAdminSetup($data) {
$this->dbActivate();
if (!isset($this->configInfo['check_for_updates'])) $this->configInfo['check_for_updates'] = (isset($data['check_for_updates']) && $data['check_for_updates']== '1' ) ? 1 : 0;
$this->configInfo['admin_username'] = zen_db_prepare_input($data['admin_username']);
$this->configInfo['admin_email'] = zen_db_prepare_input($data['admin_email']);
$this->configInfo['admin_pass'] = zen_db_prepare_input($data['admin_pass']);
$this->isEmpty($this->configInfo['admin_username'], ERROR_TEXT_ADMIN_USERNAME_ISEMPTY, ERROR_CODE_ADMIN_USERNAME_ISEMPTY);
$this->isEmpty($this->configInfo['admin_email'], ERROR_TEXT_ADMIN_EMAIL_ISEMPTY, ERROR_CODE_ADMIN_EMAIL_ISEMPTY);
$this->isEmail($this->configInfo['admin_email'], ERROR_TEXT_ADMIN_EMAIL_NOTEMAIL, ERROR_CODE_ADMIN_EMAIL_NOTEMAIL);
$this->isEmpty($this->configInfo['admin_pass'], ERROR_TEXT_ADMIN_PASS_ISEMPTY, ERROR_CODE_ADMIN_PASS_ISEMPTY);
}
function dbAdminSetup() {
$this->dbActivate(); // can likely remove this line for v1.4
$sql = "update " . DB_PREFIX . "admin set admin_name = '" . $this->configInfo['admin_username'] . "', admin_email = '" . $this->configInfo['admin_email'] . "', admin_pass = '" . zen_encrypt_password($this->configInfo['admin_pass']) . "' where admin_id = 1";
$this->db->Execute($sql) or die("Error in query: $sql".$this->db->ErrorMsg());
// enable/disable automatic version-checking
$sql = "update " . DB_PREFIX . "configuration set configuration_value = '".($this->configInfo['check_for_updates'] ? 'true' : 'false' ) ."' where configuration_key = 'SHOW_VERSION_UPDATE_IN_HEADER'";
$this->db->Execute($sql) or die("Error in query: $sql".$this->db->ErrorMsg());
$this->db->Close();
}
function verifyAdminCredentials($admin_name, $admin_pass) {
// security check
if ($admin_name == '' || $admin_name == 'demo' || $admin_pass == '') {
$this->setError(ERROR_TEXT_ADMIN_PWD_REQUIRED, ERROR_CODE_ADMIN_PWD_REQUIRED, true);
} else {
$admin_name = zen_db_prepare_input($admin_name);
$admin_pass = zen_db_prepare_input($admin_pass);
$sql = "select admin_id, admin_name, admin_pass from " . DB_PREFIX . "admin where admin_name = '" . $admin_name . "'";
//open database connection to run queries against it
$this->dbActivate();
$result = $this->db->Execute($sql);
if ($admin_name != $result->fields['admin_name']) {
$this->setError(ERROR_TEXT_ADMIN_PWD_REQUIRED, ERROR_CODE_ADMIN_PWD_REQUIRED, true);
}
if (!zen_validate_password($admin_pass, $result->fields['admin_pass'])) {
$this->setError(ERROR_TEXT_ADMIN_PWD_REQUIRED, ERROR_CODE_ADMIN_PWD_REQUIRED, true);
}
$this->db->Close();
}
}
function doPrefixRename($newprefix, $db_prefix_rename_from) {
$this->test_admin_configure(ERROR_TEXT_ADMIN_CONFIGURE,ERROR_CODE_ADMIN_CONFIGURE, true);
$this->test_store_configure(ERROR_TEXT_STORE_CONFIGURE,ERROR_CODE_STORE_CONFIGURE);
$this->test_admin_configure_write(ERROR_TEXT_ADMIN_CONFIGURE_WRITE,ERROR_CODE_ADMIN_CONFIGURE_WRITE);
$this->test_store_configure_write(ERROR_TEXT_STORE_CONFIGURE_WRITE,ERROR_CODE_STORE_CONFIGURE_WRITE);
$this->functionExists(DB_TYPE, ERROR_TEXT_DB_NOTSUPPORTED, ERROR_CODE_DB_NOTSUPPORTED);
$this->dbConnect(DB_TYPE, DB_SERVER, DB_DATABASE, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, ERROR_TEXT_DB_CONNECTION_FAILED, ERROR_CODE_DB_CONNECTION_FAILED,ERROR_TEXT_DB_NOTEXIST, ERROR_CODE_DB_NOTEXIST);
// security check
if ((!isset($_POST['adminid']) && !isset($_POST['adminpwd'])) || $_POST['adminid']=='' || $_POST['adminid']=='demo') {
$this->setError(ERROR_TEXT_ADMIN_PWD_REQUIRED, ERROR_CODE_ADMIN_PWD_REQUIRED, true);
} else {
$this->verifyAdminCredentials($_POST['adminid'], $_POST['adminpwd']);
}
// end admin verification
if (ZC_UPG_DEBUG2==true) echo 'Processing prefix updates...
';
if ($this->error == false && $nothing_to_process==false) {
$this->dbActivate();
$tables = $this->db->Execute("SHOW TABLES"); // get a list of tables to compare against
$tables_list = array();
while (!$tables->EOF) {
$tables_list[] = $tables->fields['Tables_in_' . DB_DATABASE];
$tables->MoveNext();
} //end while
//read the "database_tables.php" files, and loop through the table names
foreach($database_tablenames_array as $filename) {
if (!file_exists($filename)) continue;
$lines = file($filename);
foreach ($lines as $line) {
$line = trim($line);
if (substr($line,0,1) != '<' && substr($line,0,2) != '?'.'>' && substr($line,0,2) != '//' && $line != '') {
// echo 'line='.$line.'
';
$def_string=array();
$def_string=explode("'",$line);
//define('TABLE_CONSTANT',DB_PREFIX.'tablename');
//[1]=TABLE_CONSTANT
//[2]=,DB_PREFIX.
//[3]=tablename
//[4]=);
//[5]=
//echo '[1]->'.$def_string[1].'
';
//echo '[2]->'.$def_string[2].'
';
//echo '[3]->'.$def_string[3].'
';
//echo '[4]->'.$def_string[4].'
';
//echo '[5]->'.$def_string[5].'
';
if (strtoupper($def_string[1]) != 'DB_PREFIX' // the define of DB_PREFIX is not a tablename
&& str_replace('PHPBB','',strtoupper($def_string[1]) ) == strtoupper($def_string[1]) // this is not a phpbb table
&& str_replace(' ','',$def_string[2]) == ',DB_PREFIX.') { // this is a Zen Cart-related table (vs phpbb)
$tablename_read = $def_string[3];
foreach($tables_list as $existing_table) {
if ($tablename_read == str_replace($db_prefix_rename_from,'',$existing_table)) {
//echo $tablename_read.'
';
$sql_command = 'alter table '. $db_prefix_rename_from . $tablename_read . ' rename ' . $newprefix.$tablename_read;
//echo $sql_command .'
';
$this->db->Execute($sql_command);
$tables_updated++;
$tablename_read = '';
$sql_command = '';
}//endif $tablename_read == existing
}//end foreach $tables_list
} //endif is "DEFINE"?
} // endif substring not < or ? or // etc
} //end foreach $lines
}//end foreach $database_tablenames array
$this->db->Close();
} // end if zc_install-error
//echo $tables_updated;
if ($tables_updated <50) $this->setError(ERROR_TEXT_TABLE_RENAME_INCOMPLETE, ERROR_CODE_TABLE_RENAME_INCOMPLETE, false);
if ($tables_updated >50) {
//update the configure.php files with the new prefix.
$configure_files_updated = 0;
foreach($configure_files_array as $filename) {
$lines = file($filename);
$full_file = '';
foreach ($lines as $line) {
$def_string=explode("'",$line);
if (strtoupper($def_string[1]) == 'DB_PREFIX') {
// check to see if prefix found matches what we've been processing... for safety to be sure we have the right line
$old_prefix_from_file = $def_string[3];
if ($old_prefix_from_file == DB_PREFIX || $old_prefix_from_file == $db_prefix_rename_from) {
$line = ' define(\'DB_PREFIX\', \'' . $newprefix. '\');' . "\n";
$configure_files_updated++;
}
} // endif DEFINE DB_PREFIX found;
$full_file .= $line;
} //end foreach $lines
$fp = fopen($filename, 'w');
fputs($fp, $full_file);
fclose($fp);
@chmod($filename, 0644);
} //end foreach array to update configure.php files
if ($configure_files_updated <2) $this->setError(ERROR_TEXT_TABLE_RENAME_CONFIGUREPHP_FAILED, ERROR_CODE_TABLE_RENAME_CONFIGUREPHP_FAILED, false);
} //endif $tables_updated count sufficient
}
} // end class
?>