Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/includes/install/install.class.php
<?php
/**
* @version        $Id: install.class.php 2432 2022-01-18 19:47:07Z IOS $
* @package        Elxis
* @subpackage    Installer
* @copyright    Copyright (c) 2006-2022 Elxis CMS (https://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( https://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( https://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');
defined('ELXIS_INSTALLER') or die ('Direct access to this location is not allowed');


class
elxisInstaller {

    private
$ilangs = array(); //available installer languages
   
private $lang = 'en';
    private
$langarr = array();
    private
$version = array();
    private
$steps = array();
    private
$step = 1;
    private
$data = array();
    public
$url = ''; //site URL without trailing slash
   
public $relpath = ''; //site relative path from root folder without slashes at begin or end (empty or part of url)
   
private $error = false;
    private
$errormsg = '';


    public function
__construct() {
       
$this->prepareEnv();
       
$this->loadLanguage();
       
$this->setSteps();
    }


   
/**********************/
    /* PREPARE ENVIROMENT */
    /**********************/
   
private function prepareEnv() {
        require(
ELXIS_PATH.'/includes/version.php');
       
$this->version = $elxis_version;

       
$reload = false;
        if (
ELXIS_SELF != 'index.php') { $reload = true; }
       
$protocol = 'http';
       
$port = 0;

         
$found = false;
        if (isset(
$_SERVER['SERVER_PROTOCOL'])) {
           
$protocol = strtolower($_SERVER['SERVER_PROTOCOL']);//be careful can have value like "HTTP/1.1" in SSL !
           
if (($protocol == 'http') || ($protocol == 'https')) { $found = true; } else { $protocol = 'http'; }
        }
        if (!
$found) {
            if (isset(
$_SERVER['HTTPS'])) {
                if ((
$_SERVER['HTTPS'] == 'on') || ($_SERVER['HTTPS'] == 1)) { $protocol = 'https'; }
            } else if (isset(
$_SERVER['REQUEST_SCHEME'])) {
                if (
strtolower($_SERVER['REQUEST_SCHEME']) == 'https') { $protocol = 'https'; }
            }
        }

        if (isset(
$_SERVER['SERVER_PORT'])) {
            if (
$protocol == 'http') {
                if (
$_SERVER['SERVER_PORT'] != 80) { $port = (int)$_SERVER['SERVER_PORT']; }
            } else {
                if ((
$_SERVER['SERVER_PORT'] != 443) && ($_SERVER['SERVER_PORT'] != 80)) { $port = (int)$_SERVER['SERVER_PORT']; }
            }
        }

       
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];
        if (
strpos($host, ':') !== false) {
           
$hparts = preg_split('@\:@', $host, 2, PREG_SPLIT_NO_EMPTY);
           
$host = $hparts[0];
        }
       
$urlpath = '';
        if (isset(
$_SERVER['REQUEST_URI'])) {
           
$n = strpos($_SERVER['REQUEST_URI'], '?');
            if (
$n !== false) {
               
$urlpath = substr($_SERVER['REQUEST_URI'], 0, $n);
            } else {
               
$urlpath = $_SERVER['REQUEST_URI'];
            }
        }

        if (
strpos($urlpath, '.') !== false) {
            if (
strrpos($urlpath, 'index.php') !== false) {
               
$reload = false;
            } else {
               
$reload = true;
            }
           
$slashpos = strrpos($urlpath, '/');
           
$urlpath = substr($urlpath, 0, $slashpos);
        }
       
$urlpath = trim($urlpath, '/');
        if (
$urlpath == '/') { $urlpath = ''; }

       
$continue = true;
        while (
$continue == true) {
            if (
$urlpath == '') { $continue = false; break; }
            if (
strrpos(ELXIS_PATH, $urlpath) !== false) {
               
$continue = false;
                break;
            } else {
               
$slashpos = strrpos($urlpath, '/');
               
$urlpath = substr($urlpath, 0, $slashpos);
               
$urlpath = trim($urlpath, '/');
            }
        }

        if (
$urlpath == '/') { $urlpath = ''; }
        if (
$urlpath != '') { $urlpath = '/'.$urlpath; }

        if (
$port > 0) {
           
$this->url = $protocol.'://'.$host.':'.$port.$urlpath;
        } else {
           
$this->url = $protocol.'://'.$host.$urlpath;
        }

       
$n = strpos($host.$urlpath, '/');
        if (
$n !== false) {//installation in sub-folder
           
$this->relpath = trim(substr($host.$urlpath, $n));
           
$this->relpath = trim($this->relpath, '/');
            if (
$this->relpath == '/') { $this->relpath = ''; }
        }

        if (
$reload == true) {
            if (
headers_sent()) {
                echo
'<script>document.location.href="'.$this->url.'";</script>'."\n";
                echo
'Redirection to the proper installation URL<br />';
                echo
'<a href="'.$this->url.'" stle="font-weight:bold;">Click here</a> if you don\'t get redirected automatically.'."\n";
            } else {
                if (
ob_get_length() > 0) { ob_end_clean(); }
                @
header('content-type:text/html; charset=utf-8');
                @
header('Location: '.$this->url);
            }
            exit;
        }
    }


   
/*****************/
    /* LOAD LANGUAGE */
    /*****************/
   
private function loadLanguage() {
       
$ilangs = $this->listFolders(ELXIS_PATH.'/language/');

        include(
ELXIS_PATH.'/includes/libraries/elxis/language/langdb.php');
        if (
$ilangs) {
            foreach (
$ilangs as $ilang) {
                if (isset(
$langdb[$ilang])) {
                    if (
file_exists(ELXIS_PATH.'/language/'.$ilang.'/'.$ilang.'.install.php')) {
                       
$this->ilangs[$ilang] = $langdb[$ilang];
                       
$this->ilangs[$ilang]['RTLSFX'] = ($langdb[$ilang]['DIR'] == 'rtl') ? '-rtl' : '';
                    }
                }
            }
        }

       
$lang = '';
        if (isset(
$_GET['lang']) && (trim($_GET['lang']) != '')) {
           
$lng = trim($_GET['lang']);
            if (isset(
$this->ilangs[$lng])) { $lang = $lng; }
        }
        if ((
$lang == '') && isset($_POST['lang']) && (trim($_POST['lang']) != '')) {
           
$lng = trim($_POST['lang']);
            if (isset(
$this->ilangs[$lng])) { $lang = $lng; }
        }
        if (
$lang == '') {
           
$lang = $this->browserLang($ilangs);
        }

        if (!isset(
$this->ilangs[$lang])) {
            die(
'Fatal error: Language '.$lang.' was not found!');
        }

       
$this->lang = $lang;

        include(
ELXIS_PATH.'/language/'.$lang.'/'.$lang.'.php');
       
$this->langarr = $_lang;
        unset(
$_lang);
        if (!isset(
$locale) || !is_array($locale)) { $locale = array('en_GB.utf8', 'en_GB.UTF-8', 'en_GB', 'en', 'english', 'england'); }
        include(
ELXIS_PATH.'/language/'.$lang.'/'.$lang.'.install.php');
        foreach (
$_lang as $k => $v) { $this->langarr[$k] = $v; }
        unset(
$_lang);
       
$this->setLocale($locale);
    }


   
/****************************/
    /* LIST FOLDERS INSIDE PATH */
    /****************************/
   
private function listFolders($path) {
       
$handle = @opendir($path);
        if (!
$handle) { return array(); }
       
$arr = array();
        while (
$entry = readdir($handle)) {
           
$dir = $path.$entry;
            if ((
$entry != '.') && ($entry != '..') && is_dir($dir)) { $arr[] = $entry; }
        }
       
closedir($handle);
        if (
$arr) { asort($arr); }
        return
$arr;
    }


   
