require_once 'class/Db.class.php'; require_once 'class/Log.class.php'; require_once 'class/Cas.class.php'; require_once 'class/GingerInfos.class.php'; require_once 'config.inc.php'; class Rights { public $param = array(); public $soge = false; public $soge_str = ""; private $db; /** * Constructeur. */ public function __construct() { global $_SESSION, $_CONF; $db_pref = $_CONF['db_pref']; $this->db = Db::getInstance(); if(isset($_SESSION[$db_pref.'rights'])) { $this->param = $_SESSION[$db_pref.'rights']; $this->soge = $_SESSION[$db_pref.'soge']; $this->soge_str = $_SESSION[$db_pref.'soge_str']; } else $this->param['logged'] = False; } function __destruct() { global $_SESSION, $_CONF; $db_pref = $_CONF['db_pref']; $_SESSION[$db_pref.'soge'] = $this->soge; $_SESSION[$db_pref.'soge_str'] = $this->soge_str; $_SESSION[$db_pref.'rights'] = $this->param; } public function loginCas() { global $_GET, $_CONF, $_SESSION; $service = urlencode($_CONF["self_url"]."?module=auth&action=logincas"); $db_pref = $_CONF['db_pref']; if(isset($_GET["ticket"])) { // Vérification $ticket = $_GET["ticket"]; $login = Cas::authenticate($ticket, $service); if ($login < 0) { return array("error"=>-1, "error_msg"=>"Erreur de login CAS."); } else { if($this->login($login)) { //echo "$login is logged"; header("Location: ".$_CONF["self_url"]); exit(); } else { // GET INFOS FROM API try{ //récupère les information de l'utilisateur avec l'API Ginger //retourne une erreur $usr = GingerInfos::get_infos($login); $_SESSION[$db_pref."mail"] = $usr->mail; /* FKTYPEID => 10 ETUDIANT NON COTISANT 11 ETUDIANT COTISANT 12 PERSONNEL UTC 13 TREMPLIN NON COTISANT 14 TREMPLIN COTISANT 20 ETUDIANT ESCOM NON COTISANT 21 ETUDIANT ESCOM COTISANT 22 PERSONNEL ESCOM -1 EXTERIEUR */ //type => {etu, pers, escom, escompers, ext} switch($usr->type){ case "etu": $fktypeid = ($usr->is_cotisant) ? 11 : 10; break; case "pers": $fktypeid = 12; break; case "escom": $fktypeid = ($usr->is_cotisant) ? 21 : 20; break; case "escompers": $fktypeid = 22; break; case "ext": $fktypeid = -1; break; } $ret = $this->register($login, $fktypeid, $usr->nom, $usr->prenom, false); if($ret > 0 ) { $this->login($login); header("Location: ".$_CONF["self_url"]); exit(); } else { $error = $ret+430; return array("error"=>-1, "error_msg"=>"Une erreur à eu lieu... Merci de nous contacter en indiquant que l'erreur n° $error à eu lieu..."); } } catch (ApiException $ex) { Log::write("Erreur avec l'api Ginger pour $login: erreur: ".$ex->getMessage(),10); return array("error"=>-1, "error_msg"=>"Nous n'avons pas reconnu votre login, ceci est un cas rare, merci de nous contacter par mail..."); } } } } else { //2. On renvoie sur le cas $this->logout(); header("Location: ".Cas::getURL()."login?service=".$service); exit(); } } public function login($login) { global $_SESSION, $_CONF; $db_pref = $_CONF['db_pref']; $param = array("user_login" => $login); //*original: $req = Db::pdo()->prepare("SELECT u.user_id, u.user_login, u.user_prenom, u.user_nom, u.fk_mail_id, m.user_type FROM ".$db_pref."user u, ".$db_pref."mail m WHERE u.fk_mail_id = m.mail_id AND u.user_login = :user_login"); //*/ //on bride les droit d'entréé au seul admin treso etc. pour le moment //$req = Db::pdo()->prepare("SELECT u.user_id, u.user_login, u.user_prenom, u.user_nom, u.fk_mail_id, m.user_type, r.right, r.user_id FROM user u, mail m, `right` r WHERE u.fk_mail_id = m.mail_id AND u.user_login = :user_login AND r.user_id = u.user_id"); if($req->execute($param) && $req->rowCount() >= 1) // normalement ==1 mais bon certain arrivent à avoir deux comptes... echec... { Log::write("Connexion réussi pour ".$login,1); $user = $req->fetch(); $this->param['logged'] = True; try{ $usr = GingerInfos::get_infos($login); $_SESSION[$db_pref."mail"] = $usr->mail; /* FKTYPEID => 10 ETUDIANT NON COTISANT 11 ETUDIANT COTISANT 12 PERSONNEL UTC 13 TREMPLIN NON COTISANT 14 TREMPLIN COTISANT 20 ETUDIANT ESCOM NON COTISANT 21 ETUDIANT ESCOM COTISANT 22 PERSONNEL ESCOM 31 UTBM 32 UTT */ //type => {etu, pers, escom, escompers, ext} switch($usr->type){ case "etu": $fktypeid = ($usr->is_cotisant) ? 11 : 10; break; case "pers": $fktypeid = 12; break; case "escom": $fktypeid = ($usr->is_cotisant) ? 21 : 20; break; case "escompers": $fktypeid = 22; break; case "ext": $fktypeid = -1; break; } if($fktypeid != $user['fk_mail_id']) { // On change le statut de l'étudiant sous certaine condition // Passage de non cotisant à cotisant (pas l'inverse) if($fktypeid == 11 || $fktypeid == 21) { $param = array("user_login" => $login, "mail_id"=>$fktypeid); $req = Db::pdo()->prepare("UPDATE ".$db_pref."user SET fk_mail_id = :mail_id WHERE user_login = :user_login"); $req->execute($param); $user['fk_mail_id'] = $fktypeid; } } } catch (ApiException $ex) { Log::write("Erreur avec l'api Ginger pour $login: erreur: ".$ex->getMessage(),10); $this->param['logged'] = False; return false; } $this->param['user'] = $user; return True; } else { Log::write("Erreur de connexion pour ".$login, 10); $this->param['logged'] = False; return False; } } public function login2($login, $passwd) { global $_SESSION, $_CONF; $db_pref = $_CONF['db_pref']; $param = array("user_login" => $login, "user_passwd" => $this->hash_pass($passwd)); $req = Db::pdo()->prepare("SELECT u.user_id, u.user_login, u.user_prenom, u.user_nom, u.fk_mail_id, m.user_type FROM ".$db_pref."user u, ".$db_pref."mail m WHERE u.fk_mail_id = m.mail_id AND u.user_login = :user_login AND u.user_passwd = :user_passwd"); if($req->execute($param) && $req->rowCount() == 1) { Log::write("Connexion réussi pour ".$login,1); $user = $req->fetch(); //Vérifie si l'utilisateur est non cotisant et est dans la liste tremplin cotisant si oui change son status en cotisant $param = array("user_login" => $login); $req = Db::pdo()->prepare("SELECT end FROM ".$db_pref."tremplin WHERE login = :user_login"); if($req->execute($param) && $req->rowCount() == 1){ //Vérifie la date de fin (format: AAAA-MM-JJ) $today = getdate(); $today_str = $today["year"]."-".(($today["mon"] < 10)?"0".$today["mon"]:$today["mon"])."-".(($today["mday"] < 10)?"0".$today["mday"]:$today["mday"]); $tremplin = $req->fetch(); if(strcmp($today_str, $tremplin["end"]) <= 0){ // TREMPLIN COTISANT $param = array("userid" => $user["user_id"], "fkmailid" => 14); } else { // TREMPLIN NON COTISANT $param = array("userid" => $user["user_id"], "fkmailid" => 13); } $req = Db::pdo()->prepare("UPDATE ".$db_pref."user SET fk_mail_id = :fkmailid WHERE user_id = :userid;"); $req->execute($param); $param = array("user_login" => $login, "user_passwd" => $this->hash_pass($passwd)); $req = Db::pdo()->prepare("SELECT u.user_id, u.user_login, u.user_prenom, u.user_nom, u.fk_mail_id, m.user_type FROM ".$db_pref."user u, ".$db_pref."mail m WHERE u.fk_mail_id = m.mail_id AND u.user_login = :user_login AND u.user_passwd = :user_passwd"); if($req->execute($param) && $req->rowCount() == 1) { $user = $req->fetch(); } } $this->param['user'] = $user; $_SESSION[$db_pref."mail"] = $this->get_mail(); $this->param['logged'] = True; return True; } else { Log::write("Erreur de connexion pour ".$login." $passwd ".print_r($param, True),3); $this->param['logged'] = False; return False; } } public function logintoken($token) { global $_CONF; $arr = json_decode(base64_decode($token)); $this->login2($arr->login, $arr->passwd); header("Location: ".$_CONF["self_url"]); exit(); } public function hash_pass($passwd) { global $_CONF; return md5($_CONF['private_salt'].$passwd); } public function generate_passwd() { $str="azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN@_-!&$*"; $password = ""; for ($i = 0; $i < 8; $i++) { $password .= $str[(rand() % strlen($str))]; } return $password; } public function getID($login, $fktypeid) { global $_CONF; $db_pref = $_CONF['db_pref']; $param = array("user_login" => $login, "fkmailid" => $fktypeid); if($fktypeid == 13) { $req = Db::pdo()->prepare("SELECT user_id FROM ".$db_pref."user WHERE user_login = :user_login AND (fk_mail_id = :fkmailid or fk_mail_id = 14)"); } else { $req = Db::pdo()->prepare("SELECT user_id FROM ".$db_pref."user WHERE user_login = :user_login AND fk_mail_id = :fkmailid"); } if($req->execute($param) && $req->rowCount() == 1) { $user = $req->fetch(); return $user['user_id']; } else { return -1; } } public function getType() { return $this->param['user']['user_type']; } public function has_place() { global $_CONF; $db_pref = $_CONF['db_pref']; $param = array("user_id"=>$this->param['user']['user_id']); $req = Db::pdo()->prepare("SELECT billet_id FROM ".$db_pref."billets, ".$db_pref."tarifs t WHERE t.tarifs_id = billet_tarif_id AND billet_user_id = :user_id AND t.nb_max = 1 AND billet_removed = 0;"); if($req->execute($param) && $req->rowCount() >= 1) { return True; } else { return False; } } public function nb_place() { global $_CONF; $db_pref = $_CONF['db_pref']; $param = array("user_id"=>$this->param['user']['user_id']); $req = Db::pdo()->prepare("SELECT billet_id FROM ".$db_pref."billets WHERE billet_user_id = :user_id AND billet_code IS NOT NULL AND billet_removed = 0;"); $req->execute($param); return $req->rowCount(); } public function getMail($fkmailid) { global $_CONF; $db_pref = $_CONF['db_pref']; $param = array("fkmailid" => $fkmailid); $req = Db::pdo()->prepare("SELECT mail_str FROM ".$db_pref."mail WHERE mail_id = :fkmailid;"); if($req->execute($param) && $req->rowCount() == 1) { $mail = $req->fetch(); return $mail['mail_str']; } else { Log::write("Le mail lié à l'id $fkmailid n'a pas été trouvé !",5); return -1; } } public function get_mail() { $fkmailid = $this->param['user']['fk_mail_id']; //spéciale pour les tremplins: if($fkmailid == 14) $fkmailid = 13; if($fkmailid > 0) { return $this->param['user']['user_login']."@".$this->getMail($fkmailid); } else { return "mattgu74@gmail.com"; } } public function getMails() { global $_CONF; $db_pref = $_CONF['db_pref']; $param = array(); $req = Db::pdo()->prepare("SELECT mail_id, mail_str FROM ".$db_pref."mail WHERE mail_str != '-1';"); $req->execute($param); $mails = $req->fetchAll(); return $mails; } public function send_mail_passwd($login, $fkmailid, $nom, $prenom,$passwd) { global $_CONF; $to = $prenom.' '.$nom.' <'.$login."@".$this->getMail($fkmailid).'>'; $token = base64_encode(json_encode(array("login"=>$login, "passwd"=>$passwd))); $lien = $_CONF["self_url"]."?module=auth&action=logintoken&token=".$token; // Sujet $subject = 'IMAGINARIUM FESTIVAL - BILLETTERIE'; // message $message = "
Bonjour $prenom $nom,
En utilisant le lien suivant vous pourrez accéder à l'espace privée de la billetterie en ligne :
Billetterie ($lien)
Cordialement,
L'équipe Imaginarium Festival.
PS : En cas de problème avec le site, n'hésitez pas à envoyer un mail à l'adresse suivante : ".$_CONF['mail_contact']."
";
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf8' . "\r\n";
// En-têtes additionnels
$headers .= 'From: IMAGINARIUM FESTIVAL - BILLETTERIE