<?php
// De la http://www.marplo.net
/**
 * Urmatoarea functie sterge randurile din tabelul user_temp mai vechi de 10 min
 * verifica daca utilizatorul a incercat de mai multe ori autentificarea
 * daca a incercat deja de 3 ori fara nume-parola confirmate
 * solicita incercarea unei noi autentificari dupa 10 min
 */
 function temp_user($nume) {
  GLOBAL $conn;
  $data = time();
  $data_expir = $data-601;
  $ip = $_SERVER['REMOTE_ADDR'];

  /* Sterge randurile din tabelul user_temp mai vechi de 10 min */
  $sql = "DELETE FROM `user_temp` WHERE `data`<$data_expir";
  mysql_query($sql,$conn);

  /* Adauga slashuri (pentru nume), daca PHP nu e setat sa adauge implicit */
  if(!get_magic_quotes_gpc()) { $nume = addslashes($nume); }

  /* Verifica daca numle este in tabelul user_temp */
  $sql1 = "SELECT `nume`, `incercari`, `data` FROM `user_temp` WHERE `nume`='$nume'";
  $result = mysql_query($sql1,$conn);

  if(!$result || (mysql_numrows($result)<1)) {
	$sql1 = "INSERT INTO `user_temp` (nume, ip, data) VALUES ('$nume', '$ip', '$data')";
	mysql_query($sql1,$conn);
	return 'continua'; 
  }
  else {
	/* Gaseste nr. incercari asociata numelui */
	$tbarray = mysql_fetch_array($result);
	$incercari = $tbarray['incercari'];
	if ($incercari<3) {
	  $incercari++;
	  // incrementeaza nr. incercari cu 1 si actualizeaza data
	  $sql1 = "UPDATE `user_temp` SET `incercari`='$incercari', `data`='$data' WHERE `nume`='$nume'";
	  $result = mysql_query($sql1);
	  return 'continua';
	}
	else if ($incercari>=3) {
	  $timp = 600 - ($data - $tbarray['data']);
	  return $timp;		// Indica nr. incercari depasit si returneaza timpul pt. calculare asteptare
	}
  }
}
 
/**
 * Urmatoarea functie verifica daca numele exista in baza de date
 * daca da, verifica daca parola se potriveste cu cea din baza de date
 * daca numele sau parola nu sunt corecte, returneaza eroarea (1 sau 2).
 * pentru nume si parola confirmate returneaza 0.
 */
function confirmUser($nume, $parola) {
 GLOBAL $conn;
  /* Adauga slashuri daca este necesar (pentru query) */
  if(!get_magic_quotes_gpc()) {
	$nume = addslashes($nume);
	$parola = addslashes($parola);
  }

  /* Verifica daca numle este in baza de date */
  $q = "SELECT parola, aprobat from `utilizatori` WHERE `nume`='$nume'";
  $result = mysql_query($q,$conn);
  if(!$result || (mysql_numrows($result)<1)) {
	return 1; //Indica nume neconfirmat
  }
  else {
	/* Gaseste parola asociata numelui */
	$dbarray = mysql_fetch_array($result);
	$dbarray['parola']  = stripslashes($dbarray['parola']);
	
	// Verifica daca utilizatorul este confirmat (aprobat 1)
	if ($dbarray['aprobat']==0) {
	  return 3;	// Inregistrarea nu a fost aprobata
	}
	/* Verifica daca parola scrisa este aceeasi cu cea gasita in baza de date */
	else if($parola==$dbarray['parola']) {
	  return 0; // nume si parola confirmate
	}
	else {
	  return 2; // indica parola neconfirmata
	}
  }
}

/**
 * Verifica autentificarea prin sesiune - daca utilizatorul este deja autentificat
 * verifica daca utilizatorul a fost memorat in cookie 
 * adaug o sesiune ca utilizatoru este logat
 * Apeleaza functia ce verifica daca datele din sesiune sunt corecte cu cele din baza de date
 * returneaza TRUE daca utilizatorul este autentificat.
 */
function checkLogin() {
  /* verifica daca utilizatorul este memorat in cookie */
  if(isset($_COOKIE['cookname']) && isset($_COOKIE['cookpass'])) {
	$_SESSION['nume'] = $_COOKIE['cookname'];
	$_SESSION['parola'] = $_COOKIE['cookpass'];
  }

  /* verifica daca exista in sesiune numele si parola setate */
  if(isset($_SESSION['nume']) && isset($_SESSION['parola'])) {
	/* Confirma daca numele si parola sunt valide */
	if(confirmUser($_SESSION['nume'], $_SESSION['parola'])===0) { $result = 'logat'; }
	else {
	  /* daca variabilele sunt incorecte, sterge sesiunea, utilizatorul nu este logat */
	  unset($_SESSION['nume']);
	  unset($_SESSION['parola']);
	  $result = 'nelogat';
	}
	return $result;
  }
  /* Utilizatorul nu este logat */
  else { return 'nelogat'; }
}

/**
 * Determina daca va fi sau nu afisat formularul de autentificare
 * arata ca utilizatorul este autentificat, bazat pe variabilele din sesiune, sau mesajele de eroare
 */
function displayLogin($mesaj) {
  if(isset($_SESSION['nume']) && $mesaj=='logat') {
	$result = '&nbsp; &nbsp; &nbsp; Welcome <b>'.$_SESSION['nume'].'</b>, check your <a href=\'panel.php\'>panel.</a>';
  }
  else if($mesaj=='nelogat') {
	// Afiseaza formularul
	$result = '<script src="logare/verific.js"></script>
<form action="'. $_SERVER['PHP_SELF']. '" method="post" onsubmit="return regcheck(this)">
<label for="nume">User:&nbsp; </label><input type="text" name="nume" size="7" maxlength="30" id="nume" />
<label for="pass">Pass: </label><input type="password" name="pass" size="7" maxlength="30" id="pass" />
<input type="checkbox" name="remember" />R
<input type="submit" name="sublogin" value="Login" />
</form>';
  }
  else {
	$result = '<table align="center" bordercolor="red" border="1" cellspacing="0" cellpadding="2" width="270"><tr><td align="center">'. $mesaj. '</td></tr></table>';
  }
  return $result;
}

/**
 * Verifica daca numele si parola au fost trimise prin formularul de logare
 * daca da, verifica lungimea numelui si parolei, 
 * apoi datele in baza de date si creaza sesiunea
 */
if(isset($_POST['sublogin']) && isset($_POST['nume']) && isset($_POST['pass'])) {
  // Retinerea adresei (preluata din form) pt. revenire la pagina anterioara
  $inapoi = '<br /><b><a href="#" onClick="history.back()">Reveniti</a></b> la pagina anterioara.';

  // Elimina spatiile din marginile numelui si parolei
  $_POST['nume'] = trim($_POST['nume']);
  $_POST['pass'] = trim($_POST['pass']);

  /* verifica daca toate campurile au fost completate */
  if(!$_POST['nume'] || !$_POST['pass']){
	$eroare='Nu ati completat toate campurile'. $inapoi;
  }

  /* verifica lungimea numelui */
  else if(strlen($_POST['nume'])<3 || strlen($_POST['nume'])>32) {
	$eroare='Numele trebuie sa contina intre 3 si 32 caractere'. $inapoi;
  }

  /* verifica lungimea parolei */
  else if(strlen($_POST['pass'])<7 || strlen($_POST['pass'])>18) {
	$eroare='Parola trebuie sa contina intre 7 si 18 caractere.'. $inapoi;
  }
  else {
	// Verifica si adauga incercarea de logare in tabelul user_temp
	$continua = temp_user($_POST['nume']);

	if ($continua=='continua') {
	  $md5pass = md5($_POST['pass']);		// Cripteaza parola
	  /* verifica daca numele este in baza de date si parola este corecta */
	  $result = confirmUser($_POST['nume'], $md5pass);

	  /* Seteaza mesajul in cazul in care nume sau parola sunt incorecte */
	  if($result==1) {
		$eroare='Numele <b>'. stripslashes($_POST['nume']). '</b> nu este inregistrat.'. $inapoi. '<br />Daca ati uitat numele -&gt; <a href="logare/recuper.php">Recuperare nume</a>';
	  }
	  else if($result==2) {
		$eroare='Parola incorecta.'. $inapoi. '<br/>Daca ati uitat parola -&gt; <a href="logare/recuper.php">Recuperare parola</a>';
	  }
	  else if($result==3) {
		die('<center><br /><br /><font color="red"><h3>Inregistrarea pt. <u>'. stripslashes($_POST['nume']). '</u> este neconfirmata.</h3></font> Verificati contul de e-mail folosit la inregistrare (inclusiv in Spamm) pt. mesajul cu link-ul de confirmare.<br /><br /> Daca doriti sa solicitati un nou e-mail de confirmare, <a href="logare/recuper.php?confirm=1">Click Aici</a></center>');
	  }
	  else {
		/* daca numele si parola sunt corecte, inregistreaza variabilele in sesiune */
		$_SESSION['nume'] = $_POST['nume'];
		$_SESSION['parola'] = $md5pass;

		/** Aici utilizatorul alege sa fie retinute datele pt.urmatoarea vizita
		* seteaza doua cookie-uri, unul care pastreaza numele si al doilea pt. parola
		* acestea expira in 100 de zile */
		if(isset($_POST['remember'])) {
		  setcookie("cookname", $_SESSION['nume'], time()+60*60*24*100, "/");
		  setcookie("cookpass", $_SESSION['parola'], time()+60*60*24*100, "/");
		}

		/* Auto redirect pentru a evita retrimiterea datelor cand da inapoi sau la refresh */
		echo '<meta http-equiv="Refresh" content="1;url='.$_SERVER['PHP_SELF'].'">';
		exit;
	  }
	}
	else {
	  // Seteaza mesajul cu timpul ramas pana la o noua incercare de autentificare
	  $continua = floor($continua/60). ' minute, '. ($continua%60). ' secunde';
	  $eroare = 'Ati depasit nr. incercari permise pt. autentificare. Puteti reincerca dupa <br /><b>'. $continua. '</b>'. $inapoi. '<br /><font color="blue">Daca ati uitat parola -&gt; <a href="logare/recuper.php">Recuperare parola</a></font>';
	}
  }
}

/* Seteaza variabila logged_in, care poate fi folosita in site pt. afisearea 
 * valoarea ei reprezinta ce va afisa in pagina, prin apelarea functiei displayLogin()
 * Daca exista vreo eroare, apeleaza functia cu acea eroare, altfel, o apeleaza cu rezultatul altei functii checkLogin(), care verifica autentificarea */
$logged_in = (isset($eroare)) ? displayLogin($eroare) : displayLogin(checkLogin());

@mysql_close();
?>