/********************************************************/
    /* DETECT BROWSER LANGUAGE AND CONVERT IT TO ELXIS LANG */
    /********************************************************/
   
private function browserLang($allowed_langs=array()) {
        if (!
is_array($allowed_langs) || (count($allowed_langs) == 0)) { $allowed_langs = array('en'); }
        if (!isset(
$_SERVER['HTTP_ACCEPT_LANGUAGE'])) { return $allowed_langs[0]; }
       
$acc_langs_str = trim($_SERVER['HTTP_ACCEPT_LANGUAGE']);
        if (
$acc_langs_str == '') { return $allowed_langs[0]; }
       
$langs = array();
       
$acc_langs = explode(',', trim($acc_langs_str));
        foreach (
$acc_langs as $acc_lang) {
            if (
preg_match('/(\*|[a-zA-Z0-9]{1,8}(?:-[a-zA-Z0-9]{1,8})*)(?:\s*;\s*q\s*=\s*(0(?:\.\d{0,3})|1(?:\.0{0,3})))?/', trim($acc_lang), $match)) {
               
$q = (!isset($match[2])) ? '1.0' : (string)floatval($match[2]);
               
$m = trim(strtolower($match[1]));
               
$n = strpos($m, '-');
                if (
$n !== false) { $m = substr($m, 0, $n); }
                if (!
in_array($m, $allowed_langs)) { continue; }
                if (!isset(
$langs[$q])) { $langs[$q] = array(); }
               
$langs[$q][] = $m;
            }
        }
        if (!
$langs) { return $allowed_langs[0]; }
       
krsort($langs);
       
$final_lang = $allowed_langs[0];
        foreach (
$langs as $k => $lngs) {
           
$final_lang = $lngs[0];
            break;
        }
        return
$final_lang;
    }


   
/*************************/
    /* SET ENVIROMENT LOCALE */
    /*************************/
   
private function setLocale($locale) {
        if (
strtoupper(substr(php_uname(), 0, 3)) == 'WIN') {
           
$loc = array ('en_GB.utf8', 'en_GB.utf-8', 'eng', 'english');
           
setlocale(LC_COLLATE, $loc);
           
setlocale(LC_CTYPE, $loc);
           
setlocale(LC_TIME, $loc);
            return;
        }

       
setlocale(LC_COLLATE, $locale);
       
setlocale(LC_CTYPE, $locale);
       
setlocale(LC_TIME, $locale);    
    }


   
/********************/
    /* SET CURRENT STEP */
    /********************/
   
private function setSteps() {
       
$this->steps = array (
           
1 => $this->getLang('ELXIS_INSTALL'),
           
2 => $this->getLang('ADMIN_ACCOUNT'),//DATA_IMPORT
           
3 => $this->getLang('FINISH')
           
//2 => $this->getLang('LICENSE'),
            //3 => $this->getLang('SETTINGS'),
            //4 => $this->getLang('DATA_IMPORT'),
            //5 => $this->getLang('FINISH')
       
);

       
$step = 1;
        if (isset(
$_GET['step'])) {
           
$step = (int)$_GET['step'];
        } else if (isset(
$_POST['step'])) {
           
$step = (int)$_POST['step'];
        }
        if (
$step < 1) { $step = 1; }
       
//if ($step > 5) { $step = 1; }
       
if ($step > 3) { $step = 1; }
        if (!isset(
$this->steps[$step])) { $step = 1; }
       
$this->step = $step;
    }


   
/*****************************/
    /* GET LANGUAGE STRING VALUE */
    /*****************************/
   
public function getLang($str) {
        if (isset(
$this->langarr[$str])) { return $this->langarr[$str]; }
        return
$str;
    }


   
/***********************/
    /* PRE-PROCESS REQUEST */
    /***********************/
   
