CVE-2020-10562: Unrestricted Upload of File with Dangerous Type (CWE-434)
value: An issue was discovered in DEVOME GRR before 3.4.1c. admin_edit_room.php mishandles file uploads.
CWE description: The product allows the upload or transfer of dangerous file types that are automatically processed within its environment.
CVSS v3 base score: 7.2
Published: 2020-03-13T21:15Z
Repository: https://github.com/JeromeDevome/GRR
Language: PHP
Files changed: CHANGELOG, admin/admin_edit_room.php, frmcontactlist.php, frmcontactrange.php, include/functions.inc.php, include/misc.inc.php
Commit date: 2020-03-13 13:25:12 +0100
Commit message: sous-version 3.4.1c : mise à jour de sécurité

Diff: diff --git a/CHANGELOG b/CHANGELOG
index 105dc8d..2d5bdba 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -28,10 +28,13 @@ Sous-version 3.4.1b
 	[amélioration] configuration LDAP acceptant le protocole LDAPS
 	[amélioration] gestion des champs additionnels dans edit_entry
 	[correction] divers bugs, erreurs de syntaxe ou orthographiques
 	[modification] limitation de la taille des données conformément à la base
 	[modification] calcul et aspect de la page de contact externe
+Sous-version 3.4.1c
+    [correction] failles de sécurité dans formulaire de contact et gestion des ressources
+    [correction] divers bugs, erreurs de syntaxe ou orthographiques
 -----
 --
 -----
 
 Version 3.4.0
