Файл: sys/inc/functions/ds-plugins.php
Строк: 271
<?php
/**
* Возвращает путь до папки с плагином
* @return string
*/
function ds_plugin_directory_path($plug)
{
$plugins = ds_plugins();
if (is_file($plugin_file = PATH_PLUGINS . $plugins[$plug]['script'])) {
return dirname($plugin_file);
}
}
/**
* Возвращает массив с плагинами
* @return array
*/
function ds_plugins()
{
if ($plugins = ds_get('ds_plugins')) {
return $plugins;
}
$json = get_option('ds_plugins');
if ($json) {
$plugins = json_decode($json, 1);
}
return is_array($plugins) ? $plugins : array();
}
/**
* Функция активирует плагин
* @return bolean
*/
function ds_plugin_activate($plug, $update = false)
{
$plugins = ds_plugins();
if (!is_file($plugin_path = PATH_PLUGINS . $plugins[$plug]['script'])) {
return false;
}
if (!defined('plugin_' . $plug . '_loaded') && is_file($plugin_path)) {
require $plugin_path;
}
do_event('ds_plugin_pre_activation', $plug);
do_event('ds_plugin_' . $plug . '_pre_activation', $plug);
if (isset($plugins[$plug]) && $plugins[$plug]['active'] != '1') {
$plugins[$plug]['active'] = '1';
update_option('ds_plugins', $plugins, 'plugins');
do_event('ds_plugin_activation', $plug);
do_event('ds_plugin_' . $plug . '_activation', $plug);
return true;
}
return false;
}
/**
* Функция деактивирует плагин
* @return bolean
*/
function ds_plugin_deactivate($plug)
{
do_event('ds_plugin_pre_deactivation', $plug);
do_event('ds_plugin_' . $plug . '_pre_deactivation', $plug);
$plugins = ds_plugins();
if (isset($plugins[$plug])) {
$plugins[$plug]['active'] = '0';
update_option('ds_plugins', $plugins, 'plugins');
do_event('ds_plugin_deactivation', $plug);
do_event('ds_plugin_' . $plug . '_deactivation', $plug);
return true;
}
return false;
}
/**
* Функция добавляет плагин в список плагинов
* @return bolean
*/
function ds_plugin_add($plug, $info)
{
$plugins = ds_plugins();
if (!isset($plugins[$plug])) {
$plugins[$plug] = $info;
$plugins[$plug]['active'] = '0';
update_option('ds_plugins', $plugins, 'plugins');
return true;
}
return false;
}
/**
* Функция удаляет плагин из системы
* @return bolean
*/
function ds_plugin_remove($plug)
{
$plugins = ds_plugins();
do_event('ds_plugin_remove', $plug);
if (isset($plugins[$plug])) {
if (is_file($uninstall = ds_plugin_directory_path($plug) . '/uninstall.php')) {
require $uninstall;
}
do_event('ds_plugin_' . $plug . '_remove', $plug);
if (ds_plugin_directory_path($plug) == PATH_PLUGINS) {
unlink(PATH_PLUGINS . $plugins[$plug]['script']);
} elseif (is_dir($dirpath = dirname(PATH_PLUGINS . $plugins[$plug]['script']))) {
delete_dir($dirpath);
}
unset($plugins[$plug]);
update_option('ds_plugins', $plugins, 'plugins');
return true;
}
return false;
}
/**
* Проверка активен ли плагин
* @return bolean
*/
function is_plugin_active($plug)
{
$plugins = ds_plugins();
if (!empty($plugins[$plug]) && $plugins[$plug]['active'] == '1') {
return true;
}
return false;
}
/**
* Проверка на наличие плагина
* @return bolean
*/
function plugin_exists($plug)
{
$plugins = ds_plugins();
if (isset($plugins[$plug]['script']) && is_file(PATH_PLUGINS . $plugins[$plug]['script'])) {
return true;
}
return false;
}
/**
* Устанавливает плагин из репозитория CMS-Social
* @return bolean
*/
function ds_plugin_install($plug)
{
if (plugin_exists($plug)) {
add_error(__('Плагин уже существует'));
}
$plugin = json_decode(get_http_content('https://cms-social.ru/api/v1/plugins/info', array(
'slug' => $plug,
)), true);
if (!$plugin) {
add_error(__('Не удалось получить информацию о плагине'));
}
if (is_errors()) return false;
$sess_id = md5(time());
$tmpFile = PATH_CACHE.'/'.$sess_id.'.zip';
$pluginData = get_http_content($plugin['download']);
if (!$pluginData || !file_put_contents($tmpFile, $pluginData)) {
add_error(__('Не удалось загрузить плагин'));
}
if (is_file($tmpFile) && ds_plugin_zip_install($tmpFile)) {
return true;
}
return false;
}
/**
* Устанавливает плагин из Zip архива
* @return bolean
*/
function ds_plugin_upload($file_path)
{
$sess_id = md5(time());
if (!class_exists('ZipArchive')) {
add_error(__('У вас не установлена библиотека 'zip' для работы с архивами'));
}
if (!is_dir(PATH_CACHE)) {
@mkdir(PATH_CACHE, 0777);
@chmod(PATH_CACHE, 0777);
}
if (!is_file(PATH_PLUGINS . '/index.php')) {
file_put_contents(PATH_PLUGINS . '/index.php', "<?php nn// Index Of");
}
$tmpFile = PATH_CACHE.'/'.$sess_id.'.zip';
if (!copy($file_path, $tmpFile)) {
add_error(__('Не удалось загрузить плагин'));
}
if (is_file($tmpFile)) {
return ds_plugin_zip_install($tmpFile);
}
}
function ds_plugin_zip_install($zip_path)
{
$sess_id = md5($zip_path);
$plg = new Plugins();
$installed = array();
if (is_file($zip_path)) {
if (!is_errors()) {
$zip = new ZipArchive();
$zip->open($zip_path, ZipArchive::CREATE);
$zip->extractTo(PATH_CACHE.'/' . $sess_id);
$zip->close();
unlink($zip_path);
$files_list = ds_readdir_files_list(PATH_CACHE.'/' . $sess_id);
$dires_list = ds_readdir_dir_list(PATH_CACHE.'/' . $sess_id);
$plugins = array();
foreach($files_list AS $file) {
if (preg_match('/.php$/m', $file)) {
$read = file_get_contents($file);
if (strpos($read, 'Plugin Name') !== false) {
$plugin = $plg->getPluginInfo($file, false);
if (isset($registered[$plugin['slug']])) {
$plugins[$file] = $registered[$plugin['slug']];
} else {
$plugins[$file] = $plugin;
}
}
}
}
if (!is_errors()) {
foreach($plugins AS $plugin) {
if (basename(dirname($plugin['script'])) == $sess_id) {
if (!rename($plugin['script'], PATH_PLUGINS . '/' . basename($plugin['script']))) {
add_error(__('Не удалось установить плагин'));
} else $installed[] = $plugin['slug'];
} else {
$plugin_dirs = ds_readdir_dir_list(dirname($plugin['script']));
if (!is_dir($plugin_dir = PATH_PLUGINS . '/' . basename(dirname($plugin['script'])))) {
mkdir($plugin_dir, 0755);
}
foreach($plugin_dirs AS $dir) {
if (!is_dir($dircopy = str_replace(PATH_CACHE.'/' . $sess_id, PATH_PLUGINS, $dir))) {
mkdir($dircopy, 0755);
}
}
$plugin_files = ds_readdir_files_list(dirname($plugin['script']));
foreach($plugin_files AS $file) {
if (file_exists($filecopy = str_replace(PATH_CACHE.'/' . $sess_id, PATH_PLUGINS, $file))) {
unlink($filecopy);
}
rename($file, $filecopy);
}
if (!file_exists(str_replace(PATH_CACHE.'/' . $sess_id, PATH_PLUGINS, $plugin['script']))) {
add_error(__('Не удалось установить плагин'));
} else $installed[] = $plugin['slug'];
}
}
}
$plg->listPlugins();
}
}
if (is_dir(PATH_CACHE.'/' . $sess_id)) {
delete_dir(PATH_CACHE.'/' . $sess_id);
}
if (is_file($zip_path)) {
unlink($zip_path);
}
if (!is_errors()) {
do_event('ds_plugins_installed', $installed);
return true;
}
return false;
}