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 = " IMAGINARIUM FESTIVAL - BILLETTERIE

Bonjour $prenom $nom,

En utilisant le lien suivant vous pourrez accéder à l'espace privée de la billetterie en ligne :
Billetterie ($lien)


Attention sécurité !
Ce lien vaut pour mot de passe, il ne faut en aucun cas le communiquer ou bien le laisser dans l'historique de votre ordinateur, etc...
Si vous avez l'impression d'avoir laisser trainer ce lien dans un ordinateur dont vous ne garantissez pas la sécurité de celui ci, voici la procédure à suivre :
* Retournez sur la billeterie.
* Déconnectez vous si vous êtes déjà connecté.
* Ré remplir le formulaire d'inscription. Vous recevrez à nouveau ce mail avec un nouveau lien équivalent à un mot de passe. L'ancien lien ne sera plus utilisable.

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 ' . "\r\n"; // Envoi mail($to, $subject, $message, $headers); Log::write("Mail send to $to",1); } public function register($login, $fktypeid, $nom, $prenom, $send_mail = false) { global $_CONF; $db_pref = $_CONF['db_pref']; if(!is_numeric($fktypeid)) { // Ce n'est pas l'id de type, c'est directement une adresse mail // il faut vérifier si elle existe dans la DB (si oui on récupére l'id) // si non on l'insert $req = Db::pdo()->prepare("SELECT mail_id FROM ".$db_pref."mail WHERE mail_str = :mail_str;"); if($req->execute(array("mail_str" => $fktypeid)) && $req->rowCount() == 1) { $tmp = $req->fetch(); $fktypeid = $tmp['mail_id']; } else { $req = Db::pdo()->prepare("INSERT INTO ".$db_pref."mail ( mail_id, mail_str, user_type ) VALUES (NULL, :mail, 'EXTERIEUR');"); $req->execute(array("mail" => $fktypeid)); $fktypeid = Db::pdo()->lastInsertId(); } } $passwd = $this->generate_passwd(); $userid = $this->getID($login, $fktypeid); if($userid != -1) { $param = array("user_passwd" => $this->hash_pass($passwd), "user_id" => $userid); $req = Db::pdo()->prepare("UPDATE ".$db_pref."user SET user_passwd = :user_passwd WHERE user_id = :user_id;"); if($req->execute($param) && $req->rowCount() == 1) { Log::write("Modification du mot de passe réussi de l'utilisateur ".$login." ".$fktypeid." ".intval($send_mail),1); if($send_mail) $this->send_mail_passwd($login, $fktypeid, $nom, $prenom,$passwd); return 2; } else { Log::write("Erreur de modification du mot de passe de l'utilisateur ".$login." ".$fktypeid,1); return -1; } } else { $param = array("user_login" => $login, "user_prenom" => $prenom, "user_nom" => $nom, "fktypeid" => $fktypeid, "user_passwd" => $this->hash_pass($passwd)); $req = Db::pdo()->prepare("INSERT INTO ".$db_pref."user ( user_login, user_prenom, user_nom, user_passwd, fk_mail_id ) VALUES (:user_login, :user_prenom, :user_nom, :user_passwd, :fktypeid);"); if($req->execute($param) && $req->rowCount() == 1) { Log::write("Création réussi de l'utilisateur ".$login." ".$fktypeid,1); if($send_mail) $this->send_mail_passwd($login, $fktypeid, $nom, $prenom,$passwd); return 1; } else { Log::write("Erreur de création de l'utilisateur ".$login." ".$fktypeid,1); return -1; } } } public function logout() { $this->param = array(); $this->param['logged'] = False; } public function is_logged() { return $this->param['logged']; } public function get_username() { return ucfirst($this->param['user']['user_prenom'])." ".ucfirst($this->param['user']['user_nom']); } public function has_right($right) { global $_CONF; $db_pref = $_CONF['db_pref']; if(!$this->is_logged()) return False; // TODO, cette fonction étant appelé une fois par modules pour construire le menu, plus lors du chargement du module... // Il vaudrait mieux stocker les droits dans l'objet pour éviter de faire la requête trop de fois... $param = array("user_id" => $this->param['user']['user_id'], "right" => $right); $req = Db::pdo()->prepare("SELECT * FROM ".$db_pref."right WHERE `user_id` = :user_id AND `right` = :right"); //print_r($req); //exit(); if($req->execute($param) && $req->rowCount() >= 1) { return True; } else { return False; } } } user = $user; $this->title = $_CONF['title']; $this->set_template('html'); $this->set_view('default.phtml'); $this->param = array(); $this->copyright = $_CONF['copyright']; } private function get_container() { if ($this->view_url and file_exists($this->view_url)) { include $this->view_url; } } public function set_param($param) { $this->param = $param; } public function add_param($key, $param) { $this->param[$key] = $param; } public function get_param($key) { return $this->param[$key]; } public function set_jsfiles($param) { $this->js_files = $param; } public function add_jsfile($param) { $this->js_files[] = $param; } public function echo_jsfiles() { $r = ''; foreach($this->js_files as $js) { $r.=''; } echo $r; } public function set_cssfiles($param) { $this->css_files = $param; } public function add_cssfile($param) { $this->css_files[] = $param; } public function echo_cssfiles() { $r = ''; foreach($this->css_files as $css) { $r.=''; } echo $r; } public function set_view($view_name) { $file = dirname(__FILE__).'/../modules/'.$view_name; if(file_exists($file)) { $this->view_url = $file; } else { $this->view_url = 'modules/default.view.phtml'; } } public function render() { include $this->template_path; } public function set_template($template_name) { $file = dirname(__FILE__).'/../template/'.$template_name.'.phtml'; if(file_exists($file)) { $this->template_path = $file; } else { $this->template_path = 'template/html.phtml'; } } public function module_url($modulename) { global $CONF; return $CONF['self_url'].'?module='.$modulename; } public function set_menu($menu) { $this->menus = $menu; } }