diff --git a/admin/admin_edit_room.php b/admin/admin_edit_room.php
index dccf288..26da5fc 100644
--- a/admin/admin_edit_room.php
+++ b/admin/admin_edit_room.php
@@ -1,11 +1,11 @@
 <?php
 /**
  * admin_edit_room.php
  * Interface de creation/modification des sites, domaines et des ressources de l'application GRR
  * Ce script fait partie de l'application GRR
- * Dernière modification : $Date: 2020-01-28 11:10$
+ * Dernière modification : $Date: 2020-03-13 12:30$
  * @author    Laurent Delineau & JeromeB & Marc-Henri PAMISEU & Yan Naessens & Daniel Antelme
  * @copyright Copyright 2003-2020 Team DEVOME - JeromeB
  * @link      http://www.gnu.org/licenses/licenses.html
  *
  * This file is part of GRR.
@@ -169,36 +169,42 @@ if ((!empty($room)) || (isset($area_id)))
 {
 	// Enregistrement d'une ressource
 	if (isset($change_room))
 	{
 		if (isset($_POST['sup_img']))
-		{
-			$dest = '../images/';
-			$ok1 = false;
-			if ($f = @fopen("$dest/.test", "w"))
-			{
-				@fputs($f, '<'.'?php $ok1 = true; ?'.'>');
-				@fclose($f);
-				include("$dest/.test");
-			}
-			if (!$ok1)
-			{
-				$msg .= "L\'image n\'a pas pu etre supprimee : probleme d\'écriture sur le repertoire. Veuillez signaler ce problème à l\'administrateur du serveur.\\n";
-				$ok = 'no';
-			}
-			else
-			{
-				if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".jpg"))
-					unlink($dest."img_".TABLE_PREFIX."".$room.".jpg");
-				if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".png"))
-					unlink($dest."img_".TABLE_PREFIX."".$room.".png");
-				if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".gif"))
-					unlink($dest."img_".TABLE_PREFIX."".$room.".gif");
-				$picture_room = "";
-			}
-		}
-		if (empty($capacity))
+        {
+            $dest = '../images/';
+            $ok1 = false;
+            if ($f = @fopen("$dest/.test", "w"))
+            {
+                @fputs($f, '<'.'?php $ok1 = true; ?'.'>');
+                @fclose($f);
+                include("$dest/.test");
+            }
+            if (!$ok1)
+            {
+                $msg .= "L\'image n\'a pas pu etre supprimee : probleme d\'écriture sur le repertoire. Veuillez signaler ce problème à l\'administrateur du serveur.\\n";
+                $ok = 'no';
+            }
+            else
+            {
+                if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".jpg"))
+                    unlink($dest."img_".TABLE_PREFIX."".$room.".jpg");
+                if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".png"))
+                    unlink($dest."img_".TABLE_PREFIX."".$room.".png");
+                if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".gif"))
+                    unlink($dest."img_".TABLE_PREFIX."".$room.".gif");
+                // $picture_room = ""; mettre à jour la donnée room
+                $sql_picture = "UPDATE ".TABLE_PREFIX."_room SET picture_room='' WHERE id=".protect_data_sql($room);
+                if (grr_sql_command($sql_picture) < 0)
+                {
+                    fatal_error(0, get_vocab('update_room_failed') . grr_sql_error());
+                    $ok = 'no';
+                }
+            }
+        }
+        if (empty($capacity))
 			$capacity = 0;
 		if ($capacity < 0)
 			$capacity = 0;
 		settype($delais_max_resa_room,"integer");
 		if ($delais_max_resa_room < 0)
@@ -278,69 +284,106 @@ if ((!empty($room)) || (isset($area_id)))
 		if ($room_name == '')
 		{
 			$room_name = get_vocab("room")." ".$room;
 			grr_sql_command("UPDATE ".TABLE_PREFIX."_room SET room_name='".protect_data_sql($room_name)."' WHERE id=$room");
 		}
-		$doc_file = isset($_FILES["doc_file"]) ? $_FILES["doc_file"] : NULL;
-		if (preg_match("`\.([^.]+)$`", $doc_file['name'], $match))
-		{
-			$ext = strtolower($match[1]);
-			if ($ext != 'jpg' && $ext != 'png'&& $ext != 'gif')
-			{
-				$msg .= "L\'image n\'a pas pu etre enregistree : les seules extentions autorisees sont gif, png et jpg.\\n";
-				$ok = 'no';
-			}
-			else
-			{
-				$dest = '../images/';
-				$ok1 = false;
-				if ($f = @fopen("$dest/.test", "w"))
-				{
-					@fputs($f, '<'.'?php $ok1 = true; ?'.'>');
-					@fclose($f);
-					include("$dest/.test");
-				}
-				if (!$ok1)
-				{
-					$msg .= "L\'image n\'a pas pu etre enregistree : probleme d\'ecriture sur le repertoire IMAGES. Veuillez signaler ce probleme e l\'administrateur du serveur.\\n";
-					$ok = 'no';
-				}
-				else
-				{
-					$ok1 = @copy($doc_file['tmp_name'], $dest.$doc_file['name']);
-					if (!$ok1)
-						$ok1 = @move_uploaded_file($doc_file['tmp_name'], $dest.$doc_file['name']);
-					if (!$ok1)
-					{
-						$msg .= "L\'image n\'a pas pu etre enregistree : probleme de transfert. Le fichier n\'a pas pu etre transfere sur le repertoire IMAGES. Veuillez signaler ce probleme e l\'administrateur du serveur.\\n";
-						$ok = 'no';
-					}
-					else
-					{
-						$tab = explode(".", $doc_file['name']);
-						$ext = strtolower($tab[1]);
-						if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".".$ext))
-							@unlink($dest."img_".TABLE_PREFIX."".$room.".".$ext);
-						rename($dest.$doc_file['name'],$dest."img_".TABLE_PREFIX."".$room.".".$ext);
-						@chmod($dest."img_".TABLE_PREFIX."".$room.".".$ext, 0666);
-						$picture_room = "img_".TABLE_PREFIX."".$room.".".$ext;
-						$sql_picture = "UPDATE ".TABLE_PREFIX."_room SET picture_room='".protect_data_sql($picture_room)."' WHERE id=".$room;
-						if (grr_sql_command($sql_picture) < 0)
-						{
-							fatal_error(0, get_vocab('update_room_failed') . grr_sql_error());
-							$ok = 'no';
-						}
-					}
-				}
-			}
-		}
-		else if ($doc_file['name'] != '')
-		{
-			$msg .= "L\'image n\'a pas pu etre enregistree : le fichier image selectionne n'est pas valide !\\n";
-			$ok = 'no';
-		}
-		$msg .= get_vocab("message_records");
+        // image d'illustration
+        $doc_file = isset($_FILES["doc_file"]) ? $_FILES["doc_file"] : NULL;
+        /* Test premier, juste pour bloquer les double extensions */
+        if (count(explode('.', $doc_file['name'])) > 2) {
+            $msg .= "L\'image n\'a pas pu être enregistrée : les seules extentions autorisées sont gif, png et jpg.\\n";
+            $ok = 'no';
+        } 
+        elseif  (preg_match("`\.([^.]+)$`", $doc_file['name'], $match)) {
+            $ext = strtolower($match[1]);
+            if ($ext != 'jpg' && $ext != 'png'&& $ext != 'gif')
+            {
+                $msg .= "L\'image n\'a pas pu etre enregistree : les seules extentions autorisees sont gif, png et jpg.\\n";
+                $ok = 'no';
+            }
+            else {
+                /* deuxième test passé, l'extension est autorisée */
+                /* 3ème test avec fileinfo */
+                $finfo = finfo_open(FILEINFO_MIME_TYPE);
+                $fileType = finfo_file($finfo, $doc_file['tmp_name']);
+                /* 4ème test avec gd pour valider que c'est bien une image malgré tout - nécessaire ou parano ? */
+                switch($fileType) {
+                    case "image/gif":
+                        /* recreate l'image, supprime les data exif */
+                        $logoRecreated = @imagecreatefromgif ( $doc_file['tmp_name'] );
+                        /* fix pour la transparence */
+                        imageAlphaBlending($logoRecreated, true);
+                        imageSaveAlpha($logoRecreated, true);
+                        $extSafe = "gif";
+                        break;
+                    case "image/jpeg":
+                        $logoRecreated = @imagecreatefromjpeg ( $doc_file['tmp_name'] );
+                        $extSafe = "jpg";
+                        break;
+                    case "image/png":
+                        $logoRecreated = @imagecreatefrompng ( $doc_file['tmp_name'] );
+                        /* fix pour la transparence */
+                        imageAlphaBlending($logoRecreated, true);
+                        imageSaveAlpha($logoRecreated, true);
+                        $extSafe = "png";
+                        break;
+                    default:
+                        $msg .= "L\'image n\'a pas pu être enregistrée : type mime incompatible.\\n";
+                        $ok = 'no';
+                        $extSafe = false;
+                        break;
+                }
+            }
+            if (!$logoRecreated || $extSafe === false) {
+                /* la fonction imagecreate a échoué, donc l'image est corrompue ou craftée */
+                $msg .= "L\'image n\'a pas pu être enregistrée : fichier corrompu.\\n";
+                $ok = 'no';
+            }
+            else
+            {   /* je teste si la destination est writable */
+                $dest = '../images/';
+                $ok1 = is_writable($dest);
+                if (!$ok1)
+                {
+                    $msg .= "L\'image n\'a pas pu etre enregistree : probleme d\'ecriture sur le repertoire IMAGES. Veuillez signaler ce probleme e l\'administrateur du serveur.\\n";
+                    $ok = 'no';
+                }
+                else
+                {
+                    $ok1 = @copy($doc_file['tmp_name'], $dest.$doc_file['name']);
+                    if (!$ok1)
+                        $ok1 = @move_uploaded_file($doc_file['tmp_name'], $dest.$doc_file['name']);
+                    if (!$ok1)
+                    {
+                        $msg .= "L\'image n\'a pas pu etre enregistree : probleme de transfert. Le fichier n\'a pas pu etre transfere sur le repertoire IMAGES. Veuillez signaler ce probleme à l\'administrateur du serveur.\\n";
+                        $ok = 'no';
+                    }
+                    else
+                    {
+                        $tab = explode(".", $doc_file['name']);
+                        $ext = strtolower($tab[1]);
+                        if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".".$extSafe))
+                            @unlink($dest."img_".TABLE_PREFIX."".$room.".".$extSafe);
+                        rename($dest.$doc_file['name'],$dest."img_".TABLE_PREFIX."".$room.".".$extSafe);
+                        @chmod($dest."img_".TABLE_PREFIX."".$room.".".$extSafe, 0666);
+                        $picture_room = "img_".TABLE_PREFIX."".$room.".".$extSafe;
+                        $sql_picture = "UPDATE ".TABLE_PREFIX."_room SET picture_room='".protect_data_sql($picture_room)."' WHERE id=".protect_data_sql($room);
+                        if (grr_sql_command($sql_picture) < 0)
+                        {
+                            fatal_error(0, get_vocab('update_room_failed') . grr_sql_error());
+                            $ok = 'no';
+                        }
+                    }
+                }
+            }
+        }
+        else if ($doc_file['name'] != '')
+        {
+            $msg .= "L\'image n\'a pas pu etre enregistree : le fichier image selectionne n'est pas valide !\\n";
+            $ok = 'no';
+        }
+        $msg .= get_vocab("message_records");
 	}
 	// Si pas de probleme, retour à la page d'accueil apres enregistrement
 	if ((isset($change_done)) && (!isset($ok)))
 	{
 		if ($msg != '')
@@ -1050,11 +1093,11 @@ if ((!empty($id_area)) || (isset($add_area)))
 			echo ">".utf8_strftime("%A", $tmp)."</option>\n";
 			$k++;
 		}
 		echo "</select></td>\n";
 		echo "</tr>";
