<?php

$filter = new InputFilter();
$_POST = $filter->xssFilterHard($_POST);
$_GET = $filter->xssFilterHard($_GET);
$request = isset($_POST['request']) ? $_POST['request'] : (isset($_GET['request']) ? $_GET['request'] : null);

function testConnection($type, $server, $user, $passwd, $port = 'none', $dbName = "")
{

    if (($port == 'none') || ($port == '') || ($port == 0)) {
        //setting defaults ports
        switch ($type) {
            case 'mysql':
                $port = 3306;
                break;
            case 'pgsql':
                $port = 5432;
                break;
            case 'mssql':
                $port = 1433;
                break;
            case 'oracle':
                $port = 1521;
                break;
        }
    }

    $Server = new Net($server);
    $filter = new InputFilter();

    if ($Server->getErrno() == 0) {
        $Server->scannPort($port);
        if ($Server->getErrno() == 0) {
            $Server->loginDbServer($user, $passwd);
            $Server->setDataBase($dbName, $port);
            if ($Server->errno == 0) {
                $response = $Server->tryConnectServer($type);
                if ($response->status == 'SUCCESS') {
                    if ($Server->errno == 0) {
                        $message = "";
                        $response = $Server->tryConnectServer($type);
                        $server = $filter->validateInput($server);
                        $user = $filter->validateInput($user);
                        $passwd = $filter->validateInput($passwd);
                        $connDatabase = @mysql_connect($server, $user, $passwd);
                        $dbNameTest = "PROCESSMAKERTESTDC";
                        $dbNameTest = $filter->validateInput($dbNameTest, 'nosql');
                        $query = "CREATE DATABASE %s";
                        $query = $filter->preventSqlInjection($query, array($dbNameTest), $connDatabase);
                        $db = @mysql_query($query, $connDatabase);
                        $success = false;
                        if (!$db) {
                            $message = mysql_error();;
                        } else {
                            $usrTest = "wfrbtest";
                            $chkG = "GRANT ALL PRIVILEGES ON `%s`.* TO %s@'%%' IDENTIFIED BY 'sample' WITH GRANT OPTION";
                            $chkG = $filter->preventSqlInjection($chkG, array($dbNameTest, $usrTest), $connDatabase);
                            $ch = @mysql_query($chkG, $connDatabase);
                            if (!$ch) {
                                $message = mysql_error();
                            } else {
                                $sqlCreateUser = "CREATE USER '%s'@'%%' IDENTIFIED BY '%s'";
                                $user = $filter->validateInput($user, 'nosql');
                                $sqlCreateUser = $filter->preventSqlInjection($sqlCreateUser, array($user . "_usertest", "sample"), $connDatabase);
                                $result = @mysql_query($sqlCreateUser, $connDatabase);
                                if (!$result) {
                                    $message = mysql_error();
                                } else {
                                    $success = true;
                                    $message = G::LoadTranslation('ID_SUCCESSFUL_CONNECTION');
                                }
                                $sqlDropUser = "DROP USER '%s'@'%%'";
                                $user = $filter->validateInput($user, 'nosql');
                                $sqlDropUser = $filter->preventSqlInjection($sqlDropUser, array($user . "_usertest"), $connDatabase);
                                @mysql_query($sqlDropUser, $connDatabase);

                                $sqlDropUser = "DROP USER %s@'%%'";
                                $usrTest = $filter->validateInput($usrTest, 'nosql');
                                $sqlDropUser = $filter->preventSqlInjection($sqlDropUser, array($usrTest), $connDatabase);
                                @mysql_query($sqlDropUser, $connDatabase);
                            }
                            $sqlDropDb = "DROP DATABASE %s";
                            $dbNameTest = $filter->validateInput($dbNameTest, 'nosql');
                            $sqlDropDb = $filter->preventSqlInjection($sqlDropDb, array($dbNameTest), $connDatabase);
                            @mysql_query($sqlDropDb, $connDatabase);
                        }
                        return array($success, ($message != "") ? $message : $Server->error);
                    } else {
                        return array(false, $Server->error);
                    }
                } else {
                    return array(false, $Server->error);
                }
            } else {
                return array(false, $Server->error);
            }
        } else {
            return array(false, $Server->error);
        }
    } else {
        return array(false, $Server->error);
    }
}