public function process() {
        if (
$this->step == 2) {
           
$this->data['queries'] = 0;
           
$this->data['import_error'] = '';
           
$this->data['cfg'] = $this->catchConfigPost();

            if (
$this->data['cfg']['errormsg'] == '') {
                require_once(
ELXIS_PATH.'/includes/install/inc/miniloader.php');
                require_once(
ELXIS_PATH.'/includes/libraries/elxis/database.class.php');
               
$params = array(
                   
'dbtype' => $this->data['cfg']['cfg_db_type'],
                   
'host' => $this->data['cfg']['cfg_db_host'],
                   
'port' => $this->data['cfg']['cfg_db_port'],
                   
'dbname' => $this->data['cfg']['cfg_db_name'],
                   
'username' => $this->data['cfg']['cfg_db_user'],
                   
'password' => $this->data['cfg']['cfg_db_pass'],
                   
'persistent' => 0,
                   
'dsn' => $this->data['cfg']['cfg_db_dsn'],
                   
'scheme' => $this->data['cfg']['cfg_db_scheme'],
                   
'table_prefix' => $this->data['cfg']['cfg_db_prefix'],
                   
'debug' => 0
               
);

               
$db = new elxisDatabase($params, array(), false);
               
$okcon = $db->connect($this->data['cfg']['cfg_db_dsn'], $this->data['cfg']['cfg_db_user'], $this->data['cfg']['cfg_db_pass'], array(), true); //on fail returns false
               
if (!$okcon) {
                   
$this->data['queries'] = false;
                   
$this->data['import_error'] = $db->getErrorMsg();
                    if (
$this->data['import_error'] == '') { $this->data['import_error'] = 'Could not connect to database!'; }
                } else {
                   
$sqlfile = ELXIS_PATH.'/includes/install/data/'.$this->data['cfg']['cfg_db_type'].'.sql';
                   
$this->data['queries'] = $db->import($sqlfile);
                    if (
$this->data['queries'] === false) { $this->data['import_error'] = $db->getErrorMsg(); }
                   
$db->disconnect();    
                }
            } else {
               
$this->step = 1;
            }
            return;
        }

        if (
$this->step == 3) {
           
$this->data['cfg'] = $this->catchConfigPost();
            if (
$this->data['cfg']['errormsg'] != '') {
               
$this->step = 1;
                return;
            }
           
$this->data['usr'] = $this->catchUserPost();
            if (
$this->data['usr']['errormsg'] != '') {
               
$this->step = 2;
                return;
            }

            require_once(
ELXIS_PATH.'/includes/install/inc/miniloader.php');
            require_once(
ELXIS_PATH.'/includes/libraries/elxis/database.class.php');
           
$params = array(
               
'dbtype' => $this->data['cfg']['cfg_db_type'],
               
'host' => $this->data['cfg']['cfg_db_host'],
               
'port' => $this->data['cfg']['cfg_db_port'],
               
'dbname' => $this->data['cfg']['cfg_db_name'],
               
'username' => $this->data['cfg']['cfg_db_user'],
               
'password' => $this->data['cfg']['cfg_db_pass'],
               
'persistent' => 0,
               
'dsn' => $this->data['cfg']['cfg_db_dsn'],
               
'scheme' => $this->data['cfg']['cfg_db_scheme'],
               
'table_prefix' => $this->data['cfg']['cfg_db_prefix'],
               
'debug' => 0
           
);

            if (!
class_exists('elxisCryptHelper', false)) {
                include(
ELXIS_PATH.'/includes/libraries/elxis/helpers/crypt.helper.php');
            }

           
$db = new elxisDatabase($params, array(), false);
           
$db->connect($this->data['cfg']['cfg_db_dsn'], $this->data['cfg']['cfg_db_user'], $this->data['cfg']['cfg_db_pass'], array());

           
$eparams = array(
               
'method' => $this->data['cfg']['cfg_encrypt_method'],
               
'key' => $this->data['cfg']['cfg_encrypt_key']
            );
           
$encObj = new elxisCryptHelper($eparams);
           
$encpword = $encObj->getEncryptedPassword($this->data['usr']['u_pword']);
            unset(
$encObj, $eparams);

           
$now = gmdate('Y-m-d H:i:s');
           
$sql = "UPDATE ".$db->quoteId('#__users')." SET ".$db->quoteId('firstname')." = :x1, ".$db->quoteId('lastname')." = :x2, ".$db->quoteId('uname')." = :x3,"
           
."\n ".$db->quoteId('pword')." = :x4, ".$db->quoteId('website')." = :x5, ".$db->quoteId('email')." = :x6, ".$db->quoteId('registerdate')." = :x7,"
           
."\n ".$db->quoteId('lastvisitdate')." = :x8 WHERE ".$db->quoteId('uid')." = 1";
           
$stmt = $db->prepare($sql);

           
$stmt->bindParam(':x1', $this->data['usr']['u_firstname'], PDO::PARAM_STR);
           
$stmt->bindParam(':x2', $this->data['usr']['u_lastname'], PDO::PARAM_STR);
           
$stmt->bindParam(':x3', $this->data['usr']['u_uname'], PDO::PARAM_STR);
           
$stmt->bindParam(':x4', $encpword, PDO::PARAM_STR);
           
$stmt->bindParam(':x5', $this->data['cfg']['cfg_url'], PDO::PARAM_STR);
           
$stmt->bindParam(':x6', $this->data['usr']['u_email'], PDO::PARAM_STR);
           
$stmt->bindParam(':x7', $now, PDO::PARAM_STR);
           
$stmt->bindParam(':x8', $now, PDO::PARAM_STR);
           
$stmt->execute();

           
$author_name = $this->data['usr']['u_firstname'].' '.$this->data['usr']['u_lastname'];
           
$created_date = gmdate('Y-m-d H:i:s');

           
$sql = "UPDATE ".$db->quoteId('#__content')." SET ".$db->quoteId('created')." = :y1, ".$db->quoteId('created_by_name')." = :y2";
           
$stmt = $db->prepare($sql);
           
$stmt->bindParam(':y1', $created_date, PDO::PARAM_STR);
           
$stmt->bindParam(':y2', $author_name, PDO::PARAM_STR);
           
$stmt->execute();

           
$admin_folder = $this->renameEstia();
           
$new_link = $this->data['cfg']['cfg_url'].'/'.$admin_folder.'/';
           
$old_link = 'http://localhost/estia/';

           
$sql = "UPDATE ".$db->quoteId('#__menu')." SET ".$db->quoteId('link')." = :xnew WHERE ".$db->quoteId('link')." = :xold";
           
$stmt = $db->prepare($sql);
           
$stmt->bindParam(':xnew', $new_link, PDO::PARAM_STR);
           
$stmt->bindParam(':xold', $old_link, PDO::PARAM_STR);
           
$stmt->execute();

           
$fromname = 'Elxis Team';
           
$toname = $this->data['usr']['u_firstname'].' '.$this->data['usr']['u_lastname'];
           
$msgtype = 'info';
           
$message = 'Welcome to Elxis CMS! For support please visit https://forum.elxis.org';
           
$now = gmdate('Y-m-d H:i:s');

           
$sql = "INSERT INTO ".$db->quoteId('#__messages')." VALUES (NULL, 0, :xv1, 1, :xv2, :xv3, :xv4, :xv5, 0, 0, 0, 0)";
           
$stmt = $db->prepare($sql);
           
$stmt->bindParam(':xv1', $fromname, PDO::PARAM_STR);
           
$stmt->bindParam(':xv2', $toname, PDO::PARAM_STR);
           
$stmt->bindParam(':xv3', $msgtype, PDO::PARAM_STR);
           
$stmt->bindParam(':xv4', $message, PDO::PARAM_STR);
           
$stmt->bindParam(':xv5', $now, PDO::PARAM_STR);
           
$stmt->execute();

           
$db->disconnect();

            if (
$this->data['cfg']['cfg_repo_path'] == '') {
               
$this->renameRepository();
            }
           
$this->saveConfig($admin_folder);
            return;
        }
    }


   
/***************************************************************/
    /* GET THE VALUE FOR A USER SUBMITTED ITEM FROM THE DATA ARRAY */
    /***************************************************************/
   
public function dataValue($first, $second, $default) {
        if (
$first != '') {
            if (
$second != '') {
                return (isset(
$this->data[$first][$second])) ? $this->data[$first][$second] : $default;
            } else {
                return (isset(
$this->data[$first])) ? $this->data[$first] : $default;
            }
        }
        return
$default;
    }


   
/******************/
    /* MAKE STEP HTML */
    /******************/
   
public function makehtml() {
       
$fname = 'step'.$this->step.'.php';
        if (
file_exists(ELXIS_PATH.'/includes/install/inc/'.$fname)) {
            include(
ELXIS_PATH.'/includes/install/inc/'.$fname);
        }
    }


   
/**************************/
    /* GET CURRENT STEP TITLE */
    /**************************/
   
public function stepTitle() {
       
$step = $this->step;
        return
$this->steps[$step];
    }


   
/********************/
    /* GET STEPS NUMBER */
    /********************/
   
public function countSteps() {
        return
count($this->steps);
    }


   
/********************/
    /* GET CURRENT STEP */
    /********************/
   
public function getStep() {
        return
$this->step;
    }


   
/*****************************************/
    /* CATCH AND VALIDATE CONFIGURATION POST */
    /*****************************************/
   
