// // This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. // // To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/1.0/ // // or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. // // Francais (brouillon): http://creativecommons.org/projects/international/fr/translated-license // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Classe gestion des membres // Version 0.1.5 class membres { var $regexp = '^[a-z0-9_-]{3,30}$'; var $mail_regexp = '^([a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+)$'; var $instructions = " Il ne doit contenir que des lettres minuscules sans accents, des tirets et des chiffres. Il doit faire entre 3 et 30 caractères."; var $chemin = "../datas/"; var $err = array( "stop" => "non", "log" => "oui", "debug" => "oui"); // Gestion des erreurs function _err($err,$debug="") { // Si le debug est activé if($this->err['debug'] == "oui" && !empty($debug)) $err.= "\n// DEBUG //\n".$debug; // Si on log les erreurs if($this->err[log] == "oui") $this->erreurs[] = $err; // Si on s'arrête sur les erreurs if($this->err[stop] == "oui") { echo "
".htmlentities(stripslashes($err))."
"; exit; } $this->erreur = $err; return FALSE; } function genPass() { if(func_num_args() == 1) $nb = func_get_arg(0); else $nb = 8; // on utilise certains chiffres : 1 = i, 5 = S, 6=b, 3=E, 9=G, 0=O $lettre = array(); $lettre[0] = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'o', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'D', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '9', '0', '6', '5', '1', '3'); $lettre[1] = array('a', 'e', 'i', 'o', 'u', 'y', 'A', 'E', 'I', 'O', 'U', 'Y' , '1', '3', '0' ); $lettre[-1] = array('b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'z', 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Z', '5', '6', '9'); $retour = ""; $prec = 1; $precprec = -1; srand((double)microtime()*20001107); // pour genere la suite de lettre, on dit : si les deux lettres sonts // des consonnes (resp. des voyelles) on affiche des voyelles (resp, des consonnes). // si les lettres sont de type differents, on affiche une lettre de l'alphabet while(strlen($retour) < $nb) { $type = ($precprec + $prec)/2; $r = $lettre[$type][array_rand($lettre[$type], 1)]; $retour .= $r; $precprec = $prec; $prec = in_array($r, $lettre[-1]) - in_array($r, $lettre[1]); } return $retour; } function _checkLogin($login="",$new=FALSE,$currentID="") { if(empty($login)) return $this->_err("Le login (nom d'utilisateur) n'a pas été rempli."); if(!ereg($this->regexp,$login)) return $this->_err("Le login (nom d'utilisateur) n'est pas valide.".$this->instructions); if($new) { $requete = "SELECT id FROM membres WHERE pseudo='{$login}'"; if(!empty($currentID)) $requete.= " AND id != '".$currentID."'"; $res = mysql_query($requete); if(@mysql_num_rows($res) > 0) return $this->_err("Ce login est déjà utilisé par un autre membre."); } return TRUE; } function _checkPassword($password="") { if(empty($password)) return $this->_err("Le mot de passe n'a pas été rempli."); if(!ereg($this->regexp,$password)) return $this->_err("Le mot de passe n'est pas valide.".$this->instructions); return TRUE; } function _checkMail($email="",$new=FALSE) { if(empty($email)) return $this->_err("L'adresse E-Mail n'a pas été remplie."); if(!ereg($this->mail_regexp,$email)) return $this->_err("L'adresse E-Mail n'est pas valide."); if($new) { $requete = "SELECT id FROM membres WHERE email='{$email}' AND pseudo != '{$login}'"; $res = mysql_query($requete); if(@mysql_num_rows($res) > 0) return $this->_err("Cette adresse E-Mail est déjà utilisée par un autre membre."); } return TRUE; } function readTemplate($tpl) { if(!file_exists($this->chemin.$tpl.".txt")) return FALSE; $txt = file($this->chemin.$tpl.".txt"); $txt = implode("",$txt); return $txt; } function ajout($login="",$passe="",$email="",$groupe=1) { if(!$this->_checkLogin($login,TRUE) || !$this->_checkPassword($passe) || !$this->_checkMail($email,TRUE)) return FALSE; $passe = md5($passe); mysql_unbuffered_query( "INSERT INTO membres SET pseudo='{$login}', password='{$passe}', email='{$email}', groupe='{$groupe}', ". "ip_inscription='administrateur', date_inscription='".time()."'"); return TRUE; } function inscription($login,$email,$groupe) { $cfg = $GLOBALS['cfg']; if(!$this->_checkLogin($login,TRUE) || !$this->_checkMail($email,TRUE)) return FALSE; $passe = strtolower($this->genPass()); $ip = getenv("REMOTE_ADDR"); $requete = 'INSERT INTO membres SET pseudo="'.$login.'", password="'.md5($passe).'", email="'.$email.'", '. 'groupe="'.$groupe.'", statut="inscription", ip_inscription="'.$ip.'", date_inscription="'.time().'"'; mysql_unbuffered_query($requete); $replace = array("[NOM_SITE]"=>$cfg['titre'], "[URL_SITE]"=>$cfg['url'], "[EMAIL_ADMIN]"=>$cfg['admin_mail'], "[LOGIN]"=>$login, "[PASSE]"=>$passe); $tpl = $this->readTemplate("mail_inscription"); $tpl = strtr($tpl,$replace); $headers = 'From: <'.$cfg['robot_mail'].">\nReply-To: <".$cfg['robot_mail'].">\nReturn-Path: <".$cfg['robot_mail'].">"; @mail($email,"Inscription: ".$cfg['titre'],$tpl,$headers); #echo "
$tpl
$requete
$headers
"; exit; return TRUE; } function infos($id) { $res = mysql_query("SELECT * FROM membres WHERE id=\"{$id}\""); if(mysql_num_rows($res) < 1) return $this->_err("Ce membre n'existe pas."); $rec = mysql_fetch_assoc($res); mysql_free_result($res); return $rec; } // $rec = array( groupe, pseudo, email, password, fuseau, design ) function modifier($id,$rec) { if(count($rec) < 1) return $this->_err("Aucun paramètre donné à l'exécution."); foreach($rec as $k=>$v) { if($k == "pseudo") if(!$this->_checkLogin($v,TRUE,$id)) return FALSE; if($k == "password") { if(!$this->_checkPassword($v)) return FALSE; $v = md5($v); } if($k == "email") if(!$this->_checkMail($v)) return FALSE; $rec[$k] = "{$k}=\"{$v}\""; } $req = implode(", ",$rec); $res = mysql_unbuffered_query("UPDATE membres SET {$req} WHERE id=\"{$id}\""); if(!$res) return $this->_err("Problème technique.",mysql_error()); return TRUE; } function nb_journaux($id) { $res = mysql_unbuffered_query("SELECT COUNT(id) FROM journaux WHERE auteur=\"{$id}\""); if(!$res) return $this->_err("Problème technique.",mysql_error()); $rec = mysql_fetch_row($res); return $rec[0]; } function set_courant($membre,$journal) { if($journal !== "NOK") { $res = mysql_query("SELECT id FROM journaux WHERE id=\"{$journal}\" AND auteur=\"{$membre}\""); if(!$res) return $this->_err("Problème technique.",mysql_error()); if(mysql_num_rows($res) != 1) return $this->_err("Ce journal n'existe pas ou ne vous appartient pas.","SELECT COUNT(id) FROM journaux WHERE id=\"{$journal}\" AND auteur=\"{$membre}\""); } else $journal = ""; $res = mysql_unbuffered_query("UPDATE membres SET courant=\"{$journal}\" WHERE id=\"{$membre}\""); if(!$res) return $this->_err("Problème technique.",mysql_error()); return TRUE; } function liste($debut="",$parpage="") { if(empty($debut)) $debut = 0; if(empty($parpage)) $parpage = 20; $req = "SELECT * FROM membres ORDER BY pseudo LIMIT {$debut},{$parpage}"; $res = mysql_query($req); while($rec = mysql_fetch_assoc($res)) $out[] = $rec; mysql_free_result($res); return $out; } function nombre($groupe="") { if(empty($groupe)) $req = "SELECT COUNT(id) FROM membres"; else $req = "SELECT COUNT(id) FROM membres WHERE groupe='{$groupe}'"; $res = mysql_unbuffered_query($req); $rec = mysql_fetch_row($res); return $rec[0]; } function get($id) { $res = mysql_query("SELECT * FROM membres WHERE id=\"{$id}\""); $out = mysql_fetch_assoc($res); mysql_free_result($res); return $out; } function get_id($pseudo) { $res = mysql_query("SELECT id FROM membres WHERE pseudo='{$pseudo}'"); if(!$res) return $this->_err("Erreur mySQL.",mysql_error()); $rec = mysql_fetch_row($res); mysql_free_result($res); if(empty($rec[0])) return FALSE; return $rec[0]; } function get_quotas($id) { $res = mysql_query("SELECT COUNT(id) FROM journaux WHERE auteur=\"{$id}\""); $nb = mysql_fetch_row($res); $out['journaux'] = $nb[0]; mysql_free_result($res); $res = mysql_query("SELECT COUNT(id) FROM messages WHERE owner=\"{$id}\""); $nb = mysql_fetch_row($res); $out['messages'] = $nb[0]; mysql_free_result($res); return $out; } function supprimer($id) { mysql_unbuffered_query("DELETE FROM messages WHERE owner=\"{$id}\""); mysql_unbuffered_query("DELETE FROM membres WHERE id=\"{$id}\""); mysql_unbuffered_query("DELETE FROM abonnements WHERE membre=\"{$id}\""); mysql_unbuffered_query("DELETE FROM contacts WHERE membre=\"{$id}\""); mysql_unbuffered_query("DELETE FROM restreint WHERE membre=\"{$id}\""); return TRUE; } function chercher($texte) { $texte = addslashes($texte); $res = mysql_query("SELECT * FROM membres WHERE pseudo LIKE '%{$texte}%' OR email LIKE '%{$texte}%' ORDER BY pseudo"); while($rec = mysql_fetch_assoc($res)) { $out[] = $rec; } mysql_free_result($res); return $out; } function show_menage($jours, $rappel=FALSE) { $time = time() - ($jours * 24 * 3600); if($rappel) $rap = "> 0"; else $rap = "< 1"; $req = "SELECT id,date,pseudo FROM membres WHERE (date < {$time}) AND (rappel {$rap}) ORDER BY date DESC"; $res = mysql_query($req); while($rec = mysql_fetch_assoc($res)) { $out[] = $rec; } mysql_free_result($res); return $out; } function connectes($all=FALSE) { $last = time() - 3600; if(!$all) $all1 = "AND m.invisible='non' AND s.dernier >= {$last}"; $res = mysql_query("SELECT s.id,s.dernier,s.permanent,m.pseudo,s.ip FROM sessions AS s, membres AS m WHERE s.id=m.id {$all1} ORDER BY s.dernier DESC") or die(mysql_error()); while($rec = mysql_fetch_assoc($res)) { $out[] = $rec; } mysql_free_result($res); return $out; } function envoi_mail($groupe,$from="",$sujet="",$texte="") { if(empty($from)) return $this->_err("Expéditeur non renseigné."); if(empty($sujet)) return $this->_err("Sujet non renseigné."); if(empty($texte)) return $this->_err("Texte non renseigné."); $res = mysql_query("SELECT email FROM membres".(($groupe != "all") ? " WHERE groupe='{$groupe}'" : "")); while($rec = mysql_fetch_row($res)) $mails[] = $rec[0]; mysql_free_result($res); $mails = implode(", ",$mails); $headers = "From: {$from}\nReply-To: {$from}\nReturn-Path: {$from}\nBcc: {$mails}"; $texte = str_replace("\r","",$texte); $texte = wordwrap($texte); mail($from,stripslashes($sujet),stripslashes($texte),$headers); return TRUE; } function liste_journaux($id,$all=FALSE) { $requete = "SELECT id,titre FROM journaux WHERE auteur='{$id}'"; if(!$all) $requete.= " AND (statut='public' OR statut='collectif')"; $res = mysql_query($requete); if(!$res) return $this->_err("Erreur mySQL.",$requete."\n // ".mysql_error()); while($rec = mysql_fetch_row($res)) $out[] = array("id"=>$rec[0],"titre"=>$rec[1]); mysql_free_result($res); return $out; } function recup_passe($email) { global $cfg; if(!$this->_checkMail($email)) return FALSE; $requete = "SELECT id,pseudo,password FROM membres WHERE email='{$email}'"; $res = mysql_query($requete); if(mysql_num_rows($res) < 1) return $this->_err("Cet E-Mail est inconnu."); $rec = mysql_fetch_assoc($res); $uniq = md5(time().$email.$rec['id'].$rec['pseudo'].$rec['password']); mysql_unbuffered_query("UPDATE membres SET uniqid='{$uniq}' WHERE id='{$rec[id]}'") or die(mysql_error()); $texte = "CECI EST UN MESSAGE AUTOMATIQUE, MERCI DE NE PAS Y REPONDRE\n". "-----------------------------------------------------------\n\n". "Bonjour,\nVous avez fait une demande de changement de mot de passe\n". "sur le site {$cfg[titre]}. Pour effectuer ce changement, rendez-vous sur\n". "http://{$_SERVER[SERVER_NAME]}/membre/motdepasse?id={$uniq}\n\n". "Cordialement,\nLe robot du site"; $headers = "From: {$cfg[robot_mail]}\nReply-To: {$cfg[robot_mail]}\nReturn-Path: {$cfg[robot_mail]}"; mail($email,"Mot de passe oublie",$texte,$headers); return TRUE; } function check_forget_id($id) { $requete = "SELECT id,pseudo,email FROM membres WHERE uniqid='{$id}'"; $res = mysql_query($requete) or die(mysql_error()); if(mysql_num_rows($res) < 1) return $this->_err("Numéro invalide."); return mysql_fetch_assoc($res); } function change_passe($membre,$passe) { if(!$this->_checkPassword($passe)) return FALSE; $requete = 'UPDATE membres SET password="'.md5($passe).'", uniqid="" WHERE id="'.$membre.'"'; mysql_unbuffered_query($requete); return TRUE; } function is_banned($id_membre) { $res = mysql_query('SELECT banned FROM membres WHERE id="'.intval($id_membre).'";'); if(mysql_num_rows($res) < 1) return false; list($banned) = mysql_fetch_row($res); return $banned; } function set_ban($id, $ban_level) { mysql_unbuffered_query('UPDATE membres SET banned="'.intval($ban_level).'" WHERE id="'.intval($id).'";'); return true; } } ?>