-		// Definition des jours de la semaine e afficher sur les plannings et calendriers
+		// Definition des jours de la semaine à afficher sur les plannings et calendriers
 		echo "<tr>\n";
 		echo "<td>".get_vocab("cocher_jours_a_afficher")."</td>\n";
 		echo "<td>\n";
 		for ($i = 0; $i < 7; $i++)
 		{
diff --git a/frmcontactlist.php b/frmcontactlist.php
index 232d027..0e22ad3 100644
--- a/frmcontactlist.php
+++ b/frmcontactlist.php
@@ -1,13 +1,13 @@
 <?php
 /**
  * frmcontactlist.php
  * calcule la liste des ressources visibles dans un domaine
  * Ce script fait partie de l'application GRR
- * Dernière modification : $Date: 2018-07-31 16:00$
+ * Dernière modification : $Date: 2020-03-13 11:00$
  * @author    JeromeB & Yan Naessens
- * @copyright Copyright 2003-2018 Team DEVOME - JeromeB
+ * @copyright Copyright 2003-2020 Team DEVOME - JeromeB
  * @link      http://www.gnu.org/licenses/licenses.html
  *
  * This file is part of GRR.
  *
  * GRR is free software; you can redistribute it and/or modify
@@ -20,12 +20,13 @@ include "include/connect.inc.php";
 include "include/mysql.inc.php";
 include "include/misc.inc.php";
 include "include/functions.inc.php";
 
 $id = $_GET['id'];
-// echo "<optgroup label=\"Salles\">"; je supprime optgroup car les ressources ne sont pas toujours des salles ! YN
-$res = grr_sql_query("SELECT room_name,id FROM ".TABLE_PREFIX."_room WHERE area_id = '".$id."' ORDER BY room_name");
+if ($id != protect_data_sql($id))
+    die('Donnée incorrecte');
+$res = grr_sql_query("SELECT room_name,id FROM ".TABLE_PREFIX."_room WHERE area_id = '".protect_data_sql($id)."' ORDER BY room_name");
 $nbresult = mysqli_num_rows($res);
 $user_name = getUserName();
 if ($nbresult != 0)
 {
     $a = "";
diff --git a/frmcontactrange.php b/frmcontactrange.php
index c34a8c5..4d9d911 100644
--- a/frmcontactrange.php
+++ b/frmcontactrange.php
@@ -1,11 +1,11 @@
 <?php
 /*
  * frmcontactrange.php
  * calcule le code html de la partie intervalle du formulaire de contact
  * Ce script fait partie de l'application GRR
- * Dernière modification : $Date: 2020-01-17 14:30$
+ * Dernière modification : $Date: 2020-03-13 11:00$
  * @author    JeromeB & Yan Naessens
  * @copyright Copyright 2003-2020 Team DEVOME - JeromeB
  * @link      http://www.gnu.org/licenses/licenses.html
  *
  * This file is part of GRR.
@@ -20,12 +20,14 @@ include "include/connect.inc.php";
 include "include/mysql.inc.php";
 include "include/misc.inc.php";
 include "include/functions.inc.php";
 
 $id = $_GET['id'];
+if ($id != protect_data_sql($id))
+    die('Donnée incorrecte');
 $query = "SELECT access,morningstarts_area,eveningends_area,eveningends_minutes_area,enable_periods,resolution_area FROM ".TABLE_PREFIX."_area
-    WHERE id = '".$id."' ";
+    WHERE id = '".protect_data_sql($id)."' ";
 // echo $query."<br />";
 $res = grr_sql_query($query);
 $val= grr_sql_row($res,0);
 // print_r($val);
 $enable_periods = $val[4]=='y';
diff --git a/include/functions.inc.php b/include/functions.inc.php
index 1118a91..b7cf822 100644
--- a/include/functions.inc.php
+++ b/include/functions.inc.php
@@ -2938,11 +2938,11 @@ function send_mail($id_entry, $action, $dformat, $tab_id_moderes = array(), $old
 		{
 			foreach ($mail_admin as $value){
 				$destinataire .= ";". $value;
 			}
 
-			Email::Envois($destinataire, $sujet, $message, $repondre, '', '');
+		//	Email::Envois($destinataire, $sujet, $message, $repondre, '', '');  semble incomplet YN le 21/02/2020
 		}
 
 		$sujet7 = $vocab["subject_mail1"].$room_name." - ".$date_avis;
 		$sujet7 .= $vocab["subject_mail_retard"];
 		$message7 = removeMailUnicode(Settings::get("company"))." - ".$vocab["title_mail"];
diff --git a/include/misc.inc.php b/include/misc.inc.php
index 9d1b4a7..07516a5 100644
--- a/include/misc.inc.php
+++ b/include/misc.inc.php
@@ -1,10 +1,10 @@
 <?php
 /**
  * misc.inc.php
  * fichier de variables diverses
- * Dernière modification : $Date: 2020-01-28 17:15$
+ * Dernière modification : $Date: 2020-03-13 13:15$
  * @author    JeromeB & Laurent Delineau & Yan Naessens
  * @copyright Copyright 2003-2020 Team DEVOME - JeromeB
  * @link      http://www.gnu.org/licenses/licenses.html
  *
  * This file is part of GRR.
@@ -23,11 +23,11 @@ $grr_devel_email = "support@devome.com";
 $grr_devel_url = "http://grr.devome.com/";
 // Numéro de version actuel
 $version_grr = "3.4.1";
 // Numéro de sous-version actuel (a, b, ...)
 // Utilisez cette variable pour des versions qui corrigent la la version finale sans toucher à la base.
-$sous_version_grr = "b"; // a, b, c, ...
+$sous_version_grr = "c"; // a, b, c, ...
 // Numéro de la release candidate (doit être strictement inférieure à 9). Laisser vide s'il s'agit de la version stable.
 $version_grr_RC = "";
 // Version repository (GitHub)
 $versionReposite = "";
 

Vulnerable code:  * Dernière modification : $Date: 2020-01-28 11:10$
		{
			$dest = '../images/';
			$ok1 = false;
			if ($f = @fopen("$dest/.test", "w"))
			{
				@fputs($f, '<'.'?php $ok1 = true; ?'.'>');
				@fclose($f);
				include("$dest/.test");
			}
			if (!$ok1)
			{
				$msg .= "L\'image n\'a pas pu etre supprimee : probleme d\'écriture sur le repertoire. Veuillez signaler ce problème à l\'administrateur du serveur.\\n";
				$ok = 'no';
			}
			else
			{
				if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".jpg"))
					unlink($dest."img_".TABLE_PREFIX."".$room.".jpg");
				if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".png"))
					unlink($dest."img_".TABLE_PREFIX."".$room.".png");
				if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".gif"))
					unlink($dest."img_".TABLE_PREFIX."".$room.".gif");
				$picture_room = "";
			}
		}
		if (empty($capacity))
		$doc_file = isset($_FILES["doc_file"]) ? $_FILES["doc_file"] : NULL;
		if (preg_match("`\.([^.]+)$`", $doc_file['name'], $match))
		{
			$ext = strtolower($match[1]);
			if ($ext != 'jpg' && $ext != 'png'&& $ext != 'gif')
			{
				$msg .= "L\'image n\'a pas pu etre enregistree : les seules extentions autorisees sont gif, png et jpg.\\n";
				$ok = 'no';
			}
			else
			{
				$dest = '../images/';
				$ok1 = false;
				if ($f = @fopen("$dest/.test", "w"))
				{
					@fputs($f, '<'.'?php $ok1 = true; ?'.'>');
					@fclose($f);
					include("$dest/.test");
				}
				if (!$ok1)
				{
					$msg .= "L\'image n\'a pas pu etre enregistree : probleme d\'ecriture sur le repertoire IMAGES. Veuillez signaler ce probleme e l\'administrateur du serveur.\\n";
					$ok = 'no';
				}
				else
				{
					$ok1 = @copy($doc_file['tmp_name'], $dest.$doc_file['name']);
					if (!$ok1)
						$ok1 = @move_uploaded_file($doc_file['tmp_name'], $dest.$doc_file['name']);
					if (!$ok1)
					{
						$msg .= "L\'image n\'a pas pu etre enregistree : probleme de transfert. Le fichier n\'a pas pu etre transfere sur le repertoire IMAGES. Veuillez signaler ce probleme e l\'administrateur du serveur.\\n";
						$ok = 'no';
					}
					else
					{
						$tab = explode(".", $doc_file['name']);
						$ext = strtolower($tab[1]);
						if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".".$ext))
							@unlink($dest."img_".TABLE_PREFIX."".$room.".".$ext);
						rename($dest.$doc_file['name'],$dest."img_".TABLE_PREFIX."".$room.".".$ext);
						@chmod($dest."img_".TABLE_PREFIX."".$room.".".$ext, 0666);
						$picture_room = "img_".TABLE_PREFIX."".$room.".".$ext;
						$sql_picture = "UPDATE ".TABLE_PREFIX."_room SET picture_room='".protect_data_sql($picture_room)."' WHERE id=".$room;
						if (grr_sql_command($sql_picture) < 0)
						{
							fatal_error(0, get_vocab('update_room_failed') . grr_sql_error());
							$ok = 'no';
						}
					}
				}
			}
		}
		else if ($doc_file['name'] != '')
		{
			$msg .= "L\'image n\'a pas pu etre enregistree : le fichier image selectionne n'est pas valide !\\n";
			$ok = 'no';
		}
		$msg .= get_vocab("message_records");
		// Definition des jours de la semaine e afficher sur les plannings et calendriers
 * Dernière modification : $Date: 2018-07-31 16:00$
 * @copyright Copyright 2003-2018 Team DEVOME - JeromeB
// echo "<optgroup label=\"Salles\">"; je supprime optgroup car les ressources ne sont pas toujours des salles ! YN
$res = grr_sql_query("SELECT room_name,id FROM ".TABLE_PREFIX."_room WHERE area_id = '".$id."' ORDER BY room_name");
 * Dernière modification : $Date: 2020-01-17 14:30$
    WHERE id = '".$id."' ";
			Email::Envois($destinataire, $sujet, $message, $repondre, '', '');
 * Dernière modification : $Date: 2020-01-28 17:15$
$sous_version_grr = "b"; // a, b, c, ...
Fixed code: Sous-version 3.4.1c
    [correction] failles de sécurité dans formulaire de contact et gestion des ressources
    [correction] divers bugs, erreurs de syntaxe ou orthographiques
 * Dernière modification : $Date: 2020-03-13 12:30$
        {
            $dest = '../images/';
            $ok1 = false;
            if ($f = @fopen("$dest/.test", "w"))
            {
                @fputs($f, '<'.'?php $ok1 = true; ?'.'>');
                @fclose($f);
                include("$dest/.test");
            }
            if (!$ok1)
            {
                $msg .= "L\'image n\'a pas pu etre supprimee : probleme d\'écriture sur le repertoire. Veuillez signaler ce problème à l\'administrateur du serveur.\\n";
                $ok = 'no';
            }
            else
            {
                if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".jpg"))
                    unlink($dest."img_".TABLE_PREFIX."".$room.".jpg");
                if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".png"))
                    unlink($dest."img_".TABLE_PREFIX."".$room.".png");
                if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".gif"))
                    unlink($dest."img_".TABLE_PREFIX."".$room.".gif");
                // $picture_room = ""; mettre à jour la donnée room
                $sql_picture = "UPDATE ".TABLE_PREFIX."_room SET picture_room='' WHERE id=".protect_data_sql($room);
                if (grr_sql_command($sql_picture) < 0)
                {
                    fatal_error(0, get_vocab('update_room_failed') . grr_sql_error());
                    $ok = 'no';
                }
            }
        }
        if (empty($capacity))
        // image d'illustration
        $doc_file = isset($_FILES["doc_file"]) ? $_FILES["doc_file"] : NULL;
        /* Test premier, juste pour bloquer les double extensions */
        if (count(explode('.', $doc_file['name'])) > 2) {
            $msg .= "L\'image n\'a pas pu être enregistrée : les seules extentions autorisées sont gif, png et jpg.\\n";
            $ok = 'no';
        } 
        elseif  (preg_match("`\.([^.]+)$`", $doc_file['name'], $match)) {
            $ext = strtolower($match[1]);
            if ($ext != 'jpg' && $ext != 'png'&& $ext != 'gif')
            {
                $msg .= "L\'image n\'a pas pu etre enregistree : les seules extentions autorisees sont gif, png et jpg.\\n";
                $ok = 'no';
            }
            else {
                /* deuxième test passé, l'extension est autorisée */
                /* 3ème test avec fileinfo */
                $finfo = finfo_open(FILEINFO_MIME_TYPE);
                $fileType = finfo_file($finfo, $doc_file['tmp_name']);
                /* 4ème test avec gd pour valider que c'est bien une image malgré tout - nécessaire ou parano ? */
                switch($fileType) {
                    case "image/gif":
                        /* recreate l'image, supprime les data exif */
                        $logoRecreated = @imagecreatefromgif ( $doc_file['tmp_name'] );
                        /* fix pour la transparence */
                        imageAlphaBlending($logoRecreated, true);
                        imageSaveAlpha($logoRecreated, true);
                        $extSafe = "gif";
                        break;
                    case "image/jpeg":
                        $logoRecreated = @imagecreatefromjpeg ( $doc_file['tmp_name'] );
                        $extSafe = "jpg";
                        break;
                    case "image/png":
                        $logoRecreated = @imagecreatefrompng ( $doc_file['tmp_name'] );
                        /* fix pour la transparence */
                        imageAlphaBlending($logoRecreated, true);
                        imageSaveAlpha($logoRecreated, true);
                        $extSafe = "png";
                        break;
                    default:
                        $msg .= "L\'image n\'a pas pu être enregistrée : type mime incompatible.\\n";
                        $ok = 'no';
                        $extSafe = false;
                        break;
                }
            }
            if (!$logoRecreated || $extSafe === false) {
                /* la fonction imagecreate a échoué, donc l'image est corrompue ou craftée */
                $msg .= "L\'image n\'a pas pu être enregistrée : fichier corrompu.\\n";
                $ok = 'no';
            }
            else
            {   /* je teste si la destination est writable */
                $dest = '../images/';
                $ok1 = is_writable($dest);
                if (!$ok1)
                {
                    $msg .= "L\'image n\'a pas pu etre enregistree : probleme d\'ecriture sur le repertoire IMAGES. Veuillez signaler ce probleme e l\'administrateur du serveur.\\n";
                    $ok = 'no';
                }
                else
                {
                    $ok1 = @copy($doc_file['tmp_name'], $dest.$doc_file['name']);
                    if (!$ok1)
                        $ok1 = @move_uploaded_file($doc_file['tmp_name'], $dest.$doc_file['name']);
                    if (!$ok1)
                    {
                        $msg .= "L\'image n\'a pas pu etre enregistree : probleme de transfert. Le fichier n\'a pas pu etre transfere sur le repertoire IMAGES. Veuillez signaler ce probleme à l\'administrateur du serveur.\\n";
                        $ok = 'no';
                    }
                    else
                    {
                        $tab = explode(".", $doc_file['name']);
                        $ext = strtolower($tab[1]);
                        if (@file_exists($dest."img_".TABLE_PREFIX."".$room.".".$extSafe))
                            @unlink($dest."img_".TABLE_PREFIX."".$room.".".$extSafe);
                        rename($dest.$doc_file['name'],$dest."img_".TABLE_PREFIX."".$room.".".$extSafe);
                        @chmod($dest."img_".TABLE_PREFIX."".$room.".".$extSafe, 0666);
                        $picture_room = "img_".TABLE_PREFIX."".$room.".".$extSafe;
                        $sql_picture = "UPDATE ".TABLE_PREFIX."_room SET picture_room='".protect_data_sql($picture_room)."' WHERE id=".protect_data_sql($room);
                        if (grr_sql_command($sql_picture) < 0)
                        {
                            fatal_error(0, get_vocab('update_room_failed') . grr_sql_error());
                            $ok = 'no';
                        }
                    }
                }
            }
        }
        else if ($doc_file['name'] != '')
        {
            $msg .= "L\'image n\'a pas pu etre enregistree : le fichier image selectionne n'est pas valide !\\n";
            $ok = 'no';
        }
        $msg .= get_vocab("message_records");
		// Definition des jours de la semaine à afficher sur les plannings et calendriers
 * Dernière modification : $Date: 2020-03-13 11:00$
 * @copyright Copyright 2003-2020 Team DEVOME - JeromeB
if ($id != protect_data_sql($id))
    die('Donnée incorrecte');
$res = grr_sql_query("SELECT room_name,id FROM ".TABLE_PREFIX."_room WHERE area_id = '".protect_data_sql($id)."' ORDER BY room_name");
 * Dernière modification : $Date: 2020-03-13 11:00$
if ($id != protect_data_sql($id))
    die('Donnée incorrecte');
    WHERE id = '".protect_data_sql($id)."' ";
		//	Email::Envois($destinataire, $sujet, $message, $repondre, '', '');  semble incomplet YN le 21/02/2020
 * Dernière modification : $Date: 2020-03-13 13:15$
$sous_version_grr = "c"; // a, b, c, ...