<?php
use application\ESPCMS_AdminAuthority;
use application\ESPCMS_Core;
use application\ESPCMS_FileTool;
use admin_application\ApplyDB;
use admin_application\DBSql;
use admin_application\link\SettingLink;
class Extensions {
private static $apply_list_cache_key;
private static $apply_read_cache_key;
public function __construct() {
$exclude_method = array('saveExtensions');
ESPCMS_AdminAuthority::authorityAdminVerify($exclude_method);
self::$apply_list_cache_key = ESPCMS_CACHE_DBLIST_NAME . ESPCMS_DB_PREFIX . 'apply_';
self::$apply_read_cache_key = ESPCMS_CACHE_DBREAD_NAME . ESPCMS_DB_PREFIX . 'apply_';
}
public static function listExtensions() {
global $espcms_admin_templates, $espcms_link_db;
if (!function_exists('zip_open')) {
espcms_message_err('public_pack-espcms_php_function_err', array('zip'));
}
if (!function_exists('curl_init')) {
espcms_message_err('public_pack-espcms_php_function_err', array('curl'));
}
$db_table = ESPCMS_DB_PREFIX . "apply";
$out_type = $_REQUEST['out_type'];
if ($out_type == 'list') {
$isetup = $_REQUEST['isetup'];
if (espcms_ismatches($isetup)) {
$db_where .= " AND isetup=$isetup";
}
$isopen = $_REQUEST['isopen'];
if (espcms_ismatches($isopen)) {
$db_where .= " AND isopen=$isopen";
}
$db_query = $espcms_link_db->db_query(espcms_db_list_out($db_table, $db_where, "isopen DESC,isset DESC,appid", "DESC"));
while ($fetch_row = $espcms_link_db->db_array_list($db_query)) {
if ($fetch_row['isset']) {
$setlink['act'] = $fetch_row['appseturl'];
$fetch_row['seturl'] = linkOut($setlink);
}
$app_read = ESPCMS_Core::connect_service('SoftMarketView', array('appcode' => $fetch_row['applycode'], 'appvol' => $fetch_row['volsn']));
if (!$app_read) {
espcms_message_err('public_pack-espcms_php_function_err', array('curl'));
}
$fetch_row['pic'] = $app_read['applypic'];
$fetch_row['applycontent'] = $app_read['applycontent'];
$fetch_row['isupdate'] = $app_read['isupdate'];
$fetch_row['issqlbak'] = $app_read['issqlbak'];
$array[] = $fetch_row;
}
$espcms_admin_templates->into('array', $array);
$templates = 'admin/extensions_list';
} else {
$espcms_admin_templates->into('page_db', espcms_page_db($db_table, ''));
$espcms_admin_templates->into('link', SettingLink::Extensions_link_array(false, $_REQUEST));
$templates = 'admin/extensions_index';
}
$espcms_admin_templates->output($templates);
}
public static function setExtensions() {
global $espcms_db_cache;
$appid = $_POST['appid'];
$isopen = espcms_ismatches($_POST['isopen']) ? $_POST['isopen'] : 0;
if (!$appid || !espcms_ismatches($appid)) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$app_view = ESPCMS_Core::get_app_view($appid);
if (!$app_view) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$db_table = ESPCMS_DB_PREFIX . "apply";
$update_key = espcms_db_update_set_save($db_table, "WHERE appid=$appid", "isopen=$isopen");
if ($update_key) {
$espcms_db_cache->cacheDEL(self::$apply_read_cache_key . $app_view['applycode']);
}
if ($isopen == 1) {
espcms_log_install('setting_pack-espcms_extensions_button_open', "$app_view[applyname]");
espcms_public_dialog('info_set_ok', 'setting_pack-espcms_extensions_set_open_ok', 'true', array($appid));
} else {
espcms_log_install('setting_pack-espcms_extensions_button_stop', "$app_view[applyname]");
espcms_public_dialog('info_set_ok', 'setting_pack-espcms_extensions_set_stop_ok', 'true', array($appid));
}
}
public static function resetExtensions() {
$appid = $_POST['appid'];
if (!$appid || !espcms_ismatches($appid)) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$app_view = ESPCMS_Core::get_app_view($appid);
if (!$app_view) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$config_file = ESPCMS_FILE_ROOT . 'espcms_includes/app/app_' . $app_view['applycode'] . '.php';
if (!file_exists($config_file)) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_app_file_err', 'false', array($app_view['applycode'] . '/app_config.php'));
} else {
require_once($config_file);
}
$db_list = app_db_list();
if (!is_array($db_list)) {
espcms_public_dialog('info_set_err', 'setting_pack-espcms_extensions_reset_db_err', 'false');
}
foreach ($db_list as $value) {
if (!preg_match("/^[\w]+$/i", $value)) {
continue;
}
$db_name = ESPCMS_DB_PREFIX . $value;
espcms_db_truncate($db_name);
}
espcms_log_install('setting_pack-espcms_extensions_button_reset', "$app_view[applyname]");
espcms_public_dialog('info_set_ok', 'setting_pack-espcms_extensions_reset_message_ok', 'true', array($appid));
}
public static function delExtensions() {
global $espcms_db_cache;
$appid = $_POST['appid'];
if (!$appid || !espcms_ismatches($appid)) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$db_table = ESPCMS_DB_PREFIX . "apply";
$app_view = ESPCMS_Core::get_app_view($appid);
if (!$app_view) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$app_read = ESPCMS_Core::connect_service('SoftMarketView', array('appcode' => $app_view['applycode'], 'appvol' => $app_view['volsn']));
if (!$app_read) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$config_file = ESPCMS_FILE_ROOT . 'espcms_includes/app/app_' . $app_view['applycode'] . '.php';
if (!file_exists($config_file)) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_app_file_err', 'false', array($app_view['applycode'] . '/app_config.php'));
} else {
require_once($config_file);
}
$admin_file = app_admin_file_list();
if (is_array($admin_file)) {
foreach ($admin_file as $value) {
$admin_del_file = ESPCMS_FILE_ROOT . ESPCMS_ADMIN_DIRNAME . '/' . $value;
if (!file_exists($admin_del_file) || is_dir($admin_del_file)) {
continue;
}
ESPCMS_FileTool::delfile($admin_del_file);
}
}
$web_file = app_web_file_list();
if (is_array($web_file)) {
foreach ($web_file as $value) {
$web_del_file = ESPCMS_FILE_ROOT . $value;
if (!file_exists($web_del_file) || is_dir($web_del_file)) {
continue;
}
ESPCMS_FileTool::delfile($web_del_file);
}
}
$db_list = app_db_list();
if (is_array($db_list)) {
foreach ($db_list as $value) {
if (!preg_match("/^[\w]+$/i", $value)) {
continue;
}
$db_name = ESPCMS_DB_PREFIX . $value;
espcms_db_drop_table($db_name);
}
}
if (preg_match("/^[\w\,]+$/i", $app_read['menucode'])) {
$menucode_array = explode(',', $app_read['menucode']);
if (is_array($menucode_array)) {
foreach ($menucode_array as $value) {
if (!preg_match("/^[\w]+$/i", $value)) {
continue;
}
espcms_db_del(ESPCMS_DB_PREFIX . "menulink", 'menu_classname', "'$value'");
espcms_db_del(ESPCMS_DB_PREFIX . "menulink", 'menu_dirname', "'$value'");
espcms_db_del(ESPCMS_DB_PREFIX . "widget", 'widget_code', "'$value'");
espcms_db_del(ESPCMS_DB_PREFIX . "widget_bt", 'widget_bt_code', "'$value'");
}
}
}
if ($app_view['applycode']) {
$typeclass = $app_view['applycode'];
espcms_db_del(ESPCMS_DB_PREFIX . "templates", 'typeclass', "'$typeclass'");
}
if ($app_view['applycode']) {
$typeclass = $app_view['applycode'];
espcms_db_del(ESPCMS_DB_PREFIX . "lngpack", 'typeclass', "'$typeclass'");
}
$del_query = espcms_db_del($db_table, 'appid', $app_view['appid']);
if ($del_query) {
$espcms_db_cache->cacheDEL(self::$apply_read_cache_key . $app_view['applycode']);
}
ESPCMS_FileTool::delfile($config_file);
espcms_log_install('setting_pack-espcms_extensions_button_uninstall', "$app_view[applyname]");
espcms_public_dialog('info_set_ok', 'setting_pack-espcms_extensions_del_message_ok', 'true', array($appid));
}
public static function updateExtensions() {
global $espcms_admin_templates;
$appid = $_GET['appid'];
if (!$appid || !espcms_ismatches($appid)) {
espcms_message_err('public_pack-espcms_select_err', array($appid));
}
if (!function_exists('zip_open')) {
espcms_message_err('public_pack-espcms_php_function_err', array('zip'));
}
$espcms_admin_templates->into('link', SettingLink::Extensions_link_array());
$espcms_admin_templates->into('appid', $appid);
$espcms_admin_templates->into('token', token());
$espcms_admin_templates->output('admin/extensions_update');
}
public static function executeExtensionsUpdatePack() {
$appid = $_POST['appid'];
if (!$appid || !espcms_ismatches($appid)) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$app_view = ESPCMS_Core::get_app_view($appid);
if (!$app_view) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$update_pack_list = ESPCMS_Core::connect_service('SoftMarketUpdatePack', array('appcode' => $app_view['applycode'], 'appvol' => $app_view['volsn']), false);
if (!$update_pack_list) {
espcms_public_dialog('espcms_public_dialog', 'public_pack-espcms_update_pack_list_err', 'false');
}
exit($update_pack_list);
}
public static function viewExtensionsUpdatePack() {
$appid = $_POST['appid'];
if (!$appid || !espcms_ismatches($appid)) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$app_view = ESPCMS_Core::get_app_view($appid);
if (!$app_view) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($appid));
}
$uid = $_POST['uid'];
if (!$uid || !espcms_ismatches($uid)) {
espcms_public_dialog('espcms_public_dialog', 'public_pack-espcms_input_parameter_fail', 'false', array($uid));
}
$app_market_id = $_POST['app_market_id'];
if (!$app_market_id || !espcms_ismatches($app_market_id)) {
espcms_public_dialog('espcms_public_dialog', 'public_pack-espcms_input_parameter_fail', 'false', array($app_market_id));
}
$update_pack_view = ESPCMS_Core::connect_service('SoftMarketUpdatePackView', array('uid' => $uid, 'app_market_id' => $app_market_id));
if (!$update_pack_view || !is_array($update_pack_view)) {
espcms_public_dialog('espcms_public_dialog', 'setting_pack-espcms_update_packread_err', 'false');
}
if (!function_exists('zip_open')) {
espcms_public_dialog('espcms_public_dialog', 'public_pack-espcms_php_function_err', 'false', array('zip'));
}
$update_status = self::pack_update($update_pack_view, $app_view);
if ($update_status) {
espcms_public_dialog('espcms_public_dialog', 'setting_pack-espcms_extensions_update_message_ok', 'true', array($update_pack_view['volstr']), 'json', $update_pack_view);
} else {
espcms_public_dialog('espcms_public_dialog', 'setting_pack-espcms_extensions_update_message_no', 'false', array($update_pack_view['volstr']));
}
}
private static function pack_update($pack_read = array(), $app_view = array()) {
global $espcms_link_db, $espcms_db_cache;
if (!$pack_read || !is_array($pack_read) || !$pack_read['upfile'] || !$pack_read['downloadurl']) {
return false;
}
if (!$pack_read['vol'] || !espcms_ismatches($pack_read['vol'])) {
return false;
}
if ($pack_read['vol'] == $app_view['volsn']) {
return false;
}
$filename = md5($pack_read['vol'] . '_' . $pack_read['app_market_id'] . '_' . $pack_read['app_market_update_id']);
$download_file = ESPCMS_FILE_ROOT . 'espcms_datacache/cache_pack/' . $filename . '.zip';
if (!is_file($download_file)) {
if (!ESPCMS_FileTool::downloadFile($pack_read['upfile'], $download_file)) {
return false;
}
}
if ($pack_read['issqlbak']) {
if (!DBSql::sqlBak()) {
return false;
}
}
$zip = zip_open($download_file);
if (is_resource($zip)) {
while (($zip_entry = zip_read($zip)) !== false) {
$filename = zip_entry_name($zip_entry);
$foldername = ESPCMS_FILE_ROOT . $filename;
if (strpos(zip_entry_name($zip_entry), '/') !== false) {
$last = strrpos(zip_entry_name($zip_entry), '/');
$dir = ESPCMS_FILE_ROOT . substr(zip_entry_name($zip_entry), 0, $last);
$file = substr(zip_entry_name($zip_entry), strrpos(zip_entry_name($zip_entry), '/') + 1);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
if (strlen(trim($file)) > 0) {
$return = file_put_contents($foldername, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
if (!$return) {
return false;
}
}
} else {
$return = file_put_contents($foldername, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
if (!$return) {
return false;
}
}
}
zip_close($zip);
ESPCMS_FileTool::delFile($download_file);
} else {
return false;
}
if ($pack_read['isadmindir'] && ESPCMS_ADMIN_DIRNAME != 'espcms_admin') {
$now_dir_path = ESPCMS_FILE_ROOT . ESPCMS_ADMIN_DIRNAME . '/';
$pack_dir_path = ESPCMS_FILE_ROOT . 'espcms_admin/';
if (!ESPCMS_FileTool::file_copy($pack_dir_path, $now_dir_path)) {
espcms_out($pack_read);
return false;
}
}
if ($pack_read['issqlbak']) {
$db_file = ESPCMS_FILE_ROOT . $pack_read['vol'] . '.sql';
if (!is_file($db_file)) {
return false;
}
$updatesql = file_get_contents($db_file);
if ($updatesql) {
$updatesql = str_replace("\r\n", "\n", $updatesql);
$ret = array();
$num = 0;
foreach (explode(";\n", trim($updatesql)) 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($updatesql);
foreach ($ret as $query) {
$query = trim($query);
if ($query) {
$query = str_replace('esp_', ESPCMS_DB_PREFIX, $query);
$espcms_link_db->db_query($query);
}
}
ESPCMS_FileTool::delFile($db_file);
} else {
return false;
}
}
$appid = $app_view['appid'];
$db_table = ESPCMS_DB_PREFIX . "apply";
$update_key = espcms_db_update_set_save($db_table, "WHERE appid=$appid", "applyvol='$pack_read[volstr]',volsn=$pack_read[vol]");
if ($update_key) {
$espcms_db_cache->cacheDEL(self::$apply_read_cache_key . $app_view['applycode']);
}
return true;
}
public static function marketExtensions() {
global $espcms_admin_templates;
if (!function_exists('zip_open')) {
espcms_message_err('public_pack-espcms_php_function_err', array('zip'));
}
if (!function_exists('curl_init')) {
espcms_message_err('public_pack-espcms_php_function_err', array('curl'));
}
$out_type = $_REQUEST['out_type'];
if ($out_type == 'list') {
$pageid = isset($_REQUEST['pageid']) && espcms_ismatches($_REQUEST['pageid']) ? $_REQUEST['pageid'] : 0;
$data = array();
if (espcms_ismatches($_REQUEST['isfree'])) {
$data['isfree'] = $_REQUEST['isfree'];
}
if (espcms_ismatches($_REQUEST['ishit'])) {
$data['ishit'] = $_REQUEST['ishit'];
}
if (espcms_ismatches($_REQUEST['isbelong'])) {
$data['isbelong'] = $_REQUEST['isbelong'];
}
$searchlist = $_GET['searchlist'];
if ($searchlist == 'true') {
$data['ispage'] = 1;
exit(ESPCMS_Core::connect_service('SoftMarketList', $data, false));
}
$data['pageid'] = $pageid;
$array = ESPCMS_Core::connect_service('SoftMarketList', $data);
if (is_array($array) && is_array($array[0])) {
foreach ($array as $key => $value) {
$app_read = ApplyDB::get_apply_read($value['applycode']);
$array[$key]['app_issetup'] = $app_read['appid'] && espcms_ismatches($app_read['appid']) ? 1 : 0;
}
$espcms_admin_templates->into('array', $array);
}
$templates = 'admin/extensions_market_list';
} else {
$page_db = ESPCMS_Core::connect_service('SoftMarketList', array('ispage' => 1));
$espcms_admin_templates->into('page_db', $page_db);
$espcms_admin_templates->into('link', SettingLink::Extensions_link_array(false, $_REQUEST));
$templates = 'admin/extensions_market';
}
$espcms_admin_templates->output($templates);
}
public static function viewExtensions() {
$app_market_id = $_POST['app_market_id'];
if (!$app_market_id || !espcms_ismatches($app_market_id)) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($app_market_id));
}
if (!function_exists('zip_open')) {
espcms_public_dialog('espcms_public_dialog', 'public_pack-espcms_php_function_err', 'false', array('zip'));
}
$market_view = ESPCMS_Core::connect_service('SoftMarketSetupiew', array('app_market_id' => $app_market_id));
if (!$market_view || !$market_view['app_market_id'] || !espcms_ismatches($market_view['app_market_id'])) {
espcms_public_dialog('info_set_err', 'public_pack-espcms_select_err', 'false', array($app_market_id));
}
$app_view = ESPCMS_Core::get_app_config($market_view['applycode']);
if ($app_view || $app_view['appid']) {
espcms_public_dialog('info_set_err', 'setting_pack-espcms_extensions_setup_exist_err', 'false', array($app_view['applyname']), 'json', $app_view);
}
$setup_status = self::pack_setup($market_view);
if ($setup_status) {
espcms_public_dialog('espcms_public_dialog', 'setting_pack-espcms_extensions_setup_message_ok', 'true', array($market_view['applyname']), 'json', $market_view);
} else {
espcms_public_dialog('espcms_public_dialog', 'setting_pack-espcms_extensions_setup_message_no', 'false', array($market_view['applyname']));
}
}
private static function pack_setup($pack_read = array()) {
global $espcms_link_db, $espcms_command;
if (!$pack_read || !is_array($pack_read) || !$pack_read['upfile'] || !$pack_read['applyfilename']) {
return false;
}
if (!$pack_read['vol'] || !espcms_ismatches($pack_read['vol'])) {
return false;
}
if ($pack_read['uservol'] > $espcms_command['CON_VOL']) {
return false;
}
$filename = md5($pack_read['applycode'] . '_' . $pack_read['vol'] . '_' . $pack_read['app_market_id']);
$download_file = ESPCMS_FILE_ROOT . 'espcms_datacache/cache_pack/' . $filename . '.zip';
if (!is_file($download_file)) {
if (!ESPCMS_FileTool::downloadFile($pack_read['upfile'], $download_file)) {
return false;
}
}
if ($pack_read['issqlbak']) {
if (!DBSql::sqlBak()) {
return false;
}
}
$zip = zip_open($download_file);
if (is_resource($zip)) {
while (($zip_entry = zip_read($zip)) !== false) {
$filename = zip_entry_name($zip_entry);
$foldername = ESPCMS_FILE_ROOT . $filename;
if (strpos(zip_entry_name($zip_entry), '/') !== false) {
$last = strrpos(zip_entry_name($zip_entry), '/');
$dir = ESPCMS_FILE_ROOT . substr(zip_entry_name($zip_entry), 0, $last);
$file = substr(zip_entry_name($zip_entry), strrpos(zip_entry_name($zip_entry), '/') + 1);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
if (strlen(trim($file)) > 0) {
$return = file_put_contents($foldername, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
if (!$return) {
return false;
}
}
} else {
$return = file_put_contents($foldername, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
if (!$return) {
return false;
}
}
}
zip_close($zip);
ESPCMS_FileTool::delFile($download_file);
} else {
return false;
}
if ($pack_read['isadmindir'] && ESPCMS_ADMIN_DIRNAME != 'espcms_admin') {
$now_dir_path = ESPCMS_FILE_ROOT . ESPCMS_ADMIN_DIRNAME . '/';
$pack_dir_path = ESPCMS_FILE_ROOT . 'espcms_admin/';
if (!ESPCMS_FileTool::file_copy($pack_dir_path, $now_dir_path)) {
espcms_out($pack_read);
return false;
}
}
if ($pack_read['issqlbak']) {
$db_file = ESPCMS_FILE_ROOT . $pack_read['applycode'] . '.sql';
if (!is_file($db_file)) {
return false;
}
$updatesql = file_get_contents($db_file);
if ($updatesql) {
$updatesql = str_replace("\r\n", "\n", $updatesql);
$ret = array();
$num = 0;
foreach (explode(";\n", trim($updatesql)) 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($updatesql);
foreach ($ret as $query) {
$query = trim($query);
if ($query) {
$query = str_replace('esp_', ESPCMS_DB_PREFIX, $query);
$espcms_link_db->db_query($query);
}
}
ESPCMS_FileTool::delFile($db_file);
} else {
return false;
}
}
$app_id = ApplyDB::install_save_apply($pack_read);
return $app_id ? true : false;
}
}