switch ($request) {
    //check if the APP_CACHE VIEW table and their triggers are installed
    case 'info':
        $result = new stdClass();
        $result->info = array();

        //check the language, if no info in config about language, the default is 'en'
        $oConf = new Configurations();
        $oConf->loadConfig($x, 'APP_CACHE_VIEW_ENGINE', '', '', '', '');
        $appCacheViewEngine = $oConf->aConfig;

        if (isset($appCacheViewEngine['LANG'])) {
            $lang = (defined('SYS_LANG')) ? SYS_LANG : $appCacheViewEngine['LANG'];
            $status = strtoupper($appCacheViewEngine['STATUS']);
        } else {
            $confParams = array('LANG' => (defined('SYS_LANG')) ? SYS_LANG : 'en', 'STATUS' => '');
            $oConf->aConfig = $confParams;
            $oConf->saveConfig('APP_CACHE_VIEW_ENGINE', '', '', '');
            $lang = (defined('SYS_LANG')) ? SYS_LANG : 'en';
            $status = '';
        }

        //get user Root from hash
        $result->info = array();
        $result->error = false;

        //setup the appcacheview object, and the path for the sql files
        $appCache = new AppCacheView();
        $appCache->setPathToAppCacheFiles(PATH_METHODS . 'setup' . PATH_SEP . 'setupSchemas' . PATH_SEP);

        $res = $appCache->getMySQLVersion();
        //load translations  G::LoadTranslation
        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_MYSQL_VERSION'), 'value' => $res);

        $res = $appCache->checkGrantsForUser(false);
        $currentUser = $res['user'];
        $currentUserIsSuper = $res['super'];
        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_CURRENT_USER'), 'value' => $currentUser);
        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_USER_SUPER_PRIVILEGE'), 'value' => $currentUserIsSuper);

        try {
            PROPEL::Init(PATH_METHODS . 'dbConnections/rootDbConnections.php');
            $con = Propel::getConnection("root");
        } catch (Exception $e) {
            $result->info[] = array('name' => 'Checking MySql Root user', 'value' => 'failed');
            $result->error = true;
            $result->errorMsg = $e->getMessage();
        }

        //if user does not have the SUPER privilege we need to use the root user and grant the SUPER priv. to normal user.
        if (!$currentUserIsSuper && !$result->error) {
            $res = $appCache->checkGrantsForUser(true);
            if (!isset($res['error'])) {
                $result->info[] = array('name' => G::LoadTranslation('ID_ROOT_USER'), 'value' => $res['user']);
                $result->info[] = array('name' => G::LoadTranslation('ID_ROOT_USER_SUPER'), 'value' => $res['super']);
            } else {
                $result->info[] = array('name' => 'Error', 'value' => $res['msg']);
            }
        }

        //now check if table APPCACHEVIEW exists, and it have correct number of fields, etc.
        $res = $appCache->checkAppCacheView();
        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TABLE'), 'value' => $res['found']);

        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_ROWS'), 'value' => $res['count']);

        //now check if we have the triggers installed
        //APP_DELEGATION INSERT
        $res = $appCache->triggerAppDelegationInsert($lang, false);
        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_INSERT'), 'value' => $res);

        //APP_DELEGATION Update
        $res = $appCache->triggerAppDelegationUpdate($lang, false);
        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_UPDATE'), 'value' => $res);

        //APPLICATION UPDATE
        $res = $appCache->triggerApplicationUpdate($lang, false);
        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_APPLICATION_UPDATE'), 'value' => $res);

        //APPLICATION DELETE
        $res = $appCache->triggerApplicationDelete($lang, false);
        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_APPLICATION_DELETE'), 'value' => $res);

        //SUB_APPLICATION INSERT
        $res = $appCache->triggerSubApplicationInsert($lang, false);

        //CONTENT UPDATE
        $res = $appCache->triggerContentUpdate($lang, false);
        $result->info[] = array("name" => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_CONTENT_UPDATE'), "value" => $res);

        //show language
        $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_LANGUAGE'), 'value' => $lang);

        echo G::json_encode($result);
        break;
    case 'getLangList':
        $Translations = G::getModel('Translation');
        $result = new stdClass();
        $result->rows = array();

        $langs = $Translations->getTranslationEnvironments();
        foreach ($langs as $lang) {
            $result->rows[] = array('LAN_ID' => $lang['LOCALE'], 'LAN_NAME' => $lang['LANGUAGE']);
        }

        print (G::json_encode($result));
        break;
    case 'build':
        $sqlToExe = array();
        $conf = new Configurations();

        //DEPRECATED $lang = $_POST['lang'];
        //there is no more support for other languages that english
        $lang = (defined('SYS_LANG')) ? SYS_LANG : 'en';

        try {
            //setup the appcacheview object, and the path for the sql files
            $appCache = new AppCacheView();
            $appCache->setPathToAppCacheFiles(PATH_METHODS . 'setup' . PATH_SEP . 'setupSchemas' . PATH_SEP);

            //Update APP_DELEGATION.DEL_LAST_INDEX data
            $res = $appCache->updateAppDelegationDelLastIndex($lang, true);
            //$result->info[] = array("name" => "update APP_DELEGATION.DEL_LAST_INDEX", "value" => $res);

            //APP_DELEGATION INSERT
            $res = $appCache->triggerAppDelegationInsert($lang, true);
            //$result->info[] = array ('name' => 'Trigger APP_DELEGATION INSERT',           'value'=> $res);


            //APP_DELEGATION Update
            $res = $appCache->triggerAppDelegationUpdate($lang, true);
            //$result->info[] = array ('name' => 'Trigger APP_DELEGATION UPDATE',           'value'=> $res);


            //APPLICATION UPDATE
            $res = $appCache->triggerApplicationUpdate($lang, true);
            //$result->info[] = array ('name' => 'Trigger APPLICATION UPDATE',              'value'=> $res);


            //APPLICATION DELETE
            $res = $appCache->triggerApplicationDelete($lang, true);
            //$result->info[] = array ('name' => 'Trigger APPLICATION DELETE',              'value'=> $res);

            //SUB_APPLICATION INSERT
            $res = $appCache->triggerSubApplicationInsert($lang, false);

            //CONTENT UPDATE
            $res = $appCache->triggerContentUpdate($lang, true);
            //$result->info[] = array("name" => "Trigger CONTENT UPDATE", "value" => $res);

            //build using the method in AppCacheView Class
            $res = $appCache->fillAppCacheView($lang);
            //$result->info[] = array ('name' => 'build APP_CACHE_VIEW',              'value'=> $res);


            //set status in config table
            $confParams = array('LANG' => $lang, 'STATUS' => 'active');
            $conf->aConfig = $confParams;
            $conf->saveConfig('APP_CACHE_VIEW_ENGINE', '', '', '');

            $result = new StdClass();
            $result->success = true;
            $result->msg = G::LoadTranslation('ID_TITLE_COMPLETED');
            G::auditLog("BuildCache");
            echo G::json_encode($result);

        } catch (Exception $e) {
            $confParams = array('lang' => $lang, 'status' => 'failed');
            $appCacheViewEngine = $oServerConf->setProperty('APP_CACHE_VIEW_ENGINE', $confParams);

            $token = strtotime("now");
            PMException::registerErrorLog($e, $token);
            $varRes = '{success: false, msg:"' . G::LoadTranslation("ID_EXCEPTION_LOG_INTERFAZ", array($token)) . '"}';
            G::outRes( $varRes );
        }
        break;
    case 'recreate-root':
        $user = $_POST['user'];
        $passwd = $_POST['password'];
        $server = $_POST['host'];
        $code = $_POST['codeCaptcha'];
        $aServer = explode(':', $server);
        $serverName = $aServer[0];
        $port = (count($aServer) > 1) ? $aServer[1] : "none";

        if ($code !== $_SESSION['securimage_code_disp']['default']) {
            echo G::loadTranslation('ID_CAPTCHA_CODE_INCORRECT');
            break;
        }

        list($sucess, $msgErr) = testConnection(DB_ADAPTER, $serverName, $user, $passwd, $port);

        if ($sucess) {
            $sh = G::encryptOld(filemtime(PATH_GULLIVER . "/class.g.php"));
            $h = G::encrypt($_POST['host'] . $sh . $_POST['user'] . $sh . $_POST['password'] . $sh . (1), $sh);
            $insertStatements = "define ( 'HASH_INSTALLATION','{$h}' );  \ndefine ( 'SYSTEM_HASH', '{$sh}' ); \n";
            $lines = array();
            $content = '';
            $filename = PATH_HOME . 'engine' . PATH_SEP . 'config' . PATH_SEP . 'paths_installed.php';
            $lines = file($filename);

            $count = 1;
            foreach ($lines as $line_num => $line) {
                $pos = strpos($line, "define");
                if ($pos !== false && $count < 3) {
                    $content = $content . $line;
                    $count++;
                }
            }
            $content = "<?php \n" . $content . "\n" . $insertStatements . "\n";
            if (file_put_contents($filename, $content) != false) {
                echo G::loadTranslation('ID_MESSAGE_ROOT_CHANGE_SUCESS');
            } else {
                echo G::loadTranslation('ID_MESSAGE_ROOT_CHANGE_FAILURE');
            }
        } else {
            echo $msgErr;
        }
        break;
    case 'captcha':
        require_once PATH_TRUNK . 'vendor/dapphp/securimage/securimage.php';
        $img = new Securimage();
        $img->show();
        break;
}
