<?php
/****************************************************************************************
 * SMI (Services Maintenance Interventions) est une gestion libre de maintenance et de SAV
 *
 * Version 1.0.0
 *
 * Copyright (C) 2006-2014  Sylvain FATOME
 * This program is free software; you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation;
 * either version 2 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program
 * (in the directory docs);
 * if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA  02110-1301, USA.
 *
 * Contact : galawa@free.fr
 *
 * Web : http://smi.no-ip.org
 ****************************************************************************************/

if (file_exists("../inc/func_txt.inc.php"))
    include_once("../inc/func_txt.inc.php");
else
    include_once("inc/func_txt.inc.php");
if (file_exists("../classes/ezSQL/shared/ez_sql_core.php"))
    include_once("../classes/ezSQL/shared/ez_sql_core.php");
else
    include_once("classes/ezSQL/shared/ez_sql_core.php");
if (file_exists("../classes/ezSQL/mysql/ez_sql_mysql.php"))
    include_once("../classes/ezSQL/mysqli/ez_sql_mysqli.php");
else
    include_once("classes/ezSQL/mysql/ez_sql_mysql.php");
if (file_exists("../inc/func_sql.inc.php"))
    include_once("../inc/func_sql.inc.php");
else
    include_once("inc/func_sql.inc.php");

// Vérification des tentatives de hack
$pos = strpos($_SERVER['PHP_SELF'], "inc.php");
if ($pos === FALSE)
    $ok_inc = TRUE;
else
    $ok_inc = FALSE;
if ($ok_inc == FALSE) header("Location: ../index.php");

/********************/
/* Gestion des logs */
/********************/

/**
 * Analyse de l'URL pour les logs directs
 * Si "$dejaconnect" est TRUE, on doit obligatoirement déjà être connecté
 * Sinon, on fait un contrôle en fontion des variables de session et de l'URL
 *
 * @param $dejaconnect
 * @param bool $open
 * @return bool
 */
