"AlternC's account password"); } /* ----------------------------------------------------------------- */ /** Check that the current user is an admnistrator. * @return boolean TRUE if we are super user, or FALSE if we are not. */ function checkright() { return ($this->user["su"]=="1"); } /* ----------------------------------------------------------------- */ /** Start a session in the web desktop. Check username and password. * Note : If the user entered a bas password, the failure will be logged * and told to the corresponding user on next successfull login. * @param $username string Username that want to get connected. * @param $password string User Password. * @return boolean TRUE if the user has been successfully connected, or FALSE if an error occured. */ function login($username,$password,$restrictip=0,$authip_token=false) { global $db,$err,$cuid, $authip; $err->log("mem","login",$username); // $username=addslashes($username); // $password=addslashes($password); $db->query("select * from membres where login='$username';"); if ($db->num_rows()==0) { $err->raise("mem",_("User or password incorrect")); return false; } $db->next_record(); if (_md5cr($password,$db->f("pass"))!=$db->f("pass")) { $db->query("UPDATE membres SET lastfail=lastfail+1 WHERE uid='".$db->f("uid")."';"); $err->raise("mem",_("User or password incorrect")); return false; } if (!$db->f("enabled")) { $err->raise("mem",_("This account is locked, contact the administrator")); return false; } $this->user=$db->Record; $cuid=$db->f("uid"); // AuthIP $allowed_ip=false; if ( $authip_token ) $allowed_ip = $this->authip_tokencheck($authip_token); $aga = $authip->get_allowed('panel'); foreach ($aga as $k=>$v ) { if ( $authip->is_in_subnet(get_remote_ip(), $v['ip'], $v['subnet']) ) $allowed=true ; } // Error if there is rules, the IP is not allowed and it's not in the whitelisted IP if ( sizeof($aga)>1 && !$allowed_ip && !$authip->is_wl(get_remote_ip()) ) { $err->raise("mem",_("Your IP isn't allowed to connect")); return false; } // End AuthIP if ($restrictip) { $ip="'".get_remote_ip()."'"; } else $ip="''"; /* Close sessions that are more than 2 days old. */ $db->query("DELETE FROM sessions WHERE DATE_ADD(ts,INTERVAL 2 DAY)query("insert into sessions (sid,ip,uid) values ('$sess',$ip,'$cuid');"); setcookie("session",$sess,0,"/"); $err->error=0; /* Fill in $local */ $db->query("SELECT * FROM local WHERE uid='$cuid';"); if ($db->num_rows()) { $db->next_record(); $this->local=$db->Record; } return true; } /* ----------------------------------------------------------------- */ /** Start a session as another user from an administrator account. * This function is not the same as su. setid connect the current user in the destination * account (for good), and su allow any user to become another account for some commands only. * (del_user, add_user ...) and allow to bring back admin rights with unsu * * @param $id integer User id where we will connect to. * @return boolean TRUE if the user has been successfully connected, FALSE else. */ function setid($id) { global $db,$err,$cuid; $err->log("mem","setid",$id); $db->query("select * from membres where uid='$id';"); if ($db->num_rows()==0) { $err->raise("mem",_("User or password incorrect")); return false; } $db->next_record(); $this->user=$db->Record; $cuid=$db->f("uid"); $ip=get_remote_ip(); $sess=md5(uniqid(mt_rand())); $_REQUEST["session"]=$sess; $db->query("insert into sessions (sid,ip,uid) values ('$sess','$ip','$cuid');"); setcookie("session",$sess,0,"/"); $err->error=0; /* Fill in $local */ $db->query("SELECT * FROM local WHERE uid='$cuid';"); if ($db->num_rows()) { $db->next_record(); $this->local=$db->Record; } return true; } /* ----------------------------------------------------------------- */ /** Suite à la connexion de l'utilisateur, réinitialise ses paramètres de dernière connexion */ function resetlast() { global $db,$cuid; $ip=addslashes(getenv("REMOTE_HOST")); if (!$ip) $ip=addslashes(get_remote_ip()); $db->query("UPDATE membres SET lastlogin=NOW(), lastfail=0, lastip='$ip' WHERE uid='$cuid';"); } function authip_token($bis=false) { global $db,$cuid; $db->query("select pass from membres where uid='$cuid';"); $db->next_record(); $i=intval(time()/3600); if ($bis) ++$i; return md5("$i--".$db->f('pass')); } function authip_tokencheck($t) { if ($t==$this->authip_token() || $t==$this->authip_token(true) ) return true; return false; } /* Faut finir de l'implémenter :) function authip_class() { global $cuid; $c = Array(); $c['name']="Panel access"; $c['protocol']="panel"; $c['values']=Array($cuid=>''); return $c; } */ /* ----------------------------------------------------------------- */ /** Vérifie que la session courante est correcte (cookie ok et ip valide). * Si besoin, et si réception des champs username & password, crée une nouvelle * session pour l'utilisateur annoncé. * Cette fonction doit être appellée à chaque page devant être authentifiée. * et AVANT d'émettre des données. (un cookie peut être envoyé) * @global string $session Le cookie de session eventuel * @global string $username/password le login/pass de l'utilisateur * @return TRUE si la session est correcte, FALSE sinon. */ function checkid() { global $db,$err,$cuid,$restrictip,$authip; if (isset($_REQUEST["username"])) { if ($_REQUEST["username"] && $_REQUEST["password"]) { return $this->login($_REQUEST["username"],$_REQUEST["password"],$_REQUEST["restrictip"]); } } // end isset $_COOKIE["session"]=isset($_COOKIE["session"])?addslashes($_COOKIE["session"]):""; if (strlen($_COOKIE["session"])!=32) { $err->raise("mem",_("Cookie incorrect, please accept the session cookie")); return false; } $ip=get_remote_ip(); $db->query("select uid,'$ip' as me,ip from sessions where sid='".$_COOKIE["session"]."'"); if ($db->num_rows()==0) { $err->raise("mem",_("Session unknown, contact the administrator")); return false; } $db->next_record(); if ($db->f("ip")) { if ($db->f("me")!=$db->f("ip")) { $err->raise("mem",_("IP address incorrect, please contact the administrator")); return false; } } $cuid=$db->f("uid"); $db->query("select * from membres where uid='$cuid';"); $db->next_record(); $this->user=$db->Record; $err->error=0; /* Remplissage de $local */ $db->query("SELECT * FROM local WHERE uid='$cuid';"); if ($db->num_rows()) { $db->next_record(); $this->local=$db->Record; } return true; } /* ----------------------------------------------------------------- */ /** Change l'identité d'un utilisateur temporairement. * @global string $uid Utilisateur dont on prends l'identité * @return TRUE si la session est correcte, FALSE sinon. */ function su($uid) { global $cuid,$db,$err; if (!$this->olduid) $this->olduid=$cuid; $db->query("select * from membres where uid='$uid';"); if ($db->num_rows()==0) { $err->raise("mem",_("User or password incorrect")); return false; } $db->next_record(); $this->user=$db->Record; $cuid=$db->f("uid"); return true; } /* ----------------------------------------------------------------- */ /** Retourne a l'identite d'origine de l'utilisateur apres su. * @return TRUE si la session est correcte, FALSE sinon. */ function unsu() { global $cuid; if (!$this->olduid) return false; $this->su($this->olduid); $this->olduid=0; return true; } /* ----------------------------------------------------------------- */ /** Termine une session du bureau virtuel (logout) * @return boolean TRUE si la session a bien été détruite, FALSE sinon. */ function del_session() { global $db,$user,$err,$cuid,$classes,$hooks; $err->log("mem","del_session"); $_COOKIE["session"]=addslashes(isset($_COOKIE["session"])?$_COOKIE["session"]:''); setcookie("session","",0,"/"); setcookie("oldid","",0,"/"); if ($_COOKIE["session"]=="") { $err->error=0; return true; } if (strlen($_COOKIE["session"])!=32) { $err->raise("mem",_("Cookie incorrect, please accept the session cookie")); return false; } $ip=get_remote_ip(); $db->query("select uid,'$ip' as me,ip from sessions where sid='".$_COOKIE["session"]."'"); if ($db->num_rows()==0) { $err->raise("mem",_("Session unknown, contact the administrator")); return false; } $db->next_record(); if ($db->f("me")!=$db->f("ip")) { $err->raise("mem",_("IP address incorrect, please contact the administrator")); return false; } $cuid=$db->f("uid"); $db->query("delete from sessions where sid='".$_COOKIE["session"]."';"); $err->error=0; # Invoker le logout dans toutes les autres classes /* foreach($classes as $c) { if (method_exists($GLOBALS[$c],"alternc_del_session")) { $GLOBALS[$c]->alternc_del_session(); } } */ $hooks->invoke("alternc_del_session"); session_unset(); return true; } /* ----------------------------------------------------------------- */ /** Change le mot de passe de l'utilisateur courant. * @param string $oldpass Ancien mot de passe. * @param string $newpass Nouveau mot de passe * @param string $newpass2 Nouveau mot de passe (à nouveau) * @return boolean TRUE si le mot de passe a été changé, FALSE sinon. */ function passwd($oldpass,$newpass,$newpass2) { global $db,$err,$cuid,$admin; $err->log("mem","passwd"); $oldpass=stripslashes($oldpass); $newpass=stripslashes($newpass); $newpass2=stripslashes($newpass2); if (!$this->user["canpass"]) { $err->raise("mem",_("You are not allowed to change your password.")); return false; } if ($this->user["pass"]!=_md5cr($oldpass,$this->user["pass"])) { $err->raise("mem",_("The old password is incorrect")); return false; } if ($newpass!=$newpass2) { $err->raise("mem",_("The new passwords are differents, please retry")); return false; } $db->query("SELECT login FROM membres WHERE uid='$cuid';"); $db->next_record(); $login=$db->Record["login"]; if (!$admin->checkPolicy("mem",$login,$newpass)) { return false; // The error has been raised by checkPolicy() } $newpass=_md5cr($newpass); $db->query("UPDATE membres SET pass='$newpass' WHERE uid='$cuid';"); $err->error=0; return true; } /* ----------------------------------------------------------------- */ /** Change les préférences administrateur d'un compte * @param integer $admlist Mode de visualisation des membres (0=large 1=courte) * @return boolean TRUE si les préférences ont été changées, FALSE sinon. */ function adminpref($admlist) { global $db,$err,$cuid; $err->log("mem","admlist"); if (!$this->user["su"]) { $err->raise("mem",_("You must be a system administrator to do this.")); return false; } $db->query("UPDATE membres SET admlist='$admlist' WHERE uid='$cuid';"); $err->error=0; return true; } /* ----------------------------------------------------------------- */ /** Envoie en mail le mot de passe d'un compte. * Note : On ne peut demander le mot de passe qu'une seule fois par jour. * TODO : Translate this mail into the localization program. * TODO : Check this function's ! * @return boolean TRUE si le mot de passe a été envoyé avec succès, FALSE sinon. */ function send_pass($login) { global $err,$db,$L_HOSTING,$L_FQDN; $err->log("mem","send_pass"); $db->query("SELECT * FROM membres WHERE login='$login';"); if (!$db->num_rows()) { $err->raise("mem",_("This account is locked, contact the administrator.")); return false; } $db->next_record(); if (time()-$db->f("lastaskpass")<86400) { $err->raise("mem",_("The new passwords are differents, please retry")); return false; } $txt="Bonjour, Il semblerait que vous ayez demandé à recevoir le mot de passe du compte ".$login." sur $L_HOSTING Voici donc le nom d'utilisateur et le mot de passe qui vous permettront de rentrer sur le bureau virtuel : -------------------------------------- Nom d'utilisateur : ".$db->f("login")." Mot de passe : ".$db->f("pass")." -------------------------------------- Note : si vous n'avez pas fait cette demande, cela signifie que quelqu'un l'a faite pour vous. Vous pouvez donc ignorer ce message. Si cela se reproduit, n'hésitez pas à contacter l'administrateur de votre serveur. Cordialement. "; mail($db->f("mail"),"Votre mot de passe sur $L_HOSTING",$txt,"From: postmaster@$L_FQDN\nReply-to: postmaster@$L_FQDN"); $db->query("UPDATE membres SET lastaskpass=".time()." WHERE login='$login';"); return true; } /* ----------------------------------------------------------------- */ /** Change le mail d'un membre (première etape, envoi du CookiE) * TODO : insert this mail string into the localization system * @param string $newmail Nouveau mail souhaité pour le membre. * @return string le cookie si le mail a bien été envoyé, FALSE sinon */ function ChangeMail1($newmail) { global $err,$db,$L_HOSTING,$L_FQDN,$cuid; $err->log("mem","changemail1",$newmail); $db->query("SELECT * FROM membres WHERE uid='$cuid';"); if (!$db->num_rows()) { $err->raise("mem",_("This account is locked, contact the administrator")); return false; } $db->next_record(); // un cookie de 20 caractères pour le mail $COOKIE=substr(md5(uniqid(rand(),1)),0,20); // et de 6 pour la clé à entrer. ca me semble suffisant... $KEY=substr(md5(uniqid(rand(),1)),0,6); // TODO : Translate this and insert this in alternc.po $txt="Bonjour, Quelqu'un (peut-etre vous) a demandé le changement de l'email du compte ".$db->f("login")." sur $L_HOSTING Afin de confirmer que cet email est valide, merci de vous rendre à l'adresse ci-dessous : https://$L_FQDN/admin/mem_cm.php?usr=$cuid&cookie=$COOKIE (attention : si cette adresse est coupée sur 2 lignes, ne pas oublier de reconstituer sur une seule ligne). Le bureau vous demandera la clé qui vous a été donnée lors de la demande de changement d'email. Note : si vous n'avez pas fait cette demande, cela signifie que quelqu'un l'a faite pour vous. Vous pouvez donc ignorer ce message. Si cela se reproduit, n'hésitez pas à contacter l'administrateur de votre serveur. Cordialement. "; mail($newmail,"Changement d'email sur $L_HOSTING",$txt,"From: postmaster@$L_FQDN\nReply-to: postmaster@$L_FQDN"); // Supprime les demandes précédentes de ce compte ! $db->query("DELETE FROM chgmail WHERE uid='$cuid';"); $db->query("INSERT INTO chgmail (cookie,ckey,uid,mail,ts) VALUES ('$COOKIE','$KEY','$cuid','$newmail',".time().");"); // Supprime les cookies de la veille :) $lts=time()-86400; $db->query("DELETE FROM chgmail WHERE ts<'$lts';"); return $KEY; } /* ----------------------------------------------------------------- */ /** Change le mail d'un membre (seconde etape, CookiE+clé = application) * @param string $COOKIE Cookie envoyé par mail * @param string $KEY clé affichée à l'écran * @param integer $uid Utilisateur concerné (on est hors session) * @return TRUE si le mail a bien été modifié, FALSE sinon */ function ChangeMail2($COOKIE,$KEY,$uid) { global $err,$db,$L_HOSTING,$L_FQDN; $err->log("mem","changemail2",$uid); $db->query("SELECT * FROM chgmail WHERE cookie='$COOKIE' and ckey='$KEY' and uid='$uid';"); if (!$db->num_rows()) { $err->raise("mem",_("The information you entered is incorrect.")); return false; } $db->next_record(); // met à jour le compte : $db->query("UPDATE membres SET mail='".$db->f("mail")."' WHERE uid='$uid';"); $db->query("DELETE FROM chgmail WHERE uid='$uid';"); // Supprime les cookies de la veille :) $lts=time()-86400; $db->query("DELETE FROM chgmail WHERE ts<'$lts';"); return true; } /* ----------------------------------------------------------------- */ /** Modifie le paramètre d'aide en ligne (1/0) * @param integer $show Faut-il (1) ou non (0) afficher l'aide en ligne */ function set_help_param($show) { global $db,$err,$cuid; $err->log("mem","set_help_param",$show); $db->query("UPDATE membres SET show_help='$show' WHERE uid='$cuid';"); } /* ----------------------------------------------------------------- */ /** Dit si l'aide en ligne est demandée * @return boolean TRUE si l'aide en ligne est demandée, FALSE sinon. */ function get_help_param() { return $this->user["show_help"]; } /* ----------------------------------------------------------------- */ /** Affiche (echo) l'aide contextuelle * @param integer $file Numéro de fichier d'aide à afficher. * @return TRUE si l'aide contextuelle a été trouvée, FALSE sinon */ function show_help($file,$force=false) { global $err; $err->log("mem","show_help"); if ($this->user["show_help"] || $force) { $hlp=_("hlp_$file"); if ($hlp!="hlp_$file") { $hlp=preg_replace( "#HELPID_([0-9]*)#", "\""._("Help")."\"",$hlp); echo "

".$hlp."

"; return true; } return false; } else { return true; } } /* ----------------------------------------------------------------- */ /** * Exports all the personnal user related information for an account. * @access private */ function alternc_export_conf() { global $db,$err; $err->log("mem","export"); $str=" \n"; $users=$this->user; $str.=" ".$users["uid"]."\n"; $str.=" ".$users["login"]."\n"; $str.=" ".$users["enabled"]."\n"; $str.=" ".$users["su"]."\n"; $str.=" ".$users["pass"]."\n"; $str.=" ".$users["mail"]."\n"; $str.=" ".$users["created"]."\n"; $str.=" ".$users["lastip"]."\n"; $str.=" ".$users["lastlogin"]."\n"; $str.=" ".$users["lastfail"]."\n"; $str.=" \n"; return $str; } } /* Classe Membre */ ?>