Correction des erreurs de syntaxe PHP.
Il n'y en a pas autant que ce que je pensais \o/ .
This commit is contained in:
parent
b6d540832b
commit
10eef9a593
|
@ -25,7 +25,7 @@ class Chemin {
|
|||
if ((count($motif) != count($this->segments)) && (end($motif) != CHEMIN_JOKER_MULTI_SEGMENTS)) {
|
||||
return false;
|
||||
}
|
||||
for ($i = 0; $i < count($motif); i++) {
|
||||
for ($i = 0; $i < count($motif); $i++) {
|
||||
if ($motif[$i] == CHEMIN_JOKER_MULTI_SEGMENTS) {
|
||||
continue;
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ class Chemin {
|
|||
|
||||
public function enfant($nom) {
|
||||
$s = $this->segments;
|
||||
$x = self::nettoyer_segment($nom)
|
||||
$x = self::nettoyer_segment($nom);
|
||||
if ($x != '') {
|
||||
array_push($s, $x);
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ class Chemin {
|
|||
$chemin = preg_replace("/\\/*$/", '', $chemin);
|
||||
|
||||
$segments = explode('/', $chemin);
|
||||
$segments = array_map("nettoyer_segment", $segments)
|
||||
$segments = array_map("nettoyer_segment", $segments);
|
||||
|
||||
return $segments;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ require_once(dirname(__FILE__) . "/config.php");
|
|||
require_once(dirname(__FILE__) . "/include.php");
|
||||
|
||||
class CMS {
|
||||
public static function cms($chemin_str) {
|
||||
public function cms($chemin_str) {
|
||||
// TODO : appeller Modules::action($chemin, $action, $paramètres);
|
||||
|
||||
$chemin = new Chemin($chemin_str);
|
||||
|
|
|
@ -20,8 +20,8 @@ $config_chemin_base_stockage = Path::combine($config_chemin_base, "modele");
|
|||
|
||||
// Chemin vers la partie visible du site.
|
||||
// En général, c'est le chemin vers le dossier contenant __cms__
|
||||
$config_chemin_base_public = Path::combine($config_chemin_base "/..");
|
||||
$config_chemin_base_public = Path::combine($config_chemin_base, "/..");
|
||||
|
||||
// ======== FIN CONFIGURATION =======
|
||||
|
||||
?>
|
||||
?>
|
|
@ -29,10 +29,10 @@ class AdminConnexion {
|
|||
return formulaire_connexion();
|
||||
} else if ($vue == "connexion réussie") {
|
||||
return "<h1>Connexion réussie</h1><p>Pour vous déconnecter, utilisez le lien «déconnexion» en haut à droite.</p><p><a href=\"" . $config_url_base . "\">Retour à la page d'accueil</a>.</p>";
|
||||
} else if ($vue == "connexion échouée") {
|
||||
}else if ($vue == "connexion échouée") {
|
||||
return formulaire_connexion("<p><strong>Mauvais mot de passe et/ou nom d'utilisateur. Ré-essayez ou retournez à la <a href=\"" . $config_url_base . "\">page d'accueil</a>.</strong></p>");
|
||||
} else if ($vue == "déconnexion") {
|
||||
return "<h1>Déconnexion réussie</h1><p>Vous êtes déconnecté. Vous pouvez à présent retourner à la <a href=\"" . $config_url_base . "\">page d'accueil</a>.</p>"
|
||||
}else if ($vue == "déconnexion") {
|
||||
return '<h1>Déconnexion réussie</h1><p>Vous êtes déconnecté. Vous pouvez à présent retourner à la <a href="' . $config_url_base . "\">page d'accueil</a>.</p>";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ class AdminCouleurs {
|
|||
$ret .= "<input ... Couleur A />";
|
||||
$ret .= "<input ... Couleur B />";
|
||||
$ret .= "<input ... Couleur C />";
|
||||
$ret .= ...
|
||||
// $ret .= ...
|
||||
return "Vue normale de la page.";
|
||||
} else if ($vue == "css") {
|
||||
// TODO : où mettre ce gen_css... ?
|
||||
|
|
|
@ -64,15 +64,15 @@ class AdminUtilisateurs {
|
|||
// afficher le lien "Nouvel utilisateur"
|
||||
}
|
||||
$ret .= '<table class="utilisateurs index"><thead><th>Nom</th><th>Prénom</th><th>Groupe</th><th>Mot de passe</th><th>Peut se connecter</th><th colspan="2"></th></thead><tbody>';
|
||||
$listegroupes = // Construire la liste des groupes sous forme de menu drop-down.
|
||||
foreach (Authentification::liste_utilisateurs()) {
|
||||
$listegroupes = ""; // Construire la liste des groupes sous forme de menu drop-down.
|
||||
foreach (Authentification::liste_utilisateurs() as $u) {
|
||||
$ret .= '<tr>'
|
||||
. '<form action="' . $chemin->get_url() . '">'
|
||||
. '<td>' . $k . '</td>' // TODO : Nom
|
||||
. '<td>' . $k . '</td>' // TODO : Prénom
|
||||
. '<td>' . Authentification::get_groupe($k) . '</td>'
|
||||
. '<td>' . Authentification::get_mot_de_passe($k) . '<input type="submit" value="Générer un nouveau mot de passe"/></td>'
|
||||
. '<td>' . Authentification::get_peut_se_connecter($k) . '</td>'
|
||||
. '<td>' . $u . '</td>' // TODO : Nom
|
||||
. '<td>' . $u . '</td>' // TODO : Prénom
|
||||
. '<td>' . Authentification::get_groupe($u) . '</td>'
|
||||
. '<td>' . Authentification::get_mot_de_passe($u) . '<input type="submit" value="Générer un nouveau mot de passe"/></td>'
|
||||
. '<td>' . Authentification::get_peut_se_connecter($u) . '</td>'
|
||||
. '<td><input type="submit" value="appliquer"/></td>'
|
||||
. '<td><input type="submit" value="supprimer"/></td>' // TODO
|
||||
. '</form>'
|
||||
|
|
|
@ -43,9 +43,9 @@ class ForumSujet {
|
|||
}
|
||||
if (vérifier_permission($chemin, "supprimer", get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="hidden" name="action" value="supprimer"/>'
|
||||
$ret .= '<input type="submit" value="Supprimer"/>'
|
||||
$ret .= '</form>'
|
||||
$ret .= '<input type="hidden" name="action" value="supprimer"/>';
|
||||
$ret .= '<input type="submit" value="Supprimer"/>';
|
||||
$ret .= '</form>';
|
||||
}
|
||||
$ret .= '<ul class="forum sujet">';
|
||||
foreach (stockage::liste_enfants($chemin) as $k) {
|
||||
|
@ -54,9 +54,9 @@ class ForumSujet {
|
|||
$ret .= '</ul>';
|
||||
if (vérifier_permission($chemin, "nouvelle_page", get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>'
|
||||
$ret .= '<input type="submit" value="Nouvelle page"/>'
|
||||
$ret .= '</form>'
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>';
|
||||
$ret .= '<input type="submit" value="Nouvelle page"/>';
|
||||
$ret .= '</form>';
|
||||
}
|
||||
return $ret;
|
||||
} else if ($vue == "miniature") {
|
||||
|
|
|
@ -41,15 +41,15 @@ class GalerieÉvènement {
|
|||
}
|
||||
if (vérifier_permission($chemin, "nouvelle_page", get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>'
|
||||
$ret .= '<input type="submit" value="Nouvelle page"/>'
|
||||
$ret .= '</form>'
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>';
|
||||
$ret .= '<input type="submit" value="Nouvelle page"/>';
|
||||
$ret .= '</form>';
|
||||
}
|
||||
if (vérifier_permission($chemin, "supprimer", get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="hidden" name="action" value="supprimer"/>'
|
||||
$ret .= '<input type="submit" value="Supprimer"/>'
|
||||
$ret .= '</form>'
|
||||
$ret .= '<input type="hidden" name="action" value="supprimer"/>';
|
||||
$ret .= '<input type="submit" value="Supprimer"/>';
|
||||
$ret .= '</form>';
|
||||
}
|
||||
$ret .= '<ul class="galerie evenement">';
|
||||
foreach (Stockage::liste_enfants($chemin) as $k) {
|
||||
|
|
|
@ -41,15 +41,15 @@ class GalerieIndex {
|
|||
}
|
||||
if (vérifier_permission($chemin, "nouvelle_page", get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>'
|
||||
$ret .= '<input type="submit" value="Nouvelle page"/>'
|
||||
$ret .= '</form>'
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>';
|
||||
$ret .= '<input type="submit" value="Nouvelle page"/>';
|
||||
$ret .= '</form>';
|
||||
}
|
||||
if (vérifier_permission($chemin, "supprimer", get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="hidden" name="action" value="supprimer"/>'
|
||||
$ret .= '<input type="submit" value="Supprimer"/>'
|
||||
$ret .= '</form>'
|
||||
$ret .= '<input type="hidden" name="action" value="supprimer"/>';
|
||||
$ret .= '<input type="submit" value="Supprimer"/>';
|
||||
$ret .= '</form>';
|
||||
}
|
||||
$ret .= '<ul class="galerie index">';
|
||||
foreach (Stockage::liste_enfants($chemin) as $k) {
|
||||
|
|
|
@ -41,15 +41,15 @@ class GaleriePériode {
|
|||
}
|
||||
if (vérifier_permission($chemin, "nouvelle_page", get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>'
|
||||
$ret .= '<input type="submit" value="Nouvelle page"/>'
|
||||
$ret .= '</form>'
|
||||
$ret .= '<input type="hidden" name="action" value="nouvelle_page"/>';
|
||||
$ret .= '<input type="submit" value="Nouvelle page"/>';
|
||||
$ret .= '</form>';
|
||||
}
|
||||
if (vérifier_permission($chemin, "supprimer", get_utilisateur())) {
|
||||
$ret .= '<form action="' . $chemin->get_url() . '">';
|
||||
$ret .= '<input type="hidden" name="action" value="supprimer"/>'
|
||||
$ret .= '<input type="submit" value="Supprimer"/>'
|
||||
$ret .= '</form>'
|
||||
$ret .= '<input type="hidden" name="action" value="supprimer"/>';
|
||||
$ret .= '<input type="submit" value="Supprimer"/>';
|
||||
$ret .= '</form>';
|
||||
}
|
||||
$ret .= '<ul class="galerie période">';
|
||||
foreach (Stockage::liste_enfants($chemin) as $k) {
|
||||
|
|
|
@ -36,12 +36,12 @@ class GaleriePhoto {
|
|||
if ($vue == "normal") {
|
||||
$ret = '';
|
||||
if (vérifier_permission($chemin, "set_prop", get_utilisateur())) {
|
||||
$ret .= '<input type="text" name="titre" value="' . Stockage::get_prop($chemin, "titre") . '" />'
|
||||
$ret .= '<input type="text" name="titre" value="' . Stockage::get_prop($chemin, "titre") . '" />';
|
||||
$ret .= '<img src="' . $chemin->get_url("?vue=image") . '"></img>';
|
||||
$ret .= '<input type="filename" .../>';
|
||||
$ret .= formulaire_édition_texte_enrichi(get_prop($chemin, "description"), "message");
|
||||
} else {
|
||||
$ret .= '<h1>' . Stockage::get_prop($chemin, "titre") . '</h1>'
|
||||
$ret .= '<h1>' . Stockage::get_prop($chemin, "titre") . '</h1>';
|
||||
$ret .= '<img src="' . $chemin->get_url("?vue=image") . '"></img>';
|
||||
$ret .= affichage_texte_enrichi(get_prop($chemin, "message"));
|
||||
}
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
<?php
|
||||
|
||||
class Authentification {
|
||||
private $singleton = new Chemin("/admin/utilisateurs/");
|
||||
private function singleton() {
|
||||
return new Chemin("/admin/utilisateurs/");
|
||||
}
|
||||
|
||||
public function connexion($nom_utilisateur, $mdp) {
|
||||
$mdp_réel = Stockage::get_prop(self::$singleton->enfant($nom_utilisateur), "mot_de_passe");
|
||||
$peut_se_connecter = Stockage::get_prop(self::$singleton->enfant($nom_utilisateur), "peut_se_connecter");
|
||||
$mdp_réel = Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "mot_de_passe");
|
||||
$peut_se_connecter = Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter");
|
||||
if ($mdp == $mdp_réel && $peut_se_connecter === "true") { // Triple égale. Pas d'entourloupe avec des casts miteux !
|
||||
// TODO : Vérifier si c'est sécurisé => stocké _uniquement_ sur le serveur.
|
||||
Session::put("utilisateur", $nom_utilisateur);
|
||||
|
@ -27,18 +29,18 @@ class Authentification {
|
|||
|
||||
public function nouvel_utilisateur($nom_utilisateur) {
|
||||
// TODO : SECURITE : Si la page existe déjà, laisser tomber !
|
||||
Stockage::nouvelle_page(self::$singleton, $nom_utilisateur);
|
||||
Stockage::nouvelle_page(self::singleton(), $nom_utilisateur);
|
||||
self::set_mot_de_passe_aléatoire($nom_utilisateur);
|
||||
self::set_groupe($nom_utilisateur, "Anonymes");
|
||||
self::set_peut_se_connecter($nom_utilisateur, false);
|
||||
}
|
||||
|
||||
public function supprimer_utilisateur($nom_utilisateur) {
|
||||
Stockage::supprimer(self::$singleton->enfant($nom_utilisateur));
|
||||
Stockage::supprimer(self::singleton()->enfant($nom_utilisateur));
|
||||
}
|
||||
|
||||
public function renomer_utilisateur($nom_utilisateur, $nouveau_nom) {
|
||||
Stockage::renomer(self::$singleton->enfant($nom_utilisateur), $nouveau_nom);
|
||||
Stockage::renomer(self::singleton()->enfant($nom_utilisateur), $nouveau_nom);
|
||||
}
|
||||
|
||||
public function liste_utilisateurs() {
|
||||
|
@ -52,15 +54,15 @@ class Authentification {
|
|||
|
||||
public function set_groupe($nom_utilisateur, $groupe) {
|
||||
// TODO : Vérifier si le groupe existe ?
|
||||
Stockage::set_pop(self::$singleton->enfant($nom_utilisateur), "groupe", $groupe);
|
||||
Stockage::set_pop(self::singleton()->enfant($nom_utilisateur), "groupe", $groupe);
|
||||
}
|
||||
|
||||
public function get_groupe($nom_utilisateur) {
|
||||
return Stockage::get_prop(self::$singleton->enfant($nom_utilisateur), "groupe");
|
||||
return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "groupe");
|
||||
}
|
||||
|
||||
public function set_mot_de_passe($nom_utilisateur, $mot_de_passe) {
|
||||
Stockage::set_pop(self::$singleton->enfant($nom_utilisateur), "mot_de_passe", $mot_de_passe);
|
||||
Stockage::set_pop(self::singleton()->enfant($nom_utilisateur), "mot_de_passe", $mot_de_passe);
|
||||
}
|
||||
|
||||
public function set_mot_de_passe_aléatoire($utilisateur) {
|
||||
|
@ -68,15 +70,15 @@ class Authentification {
|
|||
}
|
||||
|
||||
public function get_mot_de_passe($nom_utilisateur) {
|
||||
return Stockage::get_prop(self::$singleton->enfant($nom_utilisateur), "mot_de_passe");
|
||||
return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "mot_de_passe");
|
||||
}
|
||||
|
||||
public function set_peut_se_connecter($nom_utilisateur, $valeur) {
|
||||
Stockage::set_pop(self::$singleton->enfant($nom_utilisateur), "peut_se_connecter", $valeur ? "true" : "false");
|
||||
Stockage::set_pop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter", $valeur ? "true" : "false");
|
||||
}
|
||||
|
||||
public function get_peut_se_connecter($nom_utilisateur) {
|
||||
return (Stockage::get_pop(self::$singleton->enfant($nom_utilisateur), "peut_se_connecter") == "true") ? true : false;
|
||||
return (Stockage::get_pop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter") == "true") ? true : false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,9 @@
|
|||
// - autorisation : true ou false.
|
||||
|
||||
class Permissions {
|
||||
private $singleton = new Chemin("/admin/permissions/");
|
||||
private function singleton() {
|
||||
return new Chemin("/admin/utilisateurs/");
|
||||
}
|
||||
|
||||
// Vérifie si $utilisateur a la permission d'effectuer $action sur $chemin.
|
||||
public function vérifier_permission($chemin, $action, $utilisateur = null) {
|
||||
|
@ -48,14 +50,14 @@ class Permissions {
|
|||
$str_regles .= "\n"; // TODO vérifier que la séquence d'échappement est bien comprise.
|
||||
}
|
||||
|
||||
return Stockage::get_prop(self::$singleton, "regles", $str_regles);
|
||||
return Stockage::get_prop(self::singleton(), "regles", $str_regles);
|
||||
}
|
||||
|
||||
public function get_regles() {
|
||||
// Renvoie un tableau de quadruplets
|
||||
// (chemin, action, groupe, autorisation).
|
||||
// ou false si erreur.
|
||||
$str_regles = Stockage::get_prop(self::$singleton, "regles");
|
||||
$str_regles = Stockage::get_prop(self::singleton(), "regles");
|
||||
// TODO erreur si la propriété n'existe pas.
|
||||
$str_regles = preg_replace('/\r\n|\r/', "\n", $str_regles);
|
||||
$regles = array();
|
||||
|
@ -65,12 +67,12 @@ class Permissions {
|
|||
if (count($r) != 4) {
|
||||
return false;
|
||||
}
|
||||
array_push(array(
|
||||
$regles[] = array(
|
||||
"chemin" => self::unescape_element_regle(new Chemin($r[0])),
|
||||
"action" => self::unescape_element_regle($r[1]),
|
||||
"groupe" => self::unescape_element_regle($r[2]),
|
||||
"autorisation" => ($r[3] == "oui")
|
||||
));
|
||||
);
|
||||
}
|
||||
return $regles;
|
||||
}
|
||||
|
|
|
@ -1,14 +1,10 @@
|
|||
<?php
|
||||
|
||||
require_once("util.php");
|
||||
require_once("path.php");
|
||||
require_once("controleur/page.php");
|
||||
|
||||
class Squelette {
|
||||
public static function enrober($page, $contenu) {
|
||||
public static function enrober($page) {
|
||||
return ''
|
||||
. Squelette::en_tete($page)
|
||||
. $contenu
|
||||
. $page->contenu
|
||||
. Squelette::pied($page);
|
||||
}
|
||||
|
||||
|
@ -17,13 +13,13 @@ class Squelette {
|
|||
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
|
||||
<head>
|
||||
<title>' . $page->get_prop("titre") . '</title>
|
||||
<title>' . $page->titre . '</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="Content-Language" content="fr" />
|
||||
<link href="../style.css" rel="stylesheet" type="text/css" /><!-- TODO : chemin incorrect -->
|
||||
</head>
|
||||
<body>
|
||||
<h1>' . $page->get_prop("titre") . '</h1>';
|
||||
<h1>' . $page->titre . '</h1>';
|
||||
// <meta name="keywords" lang="fr" content="motcle1,mocle2" />
|
||||
// <meta name="description" content="Description de ma page web." />
|
||||
}
|
||||
|
|
|
@ -20,10 +20,10 @@ class Stockage {
|
|||
// Imitation de l'url rewriting lorsque ce n'est pas disponible sur
|
||||
// le serveur.
|
||||
public function activer_réécriture($chemin_vers) {
|
||||
$php_str = "<?php\n"
|
||||
$php_str .= "require_once(" . Path::combine($config_chemin_base, "cms.php") . ");\n"
|
||||
$php_str .= "CMS::cms(" . $chemin_vers->get() . ");\n"
|
||||
$php_str .= "?>\n"
|
||||
$php_str = "<?php\n=";
|
||||
$php_str .= "require_once(" . Path::combine($config_chemin_base, "cms.php") . ");\n";
|
||||
$php_str .= "CMS::cms(" . $chemin_vers->get() . ");\n";
|
||||
$php_str .= "?>\n";
|
||||
return SystemeFichiers::écrire($chemin_vers->get_fs_public(), $php_str);
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@ class Stockage {
|
|||
|
||||
public function set_prop($chemin, $prop, $valeur) {
|
||||
if (vérifier_permission($chemin, "set_prop")) {
|
||||
return SystemeFichiers::écrire(Path::combine($chemin->get_fs_stockage(), $prop), $valeur)
|
||||
return SystemeFichiers::écrire(Path::combine($chemin->get_fs_stockage(), $prop), $valeur);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
@ -94,13 +94,13 @@ class Stockage {
|
|||
public function liste_enfants($chemin) {
|
||||
// TODO : SECURITE : vérifier la permission. Mais pour quelle action ?
|
||||
// get_prop ? ou une nouvelle (?) : liste_enfants ?
|
||||
$enfants = Array();
|
||||
foreach (SystemeFichiers::liste_fichiers() as $k => $v) {
|
||||
if (strpos($v, "__prop__") !== 0 && is_dir($chemin->enfant($v)->get_fs_stockage()) && $v != "." && $v != "..") {
|
||||
$enfants[] = $chemin->enfant($v);
|
||||
}
|
||||
}
|
||||
return $enfants;
|
||||
$enfants = Array();
|
||||
foreach (SystemeFichiers::liste_fichiers() as $k => $v) {
|
||||
if (strpos($v, "__prop__") !== 0 && is_dir($chemin->enfant($v)->get_fs_stockage()) && $v != "." && $v != "..") {
|
||||
$enfants[] = $chemin->enfant($v);
|
||||
}
|
||||
}
|
||||
return $enfants;
|
||||
}
|
||||
|
||||
public function renomer($chemin, $nouveau_nom) {
|
||||
|
|
|
@ -25,7 +25,7 @@ class SystèmeFichiers {
|
|||
}
|
||||
|
||||
public function lire($chemin_fs) {
|
||||
file_get_contents($chermin_fs)
|
||||
file_get_contents($chermin_fs);
|
||||
}
|
||||
|
||||
public function écrire($chemin_fs, $données) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user