Skip to content
Snippets Groups Projects
Commit 6324529a authored by Adrien KRÄHENBÜHL's avatar Adrien KRÄHENBÜHL
Browse files

Ajout d'une correction du TP4

parent 2abe7682
Branches
No related merge requests found
<?php
session_start();
if ( empty($_SESSION['user']) )
{
header('Location: signin.php');
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Account</title>
</head>
<body>
<p>
Hello <?= $_SESSION['user'] ?> !<br>
Welcome on your account.
</p>
<ul>
<li><a href="formpassword.php">Change password.</a></li>
<li><a href="deleteuser.php">Delete my account.</a></li>
</ul>
<p><a href="signout.php">Sign out</a></p>
<?php if ( !empty($_SESSION['message']) ) { ?>
<section>
<p><?= $_SESSION['message'] ?></p>
</section>
<?php } ?>
</body>
</html>
<?php
/******************************************************************************
* Initialisation.
*/
session_start();
unset($_SESSION['message']);
/******************************************************************************
* Traitement des données de la requête
*/
// 1. On vérifie que la méthode HTTP utilisée est bien POST
if ( $_SERVER['REQUEST_METHOD'] != 'POST' )
{
header('Location: signup.php');
exit();
}
// 2. On vérifie que les données attendues existent
if ( empty($_POST['login']) || empty($_POST['password']) || empty($_POST['confirm']) )
{
$_SESSION['message'] = "Some POST data are missing.";
header('Location: signup.php');
exit();
}
// 3. On sécurise les données reçues
$login = htmlspecialchars($_POST['login']);
$password = htmlspecialchars($_POST['password']);
$confirm = htmlspecialchars($_POST['confirm']);
// 4. On vérifie que les deux mots de passe correspondent
if ( $password !== $confirm )
{
$_SESSION['message'] = "The two passwords differ.";
header('Location: signup.php');
exit();
}
/******************************************************************************
* Chargement du model
*/
require_once('models/User.php');
/******************************************************************************
* Ajout de l'utilisateur
*/
// 1. On crée l'utilisateur avec les identifiants passés en POST
$user = new User($login,$password);
// 2. On crée l'utilisateur dans la BDD
try {
$user->create();
}
catch (PDOException $e) {
// Si erreur lors de la création de l'objet PDO
// (déclenchée par MyPDO::pdo())
$_SESSION['message'] = $e->getMessage();
header('Location: signup.php');
exit();
}
catch (Exception $e) {
// Si erreur durant l'exécution de la requête
// (déclenchée par le throw de $user->create())
$_SESSION['message'] = $e->getMessage();
header('Location: signup.php');
exit();
}
// 3. On indique que le compte a bien été créé
$_SESSION['message'] = "Account created! Now, signin.";
// 4. On sollicite une redirection vers la page d'accueil
header('Location: signin.php');
exit();
<?php
/******************************************************************************
* Initialisation.
*/
session_start();
unset($_SESSION['message']);
/******************************************************************************
* Traitement des données de la requête
*/
// 1. On vérifie que la méthode HTTP utilisée est bien POST
if ( $_SERVER['REQUEST_METHOD'] != 'POST' )
{
header('Location: signin.php');
exit();
}
// 2. On vérifie que les données attendues existent
if ( empty($_POST['login']) || empty($_POST['password']) )
{
$_SESSION['message'] = "Some POST data are missing.";
header('Location: signin.php');
exit();
}
// 3. On sécurise les données reçues
$login = htmlspecialchars($_POST['login']);
$password = htmlspecialchars($_POST['password']);
/******************************************************************************
* Chargement du model
*/
require_once('models/User.php');
/******************************************************************************
* Authentification
*/
// 1. On crée l'utilisateur avec les identifiants passés en POST
$user = new User($login,$password);
// 2. On vérifie qu'il existe dans la BDD
try {
if ( !$user->exists() )
{
$_SESSION['message'] = 'Wrong login/password.';
header('Location: signin.php');
exit();
}
}
catch (PDOException $e) {
// Si erreur lors de la création de l'objet PDO
// (déclenchée par MyPDO::pdo())
$_SESSION['message'] = $e->getMessage();
header('Location: signin.php');
exit();
}
catch (Exception $e) {
// Si erreur durant l'exécution de la requête
// (déclenchée par le throw de $user->exists())
$_SESSION['message'] = $e->getMessage();
header('Location: signin.php');
exit();
}
// 3. On sauvegarde le login dans la session
$_SESSION['user'] = $login;
// 4. On sollicite une redirection vers la page du compte
header('Location: account.php');
exit();
<?php
/******************************************************************************
* Initialisation.
*/
session_start();
unset($_SESSION['message']);
/******************************************************************************
* Vérification de la session
*/
// 1. On vérifie que l'utilisateur est connecté
if ( empty($_SESSION['user']) )
{
header('Location: signin.php');
exit();
}
// 2. On récupère le login dans une variable
$login = $_SESSION['user'];
/******************************************************************************
* Traitement des données de la requête
*/
// 1. On vérifie que la méthode HTTP utilisée est bien POST
if ( $_SERVER['REQUEST_METHOD'] != 'POST' )
{
header('Location: formpassword.php');
exit();
}
// 2. On vérifie que les données attendues existent
if ( empty($_POST['newpassword']) || empty($_POST['confirmpassword']) )
{
$_SESSION['message'] = "Some POST data are missing.";
header('Location: formpassword.php');
exit();
}
// 3. On sécurise les données reçues
$newpassword = htmlspecialchars($_POST['newpassword']);
$confirmpassword = htmlspecialchars($_POST['confirmpassword']);
// 4. On s'assure que les 2 mots de passes sont identiques
if ( $newpassword != $confirmpassword )
{
$_SESSION['message'] = "Error: passwords are different.";
header('Location: formpassword.php');
exit();
}
/******************************************************************************
* Chargement du model
*/
require_once('models/User.php');
/******************************************************************************
* Changement du mot de passe
*/
// 1. On crée l'utilisateur avec les identifiants passés en POST
$user = new User($login);
// 2. On change le mot de passe de l'utilisateur
try {
$user->changePassword($newpassword);
}
catch (PDOException $e) {
// Si erreur lors de la création de l'objet PDO
// (déclenchée par MyPDO::pdo())
$_SESSION['message'] = $e->getMessage();
header('Location: formpassword.php');
exit();
}
catch (Exception $e) {
// Si erreur durant l'exécution de la requête
// (déclenchée par le throw de $user->changePassword())
$_SESSION['message'] = $e->getMessage();
header('Location: formpassword.php');
exit();
}
// 3. On indique que le mot de passe a bien été modifié
$_SESSION['message'] = "Password successfully updated.";
// 4. On sollicite une redirection vers la page du compte
header('Location: account.php');
exit();
<?php
/******************************************************************************
* Initialisation.
*/
session_start();
unset($_SESSION['message']);
/******************************************************************************
* Vérification de la session
*/
// 1. On vérifie que l'utilisateur est connecté
if ( empty($_SESSION['user']) )
{
header('Location: signin.php');
exit();
}
// 2. On récupère le login dans une variable
$login = $_SESSION['user'];
/******************************************************************************
* Chargement du model
*/
require_once('models/User.php');
/******************************************************************************
* Suppression de l'utilisateur
*/
// 1. On crée l'utilisateur avec les identifiants passés en POST
$user = new User($login);
// 2. On détruit l'utilisateur dans la BDD
try {
$user->delete();
}
catch (PDOException $e) {
// Si erreur lors de la création de l'objet PDO
// (déclenchée par MyPDO::pdo())
$_SESSION['message'] = $e->getMessage();
header('Location: account.php');
exit();
}
catch (Exception $e) {
// Si erreur durant l'exécution de la requête
// (déclenchée par le throw de $user->create())
$_SESSION['message'] = $e->getMessage();
header('Location: account.php');
exit();
}
// 3. On détruit la session
session_destroy();
// 4. On crée une nouvelle session
session_start();
// 5. On indique que le compte a bien été supprimé
$_SESSION['message'] = "Account successfully deleted.";
// 6. On sollicite une redirection vers la page d'accueil
header('Location: signin.php');
exit();
<?php
session_start();
if ( empty($_SESSION['user']) )
{
header('Location: signin.php');
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Change password</title>
</head>
<body>
<h1>Change password</h1>
<form action="changepassword.php" method="post">
<label for="newpassword">New password</label> <input type="password" id="newpassword" name="newpassword" required>
<label for="confirmpassword">Confirm password</label><input type="password" id="confirmpassword" name="confirmpassword" required>
<input type="submit" value="Change my password">
</form>
<p>
Go back to <a href="account.php">Home</a>.
</p>
<?php if ( !empty($_SESSION['message']) ) { ?>
<section>
<p><?= $_SESSION['message'] ?></p>
</section>
<?php } ?>
</body>
</html>
<?php
require_once("MyPDO.php");
class User
{
private string $_login;
private ?string $_password;
private const USER_TABLE = "Users";
public function __construct( string $login, string $password = null )
{
$this->setLogin($login);
$this->setPassword($password);
}
public function login() : string
{
return $this->_login;
}
public function setLogin( string $login ) : void
{
$this->_login = $login;
}
public function password() : string
{
return $this->_password;
}
public function setPassword( ?string $password ) : void
{
$this->_password = $password;
}
public function exists() : bool
{
// 1. On prépare la requête $request
$request = MyPDO::pdo()->prepare('SELECT password FROM '.self::USER_TABLE.' WHERE login = :login');
// 2. On assigne $login au paramêtre :login
$ok = $request->bindValue( ":login", $this->_login, PDO::PARAM_STR );
// 3. On exécute la requête $request
$ok &= $request->execute();
if (!$ok)
throw new Exception("Error: user access in DB failed.");
// 4. On vérifie que l'utilisateur a été trouvé et que son mot de passe
// correspond à celui de l'attribut $this->_password
$user = $request->fetch(PDO::FETCH_ASSOC);
return $user && password_verify($this->_password,$user['password']);
}
public function create() : void
{
$request = MyPDO::pdo()->prepare('INSERT INTO '.self::USER_TABLE.'(login,password) VALUES (:login,:password)');
$ok = $request->bindValue( ":login", $this->_login, PDO::PARAM_STR );
$ok &= $request->bindValue( ":password", password_hash($this->_password,PASSWORD_DEFAULT), PDO::PARAM_STR );
$ok &= $request->execute();
if ( !$ok )
throw new Exception("Error: user creation in DB failed.");
}
public function changePassword( string $newpassword ) : void
{
$request = MyPDO::pdo()->prepare('UPDATE '.self::USER_TABLE.' SET password = :password WHERE login = :login');
$ok = $request->bindValue(':login', $this->_login, PDO::PARAM_STR);
$ok &= $request->bindValue(':password', password_hash($newpassword,PASSWORD_DEFAULT), PDO::PARAM_STR);
$ok &= $request->execute();
if ( !$ok )
throw new Exception("Error: password updating failed.");
$this->setPassword($newpassword);
}
public function delete() : void
{
$request = MyPDO::pdo()->prepare('DELETE FROM '.self::USER_TABLE.' WHERE login = :login');
$ok = $request->bindValue(':login', $this->_login, PDO::PARAM_STR);
$ok &= $request->execute();
if ( !$ok )
throw new Exception("Error while deleting your account.");
}
}
<?php
// Nom du fichier du fichier de BDD SQLite sur le serveur
$sqliteFile = $_SERVER['DOCUMENT_ROOT'].'/models/tp4.db';
// Exception si le fichier n'existe pas
if (!file_exists($sqliteFile))
throw new PDOException("DB file '".$sqliteFile."' doesn't exist");
// Variable contenant le DSN de la BDD SQLite
$SQL_DSN = 'sqlite:'.$sqliteFile;
File added
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Signin</title>
</head>
<body>
<h1>Signin</h1>
<form action="authenticate.php" method="post">
<label for="login">Login</label> <input type="text" id="login" name="login" required autofocus>
<label for="password">Password</label><input type="password" id="password" name="password" required>
<input type="submit" value="Signin">
</form>
<p>
If you don't have an account, <a href="signup.php">signup</a> first.
</p>
<?php if ( !empty($_SESSION['message']) ) { ?>
<section>
<p><?= $_SESSION['message'] ?></p>
</section>
<?php } ?>
</body>
</html>
<?php
session_start();
session_destroy();
header('Location: signin.php');
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Signup</title>
</head>
<body>
<h1>Signup</h1>
<form action="adduser.php" method="post">
<label for="login">Login</label> <input type="text" id="login" name="login" required autofocus>
<label for="password">Password</label> <input type="password" id="password" name="password" required>
<label for="confirm">Confirm password</label><input type="password" id="confirm" name="confirm" required>
<input type="submit" value="Signup">
</form>
<p>
If you already have an account, <a href="signin.php">signin</a>.
</p>
<?php if ( !empty($_SESSION['message']) ) { ?>
<section>
<p><?= $_SESSION['message'] ?></p>
</section>
<?php } ?>
</body>
</html>
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment