error_reporting(0);
@set_time_limit(0);
@set_magic_quotes_runtime(0);
ob_start();
define('IA_ROOT', str_replace("\\",'/', dirname(__FILE__)));
if($_GET['res']) {
$res = $_GET['res'];
$reses = tpl_resources();
if(array_key_exists($res, $reses)) {
if($res == 'css') {
header('content-type:text/css');
} else {
header('content-type:image/png');
}
echo base64_decode($reses[$res]);
exit();
}
}
$actions = array('license', 'env', 'db', 'finish');
$action = $_COOKIE['action'];
$action = in_array($action, $actions) ? $action : 'license';
$ispost = strtolower($_SERVER['REQUEST_METHOD']) == 'post';
if(file_exists(IA_ROOT . '/data/install.lock') && $action != 'finish') {
header('location: ./index.php');
}
header('content-type: text/html; charset=utf-8');
if($action == 'license') {
if($ispost) {
setcookie('action', 'env');
header('location: ?refresh');
}
tpl_install_license();
}
if($action == 'env') {
if($ispost) {
setcookie('action', isset($_POST['continue']) ? 'db' : 'license');
header('location: ?refresh');
}
$result = array();
$result['env_os'] = PHP_OS;
$result['env_version'] = PHP_VERSION;
$result['env_server'] = $_SERVER['SERVER_SOFTWARE'];
$result['env_pathroot'] = IA_ROOT;
$result['env_uploadsize'] = @ini_get('file_uploads') ? ini_get('upload_max_filesize') : 'unknow';
if(function_exists('disk_free_space')) {
$result['env_diskspace'] = floor(disk_free_space(IA_ROOT) / (1024*1024)).'M';
} else {
$result['env_diskspace'] = 'unknow';
}
$tmp = function_exists('gd_info') ? gd_info() : array();
$result['env_gd'] = empty($tmp['GD Version']) ? 'noext' : $tmp['GD Version'];
$chk_func = array(
array('method' => 'ini_get','name' => 'allow_url_fopen'),
array('method' => 'function_exists','name' => 'mysql_connect'),
array('method' => 'function_exists','name' => 'file_get_contents'),
array('method' => 'function_exists','name' => 'fsockopen'),
array('method' => 'function_exists','name' => 'xml_parser_create'),
array('method' => 'extension_loaded','name' => 'pdo_mysql'),
array('method' => 'function_exists','name' => 'curl_init')
);
$result['iscontinue'] = true;
foreach ($chk_func as $func) {
$check[$func['name']] = $func['method']($func['name']) ? true : false;
$result[$func['name']] = $func['method']($func['name']) ? '[√]On' : '[×]Off';
}
if (!empty($check['mysql_connect']) || !empty($check['pdo_mysql'])) {
$result['iscontinue'] = true;
} else {
$result['iscontinue'] = false;
}
unset($check['mysql_connect']);unset($check['pdo_mysql']);
foreach ($check as $condition) {
if (empty($condition)) {
$result['iscontinue'] = false;
}
}
$result['chk_dir'] = array(
'/',
);
foreach ($result['chk_dir'] as $dir) {
if(!local_writeable(IA_ROOT . $dir)) {
$result['chk_'.md5($dir)] = '[×]不可写';
$result['iscontinue'] = false;
} else {
$result['chk_'.md5($dir)] = '[√]可写';
}
}
tpl_install_check_env($result);
}
if($action == 'db') {
if($ispost) {
if(isset($_POST['back'])) {
setcookie('action', 'env');
header('location: ?refresh');
exit();
}
$error_msg = '';
$family = $_POST['family'] == 'x' ? 'x' : 'v';
$dbhost = $_POST['dbhost'];
$dbuser = $_POST['dbuser'];
$dbpwd = $_POST['dbpwd'];
$dbname = $_POST['dbname'];
$dbprefix = $_POST['dbprefix'];
$adminuser = $_POST['adminuser'];
$adminpwd = $_POST['adminpwd'];
$cookiepre = local_salt(4).'_';
$authkey = local_salt(16).'_';
$link = mysql_connect($dbhost, $dbuser, $dbpwd);
if(empty($link)) {
$error = mysql_error();
$error_msg = "$error
";
} else {
mysql_query("SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary");
mysql_query("SET sql_mode=''");
if(mysql_errno()) {
$error_msg = mysql_error() ."
";
} else {
$query = mysql_query("SHOW DATABASES LIKE '{$dbname}';");
if (!mysql_fetch_assoc($query)) {
if(mysql_get_server_info() > '4.1') {
mysql_query("CREATE DATABASE IF NOT EXISTS `{$dbname}` DEFAULT CHARACTER SET utf8", $link);
} else {
mysql_query("CREATE DATABASE IF NOT EXISTS `{$dbname}`", $link);
}
}
$query = mysql_query("SHOW DATABASES LIKE '{$dbname}';");
if (!mysql_fetch_assoc($query)) {
$error_msg .= "数据库不存在且创建数据库失败.
";
}
if(mysql_errno()) {
$error_msg .= mysql_error() . "
";
}
}
}
if (empty($error_msg)) {
//写入配置信息
$dbport = explode(':', $dbhost);
$dbport = !empty($dbport[1]) ? $dbport[1] : '3306';
$config = local_config();
$config = str_replace(array(
'{dbhost}', '{dbuser}', '{dbpwd}', '{dbport}', '{dbname}', '{dbtablepre}', '{cookiepre}', '{authkey}', '{attachdir}'
), array(
"'$dbhost'", "'$dbuser'", "'$dbpwd'", "'$dbport'", $dbname, $dbprefix, $cookiepre, $authkey, 'resource/attachment/'
), $config);
mysql_select_db($dbname);
$query = mysql_query("SHOW TABLES LIKE '{$dbprefix}%';");
if (mysql_fetch_assoc($query)) {
die('');
}
if($_POST['install'] == 'remote') {
$ins = remote_install();
if(empty($ins) || !is_array($ins)) {
die('');
}
if($ins['error']) {
die('');
}
if(empty($ins['scripts']) || !is_array($ins['scripts'])) {
die('');
}
$archive = remote_download($ins['attachments']);
if(!$archive) {
die('');
}
$fp = fopen($archive, 'r');
if ($fp) {
$buffer = '';
while (!feof($fp)) {
$buffer .= fgets($fp, 4096);
if($buffer[strlen($buffer) - 1] == "\n") {
$pieces = explode(':', $buffer);
$path = base64_decode($pieces[0]);
$dat = base64_decode($pieces[1]);
$fname = IA_ROOT . $path;
local_mkdirs(dirname($fname));
file_put_contents($fname, $dat);
$buffer = '';
}
}
fclose($fp);
}
unlink($archive);
mysql_close($link);
$link = mysql_connect($dbhost, $dbuser, $dbpwd);
mysql_query("SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary");
mysql_query("SET sql_mode=''");
mysql_select_db($dbname);
$version = '';
$release = '';
foreach($ins['scripts'] as $sch) {
$version = $sch['version'];
$release = $sch['release'];
runquery($sch['content']);
}
$verfile = IA_ROOT . '/source/version.inc.php';
$verdat = <<
/**
* 版本号
*
* [WeEngine System] Copyright (c) 2013 WE7.CC
*/
defined('IN_IA') or exit('Access Denied');
define('IMS_FAMILY', '{$ins['family']}');
define('IMS_VERSION', '{$version}');
define('IMS_RELEASE_DATE', '{$release}');
VER;
file_put_contents($verfile, $verdat);
} else {
$verfile = IA_ROOT . '/source/version.inc.php';
if(file_exists(IA_ROOT . '/index.php') && file_exists(IA_ROOT . '/setting.php') && file_exists($verfile)) {
$sql = file_get_contents(IA_ROOT . '/data/install.sql');
if(empty($sql)) {
die('');
}
runquery($sql);
} else {
die('');
}
}
$salt = local_salt(8);
$password = sha1("{$adminpwd}-{$salt}-{$authkey}");
mysql_query("INSERT INTO {$dbprefix}members (username, password, salt, joindate) VALUES('{$adminuser}', '$password', '$salt', '".time()."')");
$uid = mysql_insert_id();
//新建默认公众号
$wechat = array(
'hash' => local_salt(5),
'type' => '1',
'uid' => $uid,
'token' => local_salt(32),
'access_token' => '',
'name' => '默认公众号',
'account' => '默认公众号',
'original' => '',
'signature' => '',
'country' => '',
'province' => '',
'city' => '',
'username' => '',
'password' => '',
'welcome' => '欢迎信息',
'default' => '默认回复',
'default_period' => '0',
'lastupdate' => '',
'key' => '',
'secret' => '',
'styleid' => '1',
);
mysql_query("INSERT INTO `{$dbprefix}wechats` (`".implode("`,`", array_keys($wechat))."`) VALUES ('".implode("','", $wechat)."')");
local_mkdirs(IA_ROOT . '/data');
file_put_contents(IA_ROOT . '/data/config.php', $config);
touch(IA_ROOT . '/data/install.lock');
setcookie('action', 'finish');
header('location: ?refresh');
exit();
}
}
tpl_install_db($error_msg);
}
if($action == 'finish') {
setcookie('action', '', -10);
@unlink(IA_ROOT . '/data/install.sql');
define('IN_SYS', true);
require_once IA_ROOT . '/source/bootstrap.inc.php';
require_once IA_ROOT . '/source/model/setting.mod.php';
$_W['uid'] = $_W['isfounder'] = 1;
cache_build_setting();
cache_build_announcement();
cache_build_modules();
cache_build_fans_struct();
cache_build_hook();
tpl_install_finish();
}
function local_writeable($dir) {
$writeable = 0;
if(!is_dir($dir)) {
@mkdir($dir, 0777);
}
if(is_dir($dir)) {
if($fp = fopen("$dir/test.txt", 'w')) {
fclose($fp);
unlink("$dir/test.txt");
$writeable = 1;
} else {
$writeable = 0;
}
}
return $writeable;
}
function local_salt($length = 8) {
$result = '';
while(strlen($result) < $length) {
$result .= sha1(uniqid('', true));
}
return substr($result, 0, $length);
}
function local_config() {
$cfg = <<
defined('IN_IA') or exit('Access Denied');
\$config = array();
\$config['db']['host'] = {dbhost};
\$config['db']['username'] = {dbuser};
\$config['db']['password'] = {dbpwd};
\$config['db']['port'] = {dbport};
\$config['db']['database'] = '{dbname}';
\$config['db']['charset'] = 'utf8';
\$config['db']['pconnect'] = 0;
\$config['db']['tablepre'] = '{dbtablepre}';
// -------------------------- CONFIG COOKIE --------------------------- //
\$config['cookie']['pre'] = '{cookiepre}';
\$config['cookie']['domain'] = '';
\$config['cookie']['path'] = '/';
// -------------------------- CONFIG SETTING --------------------------- //
\$config['setting']['charset'] = 'utf-8';
\$config['setting']['cache'] = 'mysql';
\$config['setting']['timezone'] = 'Asia/Shanghai';
\$config['setting']['memory_limit'] = '256M';
\$config['setting']['filemode'] = 0644;
\$config['setting']['authkey'] = '{authkey}';
\$config['setting']['founder'] = '1';
\$config['setting']['development'] = 0;
\$config['setting']['referrer'] = 0;
// -------------------------- CONFIG UPLOAD --------------------------- //
\$config['upload']['image']['extentions'] = array('gif', 'jpg', 'jpeg', 'png');
\$config['upload']['image']['limit'] = 5000;
\$config['upload']['attachdir'] = '{attachdir}';
EOF;
return trim($cfg);
}
function local_mkdirs($path) {
if(!is_dir($path)) {
local_mkdirs(dirname($path));
mkdir($path);
}
return is_dir($path);
}
function runquery($sql) {
global $link, $dbprefix;
if(!isset($sql) || empty($sql)) return;
$sql = str_replace("\r", "\n", str_replace(' ims_', ' '.$dbprefix, $sql));
$sql = str_replace("\r", "\n", str_replace(' `ims_', ' `'.$dbprefix, $sql));
$ret = array();
$num = 0;
foreach(explode(";\n", trim($sql)) as $query) {
$ret[$num] = '';
$queries = explode("\n", trim($query));
foreach($queries as $query) {
$ret[$num] .= (isset($query[0]) && $query[0] == '#') || (isset($query[1]) && isset($query[1]) && $query[0].$query[1] == '--') ? '' : $query;
}
$num++;
}
unset($sql);
foreach($ret as $query) {
$query = trim($query);
if($query) {
mysql_query($query, $link);
}
}
}
function __remote_install_headers($ch = '', $header = '') {
static $hash;
if(!empty($header)) {
$pieces = explode(':', $header);
if(trim($pieces[0]) == 'hash') {
$hash = trim($pieces[1]);
}
}
if($ch == '' && $header == '') {
return $hash;
}
return strlen($header);
}
function remote_install() {
global $family;
$token = '';
$pars = array();
$pars['host'] = $_SERVER['HTTP_HOST'];
$pars['version'] = '';
$pars['release'] = '';
$url = 'http://addons.we7.cc/gateway.php';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $pars);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, '__remote_install_headers');
$content = curl_exec($ch);
curl_close($ch);
$sign = __remote_install_headers();
$ret = array();
if($content) {
$obj = simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA);
$ret['version'] = strval($obj->version);
$ret['release'] = strval($obj->release);
$ret['family'] = strval($obj->family);
$ret['announcement'] = strval($obj->announcement);
$ret['error'] = strval($obj->error);
if(empty($ret['error']) && $sign == md5($content . $token)) {
if($obj->scripts) {
$ret['scripts'] = array();
foreach($obj->scripts->script as $schema) {
$attr = $schema->attributes();
$v = strval($attr['version']);
$r = strval($attr['release']);
$c = strval($schema);
$ret['scripts'][] = array(
'version' => $v,
'release' => $r,
'content' => $c
);
}
}
if($obj->attachments) {
$ret['attachments'] = array();
foreach($obj->attachments->file as $file) {
$attr = $file->attributes();
$path = strval($attr['path']);
$sum = strval($attr['checksum']);
$entry = IA_ROOT . $path;
if(!is_file($entry) || md5_file($entry) != $sum) {
$ret['attachments'][] = $path;
}
}
}
}
}
return $ret;
}
function __remote_download_headers($ch = '', $header = '') {
static $hash;
if(!empty($header)) {
$pieces = explode(':', $header);
if(trim($pieces[0]) == 'hash') {
$hash = trim($pieces[1]);
}
}
if($ch == '' && $header == '') {
return $hash;
}
return strlen($header);
}
function remote_download($archive) {
$pars = array();
$pars['host'] = $_SERVER['HTTP_HOST'];
$pars['version'] = '';
$pars['release'] = '';
$pars['archive'] = base64_encode(json_encode($archive));
$url = 'http://addons.we7.cc/gateway.php';
$tmpfile = IA_ROOT . '/we7.zip';
$fp = fopen($tmpfile, 'w+');
if(!$fp) {
return false;
}
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $pars);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, '__remote_download_headers');
if(!curl_exec($ch)) {
return false;
}
curl_close($ch);
fclose($fp);
$sign = __remote_download_headers();
if(md5_file($tmpfile) == $sign) {
return $tmpfile;
}
return false;
}
function tpl_frame() {
global $action, $actions;
$steps = array('许可协议', '环境检测', '参数配置', '安装完成');
$contents = ob_get_contents();
ob_clean();
echo <<
微擎 - 微信公众平台自助开源引擎-
安装步骤
-
EOF;
foreach ($steps as $index => $value) {
$classname = $index == array_search($action, $actions) ? 'now' : 'succeed';
echo '
'.$value.'';}
echo <<
{$contents}
EOF;
}
function tpl_install_license() {
echo <<
阅读许可协议
版权所有 (c)2013,微擎团队保留所有权利。
感谢您选择微擎 - 微信公众平台自助开源引擎(以下简称WE7,WE7基于 PHP + MySQL的技术开发,全部源码开放。
为了使你正确并合法的使用本软件,请你在使用前务必阅读清楚下面的协议条款:
一、本授权协议适用且仅适用于W7任何版本,WE7官方对本授权协议的最终解释权。
二、协议许可的权利
1、您可以在完全遵守本最终用户授权协议的基础上,将本软件应用于非商业用途,而不必支付软件版权授权费用。
2、您可以在协议规定的约束和限制范围内修改 WE7 源代码或界面风格以适应您的网站要求。
3、您拥有使用本软件构建的网站全部内容所有权,并独立承担与这些内容的相关法律义务。
4、获得商业授权之后,您可以将本软件应用于商业用途,同时依据所购买的授权类型中确定的技术支持内容,自购买时刻起,在技术支持期限内拥有通过指定的方式获得指定范围内的技术支持服务。商业授权用户享有反映和提出意见的权力,相关意见将被作为首要考虑,但没有一定被采纳的承诺或保证。
二、协议规定的约束和限制
1、未获商业授权之前,不得将本软件用于商业用途(包括但不限于企业网站、经营性网站、以营利为目的或实现盈利的网站)。
2、未经官方许可,不得对本软件或与之关联的商业授权进行出租、出售、抵押或发放子许可证。
4、未经官方许可,禁止在 WE7 的整体或任何部分基础上以发展任何派生版本、修改版本或第三方版本用于重新分发。
5、如果您未能遵守本协议的条款,您的授权将被终止,所被许可的权利将被收回,并承担相应法律责任。
三、有限担保和免责声明
1、本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的。
2、用户出于自愿而使用本软件,您必须了解使用本软件的风险,在尚未购买产品技术服务之前,我们不承诺对免费用户提供任何形式的技术支持、使用担保,也不承担任何因使用本软件而产生问题的相关责任。
3、电子文本形式的授权协议如同双方书面签署的协议一样,具有完全的和等同的法律效力。您一旦开始确认本协议并安装 WE7,即被视为完全理解并接受本协议的各项条款,在享有上述条款授予的权力的同时,受到相关的约束和限制。协议许可范围以外的行为,将直接违反本授权协议并构成侵权,我们有权随时终止授权,责令停止损害,并保留追究相关责任的权力。
4、如果本软件带有其它软件的整合API示范例子包,这些文件版权不属于本软件官方,并且这些文件是没经过授权发布的,请参考相关软件的使用许可合法的使用。
我已经阅读并同意此协议