function CheckURLLog($dejaconnect, $open = TRUE)
{
    global
    $db,
    $_SESSION,
    $_GET;

    $loginok = FALSE;

    // On vérifie les droits de l'utilisateur

    // On analyse d'abord si le compte est déjà connecté
    if (isset($_SESSION["etat_log"]) AND isset($_SESSION["niv_log"]) AND isset($_SESSION["code_log"])) {
        $codeok = FALSE;
        // Si pas connecté, on abandonne
        if ($_SESSION["etat_log"] <> "connecte") return false;
        // Si pas de code de connexion, on abandonne. Si oui, on vérifie validité
        if (trim($_SESSION["code_log"]) == "")
            return false;
        else {
            if ($open == TRUE)
                $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
            $rech = "SELECT COUNT(*) FROM `" . TBPW . "` WHERE `pw_code` = '" . $_SESSION["code_log"] . "' AND `pw_actif` = '1'";
            $nbres = $db->get_var($rech);
            if ($nbres == 1) // Il ne peut y avoir qu'un seul résultat
                $codeok = TRUE;
            if ($open == TRUE)
                $db->disconnect();
        }

        if ($codeok == TRUE) {
            // Si pas de niveau de connexion correct, on abandonne. Si oui, on vérifie validité
            if (is_numeric($_SESSION["niv_log"])) {
                $nivlog = $_SESSION["niv_log"];
                settype($nivlog, "integer");
                if (($nivlog < 1) OR ($nivlog > 11))
                    return false;
                else {
                    // On vérifie le droit sur le fichier (L'administrateur n'est pas contrôlé)
                    if ($nivlog <> 9) {
                        // On récupère le nom du script et les arguments
                        $td = '';

                        $tab_script = explode('/', $_SERVER['SCRIPT_NAME']);
                        $script = $tab_script[count($tab_script) - 1];
                        // On analyse l'argument
                        $tab_compl = explode('?', $_SERVER['REQUEST_URI']);
                        // On vérifie si "td=" existe et si oui, on affecte $td
                        $tab_arg = explode('&', $tab_compl[count($tab_compl) - 1]);
                        foreach ($tab_arg as $value) {
                            $pos = strpos($value, 'td=');
                            if ($pos !== FALSE) {
                                if ($pos == 0) {
                                    $tab_td = explode('=', $value);
                                    $td = $tab_td[1];
                                }
                            }
                        }

                        if (trim($script) <> "") {
                            if ($open == TRUE)
                                $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
                            $rech2 = "SELECT pw_modele FROM `" . TBPW . "` WHERE `pw_code` = '" . $_SESSION["code_log"] . "'";
                            $row2 = $db->get_row($rech2, ARRAY_A);
                            if ($row2) {
                                extract($row2);

                                // On vérifie le droit d'exécution de l'utilisateur sur le nom de fichier
                                if (trim($pw_modele) <> "") {
                                    if (trim($td) <> "")
                                        $rech3 = "SELECT droitsmd_auto FROM `" . TBDROITSMD . "` WHERE `droitsmd_nomfic` = '$script' AND `droitsmd_td` = '$td' AND `droitsmd_modele` = '$pw_modele'";
                                    else
                                        $rech3 = "SELECT droitsmd_auto FROM `" . TBDROITSMD . "` WHERE `droitsmd_nomfic` = '$script' AND `droitsmd_modele` = '$pw_modele'";
                                    $row3 = $db->get_row($rech3, ARRAY_A);
                                    if ($row3) {
                                        extract($row3);
                                        $loginok = $droitsmd_auto;
                                    } else
                                        $loginok = TRUE;
                                }
                            }
                            if ($open == TRUE)
                                $db->disconnect();
                        }
                    }

                    switch ($nivlog) {
                        // Si technicien ou agence, il doit y avoir le code agence (qui doit exister) dans la session
                        case 3 :
                        case 4 :
                            if (isset($_SESSION["code_age"])) {
                                if ($open == TRUE)
                                    $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
                                $rech = "SELECT COUNT(*) FROM `" . TBAGE . "` WHERE `age_code` = '" . $_SESSION["code_age"] . "'";
                                $nbres = $db->get_var($rech);
                                if ($nbres == 1) // Il ne peut y avoir qu'un seul résultat
                                {
                                    // Le chemin doit contenir le nom du sous-répertoire pour les agences
                                    if (stristr($_SERVER["PHP_SELF"], "/age/"))
                                        $loginok = TRUE;
                                }
                                if ($open == TRUE)
                                    $db->disconnect();
                            }
                            break;
                        // Si donneur d'ordre ou technicien donneur d'ordre,
                        // il doit y avoir le code donneur d'ordres (qui doit exister) dans la session
                        case 6 :
                        case 7 :
                            if (isset($_SESSION["code_do"])) {
                                if ($open == TRUE)
                                    $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
                                $rech = "SELECT COUNT(*) FROM `" . TBDO . "` WHERE `do_code` = '" . $_SESSION["code_do"] . "'";
                                $nbres = $db->get_var($rech);
                                if ($nbres == 1) // Il ne peut y avoir qu'un seul résultat
                                {
                                    // Le chemin doit contenir le nom du sous-répertoire pour les donneurs d'ordres
                                    if (stristr($_SERVER["PHP_SELF"], "/do/"))
                                        $loginok = TRUE;
                                }
                                if ($open == TRUE)
                                    $db->disconnect();
                            }
                            break;
                        // Si sous-traitant ou technicien sous-traitant,
                        // il doit y avoir le code sous-traitant (qui doit exister) dans la session
                        case 10 :
                        case 11 :
                            if (isset($_SESSION["code_st"])) {
                                if ($open == TRUE)
                                    $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
                                $rech = "SELECT COUNT(*) FROM `" . TBST . "` WHERE `st_code` = '" . $_SESSION["code_st"] . "'";
                                $nbres = $db->get_var($rech);
                                if ($nbres == 1) // Il ne peut y avoir qu'un seul résultat
                                {
                                    // Le chemin doit contenir le nom du sous-répertoire pour les sous-traitants
                                    if (stristr($_SERVER["PHP_SELF"], "/st/"))
                                        $loginok = TRUE;
                                }
                                if ($open == TRUE)
                                    $db->disconnect();
                            }
                            break;
                        case 1 :
                            // Le chemin doit contenir le nom du sous-répertoire pour les clients
                            if (stristr($_SERVER["PHP_SELF"], "/cli/") == TRUE)
                                $loginok = TRUE;
                            break;
                        case 2 :
                            // Le chemin doit contenir le nom du sous-répertoire pour l'Opérateur
                            if (stristr($_SERVER["PHP_SELF"], "/ope/"))
                                $loginok = TRUE;
                            break;
                        case 5 :
                        case 9 :
                            // Le chemin doit contenir le nom du sous-répertoire pour l'administrateur et le centre de gestion
                            if (stristr($_SERVER["PHP_SELF"], "/admin/"))
                                $loginok = TRUE;
                            break;
                    }
                }
            } else
                return false;
        }
    } else {
        if ($dejaconnect == FALSE) {
            $login = $_GET["log"];
            $pass = $_GET["pw"];

            $log_ip = $_SERVER['REMOTE_ADDR']; // Récupération adresse IP

            // Contrôle du login et du mot de passe
            if ($open == TRUE)
                $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
            $rech = "SELECT * FROM `" . TBPW . "` WHERE `pw_code` = '" . $login . "'";
            $row = $db->get_row($rech, ARRAY_A);
            if ($row) {
                extract($row);

                if ($login == $pw_code) // Le code entré doit correspondre exactement au code stocké (majuscules/minuscules)
                {
                    $pwok = FALSE;

                    // Le mot de passe doit correspondre exactement (en mode 'natif' ou MD5)
                    if ($pw_pass == $pass)
                        $pwok = TRUE;
                    else
                        if ($pw_pass == md5($pass))
                            $pwok = TRUE;

                    if ($pwok == TRUE) {
                        if ($pw_actif == 1) // Le compte doit être actif
                        {
                            // On vérifie le droit sur le fichier (L'administrateur n'est pas contrôlé)
                            if ($nivlog <> 9) {
                                // On récupère le nom du script et les arguments
                                $td = '';

                                $tab_script = explode('/', $_SERVER['SCRIPT_NAME']);
                                $script = $tab_script[count($tab_script) - 1];
                                // On analyse l'argument
                                $tab_compl = explode('?', $_SERVER['REQUEST_URI']);
                                // On vérifie si "td=" existe et si oui, on affecte $td
                                $tab_arg = explode('&', $tab_compl[count($tab_compl) - 1]);
                                foreach ($tab_arg as $value) {
                                    $pos = strpos($value, 'td=');
                                    if ($pos !== FALSE) {
                                        if ($pos == 0) {
                                            $tab_td = explode('=', $value);
                                            $td = $tab_td[1];
                                        }
                                    }
                                }

                                if (trim($script) <> "") {
                                    // On vérifie le droit d'exécution de l'utilisateur sur le nom de fichier
                                    if (trim($pw_modele) <> "") {
                                        if (trim($td) <> "")
                                            $rech3 = "SELECT droitsmd_auto FROM `" . TBDROITSMD . "` WHERE `droitsmd_nomfic` = '$script' AND `droitsmd_td` = '$td' AND `droitsmd_modele` = '$pw_modele'";
                                        else
                                            $rech3 = "SELECT droitsmd_auto FROM `" . TBDROITSMD . "` WHERE `droitsmd_nomfic` = '$script' AND `droitsmd_modele` = '$pw_modele'";
                                        $row3 = $db->get_row($rech3, ARRAY_A);
                                        if ($row3) {
                                            extract($row3);
                                            $loginok = $droitsmd_auto;
                                        } else
                                            $loginok = TRUE;
                                    }
                                }
                            }
                            // Vérification dans quel répertoire est demandé le fichier
                            // Pour valider l'accès au répertoire
                            switch ($pw_level) {
                                case "1" :
                                    if (stristr($_SERVER["PHP_SELF"], "/cli/"))
                                        $loginok = TRUE;
                                    break;
                                case "2" :
                                    if (stristr($_SERVER["PHP_SELF"], "/ope/"))
                                        $loginok = TRUE;
                                    break;
                                case "3" :
                                case "4" :
                                    if (stristr($_SERVER["PHP_SELF"], "/age/")) {
                                        $loginok = TRUE;
                                        // MAJ code agence
                                        if ($pw_level == 4)
                                            $_SESSION["code_age"] = $pw_code;
                                        if ($pw_level == 3) {
                                            $rech2 = "SELECT * FROM `" . TBTEC . "` WHERE `tec_code` = '" . $pw_code . "'";
                                            $row2 = $db->get_row($rech2, ARRAY_A);
                                            if ($row2) {
                                                extract($row2);
                                                $_SESSION["code_age"] = $tec_codeage;
                                            }
                                        }
                                    }
                                    break;
                                case "6" :
                                case "7" :
                                    if (stristr($_SERVER["PHP_SELF"], "/do/")) {
                                        $loginok = TRUE;
                                        // MAJ code donneur d'ordres
                                        if ($pw_level == 6)
                                            $_SESSION["code_do"] = $pw_code;
                                        if ($pw_level == 7) {
                                            $rech2 = "SELECT * FROM `" . TBTEC . "` WHERE `tec_code` = '" . $pw_code . "'";
                                            $row2 = $db->get_row($rech2, ARRAY_A);
                                            if ($row2) {
                                                extract($row2);
                                                $_SESSION["code_do"] = $tec_codedo;
                                            }
                                        }
                                    }
                                    break;
                                case "5" :
                                case "9" :
                                    if (stristr($_SERVER["PHP_SELF"], "/admin/"))
                                        $loginok = TRUE;
                                    break;
                                case "10" :
                                case "11" :
                                    if (stristr($_SERVER["PHP_SELF"], "/st/")) {
                                        $loginok = TRUE;
                                        // MAJ code Sous-traitant
                                        if ($pw_level == 10)
                                            $_SESSION["code_st"] = $pw_code;
                                        if ($pw_level == 11) {
                                            $rech2 = "SELECT * FROM `" . TBTEC . "` WHERE `tec_code` = '" . $pw_code . "'";
                                            $row2 = $db->get_row($rech2, ARRAY_A);
                                            if ($row2) {
                                                extract($row2);
                                                $_SESSION["code_st"] = $tec_codest;
                                            }
                                        }
                                    }
                                    break;
                            }

                            if ($loginok == TRUE) {
                                $_SESSION["etat_log"] = "connecte";
                                $_SESSION["code_log"] = $pw_code;
                                $_SESSION["niv_log"] = $pw_level;
                                $rech2 = "UPDATE `" . TBPW . "` SET `pw_lastsuccess`='" . $dateheurea . "', `pw_lastip`='" . $log_ip . "' WHERE `pw_id`='" . $pw_id . "'";
                                $db->query($rech2);
                            }
                        }
                    }
                }
            }
            $db->disconnect();
        }
    }
    return $loginok;
}

