<?php

/**
 * Classe permettant de lire et d'enregistrer le contenu du ficheir base1.ini
 *
 */
/*TODO REMOVE CETTE CLASSE ELLE EST DEJA INIT EN V2 */
class ParseConfigFile
{

    // Propriétés
    // chemin d'accés au fichier base1.ini
    private $chemin;

    // tableau associatif qui contiendra les noms logiques recherchés associés é leur valeurs
    // ce tableau est construit é partir du tableau LogicNames
    private $var_ini;

    public $error;

    // Méthodes
    // Constructeur
    public function __construct($chemin)
    {
        $this->chemin = $chemin;
        
        // Tableau associatif contenant tous les noms logiques et qui contiendra leurs valeurs associées
        foreach (LogicNames::$logic_names as $key => $value)
            $this->var_ini[$key] = '';
    }

    // Ouverture du fichier config.ini et récupération des variables
    // retourne false si le fichier config.ini n'a pu étre ouvert
    public function getConfigContents()
    {
        global $connecteur;

        // On détermine ici si le memcache est activé et on l'enregistre dans une variable de session
        if (extension_loaded('memcache')) {
            $memcache = new Memcache();
            try {
                if (@$memcache->connect('localhost', 11211) !== true) {
                    $_SESSION['memcache'] = 0;
                    throw new Exception($e);
                } else
                    $_SESSION['memcache'] = 1;
            } catch (Exception $e) {}
        } else
            $_SESSION['memcache'] = 0;
        
        try {
            // Ouverture du fichier
            if ($f = fopen($this->chemin, 'r')) {
                // Parse du fichier
                while (! feof($f)) { // jusqu'a la fin du fichier
                    $chTmp = fgets($f, 4096); // on recupére jusqu'à 4096 caractère sur la ligne
                                              // On supprime tous les espaces présents au niveau de la ligne
                    $ch = str_ireplace(' ', '', $chTmp);
                    if (mb_substr($ch, 0, 1) != ';' && count_chars($ch) > 0 && str_word_count($ch) > 0) { // si la ligne n'est pas en commentaire et contient des caractéres

                        foreach ($this->var_ini as $key => $values) { // on bouble sur le tableau associatif des noms logiques
                            if (stripos($ch, $key . '=') !== false) { // on teste si un nom logique est présent sur cette ligne
                                                                      // Traitement si le nom logique est celui d'une connexion db
                                if (stripos($ch, '[MAGIC_DATABASES]') !== false && ControleSaisie::CtrlLogicalNames($ch, $key, 'database') && (strcasecmp($key, DB_OXASQLDB) == 0 || strcasecmp($key, DB_OXACATDB) == 0 || strcasecmp($key, DB_OXAPROCDB) == 0) || strcasecmp($key, DB_OXADWDB) == 0 || strcasecmp($key, DB_OXAFTDB) == 0) {
                                    // Explode permet de découper la chaine selon un délimiteur
                                    $array = explode(',', $ch);
                                    $chaine = trim($array[0]);
                                    $regexFindVarHost = '/^\%[a-zA-Z]+DB_HOST\%$/i';
                                    
                                    // On teste si la version de Magic est V9 ou V10, pour cela on se base sur la présence du DBMS en première position de la chaine
                                    // Si 'DBMS' est présent alors il s'agit d'une version Magic V10
                                    if ('DBMS' == mb_substr($chaine, strpos($chaine, '*') + 1)) {
                                        /**
                                         * Exemple de ligne :
                                         * [MAGIC_DATABASES]OXASQLDB=*DBMS,21,OXADEV10, ,ORLY, ,haplus,%OXASQLDB_PASSWORD%,NoMagicRecordLock, ChangeFileInToolkit, NoCheckDefinition, NoCheckKey, NoFileLocks, SQL_PHYSICAL_LOCKING=Y, , CheckExist, 0, , NoXATrans, NoAS400SrvrSort,,
                                         */
                                        $_SESSION[$key . '_TYPE'] = trim($array[1]);
                                        
                                        // Récupération du nom de base que l'on stocke dans le tableau superglobal
                                        $_SESSION[$key . '_NAME'] = trim($array[2]);

                                        
                                        // Récupération du nom de serveur que l'on stocke dans la session
                                        switch ($key) {
                                            case DB_OXASQLDB: // On passe le nom du serveur en minuscule
                                                $server = strtolower(trim($array[4]));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = strtolower(trim(preg_replace($regexFindVarHost, $_SESSION[$var.'_SERVER'], $array[4])));
                                                }
                                                $_SESSION[$key . '_SERVER'] = $server;
                                                break;
                                            case DB_OXAFTDB:
                                            case DB_OXACATDB: // On passe le nom du serveur en majuscule
                                                $server = strtoupper(trim($array[4]));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = strtoupper(trim(preg_replace($regexFindVarHost, $_SESSION[$var.'_SERVER'] ,$array[4])));
                                                }
                                                $_SESSION[$key . '_SERVER'] = $server;
                                                break;
                                            
                                            case DB_OXAPROCDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                            case DB_OXADWDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                                $server = ucfirst(strtolower(trim($array[4])));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = ucfirst(strtolower(trim(preg_replace($regexFindVarHost, $_SESSION[$var.'_SERVER'], $array[4]))));
                                                }
                                                $_SESSION[$key . '_SERVER'] = $server;
                                                break;
                                        }
                                        
                                        // Récupération du login que l'on stocke dans le tableau superglobal
                                        $_SESSION[$key . '_LOGIN'] = trim($array[6]);
                                    }                                    // Sinon il s'agit d'une version V9
                                    else {
                                        /**
                                         * Exemple de ligne :
                                         * [MAGIC_DATABASES]OXAPROCDB=*21,OXAPROC_950, , ,PAU\SQLEXPRESS, ,haplus,%OXAPROCDB_PASSWORD%,NoMagicRecordLock, ChangeFileInToolkit, NoCheckDefinition, NoCheckKey, NoFileLocks, , SQL_PHYSICAL_LOCKING=Y, , CheckExist, 0, , NoXATrans, NoAS400SrvrSort,
                                         */
                                        $_SESSION[$key . '_TYPE'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        
                                        // Récupération du nom de base que l'on stocke dans le tableau superglobal
                                        $_SESSION[$key . '_NAME'] = trim($array[1]);
                                        
                                        // Récupération du nom de serveur que l'on stocke dans la session
                                        switch ($key) {
                                            case DB_OXASQLDB: // On passe le nom du serveur en minuscule
                                                $server = strtolower(trim($array[4]));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = strtolower(trim(preg_replace($regexFindVarHost, $_SESSION[$var.'_SERVER'], $array[4])));
                                                }
                                                $_SESSION[$key . '_SERVER'] = $server;
                                                break;

                                            case DB_OXACATDB: // On passe le nom du serveur en majuscule
                                                $server = strtoupper(trim($array[4]));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = strtoupper(trim(preg_replace($regexFindVarHost, $_SESSION[$var.'_SERVER'] ,$array[4])));
                                                }
                                                $_SESSION[$key . '_SERVER'] = $server;
                                                break;

                                            case DB_OXAPROCDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                            case DB_OXADWDB: // On passe le nom du serveur en minuscule puis la première lettre en majuscule
                                                $server = ucfirst(strtolower(trim($array[4])));
                                                preg_match($regexFindVarHost, $array[4], $matches);
                                                if (count($matches) > 0) {
                                                    $var = str_replace('%', '', $matches[0]);
                                                    $server = ucfirst(strtolower(trim(preg_replace($regexFindVarHost, $_SESSION[$var.'_SERVER'], $array[4]))));
                                                }
                                                $_SESSION[$key . '_SERVER'] = $server;
                                                break;
                                        }
                                        
                                        // Récupération du login que l'on stocke dans le tableau superglobal
                                        $_SESSION[$key . '_LOGIN'] = trim($array[6]);
                                    }
                                } elseif ($key === 'HTTPS') {
                                    $chaine = trim($ch);
                                    $_SESSION['oxa_prc_https'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                } elseif ($key === 'brokernumber') {
                                    $chaine = trim($ch);
                                    $_SESSION['_brokernumber'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                } elseif ($key === 'VERSION') {
                                    $chaine = trim($ch);
                                    $_SESSION['VERSIONINI'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                } elseif (stripos($key, 'DB_HOST') !== false) {
                                    $chaine = trim($ch);
                                    $result = explode(',', $chaine);
                                    if (!empty($result[1])) { // 1 = port
                                        $_SESSION[$key.'_SERVER'] = mb_substr($result[0], strpos($result[0], '*') + 1) .','.$result[1];
                                    } else {
                                        $_SESSION[$key.'_SERVER'] = mb_substr($result[0], strpos($result[0], '=') + 1);
                                    }
                                } elseif ($key === 'serveurweb') {
                                    $chaine = trim($ch);
                                    $_SESSION['_serveurweb'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                } elseif ($key === 'oxadataweb') {
                                    $_SESSION['_oxadataweb'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                    $_SESSION['oxadataweb'] = str_replace("\r", '', str_replace("\n", '', str_replace('*', '', mb_substr($ch, strpos($ch, '=') + 1))));
                                } elseif ($key == 'haplusweb') {
                                    $chaine = trim($ch);
                                    
                                    if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                        $_SESSION['_haplusweb'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                    } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                        $_SESSION['_haplusweb'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                    }
                                } elseif (strcasecmp($key, 'ispi') == 0) {
                                    if ($this->checkVar($ch, $key)) {
                                        $chaine = trim($ch);
                                        if (mb_substr($chaine, strpos($chaine, '*') + 1) == '') {
                                            $error = new ErrorHandle();
                                            $error->logError('Erreur : Le paramètre ispi n\'est pas renseigné dans le fichier wsdl.ini !');
                                        } else {
                                            $_SESSION['wsdlurl'] = mb_substr($chaine, strpos($chaine, '*') + 1) . '?appname=Oxaproc&PRGNAME=WSDL&ARGUMENTS=-A';
                                            $_SESSION['ispiurl'] = mb_substr($chaine, strpos($chaine, '*') + 1) . '?appname=Oxaproc';
                                        }
                                    }
                                } elseif ($key == 'oxadata') {
                                    $chaine = trim($ch);
                                    if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                        $_SESSION['oxadata'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                    } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                        $_SESSION['oxadata'] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                    }
                                } else {
                                    
                                    // Initialsation de la ligne du fichier base1.ini en cours de lecture avec suppression des espaces aux extremités
                                    $chaine = trim($ch);
                                    
                                    if ($this->checkVar($ch, $key)) {
                                        if (ControleSaisie::CtrlLogicalNames($chaine, $key) && strcasecmp($key, '_images') == 0 && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['_images'] = substr($chaine, strpos($chaine, '*') + 1);
                                        } else if (ControleSaisie::CtrlLogicalNames($chaine, $key) && strcasecmp($key, 'ImgartHTM') == 0 && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['_imagesHTTP'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            $_SESSION['ImgartHTM'] = mb_substr($chaine, strpos($chaine, '*') + 1);

                                            if ('/' != mb_substr($_SESSION['_imagesHTTP'], mb_strlen($_SESSION['_imagesHTTP']) - 1, 1)) {
                                                $_SESSION['_imagesHTTP'] .= '/';
                                                $_SESSION['ImgartHTM'] .=  '/';
                                            }
                                        } elseif (ControleSaisie::CtrlLogicalNames($chaine, $key) && strcasecmp($key, 'fic_pj') == 0 && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['chemin_pj'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif (ControleSaisie::CtrlLogicalNames($chaine, $key) && strcasecmp($key, 'FicPJHTM') == 0 && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION['url_pj'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif (ControleSaisie::CtrlLogicalNames($chaine, $key) && strcasecmp($key, 'tmp') == 0) {
                                            $_SESSION['dir_tmp'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif (ControleSaisie::CtrlLogicalNames($chaine, $key) && strcasecmp($key, 'tmpweb') == 0) {
                                            $_SESSION['url_tmp'] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif (ControleSaisie::CtrlLogicalNames($chaine, $key) && (strcasecmp($key, '_log') == 0) && mb_substr($chaine, strpos($chaine, '*') + 1) != '' || (strcasecmp($key, 'tmpweb') == 0) && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                        } elseif (ControleSaisie::CtrlLogicalNames($chaine, $key) && (strcasecmp($key, '_debug') == 0) && mb_substr($chaine, strpos($chaine, '*') + 1) != '' || (strcasecmp($key, 'tmpweb') == 0) && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                            $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                        }                                        // Ici on récupère les paramétres de connexion à la base de données
                                        elseif (stripos($chaine, '[MAGIC_LOGICAL_NAMES]') !== false && ControleSaisie::CtrlLogicalNames($chaine, $key) && (strcasecmp($key, 'OXASQLDB_P') == 0 || strcasecmp($key, 'OXAPROCDB_P') == 0 || strcasecmp($key, 'OXACATDB_P') == 0) || strcasecmp($key, 'OXADWDB_P') == 0 || strcasecmp($key, 'OXAFTDB_P') == 0) {
                                            
                                            // On récupère le nom logique de la base
                                            // $chaine_base = explode('_', $key);
                                            // $base = $chaine_base[0];
                                            // et le mot de passe associé
                                            $pass_crypt = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            
                                            // Découpage du password dans un tableau
                                            $array_encode = str_split($pass_crypt, 3);
                                            $password = '';
                                            
                                            // On teste si la chaine de mot de passe à décrypter n'est pas vide
                                            if (mb_strlen($pass_crypt) > 0) {
                                                for ($i = 0; $i < count($array_encode); $i ++) {
                                                    
                                                    $tmp = ($array_encode[$i] - ($i + 1)); // Modulo sur le code ASCII 256
                                                    $password .= chr($tmp);
                                                }
                                                
                                                $_SESSION[$key . '_PASSWORD'] = $password;
                                            }
                                        } // fin du traitement du connectbdd
                                        elseif (strcasecmp($key, 'INTUITION_SERVER') == 0 || strcasecmp($key, 'INTUITION_PORT') == 0 || strcasecmp($key, 'INTUITION_CAT') == 0 || strcasecmp($key, 'INTUITION_FMT') == 0 || strcasecmp($key, 'INTUITION_HAP') == 0 || strcasecmp($key, 'INTUITION_USER') == 0 || strcasecmp($key, 'INTUITION_STK') == 0) {
                                            // Ici on prend en compte la valeur de la variable intuition qu'elle commence ou non par le caractère *
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }
                                        }                                        // Récupération dans le base1.ini du nom de l'environnement
                                        elseif (strcasecmp($key, 'ENV_NAME') == 0) {
                                            // Ici on prend en compte la valeur de la variable intuition qu'elle commence ou non par le caractère *
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }
                                        } elseif (strcasecmp($key, '_etc') == 0) {
                                            // Ici on prend en compte la valeur de la variable intuition qu'elle commence ou non par le caractère *
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }
                                            
                                            // on recupere le chemin physique vers le répertoire Haplus
                                            $decoupTmp = explode('etc', $_SESSION[$key]);
                                            // On remplace les * éventuelles par des blancs
                                            $decoup = str_replace('*', '', $decoupTmp);
                                            $_SESSION['application'] = $decoup[0];
                                        } elseif (strcasecmp($key, 'OXAREPORTS_SERVER') == 0 || strcasecmp($key, 'OXAREPORTS_NUM') == 0) {
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }
                                            
                                            if (strcasecmp($key, 'OXAREPORTS_NUM') == 0) {
                                                $_SESSION['OXAREPORTS_NUM_INIT'] = $_SESSION[$key];
                                                
                                                if ($_SESSION['OXAREPORTS_NUM'] == 1)
                                                    $_SESSION['OXAREPORTS_NUM'] = '';
                                            }
                                        }                                        // Récupération des paramètres liés à MEMCACHE
                                        elseif (strcasecmp($key, 'MEMCACHE_HOST') == 0 || strcasecmp($key, 'MEMCACHE_PORT') == 0) {
                                            if (stripos($chaine, '*') !== false && mb_substr($chaine, strpos($chaine, '*') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '*') + 1);
                                            } elseif (stripos($chaine, '*') === false && mb_substr($chaine, strpos($chaine, '=') + 1) != '') {
                                                $_SESSION[$key] = mb_substr($chaine, strpos($chaine, '=') + 1);
                                            }
                                        }                                        // Si la variable d'environnement est obligatoire et non renseignée
                                        // Alors on enregistre un avertissement
                                        elseif ('O' === $values) {
                                            $error = new ErrorHandle();
                                            $error->logError("Avertissement : Le parametre $key n'est pas renseigne !");
                                        }
                                    }
                                }
                            } // fin du if
                        } // fin du for
                    } // fin du if
                } // fin du while
                
                $_SESSION['_etc'] = str_replace('%VERSION%', $_SESSION['VERSIONINI'], $_SESSION['_etc']);
                $_SESSION['application'] = str_replace('%VERSION%', $_SESSION['VERSIONINI'], $_SESSION['application']);

                return true;
            } else
                $_SESSION['MESSAGE_ERREUR_CONNEXION'] = 'Le fichier de configuration base1.ini est manquant';

        } // fin try
          // Erreur renvoyée si fichier inexistant
        catch (Exception $e) {
            $error = new ErrorHandle();
            $error->logError($e->getMessage());
            return false; // le fichier n'a pas été trouvé
        }
        $connecteur = new Connecteur();

        $securiteIP = new SecuriteIP($_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'], '',(isset($_SESSION['ContexteMobile']) && $_SESSION['ContexteMobile'] ==1)?'M':'P');


        if (!$securiteIP->IPValid()) {
            echo '<script>document.location.href=\'V2/index/forbidden\'</script>';
            exit;
        }
    }

    // fin de la fonction
    public function checkVar($ch, $key)
    {
        return preg_match('/(])[\040]*' . $key . '[\040]*[=]/i', $ch);
    }
}
