123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: function_plugin.php 36284 2016-12-12 00:47:50Z nemohou $
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- require_once libfile('function/cloudaddons');
- function plugininstall($pluginarray, $installtype = '', $available = 0) {
- if(!$pluginarray || !$pluginarray['plugin']['identifier']) {
- return false;
- }
- $plugin = C::t('common_plugin')->fetch_by_identifier($pluginarray['plugin']['identifier']);
- if($plugin) {
- return false;
- }
- $pluginarray['plugin']['modules'] = dunserialize($pluginarray['plugin']['modules']);
- $pluginarray['plugin']['modules']['extra']['installtype'] = $installtype;
- if(updatepluginlanguage($pluginarray)) {
- $pluginarray['plugin']['modules']['extra']['langexists'] = 1;
- }
- if(!empty($pluginarray['intro'])) {
- if(!empty($pluginarray['intro'])) {
- require_once libfile('function/discuzcode');
- $pluginarray['plugin']['modules']['extra']['intro'] = discuzcode(strip_tags($pluginarray['intro']), 1, 0);
- }
- }
- if(!empty($pluginarray['uninstallfile'])) {
- $pluginarray['plugin']['modules']['extra']['uninstallfile'] = $pluginarray['uninstallfile'];
- }
- if(!empty($pluginarray['checkfile'])) {
- $pluginarray['plugin']['modules']['extra']['checkfile'] = $pluginarray['checkfile'];
- }
- if(!empty($pluginarray['enablefile'])) {
- $pluginarray['plugin']['modules']['extra']['enablefile'] = $pluginarray['enablefile'];
- }
- if(!empty($pluginarray['disablefile'])) {
- $pluginarray['plugin']['modules']['extra']['disablefile'] = $pluginarray['disablefile'];
- }
- $pluginarray['plugin']['modules'] = serialize($pluginarray['plugin']['modules']);
- $data = array();
- foreach($pluginarray['plugin'] as $key => $val) {
- if($key == 'directory') {
- $val .= (!empty($val) && substr($val, -1) != '/') ? '/' : '';
- } elseif($key == 'available') {
- $val = $available;
- }
- $data[$key] = $val;
- }
- $pluginid = C::t('common_plugin')->insert($data, true);
- if(is_array($pluginarray['var'])) {
- foreach($pluginarray['var'] as $config) {
- $data = array('pluginid' => $pluginid);
- foreach($config as $key => $val) {
- $data[$key] = $val;
- }
- C::t('common_pluginvar')->insert($data);
- }
- }
- if(!empty($dir) && !empty($pluginarray['importfile'])) {
- require_once libfile('function/importdata');
- foreach($pluginarray['importfile'] as $importtype => $file) {
- if(in_array($importtype, array('smilies', 'styles'))) {
- $files = explode(',', $file);
- foreach($files as $file) {
- if(file_exists($file = DISCUZ_ROOT.'./source/plugin/'.$dir.'/'.$file)) {
- $importtxt = @implode('', file($file));
- $imporfun = 'import_'.$importtype;
- $imporfun();
- }
- }
- }
- }
- }
- cloudaddons_installlog($pluginarray['plugin']['identifier'].'.plugin');
- cron_create($pluginarray['plugin']['identifier']);
- updatecache(array('plugin', 'setting', 'styles'));
- cleartemplatecache();
- dsetcookie('addoncheck_plugin', '', -1);
- return $pluginid;
- }
- function pluginupgrade($pluginarray, $installtype) {
- if(!$pluginarray || !$pluginarray['plugin']['identifier']) {
- return false;
- }
- $plugin = C::t('common_plugin')->fetch_by_identifier($pluginarray['plugin']['identifier']);
- if(!$plugin) {
- return false;
- }
- if(is_array($pluginarray['var'])) {
- $pluginvars = $pluginvarsnew = array();
- foreach(C::t('common_pluginvar')->fetch_all_by_pluginid($plugin['pluginid']) as $pluginvar) {
- $pluginvars[] = $pluginvar['variable'];
- }
- foreach($pluginarray['var'] as $config) {
- if(!in_array($config['variable'], $pluginvars)) {
- $data = array('pluginid' => $plugin[pluginid]);
- foreach($config as $key => $val) {
- $data[$key] = $val;
- }
- C::t('common_pluginvar')->insert($data);
- } else {
- $data = array();
- foreach($config as $key => $val) {
- if($key != 'value') {
- $data[$key] = $val;
- }
- }
- if($data) {
- C::t('common_pluginvar')->update_by_variable($plugin['pluginid'], $config['variable'], $data);
- }
- }
- $pluginvarsnew[] = $config['variable'];
- }
- $pluginvardiff = array_diff($pluginvars, $pluginvarsnew);
- if($pluginvardiff) {
- C::t('common_pluginvar')->delete_by_variable($plugin['pluginid'], $pluginvardiff);
- }
- }
- $langexists = updatepluginlanguage($pluginarray);
- $pluginarray['plugin']['modules'] = dunserialize($pluginarray['plugin']['modules']);
- $plugin['modules'] = dunserialize($plugin['modules']);
- if(!empty($plugin['modules']['system'])) {
- $pluginarray['plugin']['modules']['system'] = $plugin['modules']['system'];
- }
- $plugin['modules']['extra']['installtype'] = $installtype;
- $pluginarray['plugin']['modules']['extra'] = $plugin['modules']['extra'];
- if(!empty($pluginarray['intro']) || $langexists) {
- if(!empty($pluginarray['intro'])) {
- require_once libfile('function/discuzcode');
- $pluginarray['plugin']['modules']['extra']['intro'] = discuzcode(strip_tags($pluginarray['intro']), 1, 0);
- }
- $langexists && $pluginarray['plugin']['modules']['extra']['langexists'] = 1;
- }
- if(!empty($pluginarray['uninstallfile'])) {
- $pluginarray['plugin']['modules']['extra']['uninstallfile'] = $pluginarray['uninstallfile'];
- }
- if(!empty($pluginarray['checkfile'])) {
- $pluginarray['plugin']['modules']['extra']['checkfile'] = $pluginarray['checkfile'];
- }
- if(!empty($pluginarray['enablefile'])) {
- $pluginarray['plugin']['modules']['extra']['enablefile'] = $pluginarray['enablefile'];
- }
- if(!empty($pluginarray['disablefile'])) {
- $pluginarray['plugin']['modules']['extra']['disablefile'] = $pluginarray['disablefile'];
- }
- $pluginarray['plugin']['modules'] = serialize($pluginarray['plugin']['modules']);
- C::t('common_plugin')->update($plugin['pluginid'], array('version' => $pluginarray['plugin']['version'], 'modules' => $pluginarray['plugin']['modules']));
- cloudaddons_installlog($pluginarray['plugin']['identifier'].'.plugin');
- cron_create($pluginarray['plugin']['identifier']);
- updatecache(array('plugin', 'setting', 'styles'));
- cleartemplatecache();
- dsetcookie('addoncheck_plugin', '', -1);
- return true;
- }
- function modulecmp($a, $b) {
- return $a['displayorder'] > $b['displayorder'] ? 1 : -1;
- }
- function updatepluginlanguage($pluginarray) {
- global $_G;
- if(!$pluginarray['language']) {
- return false;
- }
- foreach(array('script', 'template', 'install', 'system') as $type) {
- loadcache('pluginlanguage_'.$type, 1);
- if($type != 'system') {
- if(!empty($pluginarray['language'][$type.'lang'])) {
- $_G['cache']['pluginlanguage_'.$type][$pluginarray['plugin']['identifier']] = $pluginarray['language'][$type.'lang'];
- }
- } else {
- if(!empty($_G['config']['plugindeveloper']) && @include(DISCUZ_ROOT.'./data/plugindata/'.$pluginarray['plugin']['identifier'].'.lang.php')) {
- if(!empty($systemlang[$pluginarray['plugin']['identifier']])) {
- $pluginarray['language']['systemlang'] = $systemlang[$pluginarray['plugin']['identifier']];
- }
- }
- foreach($pluginarray['language']['systemlang'] as $file => $vars) {
- foreach($vars as $key => $var) {
- $_G['cache']['pluginlanguage_system'][$file][$key] = $var;
- }
- }
- }
- savecache('pluginlanguage_'.$type, $_G['cache']['pluginlanguage_'.$type]);
- }
- return true;
- }
- function runquery($sql) {
- global $_G;
- $tablepre = $_G['config']['db'][1]['tablepre'];
- $dbcharset = $_G['config']['db'][1]['dbcharset'];
- $sql = str_replace(array(' cdb_', ' `cdb_', ' pre_', ' `pre_'), array(' {tablepre}', ' `{tablepre}', ' {tablepre}', ' `{tablepre}'), $sql);
- $sql = str_replace("\r", "\n", str_replace(array(' {tablepre}', ' `{tablepre}'), array(' '.$tablepre, ' `'.$tablepre), $sql));
- $ret = array();
- $num = 0;
- foreach(explode(";\n", trim($sql)) as $query) {
- $queries = explode("\n", trim($query));
- foreach($queries as $query) {
- $ret[$num] .= $query[0] == '#' || $query[0].$query[1] == '--' ? '' : $query;
- }
- $num++;
- }
- unset($sql);
- foreach($ret as $query) {
- $query = trim($query);
- if($query) {
- if(substr($query, 0, 12) == 'CREATE TABLE') {
- $name = preg_replace("/CREATE TABLE ([a-z0-9_]+) .*/is", "\\1", $query);
- DB::query(createtable($query, $dbcharset));
- } else {
- DB::query($query);
- }
- }
- }
- }
- function createtable($sql, $dbcharset) {
- $type = strtoupper(preg_replace("/^\s*CREATE TABLE\s+.+\s+\(.+?\).*(ENGINE|TYPE)\s*=\s*([a-z]+?).*$/isU", "\\2", $sql));
- $type = in_array($type, array('MYISAM', 'HEAP')) ? $type : 'MYISAM';
- return preg_replace("/^\s*(CREATE TABLE\s+.+\s+\(.+?\)).*$/isU", "\\1", $sql).
- (DB::$db->version() > '4.1' ? " ENGINE=$type DEFAULT CHARSET=$dbcharset" : " TYPE=$type");
- }
- function updatetable($sql) {
- global $_G;
- $config = array(
- 'dbcharset' => $_G['config']['db']['1']['dbcharset'],
- 'charset' => $_G['config']['output']['charset'],
- 'tablepre' => $_G['config']['db']['1']['tablepre']
- );
- preg_match_all("/CREATE\s+TABLE.+?pre\_(.+?)\s*\((.+?)\)\s*(ENGINE|TYPE)\s*=\s*(\w+)/is", $sql, $matches);
- $newtables = empty($matches[1])?array():$matches[1];
- $newsqls = empty($matches[0])?array():$matches[0];
- if(empty($newtables) || empty($newsqls)) {
- return array(1);
- }
- foreach($newtables as $i => $newtable) {
- $newcols = updatetable_getcolumn($newsqls[$i]);
- if(!$query = DB::query("SHOW CREATE TABLE ".DB::table($newtable), 'SILENT')) {
- preg_match("/(CREATE TABLE .+?)\s*(ENGINE|TYPE)\s*=\s*(\w+)/is", $newsqls[$i], $maths);
- $maths[3] = strtoupper($maths[3]);
- if($maths[3] == 'MEMORY' || $maths[3] == 'HEAP') {
- $type = helper_dbtool::dbversion() > '4.1' ? " ENGINE=MEMORY".(empty($config['dbcharset'])?'':" DEFAULT CHARSET=$config[dbcharset]" ): " TYPE=HEAP";
- } else {
- $type = helper_dbtool::dbversion() > '4.1' ? " ENGINE=MYISAM".(empty($config['dbcharset'])?'':" DEFAULT CHARSET=$config[dbcharset]" ): " TYPE=MYISAM";
- }
- $usql = $maths[1].$type;
- $usql = str_replace("CREATE TABLE IF NOT EXISTS pre_", 'CREATE TABLE IF NOT EXISTS '.$config['tablepre'], $usql);
- $usql = str_replace("CREATE TABLE pre_", 'CREATE TABLE '.$config['tablepre'], $usql);
- if(!DB::query($usql, 'SILENT')) {
- return array(-1, $newtable);
- }
- } else {
- $value = DB::fetch($query);
- $oldcols = updatetable_getcolumn($value['Create Table']);
- $updates = array();
- $allfileds =array_keys($newcols);
- foreach ($newcols as $key => $value) {
- if($key == 'PRIMARY') {
- if($value != $oldcols[$key]) {
- if(!empty($oldcols[$key])) {
- $usql = "RENAME TABLE ".DB::table($newtable)." TO ".DB::table($newtable.'_bak');
- if(!DB::query($usql, 'SILENT')) {
- return array(-1, $newtable);
- }
- }
- $updates[] = "ADD PRIMARY KEY $value";
- }
- } elseif ($key == 'KEY') {
- foreach ($value as $subkey => $subvalue) {
- if(!empty($oldcols['KEY'][$subkey])) {
- if($subvalue != $oldcols['KEY'][$subkey]) {
- $updates[] = "DROP INDEX `$subkey`";
- $updates[] = "ADD INDEX `$subkey` $subvalue";
- }
- } else {
- $updates[] = "ADD INDEX `$subkey` $subvalue";
- }
- }
- } elseif ($key == 'UNIQUE') {
- foreach ($value as $subkey => $subvalue) {
- if(!empty($oldcols['UNIQUE'][$subkey])) {
- if($subvalue != $oldcols['UNIQUE'][$subkey]) {
- $updates[] = "DROP INDEX `$subkey`";
- $updates[] = "ADD UNIQUE INDEX `$subkey` $subvalue";
- }
- } else {
- $usql = "ALTER TABLE ".DB::table($newtable)." DROP INDEX `$subkey`";
- DB::query($usql, 'SILENT');
- $updates[] = "ADD UNIQUE INDEX `$subkey` $subvalue";
- }
- }
- } else {
- if(!empty($oldcols[$key])) {
- if(strtolower($value) != strtolower($oldcols[$key])) {
- $updates[] = "CHANGE `$key` `$key` $value";
- }
- } else {
- $i = array_search($key, $allfileds);
- $fieldposition = $i > 0 ? 'AFTER `'.$allfileds[$i-1].'`' : 'FIRST';
- $updates[] = "ADD `$key` $value $fieldposition";
- }
- }
- }
- if(!empty($updates)) {
- $usql = "ALTER TABLE ".DB::table($newtable)." ".implode(', ', $updates);
- if(!DB::query($usql, 'SILENT')) {
- return array(-1, $newtable);
- }
- }
- }
- }
- return array(1);
- }
- function updatetable_getcolumn($creatsql) {
- $creatsql = preg_replace("/ COMMENT '.*?'/i", '', $creatsql);
- preg_match("/\((.+)\)\s*(ENGINE|TYPE)\s*\=/is", $creatsql, $matchs);
- $cols = explode("\n", $matchs[1]);
- $newcols = array();
- foreach ($cols as $value) {
- $value = trim($value);
- if(empty($value)) continue;
- $value = updatetable_remakesql($value);
- if(substr($value, -1) == ',') $value = substr($value, 0, -1);
- $vs = explode(' ', $value);
- $cname = $vs[0];
- if($cname == 'KEY' || $cname == 'INDEX' || $cname == 'UNIQUE') {
- $name_length = strlen($cname);
- if($cname == 'UNIQUE') $name_length = $name_length + 4;
- $subvalue = trim(substr($value, $name_length));
- $subvs = explode(' ', $subvalue);
- $subcname = $subvs[0];
- $newcols[$cname][$subcname] = trim(substr($value, ($name_length+2+strlen($subcname))));
- } elseif($cname == 'PRIMARY') {
- $newcols[$cname] = trim(substr($value, 11));
- } else {
- $newcols[$cname] = trim(substr($value, strlen($cname)));
- }
- }
- return $newcols;
- }
- function updatetable_remakesql($value) {
- $value = trim(preg_replace("/\s+/", ' ', $value));
- $value = str_replace(array('`',', ', ' ,', '( ' ,' )', 'mediumtext'), array('', ',', ',','(',')','text'), $value);
- return $value;
- }
- function cron_create($pluginid, $filename = null, $name = null, $weekday = null, $day = null, $hour = null, $minute = null) {
- if(!ispluginkey($pluginid)) {
- return false;
- }
- $dir = DISCUZ_ROOT.'./source/plugin/'.$pluginid.'/cron';
- if(!file_exists($dir)) {
- return false;
- }
- $crondir = dir($dir);
- while($filename = $crondir->read()) {
- if(!in_array($filename, array('.', '..')) && preg_match("/^cron\_[\w\.]+$/", $filename)) {
- $content = file_get_contents($dir.'/'.$filename);
- preg_match("/cronname\:(.+?)\n/", $content, $r);$name = lang('plugin/'.$pluginid, trim($r[1]));
- preg_match("/week\:(.+?)\n/", $content, $r);$weekday = trim($r[1]) ? intval($r[1]) : -1;
- preg_match("/day\:(.+?)\n/", $content, $r);$day = trim($r[1]) ? intval($r[1]) : -1;
- preg_match("/hour\:(.+?)\n/", $content, $r);$hour = trim($r[1]) ? intval($r[1]) : -1;
- preg_match("/minute\:(.+?)\n/", $content, $r);$minute = trim($r[1]) ? trim($r[1]) : 0;
- $minutenew = explode(',', $minute);
- foreach($minutenew as $key => $val) {
- $minutenew[$key] = $val = intval($val);
- if($val < 0 || $var > 59) {
- unset($minutenew[$key]);
- }
- }
- $minutenew = array_slice(array_unique($minutenew), 0, 12);
- $minutenew = implode("\t", $minutenew);
- $filename = $pluginid.':'.$filename;
- $cronid = C::t('common_cron')->get_cronid_by_filename($filename);
- if(!$cronid) {
- return C::t('common_cron')->insert(array(
- 'available' => 1,
- 'type' => 'plugin',
- 'name' => $name,
- 'filename' => $filename,
- 'weekday' => $weekday,
- 'day' => $day,
- 'hour' => $hour,
- 'minute' => $minutenew,
- ), true);
- } else {
- C::t('common_cron')->update($cronid, array(
- 'name' => $name,
- 'weekday' => $weekday,
- 'day' => $day,
- 'hour' => $hour,
- 'minute' => $minutenew,
- ));
- return $cronid;
- }
- }
- }
- }
- function cron_delete($pluginid) {
- if(!ispluginkey($pluginid)) {
- return false;
- }
- $dir = DISCUZ_ROOT.'./source/plugin/'.$pluginid.'/cron';
- if(!file_exists($dir)) {
- return false;
- }
- $crondir = dir($dir);
- $count = 0;
- while($filename = $crondir->read()) {
- if(!in_array($filename, array('.', '..')) && preg_match("/^cron\_[\w\.]+$/", $filename)) {
- $filename = $pluginid.':'.$filename;
- $cronid = C::t('common_cron')->get_cronid_by_filename($filename);
- C::t('common_cron')->delete($cronid);
- $count++;
- }
- }
- return $count;
- }
- function domain_create($pluginid, $domain, $domainroot) {
- $plugin = C::t('common_plugin')->fetch_by_identifier($pluginid);
- if(!$plugin || !$plugin['available']) {
- return;
- }
- C::t('common_domain')->delete_by_id_idtype($plugin['pluginid'], 'plugin');
- $data = array(
- 'id' => $plugin['pluginid'],
- 'idtype' => 'plugin',
- 'domain' => $domain,
- 'domainroot' => $domainroot,
- );
- C::t('common_domain')->insert($data);
- require_once libfile('function/cache');
- updatecache('setting');
- }
- function domain_delete($pluginid) {
- $plugin = C::t('common_plugin')->fetch_by_identifier($pluginid);
- if(!$plugin || !$plugin['available']) {
- return;
- }
- C::t('common_domain')->delete_by_id_idtype($plugin['pluginid'], 'plugin');
- require_once libfile('function/cache');
- updatecache('setting');
- }
- ?>
|