/**
 * Vérification du niveau de connexion
 * $nivlogauto est de la forme 1-2-3-4 ...
 *
 * @param $nivlogauto
 * @return bool
 */
function CheckNivLog($nivlogauto)
{
    global
    $_SESSION;

    $nivlogok = FALSE;

    if (isset($_SESSION["niv_log"])) {
        if (is_numeric($_SESSION["niv_log"])) {
            $nivlog = $_SESSION["niv_log"];
            settype($niv_log, "integer");
            if (($nivlog < 1) OR ($nivlog > 11))
                return false;
            if (trim($nivlogauto) <> "") {
                $tab_nivlogauto = explode("-", $nivlogauto);
                if (exist_in_array($_SESSION["niv_log"], $tab_nivlogauto))
                    $nivlogok = TRUE;
            }
        }
    }

    return $nivlogok;
}

/**
 * Archivage du log courant
 *
 * @param $code_session
 * @param bool $open
 */
function Archivelog($code_session, $open = TRUE)
{
    global
    $_SESSION,
    $rep_appli;

    if ((!isset($code_session)) OR ($code_session == "")) // Test si pas encore connecté
        $code_session = "?";
    $datecourante = date("Y-m-d");
    $heurecourante = date("H:i:s");
    $urlpr = $_SERVER['HTTP_REFERER'];
    $urlprecedent = str_replace($rep_appli, "", $urlpr); // "Nettoyage" si on était en domaine principal
    $urlcour = $_SERVER['REQUEST_URI'];
    $racinesrv = REP . "/";
    $urlcourant = str_replace($racinesrv, "", $urlcour); // "Nettoyage" si on était en domaine principal

    $log_ip = $_SERVER['REMOTE_ADDR']; // Récupération adresse IP

    if ($open == TRUE)
        $db = open_database(DBUSER, DBPASS, DBNAME, DBHOST);
    $rechlog = "INSERT INTO `" . TBLOG . "`";
    $rechlog .= " (log_code,log_date,log_heure,log_urlprec,log_url,log_ip) VALUES";
    $rechlog .= " ('$code_session','$datecourante','$heurecourante','$urlprecedent','$urlcourant','$log_ip')";
    $db->query($rechlog);
    if ($open == TRUE)
        $db->disconnect();
    $_SESSION["lnk_lst"] = '';
}
?>