You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

645 lines
19 KiB

<?php
/**
* ECSHOP 升级程序 之 控制器
* ============================================================================
* * 版权所有 2005-2012 上海商创网络科技有限公司,并保留所有权利。
* 网站地址: http://www.ecmoban.com
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
* 使用;不允许对程序代码以任何形式任何目的的再发布。
* ============================================================================
* $Author: liubo $
* $Date: 2009-12-14 17:22:19 +0800 (一, 2009-12-14) $
* $Id: index.php 16882 2009-12-14 09:22:19Z liubo $
*/
require_once('./includes/init.php');
/* 初始化EC的字符集与语言变量*/
$updater_lang = $ec_charset = '';
if (!empty($_POST['lang']))
{
$lang_charset = explode('_', $_POST['lang']);
$updater_lang = $lang_charset[0].'_'.$lang_charset[1];
$ec_charset = $lang_charset[2];
}
if(file_exists(ROOT_PATH ."data/install.lock.php"))
{
die('You have installed! ');
}
if(empty($updater_lang))
{
if (defined('EC_LANGUAGE'))
{
$updater_lang = EC_LANGUAGE;
}
else
{
$updater_lang = get_current_lang();
if($updater_lang === false)
{
die('Please set system\'s language!');
}
}
}
if (empty($ec_charset))
{
if (isset($_COOKIE['ECCC']))
{
$ec_charset = $_COOKIE['ECCC'];
}
elseif (defined('EC_CHARSET'))
{
$ec_charset = EC_CHARSET;
}
elseif (get_current_version() < 'v2.6.0')
{
$ec_charset = 'utf-8';
}
else
{
$ec_charset = 'utf-8';
}
}
/* 发送HTTP头部,保证浏览器识别UTF8编码 */
@header('Content-type: text/html; charset='.$ec_charset);
//echo $updater_lang . '_' . $ec_charset;
/* 加载升级程序所使用的语言包 */
$updater_lang_package_path = ROOT_PATH . 'demo/languages/' . $updater_lang . '_' . $ec_charset .'.php';
if (file_exists($updater_lang_package_path))
{
include_once($updater_lang_package_path);
$smarty->assign('lang', $_LANG);
}
else
{
die('Can\'t find language package!');
}
/* 初始化流程控制变量 */
$step = isset($_REQUEST['step']) ? $_REQUEST['step'] : 'sel_lang';
$smarty->assign('ec_charset', $ec_charset);
$smarty->assign('updater_lang', $updater_lang);
switch($step)
{
/* 选择语言编码页面 */
case 'sel_lang' :
$smarty->display('lang.php');
break;
/* 说明页面 */
case 'readme' :
write_charset_config($updater_lang, $ec_charset);
$smarty->assign('new_version', VERSION);
$smarty->assign('old_version', get_current_version());
$smarty->assign('ui', empty($_REQUEST['ui'])?'ecshop':$_REQUEST['ui']);
$smarty->assign('mysql_charset', $mysql_charset);
$smarty->assign('ecshop_charset', $ecshop_charset);
$smarty->display('readme.php');
break;
/* UC 安装配置检测 */
case 'uccheck' :
$smarty->assign('ucapi', $_POST['ucapi']);
$smarty->assign('ucfounderpw', $_POST['ucfounderpw']);
$smarty->assign('installer_lang', $installer_lang);
$smarty->display('uc_check.php');
break;
case 'setup_ucenter' :
include_once(ROOT_PATH . 'includes/cls_json.php');
$json = new JSON();
$result = array('error' => 0, 'message' => '');
$app_type = 'ECSHOP';
$app_name = $db->getOne('SELECT value FROM ' . $ecs->table('shop_config') . " WHERE code = 'shop_name'");
$app_url = url();
$app_charset = EC_CHARSET;
$app_dbcharset = strtolower((str_replace('-', '', EC_CHARSET)));
$ucapi = !empty($_POST['ucapi']) ? trim($_POST['ucapi']) : '';
$ucip = !empty($_POST['ucip']) ? trim($_POST['ucip']) : '';
$dns_error = false;
if(!$ucip)
{
$temp = @parse_url($ucapi);
$ucip = gethostbyname($temp['host']);
if(ip2long($ucip) == -1 || ip2long($ucip) === FALSE)
{
$ucip = '';
$dns_error = true;
}
}
if($dns_error){
$result['error'] = 2;
$result['message'] = '';
die($json->encode($result));
}
$ucfounderpw = trim($_POST['ucfounderpw']);
$app_tagtemplates = 'apptagtemplates[template]='.urlencode('<a href="{url}" target="_blank">{goods_name}</a>').'&'.
'apptagtemplates[fields][goods_name]='.urlencode($_LANG['tagtemplates_goodsname']).'&'.
'apptagtemplates[fields][uid]='.urlencode($_LANG['tagtemplates_uid']).'&'.
'apptagtemplates[fields][username]='.urlencode($_LANG['tagtemplates_username']).'&'.
'apptagtemplates[fields][dateline]='.urlencode($_LANG['tagtemplates_dateline']).'&'.
'apptagtemplates[fields][url]='.urlencode($_LANG['tagtemplates_url']).'&'.
'apptagtemplates[fields][image]='.urlencode($_LANG['tagtemplates_image']).'&'.
'apptagtemplates[fields][goods_price]='.urlencode($_LANG['tagtemplates_price']);
$postdata ="m=app&a=add&ucfounder=&ucfounderpw=".urlencode($ucfounderpw)."&apptype=".urlencode($app_type).
"&appname=".urlencode($app_name)."&appurl=".urlencode($app_url)."&appip=&appcharset=".$app_charset.
'&appdbcharset='.$app_dbcharset.'&apptagtemplates='.$app_tagtemplates;
$ucconfig = dfopen($ucapi.'/index.php', 500, $postdata, '', 1, $ucip);
if(empty($ucconfig))
{
//ucenter 验证失败
$result['error'] = 1;
$result['message'] = '验证失败';
}
elseif($ucconfig == '-1')
{
//管理员密码无效
$result['error'] = 1;
$result['message'] = '创始人密码错误';
}
else
{
list($appauthkey, $appid) = explode('|', $ucconfig);
if(empty($appauthkey) || empty($appid))
{
//ucenter 安装数据错误
$result['error'] = 1;
$result['message'] = '安装数据错误';
}
elseif(($succeed = save_uc_config($ucconfig."|$ucapi|$ucip")))
{
$result['error'] = 0;
$result['message'] = 'OK';
}
else
{
//config文件写入错误
$result['error'] = 1;
$result['message'] = '配置文件写入错误';
}
}
die($json->encode($result));
break;
/* 会员数据合并界面 */
case 'usersmerge' :
include(ROOT_PATH . 'data/config.php');
if (UC_CHARSET != EC_CHARSET)
{
$smarty->assign('not_match', true);
}
else
{
$link = @mysql_connect(UC_DBHOST, UC_DBUSER, UC_DBPW);
if (!$link)
{
$smarty->assign('noucdb', true);
}
else
{
@mysql_close($link);
$ucdb = new cls_mysql(UC_DBHOST, UC_DBUSER, UC_DBPW, UC_DBNAME, UC_DBCHARSET);
$maxuid = intval($ucdb->getOne("SELECT MAX(uid)+1 FROM ".UC_DBTABLEPRE."members LIMIT 1"));
$smarty->assign('maxuid', $maxuid);
}
}
$smarty->display('usermerge.php');
break;
/*将会员数据导入到uc*/
case 'userimporttouc' :
include(ROOT_PATH . 'data/config.php');
include_once(ROOT_PATH . 'includes/cls_json.php');
$ucdb = new cls_mysql(UC_DBHOST, UC_DBUSER, UC_DBPW, UC_DBNAME, UC_DBCHARSET);
$json = new JSON();
$result = array('error' => 0, 'message' => '');
$maxuid = intval($ucdb->getOne("SELECT MAX(uid)+1 FROM ".UC_DBTABLEPRE."members LIMIT 1"));
$merge_method = intval($_POST['merge']);
$merge_uid = array();
$uc_uid = array();
$repeat_user = array();
$query = $db->query("SELECT * FROM " . $ecs->table('users') . " ORDER BY `user_id` ASC");
while($data = $db->fetch_array($query))
{
$salt = rand(100000, 999999);
$password = md5($data['password'].$salt);
$data['username'] = addslashes($data['user_name']);
$lastuid = $data['user_id'] + $maxuid;
$uc_userinfo = $ucdb->getRow("SELECT `uid`, `password`, `salt` FROM ".UC_DBTABLEPRE."members WHERE `username`='$data[username]'");
if(!$uc_userinfo)
{
$ucdb->query("INSERT LOW_PRIORITY INTO ".UC_DBTABLEPRE."members SET uid='$lastuid', username='$data[username]', password='$password', email='$data[email]', regip='$data[regip]', regdate='$data[regdate]', salt='$salt'", 'SILENT');
$ucdb->query("INSERT LOW_PRIORITY INTO ".UC_DBTABLEPRE."memberfields SET uid='$lastuid'",'SILENT');
}
else
{
if ($merge_method == 1)
{
if (md5($data['password'].$uc_userinfo['salt']) == $uc_userinfo['password'])
{
$merge_uid[] = $data['user_id'];
$uc_uid[] = array('user_id' => $data['user_id'], 'uid' => $uc_userinfo['uid']);
continue;
}
}
$ucdb->query("REPLACE INTO ".UC_DBTABLEPRE."mergemembers SET appid='".UC_APPID."', username='$data[username]'", 'SILENT');
$repeat_user[] = $data;
}
}
$ucdb->query("ALTER TABLE ".UC_DBTABLEPRE."members AUTO_INCREMENT=".($lastuid + 1), 'SILENT');
//需要更新user_id的表
$up_user_table = array('account_log', 'affiliate_log', 'booking_goods', 'collect_goods', 'comment', 'feedback', 'order_info', 'snatch_log', 'tag', 'users', 'user_account', 'user_address', 'user_bonus');
// 清空的表
$truncate_user_table = array('cart', 'sessions', 'sessions_data');
if (!empty($merge_uid))
{
$merge_uid = implode(',', $merge_uid);
}
else
{
$merge_uid = 0;
}
// 更新ECSHOP表
foreach ($up_user_table as $table)
{
$db->query("UPDATE " . $ecs->table($table) . " SET `user_id`=`user_id`+ $maxuid ORDER BY `user_id` DESC");
foreach ($uc_uid as $uid)
{
$db->query("UPDATE " . $ecs->table($table) . " SET `user_id`='" . $uid['uid'] . "' WHERE `user_id`='" . ($uid['user_id'] + $maxuid) . "'");
}
}
foreach ($truncate_user_table as $table)
{
$db->query("TRUNCATE TABLE " . $ecs->table($table));
}
// 保存重复的用户信息
if (!empty($repeat_user))
{
@file_put_contents(ROOT_PATH . 'data/repeat_user.php', $json->encode($repeat_user));
}
$result['error'] = 0;
$result['message'] = 'OK';
die($json->encode($result));
break;
/* 检查环境页面 */
case 'check' :
include_once(ROOT_PATH . 'demo/includes/lib_env_checker.php');
include_once(ROOT_PATH . 'demo/includes/checking_dirs.php');
$ui = isset($_REQUEST['ui']) ? $_REQUEST['ui'] : 'ecshop';
if ($ui == 'ecshop')
{
array_shift($checking_dirs);
}
$dir_checking = check_dirs_priv($checking_dirs);
$templates_root = array(
'dwt' => ROOT_PATH . 'themes/default/',
'lbi' => ROOT_PATH . 'themes/default/library/');
$template_checking = check_templates_priv($templates_root);
$rename_priv = check_rename_priv();
$disabled = '';
if ($dir_checking['result'] === 'ERROR'
|| !empty($template_checking)
|| !empty($rename_priv))
{
$disabled = 'disabled="true"';
}
$has_unwritable_tpl = 'yes';
if (empty($template_checking))
{
$template_checking = $_LANG['all_are_writable'];
$has_unwritable_tpl = 'no';
}
$smarty->assign('config_info', get_config_info());
$smarty->assign('dir_checking', $dir_checking['detail']);
$smarty->assign('has_unwritable_tpl', $has_unwritable_tpl);
$smarty->assign('template_checking', $template_checking);
$smarty->assign('rename_priv', $rename_priv);
$smarty->assign('disabled', $disabled);
$smarty->display('checking.php');
break;
/* 获得版本列表 */
case 'get_ver_list' :
include_once(ROOT_PATH . 'includes/cls_json.php');
$json = new JSON();
$cur_ver = get_current_version();
$new_ver = get_new_version();
$needup_ver_list = get_needup_version_list($cur_ver, $new_ver);
/* 安装测试数据 */
if (file_exists(ROOT_PATH . 'demo/'. $system_lang . '.sql'))
{
$sql_files = array(ROOT_PATH . 'demo/'. $system_lang . '.sql');
}
else
{
$sql_files = array(ROOT_PATH . 'demo/zh_cn.sql');
}
if (!install_data($sql_files))
{
die(implode(',', $err->last_message()));
}
if (!copy_files(ROOT_PATH . 'demo/brandlogo/', ROOT_PATH . 'data/brandlogo/'))
{
die(implode(',', $err->last_message()));
}
if (!copy_files(ROOT_PATH . 'demo/200905/goods_img/', ROOT_PATH . 'images/200905/goods_img/'))
{
die(implode(',', $err->last_message()));
}
if (!copy_files(ROOT_PATH . 'demo/200905/thumb_img/', ROOT_PATH . 'images/200905/thumb_img/'))
{
die(implode(',', $err->last_message()));
}
if (!copy_files(ROOT_PATH . 'demo/200905/source_img/', ROOT_PATH . 'images/200905/source_img/'))
{
die(implode(',', $err->last_message()));
}
if (!copy_files(ROOT_PATH . 'demo/afficheimg/', ROOT_PATH . 'data/afficheimg/'))
{
die(implode(',', $err->last_message()));
}
if (!copy_files(ROOT_PATH . 'demo/packimg/', ROOT_PATH . 'data/packimg/'))
{
die(implode(',', $err->last_message()));
}
if (!copy_files(ROOT_PATH . 'demo/cardimg/', ROOT_PATH . 'data/cardimg/'))
{
die(implode(',', $err->last_message()));
}
$result = array('msg'=>'OK', 'cur_ver'=>$cur_ver, 'needup_ver_list'=>$needup_ver_list);
echo $json->encode($result);
break;
/* 获得某个SQL文件的SQL语句数 */
case 'get_record_number' :
include_once(ROOT_PATH . 'includes/cls_json.php');
$json = new JSON();
$next_ver = isset($_REQUEST['next_ver']) ? $_REQUEST['next_ver'] : '';
$type = isset($_REQUEST['type']) ? $_REQUEST['type'] : '';
if ($next_ver === '' || $type === '')
{
die('EMPTY');
}
$result = array('msg'=>'OK', 'rec_num'=>get_record_number($next_ver, $type));
echo $json->encode($result);
break;
/* 备份数据库 */
case 'dump_database' :
include_once(ROOT_PATH . 'includes/cls_json.php');
$json = new JSON();
$next_ver = isset($_REQUEST['next_ver']) ? $_REQUEST['next_ver'] : '';
if ($next_ver === '')
{
die('EMPTY');
}
$result = dump_database($next_ver);
if($result === false)
{
echo implode(',', $err->last_message());
}
else
{
echo 'OK';
}
break;
case 'rollback' :
include_once(ROOT_PATH . 'includes/cls_json.php');
$json = new JSON();
$next_ver = isset($_REQUEST['next_ver']) ? $_REQUEST['next_ver'] : '';
if ($next_ver === '')
{
die('EMPTY');
}
$result = rollback($next_ver);
if($result === false)
{
echo implode(',', $err->last_message());
}
else
{
echo 'OK';
}
break;
/* 升级文件 */
case 'update_files' :
include_once(ROOT_PATH . 'includes/cls_json.php');
$json = new JSON();
$next_ver = isset($_REQUEST['next_ver']) ? $_REQUEST['next_ver'] : '';
if ($next_ver === '')
{
die('EMPTY');
}
$result = update_files($next_ver);
echo $json->encode($result);
break;
/* 升级数据结构 */
case 'update_structure' :
$next_ver = isset($_REQUEST['next_ver']) ? $_REQUEST['next_ver'] : '';
$cur_pos = isset($_REQUEST['cur_pos']) ? $_REQUEST['cur_pos'] : '';
if ($next_ver === '' || intval($cur_pos) < 1)
{
die('EMPTY');
}
$result = update_structure_automatically($next_ver, intval($cur_pos)-1);
if ($result === false)
{
echo implode(',', $err->last_message());
}
else
{
echo 'OK';
}
break;
/* 升级数据 */
case 'update_data' :
$next_ver = isset($_REQUEST['next_ver']) ? $_REQUEST['next_ver'] : '';
if ($next_ver === '')
{
die('EMPTY');
}
update_database_optionally($next_ver);
$result = update_data_automatically($next_ver);
if ($result === false)
{
die(implode(',', $err->last_message()));
}
echo 'OK';
break;
/* 更新版本号 */
case 'update_version' :
$next_ver = isset($_REQUEST['next_ver']) ? $_REQUEST['next_ver'] : '';
if ($next_ver === '')
{
die('EMPTY');
}
//update_version($next_ver);
echo 'OK';
break;
/* 成功页面 */
case 'done' :
$ui = isset($_REQUEST['ui']) ? $_REQUEST['ui'] : 'ecshop';
if ($ui == 'ucenter')
{
change_ucenter_config();
}
clear_all_files();
// remove_ucenter_config();
// remove_lang_config();
$smarty->display('done.php');
break;
/* 出错页面 */
case 'error' :
$err_msg = implode(',', $err->get_all());
if (empty($err_msg))
{
$err_msg = $_LANG['js_error'];
}
$smarty->assign('err_msg', $err_msg);
$smarty->display('error.php');
break;
/* 出现异常 */
default :
die('ERROR, unknown step!');
}
/**
* 把一个文件从一个目录复制到另一个目录
*
* @access public
* @param string $source 源目录
* @param string $target 目标目录
* @return boolean 成功返回true,失败返回false
*/
function copy_files($source, $target)
{
global $err, $_LANG;
if (!file_exists($target))
{
//if (!mkdir(rtrim($target, '/'), 0777))
if (!mkdir($target, 0777))
{
$err->add($_LANG['cannt_mk_dir']);
return false;
}
@chmod($target, 0777);
}
$dir = opendir($source);
while (($file = @readdir($dir)) !== false)
{
if (is_file($source . $file))
{
if (!copy($source . $file, $target . $file))
{
$err->add($_LANG['cannt_copy_file']);
return false;
}
@chmod($target . $file, 0777);
}
}
closedir($dir);
return true;
}
/**
* 安装数据
*
* @access public
* @param array $sql_files SQL文件路径组成的数组
* @return boolean 成功返回true,失败返回false
*/
function install_data($sql_files)
{
global $err;
include(ROOT_PATH . 'data/config.php');
include_once(ROOT_PATH . 'includes/cls_mysql.php');
include_once(ROOT_PATH . 'includes/cls_sql_executor.php');
$db = new cls_mysql($db_host, $db_user, $db_pass, $db_name);
$se = new sql_executor($db, EC_DB_CHARSET, 'ecs_', $prefix);
$result = $se->run_all($sql_files);
return true;
}
?>