private function catchConfigPost() {
       
$cfg = array(
           
'errormsg' => '',
           
'cfg_sitename' => '',
           
'cfg_url' => '',
           
'cfg_repo_path' => '',
           
'cfg_lang' => '',
           
'cfg_encrypt_method' => '',
           
'cfg_encrypt_key' => '',
           
'cfg_db_type' => '',
           
'cfg_db_host' => '',
           
'cfg_db_prefix' => '',
           
'cfg_db_port' => 0,
           
'cfg_db_name' => '',
           
'cfg_db_user' => '',
           
'cfg_db_pass' => '',
           
'cfg_db_dsn' => '',
           
'cfg_db_scheme' => '',
           
'cfg_ftp' => 0,
           
'cfg_ftp_host' => '',
           
'cfg_ftp_port' => 21,
           
'cfg_ftp_root' => '',
           
'cfg_ftp_user' => '',
           
'cfg_ftp_pass' => '',
           
'cfg_mail_method' => 'mail',//mail smtp sendmail
           
'cfg_smtp_host' => '',
           
'cfg_smtp_port' => 25,
           
'cfg_smtp_secure' => '',//empty, ssl, tls, starttls
           
'cfg_smtp_auth' => 0,//attention:checkbox!
           
'cfg_mail_auth_method' => '',//empty, CRAM-MD5, LOGIN, NTLM, PLAIN, XOAUTH2
           
'cfg_smtp_user' => '',
           
'cfg_smtp_pass' => '',
           
'cfg_sef' => 0,
           
'cfg_sitelangs' => '',
           
'cfg_multilinguism' => 1//auto-calculated, not from post
       
);

       
$cfg['cfg_sitename'] = filter_input(INPUT_POST, 'cfg_sitename', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
       
$cfg['cfg_url'] = trim(filter_input(INPUT_POST, 'cfg_url', FILTER_SANITIZE_URL));
       
$cfg['cfg_repo_path'] = filter_input(INPUT_POST, 'cfg_repo_path', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);//this is empty, we will create on save
       
$cfg['cfg_repo_path'] = rtrim(str_replace('\\', '/', $cfg['cfg_repo_path']), '/');
       
$cfg['cfg_lang'] = trim(filter_input(INPUT_POST, 'cfg_lang', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_encrypt_method'] = trim(filter_input(INPUT_POST, 'cfg_encrypt_method', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
        if ((
$cfg['cfg_encrypt_method'] != 'xor') && ($cfg['cfg_encrypt_method'] != 'mcrypt') && ($cfg['cfg_encrypt_method'] != 'openssl')) { $cfg['cfg_encrypt_method'] = ''; }
       
$cfg['cfg_encrypt_key'] = trim(filter_input(INPUT_POST, 'cfg_encrypt_key', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_db_type'] = trim(filter_input(INPUT_POST, 'cfg_db_type', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_db_host'] = trim(filter_input(INPUT_POST, 'cfg_db_host', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_db_prefix'] = trim(filter_input(INPUT_POST, 'cfg_db_prefix', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_db_port'] = (isset($_POST['cfg_db_port'])) ? (int)$_POST['cfg_db_port'] : 0;
        if (
$cfg['cfg_db_port'] < 0) { $cfg['cfg_db_port'] = 0; }
       
$cfg['cfg_db_name'] = trim(filter_input(INPUT_POST, 'cfg_db_name', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_db_user'] = trim(filter_input(INPUT_POST, 'cfg_db_user', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_db_pass'] = trim(filter_input(INPUT_POST, 'cfg_db_pass', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_db_dsn'] = trim(filter_input(INPUT_POST, 'cfg_db_dsn', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_db_scheme'] = trim(filter_input(INPUT_POST, 'cfg_db_scheme', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_ftp'] = (isset($_POST['cfg_ftp'])) ? (int)$_POST['cfg_ftp'] : 0;
        if (
$cfg['cfg_ftp'] <> 1) { $cfg['cfg_ftp'] = 0; }
       
$cfg['cfg_ftp_host'] = trim(filter_input(INPUT_POST, 'cfg_ftp_host', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_ftp_port'] = (isset($_POST['cfg_ftp_port'])) ? (int)$_POST['cfg_ftp_port'] : 0;
        if (
$cfg['cfg_ftp_port'] < 1) { $cfg['cfg_ftp_port'] = 21; }
       
$cfg['cfg_ftp_root'] = trim(filter_input(INPUT_POST, 'cfg_ftp_root', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_ftp_root'] = rtrim($cfg['cfg_ftp_root'], '/');
        if (
$cfg['cfg_ftp_root'] == '') { $cfg['cfg_ftp_root'] = '/'; }
       
$cfg['cfg_ftp_user'] = trim(filter_input(INPUT_POST, 'cfg_ftp_user', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_ftp_pass'] = trim(filter_input(INPUT_POST, 'cfg_ftp_pass', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$cfg['cfg_sef'] = (isset($_POST['cfg_sef'])) ? (int)$_POST['cfg_sef'] : 0;
        if (
$cfg['cfg_sef'] < 0) { $cfg['cfg_sef'] = 0; }

       
$cfg['cfg_mail_method'] = trim(filter_input(INPUT_POST, 'cfg_mail_method', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
        if (
$cfg['cfg_mail_method'] == '') { $cfg['cfg_mail_method'] = 'mail'; }
        if (!
in_array($cfg['cfg_mail_method'], array('mail', 'smtp', 'sendmail'))) { $cfg['cfg_mail_method'] = 'mail'; }
       
$cfg['cfg_smtp_host'] = trim(filter_input(INPUT_POST, 'cfg_smtp_host', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
       
$cfg['cfg_smtp_port'] = (isset($_POST['cfg_smtp_port'])) ? (int)$_POST['cfg_smtp_port'] : 0;
        if (
$cfg['cfg_smtp_port'] < 1) { $cfg['cfg_smtp_port'] = 25; }
       
$cfg['cfg_smtp_secure'] = trim(filter_input(INPUT_POST, 'cfg_smtp_secure', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
        if (
$cfg['cfg_smtp_secure'] != '') {
            if (!
in_array($cfg['cfg_smtp_secure'], array('ssl', 'tls', 'starttls'))) { $cfg['cfg_smtp_secure'] = ''; }
        }
       
$cfg['cfg_smtp_auth'] = (isset($_POST['cfg_smtp_auth'])) ? (int)$_POST['cfg_smtp_auth'] : 0;
       
$cfg['cfg_mail_auth_method'] = trim(filter_input(INPUT_POST, 'cfg_smtp_secure', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
        if (
$cfg['cfg_mail_auth_method'] != '') {
            if (!
in_array($cfg['cfg_mail_auth_method'], array('CRAM-MD5', 'LOGIN', 'NTLM', 'PLAIN', 'XOAUTH2'))) { $cfg['cfg_mail_auth_method'] = ''; }
        }
       
$cfg['cfg_smtp_user'] = trim(filter_input(INPUT_POST, 'cfg_smtp_user', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
       
$cfg['cfg_smtp_pass'] = trim(filter_input(INPUT_POST, 'cfg_smtp_pass', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));

        if (
trim($cfg['cfg_sitename']) == '') {
           
$cfg['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), $this->getLang('SITENAME'));
            return
$cfg;
        }
        if ((
$cfg['cfg_url'] == '') || !filter_var($cfg['cfg_url'], FILTER_VALIDATE_URL)) {
           
$cfg['errormsg'] = $this->getLang('INVALID_URL'); return $cfg;
        }
        if (
$cfg['cfg_repo_path'] != '') {//this is empty, we will create on save
           
if (!file_exists($cfg['cfg_repo_path'].'/')) { $cfg['errormsg'] = $this->getLang('REPOPATH_NOEX'); return $cfg; }
        }
        if ((
$cfg['cfg_lang'] == '') || !file_exists(ELXIS_PATH.'/language/'.$cfg['cfg_lang'].'/'.$cfg['cfg_lang'].'.php')) {
           
$cfg['errormsg'] = 'Invalid language!'; return $cfg;
        }
        if ((
$cfg['cfg_encrypt_key'] == '') || (strlen($cfg['cfg_encrypt_key']) != 16)) {
           
$cfg['errormsg'] = 'Invalid encryption key!'; return $cfg;
        }
        if (
$cfg['cfg_db_type'] == '') {
           
$cfg['errormsg'] = 'You must select a database type!'; return $cfg;
        }
       
$pdodrivers = PDO::getAvailableDrivers();
        if (!
$pdodrivers) { $pdodrivers = array(); }
        if (!
in_array($cfg['cfg_db_type'], $pdodrivers)) {
           
$cfg['errormsg'] = 'PDO database driver '.$cfg['cfg_db_type'].' is not supported by your system!'; return $cfg;
        }
        if (!
file_exists(ELXIS_PATH.'/includes/install/data/'.$cfg['cfg_db_type'].'.sql')) {
           
$cfg['errormsg'] = 'PDO database driver '.$cfg['cfg_db_type'].' is not supported by the Elxis installer!'; return $cfg;
        }
        if (
$cfg['cfg_db_host'] == '') {
           
$cfg['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), 'DB '.$this->getLang('HOST')); return $cfg;
        }
        if (
$cfg['cfg_db_prefix'] == '') {
           
$cfg['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), $this->getLang('TABLES_PREFIX')); return $cfg;
        }

        if (
$cfg['cfg_db_name'] == '') {
           
$cfg['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), 'DB '.$this->getLang('NAME')); return $cfg;
        }
        if (
$cfg['cfg_db_scheme'] != '') {
           
$cfg['cfg_db_scheme'] = str_replace('\\', '/', $cfg['cfg_db_scheme']);
            if (!
is_file($cfg['cfg_db_scheme'])) {
               
$cfg['errormsg'] = 'Database schema file does not exist!';
                return
$cfg;
            }
        }
        if (((
$cfg['cfg_db_type'] == 'sqlite') || ($cfg['cfg_db_type'] == 'sqlite2')) && ($cfg['cfg_db_scheme'] == '')) {
           
$cfg['errormsg'] = 'A schema file is required for '.$cfg['cfg_db_type'];
            return
$cfg;
        }
        if ((
$cfg['cfg_db_dsn'] == '') && ($cfg['cfg_db_scheme'] == '')) {
            if (
$cfg['cfg_db_user'] == '') {
               
$cfg['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), 'DB '.$this->getLang('USERNAME')); return $cfg;
            }
            if (
$cfg['cfg_db_pass'] == '') {
               
$cfg['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), 'DB '.$this->getLang('PASSWORD')); return $cfg;
            }
        }

        if (
$cfg['cfg_ftp'] == 1) {
            if (
$cfg['cfg_ftp_host'] == '') {
               
$cfg['cfg_ftp_host'] = sprintf($this->getLang('FIELDNOEMPTY'), 'FTP '.$this->getLang('HOST')); return $cfg;
            }
            if (
$cfg['cfg_ftp_user'] == '') {
               
$cfg['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), 'FTP '.$this->getLang('USERNAME')); return $cfg;
            }
            if (
$cfg['cfg_ftp_pass'] == '') {
               
$cfg['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), 'FTP '.$this->getLang('PASSWORD')); return $cfg;
            }
        }

        if (isset(
$_POST['cfg_sitelangs'])) {
           
$cfg['cfg_sitelangs'] = trim(filter_input(INPUT_POST, 'cfg_sitelangs', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
            if (
$cfg['cfg_sitelangs'] == '') {
               
$cfg['cfg_multilinguism'] = 1;
            } else if (
$cfg['cfg_sitelangs'] == 'none') {
               
$cfg['cfg_sitelangs'] = $cfg['cfg_lang'];
               
$cfg['cfg_multilinguism'] = 0;
            } else {
               
$parts = explode(',', $cfg['cfg_sitelangs']);
                if (!
in_array($cfg['cfg_lang'], $parts)) { $parts[] = $cfg['cfg_lang']; }
               
$cfg['cfg_sitelangs'] = implode(',', $parts);
                if (
count($parts) == 1) { $cfg['cfg_multilinguism'] = 0; }
            }
        }

        return
$cfg;
    }


   
/********************************/
    /* CATCH AND VALIDATE USER POST */
    /********************************/
   
private function catchUserPost() {
       
$usr = array(
           
'errormsg' => '',
           
'u_firstname' => '',
           
'u_lastname' => '',
           
'u_email' => '',
           
'u_uname' => '',
           
'u_pword' => ''
       
);

       
$usr['u_firstname'] = filter_input(INPUT_POST, 'u_firstname', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
       
$usr['u_lastname'] = filter_input(INPUT_POST, 'u_lastname', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
       
$usr['u_email'] = trim(filter_input(INPUT_POST, 'u_email', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$usr['u_uname'] = trim(filter_input(INPUT_POST, 'u_uname', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$usr['u_pword'] = trim(filter_input(INPUT_POST, 'u_pword', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$u_pword2 = trim(filter_input(INPUT_POST, 'u_pword2', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));

        if (
trim($usr['u_firstname']) == '') {
           
$usr['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), $this->getLang('FIRSTNAME'));
            return
$usr;
        }
        if (
trim($usr['u_lastname']) == '') {
           
$usr['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), $this->getLang('LASTNAME'));
            return
$usr;
        }
        if (
$usr['u_email'] == '') {
           
$usr['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), $this->getLang('EMAIL'));
            return
$usr;
        }
        if (!
filter_var($usr['u_email'], FILTER_VALIDATE_EMAIL)) {
           
$usr['errormsg'] = 'Provided email in invalid!'; return $usr;
        }

        if (
$usr['u_uname'] == '') {
           
$usr['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), $this->getLang('USERNAME')); return $usr;
        }
        if (
$usr['u_pword'] == '') {
           
$usr['errormsg'] = sprintf($this->getLang('FIELDNOEMPTY'), $this->getLang('PASSWORD')); return $usr;
        }
        if (
$u_pword2 == '') { $usr['errormsg'] = $this->getLang('PASS_NOMATCH'); return $usr; }
        if (
$usr['u_pword'] != $u_pword2) { $usr['errormsg'] = $this->getLang('PASS_NOMATCH'); return $usr; }

       
$ustr = preg_replace('/[^A-Z\-\_0-9]/i', '', $usr['u_uname']);
       
$pstr = preg_replace('/[^A-Z\-\_0-9\!\@]/i', '', $usr['u_pword']);
        if (
$ustr != $usr['u_uname']) {
           
$usr['errormsg'] = sprintf($this->getLang('FIELDNOACCCHAR'), $this->getLang('USERNAME')); return $usr;
        }
        if (
strlen($usr['u_uname']) < 4) {
           
$usr['errormsg'] = 'Username is too short!'; return $usr;
        }
        if ((
$pstr != $usr['u_pword']) || (trim($_POST['u_pword']) !=  $usr['u_pword'])) {
           
$usr['errormsg'] = sprintf($this->getLang('FIELDNOACCCHAR'), $this->getLang('PASSWORD')); return $usr;
        }
        if (
strlen($usr['u_pword']) < 8) {
           
$usr['errormsg'] = 'Password is too short!'; return $usr;
        }

        return
$usr;
    }


   
/************************/
    /* GET CURRENT LANGUAGE */
    /************************/
   
public function currentLang() {
        return
$this->lang;
    }


   
/*********************/
    /* GET LANGUAGE INFO */
    /*********************/
   
public function langInfo($str) {
       
$linfo = $this->ilangs[ $this->lang ];
        if (isset(
$linfo[$str])) { return $linfo[$str]; }
        return
'';
    }


   
/******************************/
    /* GET INSTALL LANGUAGES KEYS */
    /******************************/
   
public function getiLangs() {
        return
$this->ilangs ? array_keys($this->ilangs) : array();
    }


   
/********************/
    /* GET VERSION INFO */
    /********************/
   
public function verInfo($str) {
        if (isset(
$this->version[$str])) {
            return
$this->version[$str];
        }
        return
'';
    }


   
/***********************************************/
    /* GET A LIST OF ALL AVAILABLE ELXIS LANGUAGES */
    /***********************************************/
   
public function elxisLanguages() {
       
$ilangs = $this->listFolders(ELXIS_PATH.'/language/');
       
$elxislangs = array();
        include(
ELXIS_PATH.'/includes/libraries/elxis/language/langdb.php');
        if (
$ilangs) {
            foreach (
$ilangs as $ilang) {
                if (isset(
$langdb[$ilang])) { $elxislangs[$ilang] = $langdb[$ilang];  }
            }
        }

        return
$elxislangs;
    }


   
/*************************************/
    /* BUILD AND SAVE CONFIGURATION FILE */
    /*************************************/
   
private function saveConfig($admin_folder) {
       
$mparts = explode('@', $this->data['usr']['u_email']);
       
$mdomain = strtolower($mparts[1]);
       
$sparts = parse_url($this->data['cfg']['cfg_url']);
       
$sdomain = strtolower($sparts['host']);
        if (
$mdomain == $sdomain) {
           
$fromemail = 'elxis@'.$mparts[1];
        } else {
           
$fromemail = $this->data['usr']['u_email'];
        }

       
$tld = '';
       
$n = strrpos($sdomain, '.');
        if (
$n !== false) {
           
$n = $n + 1;
           
$tld = substr($sdomain, $n);
           
$tld = strtoupper($tld);
        }
        unset(
$mparts, $sparts, $mdomain, $sdomain, $n);

       
$timezone = '';
        if ((
$tld != '') && !in_array($tld, array('LOC', 'COM', 'NET', 'ORG', 'TV', 'INFO', 'BIZ', 'EU', 'EDU', 'GOV', 'MIL', 'TRAVEL', 'ASIA'))) {
           
$timezone = $this->getTzone($tld);
            if (
$timezone == '') {
               
$region = strtoupper($this->langInfo('REGION'));
               
$timezone = $this->getTzone($region);
            }
        } else {
           
$region = strtoupper($this->langInfo('REGION'));
           
$timezone = $this->getTzone($region);
        }

        if (
$timezone == '') { $timezone = 'Europe/London'; }
        unset(
$tld);

       
$cvars = array();
       
$cvars['URL'] = $this->data['cfg']['cfg_url'];
       
$cvars['REPO_PATH'] = $this->data['cfg']['cfg_repo_path'];
       
$cvars['LANG'] = $this->data['cfg']['cfg_lang'];
       
$cvars['SITELANGS'] = $this->data['cfg']['cfg_sitelangs'];
       
$cvars['MULTILINGUISM'] = $this->data['cfg']['cfg_multilinguism'];
       
$cvars['SITENAME'] = addslashes($this->data['cfg']['cfg_sitename']);
       
$cvars['ENCRYPT_METHOD'] = $this->data['cfg']['cfg_encrypt_method'];
       
$cvars['ENCRYPT_KEY'] = $this->data['cfg']['cfg_encrypt_key'];
       
$cvars['DB_TYPE'] = $this->data['cfg']['cfg_db_type'];
       
$cvars['DB_HOST'] = $this->data['cfg']['cfg_db_host'];
       
$cvars['DB_NAME'] = $this->data['cfg']['cfg_db_name'];
       
$cvars['DB_PREFIX'] = $this->data['cfg']['cfg_db_prefix'];
       
$cvars['DB_USER'] = addslashes($this->data['cfg']['cfg_db_user']);
       
$cvars['DB_PASS'] = addslashes($this->data['cfg']['cfg_db_pass']);
       
$cvars['DB_DSN'] = addslashes($this->data['cfg']['cfg_db_dsn']);
       
$cvars['DB_SCHEME'] = $this->data['cfg']['cfg_db_scheme'];
       
$cvars['DB_PORT'] = $this->data['cfg']['cfg_db_port'];
       
$cvars['DB_PERSISTENT'] = 0;
       
$cvars['FTP'] = $this->data['cfg']['cfg_ftp'];
       
$cvars['FTP_HOST'] = $this->data['cfg']['cfg_ftp_host'];
       
$cvars['FTP_PORT'] = $this->data['cfg']['cfg_ftp_port'];
       
$cvars['FTP_ROOT'] = $this->data['cfg']['cfg_ftp_root'];
       
$cvars['FTP_USER'] = addslashes($this->data['cfg']['cfg_ftp_user']);
       
$cvars['FTP_PASS'] = addslashes($this->data['cfg']['cfg_ftp_pass']);
       
$cvars['REGISTRATION_EMAIL_DOMAIN'] = '';
       
$cvars['REGISTRATION_EXCLUDE_EMAIL_DOMAINS'] = '';

       
$cvars['MAIL_METHOD'] = $this->data['cfg']['cfg_mail_method'];
       
$cvars['MAIL_SMTP_HOST'] = $this->data['cfg']['cfg_smtp_host'];
       
$cvars['MAIL_SMTP_PORT'] = $this->data['cfg']['cfg_smtp_port'];
       
$cvars['MAIL_SMTP_SECURE'] = $this->data['cfg']['cfg_smtp_secure'];
       
$cvars['MAIL_SMTP_AUTH'] = $this->data['cfg']['cfg_smtp_auth'];
       
$cvars['MAIL_AUTH_METHOD'] = $this->data['cfg']['cfg_mail_auth_method'];
       
$cvars['MAIL_SMTP_USER'] = $this->data['cfg']['cfg_smtp_user'];
       
$cvars['MAIL_SMTP_PASS'] = $this->data['cfg']['cfg_smtp_pass'];
       
$cvars['MAIL_NAME'] = $this->data['usr']['u_firstname'].' '.$this->data['usr']['u_lastname'];
       
$cvars['MAIL_NAME'] = addslashes($cvars['MAIL_NAME']);
       
$cvars['MAIL_EMAIL'] = $this->data['usr']['u_email'];
       
$cvars['MAIL_FROM_NAME'] = 'Elxis';
       
$cvars['MAIL_FROM_EMAIL'] = $fromemail;
       
$cvars['MAIL_MANAGER_NAME'] = 'Technical manager';
       
$cvars['MAIL_MANAGER_EMAIL'] = $this->data['usr']['u_email'];
       
$cvars['OFFLINE_MESSAGE'] = '';
       
$cvars['METADESC'] = 'This site is powered by Elxis CMS. Feel the power of open source!';
       
$cvars['METAKEYS'] = 'elxis cms, open source, free, multilingual, html5, lightweight, responsive';
       
$cvars['ONLINE'] = 1;
       
$cvars['DEFAULT_ROUTE'] = 'content:/';
       
$cvars['TEMPLATE'] = 'five';
       
$cvars['ATEMPLATE'] = 'onyx';
       
$cvars['STATISTICS'] = 1;
       
$cvars['GZIP'] = 0;
       
$cvars['CACHE'] = 0;
       
$cvars['CACHE_TIME'] = 1800;
       
$cvars['REALNAME'] = 1;
       
$cvars['REGISTRATION'] = 1;
       
$cvars['REGISTRATION_ACTIVATION'] = 1;
       
$cvars['PASS_RECOVER'] = 1;
       
$cvars['SESSION_LIFETIME'] = 900;
       
$cvars['SESSION_MATCHIP'] = 0;
       
$cvars['SESSION_MATCHBROWSER'] = 1;
       
$cvars['SESSION_MATCHREFERER'] = 0;
       
$cvars['SESSION_ENCRYPT'] = 0;
       
$cvars['SECURITY_LEVEL'] = 0;
       
$cvars['SESSION_HANDLER'] = 'database';
       
$cvars['SSL'] = 0;
       
$cvars['ERROR_REPORT'] = 0;
       
$cvars['ERROR_LOG'] = 1;
       
$cvars['ERROR_ALERT'] = 0;
       
$cvars['LOG_ROTATE'] = 1;
       
$cvars['DEBUG'] = 0;
       
$cvars['MINICSS'] = 0;
       
$cvars['MINIJS'] = 0;
       
$cvars['DEFENDER'] = 'G';
       
$cvars['DEFENDER_NOTIFY'] = 1;
       
$cvars['DEFENDER_LOG'] = 0;
       
$cvars['DEFENDER_IPAFTER'] = 1;
       
$cvars['DEFENDER_WHITELIST'] = '';
       
$cvars['TIMEZONE'] = $timezone;
       
$cvars['SEF'] = ($this->data['cfg']['cfg_sef'] > 0) ? 1 : 0;
       
$cvars['CRONJOBS'] = 0;
       
$cvars['CRONJOBS_PROB'] = 10;
       
$cvars['LANG_DETECT'] = 0;
       
$cvars['XFOPTIONS'] = '';
       
$cvars['CSP'] = '';
       
$cvars['SEO_MATCH'] = 'normal';
       
$cvars['CAPTCHA'] = 'NOROBOT';
       
$cvars['JQUERY'] = '3m';

       
ksort($cvars);

       
$this->data['final']['adminfolder'] = $admin_folder;
       
$this->data['final']['renhtaccess'] = -1;
        if (
$this->data['cfg']['cfg_sef'] > 0) {
           
$ok = $this->makeRewriteFile($this->data['cfg']['cfg_sef'], $admin_folder);
           
$this->data['final']['renhtaccess'] = $ok ? 1 : 0;
            if (!
$ok) {
               
$this->data['cfg']['cfg_sef'] = 0;
               
$cvars['SEF'] = 0;
            }
        }

       
$out = '<?php '._LEND;
       
$out .= '/**'._LEND;
       
$out .= 'Elxis CMS - Copyright 2006-'.date('Y').' elxis.org. All rights reserved.'._LEND;
       
$out .= 'Last saved on '.gmdate('Y-m-d H:i:s').' (UTC) by '.$this->data['usr']['u_uname']._LEND;
       
$out .= '******************************************/'._LEND._LEND;
       
$out .= 'defined(\'_ELXIS_\') or die (\'Direct access to this location is not allowed\');'._LEND._LEND._LEND;
       
$out .= 'class elxisConfig {'._LEND._LEND;
        foreach (
$cvars as $key => $val) {
            if (
is_int($val)) {
               
$out .= "\t".'private $'.$key.' = '.$val.';'._LEND;
            } else {
               
$out .= "\t".'private $'.$key.' = \''.$val.'\';'._LEND;
            }
        }
       
$out .= _LEND;
       
$out .= "\t".'public function __construct() {'._LEND;
       
$out .= "\t".'}'._LEND._LEND;
       
$out .= "\t".'public function get($var=\'\') {'._LEND;
       
$out .= "\t\t".'if (($var != \'\') && isset($this->$var)) { return $this->$var; }'._LEND;
       
$out .= "\t\t".'return \'\';'._LEND;
       
$out .= "\t".'}'._LEND._LEND;
       
$out .= "\t".'public function set($var, $value) {'._LEND;
       
$out .= "\t\t".'if (($var == \'\') || (!is_string($var))) { return false; }'._LEND;
       
$out .= "\t\t".'if (isset($this->$var)) {'._LEND;
       
$out .= "\t\t\t".'if (!in_array($var, array(\'SITENAME\', \'METADESC\', \'METAKEYS\'))) { return false; }'._LEND;
       
$out .= "\t\t".'}'._LEND;
       
$out .= "\t\t".'$this->$var = $value;'._LEND;
       
$out .= "\t\t".'return true;'._LEND;
       
$out .= "\t".'}'._LEND._LEND;
       
$out .= '}'._LEND._LEND;
       
$out .= '?>';

       
$this->data['final']['save'] = false;
       
$this->data['final']['config'] = $out;

        if (
$handle = @fopen(ELXIS_PATH.'/configuration.php', 'w')) {
           
$bytes = @fwrite($handle, $out);
            if (
$bytes) { $this->data['final']['save'] = true; }
           
fclose($handle);
            if (
file_exists(ELXIS_PATH.'/configuration_sample.php')) {
                @
unlink(ELXIS_PATH.'/configuration_sample.php');
            }
        }

        if (
$this->data['final']['save'] === false) {
            if (
$this->data['cfg']['cfg_ftp'] == 1) {
               
$ftp_root = rtrim($this->data['cfg']['cfg_ftp_root'], '/');
                if (
$ftp_root == '') { $ftp_root = '/'; }
               
$repo_path = rtrim($this->data['cfg']['cfg_repo_path'], '/');
                if (
$repo_path == '') { $repo_path = ELXIS_PATH.'/repository'; }
               
$site_root = preg_replace('#('.$ftp_root.')$#', '', ELXIS_PATH);
               
$ftp_root_repo = preg_replace('#^('.$site_root.')#', '', $repo_path);

                if (
$this->data['cfg']['cfg_ftp_port'] > 0) {
                   
$conn_id = @ftp_connect($this->data['cfg']['cfg_ftp_host'], $this->data['cfg']['cfg_ftp_port']);
                } else {
                   
$conn_id = @ftp_connect($this->data['cfg']['cfg_ftp_host']);
                }

                if (
$conn_id) {
                   
$login_result = @ftp_login($conn_id, $this->data['cfg']['cfg_ftp_user'], $this->data['cfg']['cfg_ftp_pass']);
                    if (
$login_result) {
                       
$tmpFile = $repo_path.'/tmp/configuration.php';
                        if (@
file_put_contents($tmpFile, $this->data['final']['config'])) {
                           
$ftppath = $ftp_root.'/configuration.php';
                           
$upload = ftp_put($conn_id, $ftppath, $tmpFile, FTP_BINARY);
                            if (
$upload) {
                               
$this->data['final']['save'] = true;
                                if (
file_exists(ELXIS_PATH.'/configuration_sample.php')) {
                                    @
ftp_delete($conn_id, $ftp_root.'/configuration_sample.php');
                                }
                            }
                        }
                        @
unlink($tmpFile);
                    }
                   
ftp_close($conn_id);
                }
            }
        }
    }


   
/**************************/
    /* MAKE A RANDOM USERNAME */
    /**************************/
   
public function makeUname() {
       
$greek = array('zeus', 'hermes', 'apollo', 'athena', 'poseidon', 'hades', 'cronus', 'erebos', 'chaos',
       
'uranus', 'tartarus', 'iapetos', 'atlas', 'prometheus', 'gaia', 'talos', 'typhon', 'phobos', 'cerberus',
       
'medusa', 'proteus', 'triton', 'pandora', 'electra', 'nestor', 'pythagoras', 'socrates', 'archimedes', 'hector',
       
'ajax', 'theseus', 'orpheus', 'cadmus', 'anaxagoras', 'protagoras', 'hypatia', 'homer');
       
$italian = array('flora', 'janus', 'juno', 'mars', 'mercury', 'pluto', 'saturn', 'venus', 'vulcan',
       
'vesta', 'minerva', 'fauna', 'diana', 'aurora', 'luna', 'hercules', 'augustus', 'caligula', 'tiberius',
       
'titus', 'magnus', 'severus', 'claudius', 'cicero', 'seneca');
       
$german = array('odin', 'loki', 'thor', 'balder', 'njord', 'buri', 'seth', 'freya', 'freyr', 'midgard', 'valhalla',
       
'hesus', 'fornjot', 'druden', 'donar', 'alfadir', 'picullus');
       
$inter = array('helix', 'acropolis', 'analysis', 'genesis', 'eureka', 'abyss', 'enigma', 'amazon',
       
'anax', 'asterisk', 'helios', 'nectar', 'utopia', 'paradox', 'alpha', 'delta', 'epsilon', 'sigma', 'omega', 'olympus', 'pilot', 'harmony',
       
'acrobat', 'astronaut', 'captain', 'cosmos', 'discus', 'hypnosis', 'logic', 'micro', 'neutron', 'electron', 'proton',
       
'photon', 'neuron', 'oasis', 'panic', 'phoenix', 'planet', 'python', 'thesis', 'typhoon', 'android', 'energy',
       
'oxygen', 'bios', 'logos');

       
$f = rand(0, 9);
        if (
$this->langInfo('LANGUAGE') == 'el') {
           
shuffle($greek);
            return
$greek[$f];
        } else if (
$this->langInfo('LANGUAGE') == 'it') {
           
shuffle($italian);
            return
$italian[$f];
        } else if (
$this->langInfo('LANGUAGE') == 'de') {
           
shuffle($german);
            return
$german[$f];
        } else {
           
$arr = array_merge($greek, $inter);
           
shuffle($arr);
            return
$arr[$f];
        }
    }


   
/************************************/
    /* GET PROPER TIMEZONE FOR A REGION */
    /************************************/
   
private function getTzone($region) {
        switch (
$region) {
            case
'EG': $tzone = 'Africa/Cairo'; break;
            case
'AU': $tzone = 'Australia/Melbourne'; break;
            case
'RS': $tzone = 'Europe/Belgrade'; break;
            case
'DE': $tzone = 'Europe/Berlin'; break;
            case
'PT': $tzone = 'Europe/Lisbon'; break;
            case
'CY': $tzone = 'Europe/Nicosia'; break;
            case
'IT': $tzone = 'Europe/Rome'; break;
            case
'ES': $tzone = 'Europe/Madrid'; break;
            case
'BG': $tzone = 'Europe/Sofia'; break;
            case
'CZ': $tzone = 'Europe/Prague'; break;
            case
'GR': $tzone = 'Europe/Athens'; break;
            case
'CY': $tzone = 'Europe/Nicosia'; break;
            case
'PL': $tzone = 'Europe/Warsaw'; break;
            case
'FR': $tzone = 'Europe/Paris'; break;
            case
'NO': $tzone = 'Europe/Oslo'; break;
            case
'HU': $tzone = 'Europe/Budapest'; break;
            case
'DK': $tzone = 'Europe/Copenhagen'; break;
            case
'UA': $tzone = 'Europe/Kiev'; break;
            case
'RU': $tzone = 'Europe/Moscow'; break;
            case
'AL': $tzone = 'Europe/Tirane'; break;
            case
'EE': $tzone = 'Europe/Tallinn'; break;
            case
'LV': $tzone = 'Europe/Riga'; break;
            case
'NL': $tzone = 'Europe/Amsterdam'; break;
            case
'FI': $tzone = 'Europe/Helsinki'; break;
            case
'SI': $tzone = 'Europe/Ljubljana'; break;
            case
'SK': $tzone = 'Europe/Bratislava'; break;
            case
'RO': $tzone = 'Europe/Bucharest'; break;
            case
'BE': $tzone = 'Europe/Brussels'; break;
            case
'HR': $tzone = 'Europe/Zagreb'; break;
            case
'LT': $tzone = 'Europe/Vilnius'; break;
            case
'SE': $tzone = 'Europe/Stockholm'; break;
            case
'UK': case 'GB': case 'IS': case 'IE': $tzone = 'Europe/London'; break;
            case
'BA': $tzone = 'Europe/Sarajevo'; break;
            case
'MK': $tzone = 'Europe/Skopje'; break; //macedonia is Greek
           
case 'IL': $tzone = 'Asia/Tel_Aviv'; break;
            case
'JP': $tzone = 'Asia/Tokyo'; break;
            case
'TR': $tzone = 'Asia/Istanbul'; break;
            case
'IN': $tzone = 'Asia/Calcutta'; break;
            case
'IR': $tzone = 'Asia/Tehran'; break;
            case
'ZN': $tzone = 'Asia/Shanghai'; break;
            case
'CA': $tzone = 'America/Toronto'; break;
            case
'AR': $tzone = 'America/Buenos_Aires'; break;
            case
'KR': $tzone = 'Asia/Seoul'; break;
            case
'GE': $tzone = 'Asia/Tbilisi'; break;
            case
'MX': $tzone = 'America/Mexico_City'; break;
            case
'US': $tzone = 'America/New_York'; break;
            case
'ZA': $tzone = 'Africa/Lusaka'; break;
            case
'BR': $tzone = 'America/Sao_Paulo'; break;
            default:
$tzone = ''; break;
        }
        return
$tzone;
    }


   
/*******************************************/
    /* RENAME ESTIA FOLDER AND RETURN NEW NAME */
    /*******************************************/
   
private function renameEstia() {
       
$admin_folder = 'estia';
        if (!
file_exists(ELXIS_PATH.'/estia/')) { return 'estia'; }
        if (!
is_dir(ELXIS_PATH.'/estia/')) { return 'estia'; }

       
$names = array('acropolis', 'arcadia', 'utopia', 'valhalla', 'stargate', 'nirvana', 'enigma', 'mystic');
       
$f = rand(1, 20);
       
shuffle($names);
       
$newname = $names[1].''.$f;
        if (
file_exists(ELXIS_PATH.'/'.$newname.'/')) { return 'estia'; } //dont rename if there is already such a folder

       
$ok = @rename(ELXIS_PATH.'/estia/', ELXIS_PATH.'/'.$newname.'/');
        if (
$ok) { return $newname; }
        return
'estia';
    }


   
/******************************************************/
    /* RENAME ELXIS REPOSITORY FOLDER TO SOMETHING RANDOM */
    /******************************************************/
   
private function renameRepository() {
        if (
$this->data['cfg']['cfg_repo_path'] != '') { return; }
        if (!
file_exists(ELXIS_PATH.'/repository/')) { return; }

       
$alphanum = array_merge(range(0,9), range('a', 'z'),range('A', 'Z'));
       
$length = count($alphanum) - 1;
       
$rnd = '';
        for(
$i=0; $i < 5; $i++) {
           
$idx = mt_rand(0, $length);
           
$rnd .= $alphanum[$idx];
        }

       
$newname = 'elxrepo'.$rnd;
       
$ok = @rename(ELXIS_PATH.'/repository/', ELXIS_PATH.'/'.$newname.'/');
        if (
$ok) {
           
$this->data['cfg']['cfg_repo_path'] = ELXIS_PATH.'/'.$newname.'/';
        }
    }


   
/***********************************************/
    /* GENERATE AND SAVE .HTACCESS/WEB.CONFIG FILE */
    /***********************************************/
   
private function makeRewriteFile($sef, $admin_folder) {
       
$sef = (int)$sef;
        if (
$sef < 1) { return; }
        if (
$sef == 2) {
           
$file_initial = 'web.config.txt';
           
$file_final = 'web.config';
        } else {
           
$file_initial = 'htaccess.txt';
           
$file_final = '.htaccess';
        }

        if (!
file_exists(ELXIS_PATH.'/includes/install/data/'.$file_initial)) { return false; }
       
$handle = @fopen(ELXIS_PATH.'/includes/install/data/'.$file_initial, 'r');
        if (!
$handle) { return false; }
       
$data = '';
        while (!
feof($handle)) {
           
$line = fgets($handle);
           
$line = preg_replace( "/\r|\n/", '', $line);
            if (
$admin_folder != 'estia') { $line = str_replace('estia', $admin_folder, $line); }
            if (
$this->relpath != '') { $line = str_replace('RewriteBase /', 'RewriteBase /'.$this->relpath.'/', $line); }
           
$data .= $line."\r\n";
        }
       
fclose($handle);

        if (
file_exists(ELXIS_PATH.'/'.$file_final)) {
           
$ok = @unlink(ELXIS_PATH.'/'.$file_final);
            if (!
$ok) { return false; }
        }

        if (
$handle = @fopen(ELXIS_PATH.'/'.$file_final, 'w')) {
            @
fwrite($handle, $data);
           
fclose($handle);
            return
true;
        }

        return
false;
    }

}

?>