Вход Регистрация
Файл: MobileCMS-2.7.0-beta/modules/main/controllers/main_admin.php
Строк: 271
<?php
/**
     * MobileCMS
     *
     * Open source content management system for mobile sites
     *
     * @author MobileCMS Team <support@mobilecms.ru>
     * @copyright Copyright (c) 2011, MobileCMS Team
     * @link http://mobilecms.ru Official site
     * @license http://opensource.org/licenses/gpl-license.php GNU Public License
     */


/**
 * Основные функции админ панели
 */
class Main_Admin_Controller extends Controller {
    
/**
     * Уровень пользовательского доступа
     */
    
protected $access_level 10;
    
/**
     * Тема
     */
    
protected $template_theme 'admin';

    
/**
     * Метод по умолчанию
     */
    
public function action_index() {
        
$this->action_config();
    }

    
/**
     * Конфигурация системы
     */
    
public function action_config() {
        
$_config $this->config['system'];

        if (isset(
$_POST['submit'])) {
            
main::is_demo();
            
$_config $_POST;

            foreach (
$_config as $key => $value) {
                if (
$key == 'submit') continue;
                
$sql  "UPDATE #__config SET n";
                
$sql .= "`value` = '".mysqli_real_escape_string($this->db->db_linkstripslashes($value))."'n";
                
$sql .= "WHERE `key` = '".$key."'";
                
$this->db->query($sql);
            }

            
# Чистим кеш главной
            
@unlink(ROOT.'cache/file_cache/'.md5('index_page'));

            
a_notice('Данные успешно изменены!'a_url('main/admin/config'));
        }

        if (!isset(
$_POST['submit']) || $error) {
            
# Получаем темы
            
$default_themes = array();
            
$admin_themes = array();
            
$dir opendir(ROOT.'views');
            while (
$theme readdir($dir)) {
                if (
$theme == '.' || $theme == '..' || $theme == '.htaccess' || $theme == '.gitignore') continue;
                if (
file_exists(ROOT.'views/'.$theme.'/theme.ini')) {
                    
$theme_info parse_ini_file(ROOT.'views/'.$theme.'/theme.ini');
                    if (!empty(
$theme_info['title'])) {
                        if (
strpos($theme'admin') === 0$admin_themes[] = $theme_info;
                        else 
$default_themes[] = $theme_info;
                    }
                }
            }

            
$mainpage_modules = array();
            
$dir opendir(ROOT.'modules');
            while (
$module readdir($dir)) {
                if (
$module == '.' || $module == '..' || $module == '.htaccess' || $module == '.gitignore') continue;
                if (
file_exists(ROOT.'modules/'.$module.'/module.ini')) {
                    
$module_info parse_ini_file(ROOT.'modules/'.$module.'/module.ini');
                    if (
$module_info['mainpage']) $mainpage_modules[] = $module_info;
                }
            }

            
$this->tpl->assign(array(
                
'_config' => $_config,
                
'admin_themes' => $admin_themes,
                
'default_themes' => $default_themes,
                
'mainpage_modules' => $mainpage_modules
            
));

            
$this->tpl->display('config');
        }
    }
    
    
/**
     * Конфигурация модуля
     */
    
public function action_ftp_config() {
        
$_config $this->config['ftp'];

        if (isset(
$_POST['submit'])) {
            
main::is_demo();
            
$_config $_POST;
            
                        
a_import('modules/main/helpers/main_ftp');
            
            
# Тестируем подключение и папку скрипта
            
$connect_data = array(
                
'server' => $_POST['server'],
                
'port' => $_POST['port'],
                
'login' => $_POST['login'],
                
'password' => $_POST['password']
            );
            
            if (!
$ftp_handle main_ftp::connect($connect_data))
                
$this->error .= 'Не удалось подключиться к указанному фтп серверу, проверьте правильность указанных данных<br />';
            
            if (!
$this->error) {    
                
$test_file 'tmp/'.main::get_unique_code();
                
                
file_put_contents(ROOT.$test_file'ftp test');
                
                if (!@
ftp_get($ftp_handleROOT.'tmp/'.main::get_unique_code(), $_POST['path'].'/'.$test_fileFTP_ASCII))
                    
$this->error .= 'Фтп папка скрипта указана не верно!';
                
                if (!
$this->error) {
                    
main::config($_config'ftp'$this->db);
        
                    
a_notice('Данные успешно изменены!'a_url('main/admin/ftp_config'));
                }
            }
        }

        if (!isset(
$_POST['submit']) || $this->error) {
            
$this->tpl->assign(array(
                
'error' => $this->error,
                
'_config' => $_config
            
));

            
$this->tpl->display('ftp_config');
        }
    }
    
    
/**
     * Загрузка модулей, тем и обновлений по фтп
     */
    
public function action_upload() {
        switch (
$_GET['action']) {
            case 
'module':
                
$action 'module';
                
$title 'Загрузить модуль';
                
$notice_message 'Модуль успешно загружен, теперь перейдите в управление модулями и инсталлируйте его';
                
$notice_url a_url('modules/admin');
                break;
            
            case 
'theme':
                
$action 'theme';
                
$title 'Загрузить тему';
                
$notice_message 'Тема успешно загружена, теперь перейдите в раздел &quot;Конфигурация системы&quot; и активируйте её.';
                
$notice_url a_url('main/admin/config');
                break;
            
            case 
'update':
            default:
                
$action 'update';
                
$title 'Загрузить обновление';
                
$notice_message 'Обновление успешно загружено!';
                
$notice_url a_url('user/admin');
                break;
        }
        
        if (isset(
$_POST['submit'])) {
            if (empty(
$_FILES['file']['tmp_name']))
                
$this->error .= "Укажите файл для загрузки<br />";
        
            if (!
$this->error) {
                
# Создаем объект архива
                
a_import('libraries/pclzip.lib');
                
$archive = new PclZip($_FILES['file']['tmp_name']);
                
                
# Подключаемся по фтп
                                
a_import('modules/main/helpers/main_ftp');
            
                
$connect_data = array(
                    
'server' => $this->config['ftp']['server'],
                    
'port' => $this->config['ftp']['port'],
                    
'login' => $this->config['ftp']['login'],
                    
'password' => $this->config['ftp']['password']
                );
                
                if (!
$ftp_handle main_ftp::connect($connect_data))
                    
a_notice('Не удалось подключиться к указанному фтп серверу, проверьте настройки FTP'a_url('main/admin/ftp_config'));
                
                
$test_file 'tmp/'.main::get_unique_code();
                
                
file_put_contents(ROOT.$test_file'ftp test');
                
                if (!@
ftp_get($ftp_handleROOT.'tmp/'.main::get_unique_code(), $this->config['ftp']['path'].'/'.$test_fileFTP_ASCII))
                    
a_notice('Не удалось проверить корневую папку MobileCMS, проверьте настройки FTP'a_url('main/admin/ftp_config'));
                
                switch (
$action) {
                    
# Подготовка к загрузке для модуля
                    
case 'module':
                        
$module_ini $archive->extract(PCLZIP_OPT_BY_NAME'module.ini'PCLZIP_OPT_EXTRACT_AS_STRING);
                        
$ini_string $module_ini[0]['content'];
                        if (empty(
$ini_string))
                            
a_error("Не найден файл <b>module.ini</b> загружаемого модуля!");
        
                        
$module parse_ini_string($ini_string);
                        
$module['name'] = trim($module['name']);
                        if (empty(
$module['name']))
                            
a_error("Не указано имя модуля в файле module.ini!");
        
                        if (
is_dir(ROOT.'modules/'.$module['name']))
                            
a_error("Папка с именем нового модуля уже существует, возможно, модуль быз загружен ранее!");
        
                        if (!
preg_match("~^[0-9a-z_]*$~"$module['name']))
                            
a_error("Имя модуля имеет не правильный формат, оно должно состоять только из латинских букв в нижнем регистре, цифр и подчеркивания");
                            
                        
# Создаем папку модуля
                        
if (!@ftp_mkdir($ftp_handle$this->config['ftp']['path'].'/modules/'.$module['name']))
                            
a_error("Не удалось создать папку модуля");
                            
                        
$upload_path $this->config['ftp']['path'].'/modules/'.$module['name'];
                        break;
                    
                    
# Подготовка к загрузке для темы
                    
case 'theme':
                        
$theme_ini $archive->extract(PCLZIP_OPT_BY_NAME'theme.ini'PCLZIP_OPT_EXTRACT_AS_STRING);
                        
$ini_string $theme_ini[0]['content'];
                        if (empty(
$ini_string))
                            
a_error("Не найден файл <b>theme.ini</b> загружаемой темы!");
        
                        
$theme parse_ini_string($ini_string);
                        
$theme['name'] = trim($theme['name']);
                        if (empty(
$theme['name']))
                            
a_error("Не указано имя темы в файле theme.ini!");
        
                        if (
is_dir(ROOT.'views/'.$theme['name']))
                            
a_error("Папка с именем новой темы уже существует, возможно, тема была загружена ранее!");
        
                        if (!
preg_match("~^[0-9a-z_]*$~"$theme['name']))
                            
a_error("Имя темы имеет не правильный формат, оно должно состоять только из латинских букв в нижнем регистре, цифр и подчеркивания");
                            
                        
# Создаем папку темы
                        
if (!@ftp_mkdir($ftp_handle$this->config['ftp']['path'].'/views/'.$theme['name']))
                            
a_error("Не удалось создать папку темы");
                            
                        
$upload_path $this->config['ftp']['path'].'/views/'.$theme['name'];
                        break;
                    
                    
# Подготовка к загрузке для обновления
                    
case 'update':
                        
$upload_path $this->config['ftp']['path'];
                        break;
                }
                
                
# Распаковываем архив во временную папку
                
$tmp_path ROOT.'tmp/'.main::get_unique_code();
                
mkdir($tmp_path);
                
$result $archive->extract(PCLZIP_OPT_PATH$tmp_path);
                
                
main_ftp::copy_local_dir($ftp_handle$tmp_path$upload_path);
                
                
a_notice($notice_message$notice_url);
            }
        }
        if (!isset(
$_POST['submit']) or $this->error) {
            
$this->tpl->assign(array(
                
'error' => $this->error,
                
'action' => $action,
                
'title' => $title
            
));
            
            
$this->tpl->display('upload');
        }
    }
    
    
/**
     * MySQL запросы
     */
    
public function action_mysql() {
    
    
# Парсер SQL запросов
  
function parse_sql($sql) {
    
$queries = array();
    
$strlen strlen($sql);
    
$position 0;
    
$query '';

    for (;
$position<$strlen;++$position) {
      
$char $sql{$position};

      switch (
$char) {
        case 
'-':
          if (
substr($sql$position3) !== '-- ') {
            
$query .= $char;
            
            break;
          }

        case 
'#':
          while (
$char !== "r" && $char !== "n" && $position $strlen 1$char $sql{++$position};
        break;

        case 
'`':
        case 
''':
        case '"':
          
$quote  = $char;
          
$query .= $quote;

          while (
$position < $strlen - 1) {
            
$char = $sql{++$position};

            if (
$char === '\') {
              
$query .= $char;

              if (
$position < $strlen - 1) {
                
$char = $sql{++$position};
                
$query .= $char;

                if (
$position < $strlen - 1) $char = $sql{++$position};
              } else {
                break;
              }
            }

            if (
$char === $quote) break;

            
$query .= $char;
          }

          
$query .= $quote;
          
          break;

        case ';':
          
$query = trim($query);
                    
          if (
$query$queries[] = $query;
          
          
$query = '';
        break;

        default:
          
$query .= $char;
        break;
      }
    }

    
$query = trim($query);
        
    if (
$query$queries[] = $query;

    return 
$queries;
  }
    
    if (isset(
$_POST['submit'])) {
      main::is_demo();
    
      if (empty(
$_POST['queries']))
        a_error('Запросы отсутствуют');
        
      if (!
$error) {
        
$sql = parse_sql($_POST['queries']);
        
        # Кол-во выполненных запросов
        
$num_queries = 0;
        
        # Выполнение запросов
        for (
$i=0;$i<count($sql);$i++) {
          if (
$sql[$i] != '') {
            if (
$this->db->query($sql[$i])) {
              
$num_queries++;
            }
          }
        }
      }  

          a_notice('Выполнено '. 
$num_queries .' запросов', a_url('main/admin/mysql'));
    }

    if(!isset(
$_POST['submit']) || $error) {
      
$this->tpl->assign(array(
             'error' => 
$this->error,
             'title' => 'MySQL запросы'
          ));
            
          
$this->tpl->display('mysql'); 
    } 
    }
}

?>
Онлайн: 1
Реклама