pluginsGLPI / formcreator

GLPI Plugin Formcreator (DOWNLOAD : https://github.com/pluginsGLPI/formcreator/releases)
http://www.teclib-edition.com
GNU General Public License v3.0
174 stars 125 forks source link

Message d'erreur "Une Erreur interne est survenue" lors de la validation d'un formulaire #3412

Open benjy2006 opened 1 year ago

benjy2006 commented 1 year ago

Describe the bug Lorsqu'un utilisateur rempli un formulaire en oubliant de renseigner un champ obligatoire, un message générique s'affiche "Une erreur interne est survenue. Veuillez en informer l'administrateur.".

Le formulaire n'est donc pas enregistré et les cibles ne sont pas jouées.

Pour obtenir la raison de la non validation du formulaire, il faut rafraichir la page. Problème : l'utilisateur perd tout ce qu'il a renseigné précédemment.

To Reproduce Steps to reproduce the behavior:

  1. Se rendre dans le menu Assistance -> Formulaire
  2. Ouvrir un nouveau formulaire
  3. Remplir le formulaire en oubliant de renseigner un champ obligatoire
  4. Cliquer sur "Envoyer"

Expected behavior Une fenêtre "popup" doit indiquer la / les raisons du problème lorsque nous cliquons sur le bouton "Envoyer"

Screenshots

image

GLPI / Plugins (please complete the following information):

Desktop (please complete the following information):

Additional context Add any other context about the problem here.

btry commented 1 year ago

Bonjour

Quand cette erreur survient, il y a en principe quelque chose qui s'est mal passé. L'interface où l'erreur peut survenir est dédiée à des utilisateurs peu avertis voire peu à l'aise avec l'informatique. C'est pour cela que le message ne donne pas de détails. En revanche l'équipe qui gère l'instance de GLPI peut chercher des informations dans les fichiers php-errors.log et sql-errors.log.

Si vous trouvez quelque chose qui correspond, merci de le partager ici pour que j'analyse la situation.

btry commented 1 year ago

Pour obtenir la raison de la non validation du formulaire, il faut rafraichir la page. Problème : l'utilisateur perd tout ce qu'il a renseigné précédemment.

Cela implique que vous avez un toast avec une erreur ? Cela peut arriver si le plugin réussit à analyser les réponses à la recherche d'une mauvaise saisie. Si une saisie incorrecte est trouvée, un toast donnera des informations. Il est peu probable que cette erreur de saisie ait un lien avec la cause de l'erreur interne. Prenez une capture de ce toast et partagez-le, au cas où.

benjy2006 commented 1 year ago

Bonjour, merci pour votre retour rapide.

Voici un exemple du message d'erreur qui s'affiche après rafraichissement de la page. Ici j'ai simplement renseigné la question "Objet de la demande" puis validé.

Après apparition du message "une erreur interne est survenue", j'ai rafraichi la page, et j'obtiens bien la raison du problème. Cependant, le formulaire se réactualisant, je perd la réponse que j'avais renseignée.

image

J'essaye de trouver du temps cet après midi pour analyser les fichiers php-errors.log et sql-errors.log.

btry commented 1 year ago

Essayez aussi de reproduire avec les outils pour développeur du navigateur.

Vous trouverez une requête HTTP vers ajax/formanswer.php . Sauvegardez la requête HTTP en format cURL et exécutez la depuis un terminal. La réponse HTTP doit porter le code 200 (si succès) et la réponse doit être au format JSON. Vérifiez si quelque chose pollue la réponse. Il se peut que le mode debug de GLPI activé fasse apparaitre une erreur dans la réponse, auquel cas vous aurez aussi une trace de l'erreur dans les logs.

benjy2006 commented 1 year ago

Bonjour,

J'ai bien erreur lorsque je suis en mode debug mais je n'arrive pas à sauvegarder la requête HTTP :

image

J'ai également fait un tail -f sur les fichiers sql et php-errors.log, je n'ai pas de trace lorsque je sauvegarde le formulaire.

btry commented 1 year ago

Pour sauvegarder une requête HTTP, il faut ouvrir les outils de développeur du navigateur avec Ctrl+Maj+I. Vous pourrez ensuite explorer les requêtes HTTP de l'onglet, et générer une ligne de commande cURL (ou pour d'autres outils) équivalente à la requête originale. Cela permet de la rejouer et d'examiner les données échangées

image

benjy2006 commented 1 year ago

Merci pour les indications.

En reproduisant le problème, voici les erreurs générées :

image

btry commented 1 year ago

L'erreur indique que la réponse de la requête HTTP à examiner pourrait être incorrecte. Il faut que vous suiviez la manipulation décrite ici pour voir la réponse (dont je rappelle la procédure ci dessous).

Vous devez ouvrir les outils développeur du navigateur, puis reproduire le souci, trouver dans l'onglet "réseau" la requête http vers formanswer.php, cliquer droit dessus, et choisir Copy > Copy as cURL, puis faire Ctrl+V dans un terminal pour exécuter la commande cURL que le navigateur a placé dans votre presse papier.

Eventuellement, vous pourrez voir la réponse HTTP de la requête en cliquant dessus et en ouvrant l'onglet "Réponse" dans le panneau qui apparait à droite (voir capture ci-dessous)

image

Dans cet exemple, au moment de soumettre le formulaire, ma session a expiré et une chaine de caractères en format JSON contient l'erreur qui sera ensuite affichée. Dans votre cas, la chaine en format JSON doit contenir des informations pour charger une nouvelle page web. Je pense que la chaine est endommagée par quelque chose. J'ai besoin de la lire pour avoir un indice sur la source de votre problème.

benjy2006 commented 1 year ago

Lorsque j'execute la commande curl dans une invite de commande Windows, voici ce que j'ai :

image

Je ne pense pas utiliser le bon terminal... Est-ce qu'il faut que j'exécute cette commande directement sur le serveur ?

Lorsque je vais dans l'onglet "Réponse", je n'ai malheureusement rien qui s'affiche :

image

btry commented 1 year ago

La ligne de commande doit commencer par le mot "curl" . Il s'agit d'une commande disponible sur les systèmes linux (parfois au prix de l'installation du package adéquat).

Si vous utilisez windows vous pouvez utiliser à la place "Copy as Powershell".

btry commented 1 year ago

Je remarque que dans la capture d'écran, la requête est marquée en rouge. Vous avez peut être une erreur HTTP 40x ou 50x. Vérifiez le code de réponse : si ce n'est pas 200, ce n'est pas normal.

benjy2006 commented 1 year ago

En effet c'est une erreur 400 : image

Voici le résultat lorsque j'exécute la commande en PowerShell :

image

Notre serveur GLPI est installée sur une VM Debian. Est-ce que je peux executer la commande curl en me connectant en SSH sans risque ?

btry commented 1 year ago

Vous pouvez l'exécuter depuis le serveur; il n'y a pas de risque particulier.

benjy2006 commented 1 year ago

Je vous confirme que la ligne de commande que je copie commence bien par curl. Peux-être qu'il faut que je ne garde que la première ligne ?

image

benjy2006 commented 1 year ago

En effet ça fonctionne mieux lorsque je ne prend que la première ligne. Malheureusemen je n'arrive pas à tester car il rencontre un problème de certificat :

image

Pourtant le certificat est bien valide sur le navigateur :

image

btry commented 1 year ago

Je m'y attendais, vu que vous utilisez SSL et encore plus avec un nom d'hôte sans domaine.

Je ne suis pas sûr que ça fonctionnera : recommencez en ajoutant l'argument --insecure (de préférence juste après "curl")

benjy2006 commented 1 year ago

image

btry commented 1 year ago

donc réponse vide. Et côté du navigateur vous avez un code HTTP 400. Dans le code, l'erreur 400 correspond à un refus d'enregistrer la demande de l'utilsiateur. Je suppose que c'est à cause du champ obligatoire non renseigné.

Est ce que le demandeur est authentifié, ou est ce que le formulaire est public et utilisé sans authentification ?

benjy2006 commented 1 year ago

OK, je ne savais pas si la réponse vide pouvait quand même être interprétée.

Pour répondre à votre question, l'utilisateur est authentifié, en l'occurrence ici, j'utilise mon compte. Les formulaires ne sont pas publics. Les utilisateurs doivent s'authentifier pour y accéder. (Je précise que nous en avons plusieurs et le problème est général, nous avons le même comportement quelque soit le formulaire rempli)

btry commented 1 year ago

Si les champs obligatoires sont tous remplis, le problème persiste ?

benjy2006 commented 1 year ago

Bonjour,

S'il n'y a pas d'oubli, si tous les champs obligatoires sont renseignés, les cibles sont bien jouées et un ticket est généré. Le popup / toast de confirmation s'affiche correctement en bas à droite de la page :

image

btry commented 1 year ago

Bonjour

Il semble maintenant clair qu'il y a bien un lien de cause à effet entre le champ obligatoire non renseigné et le bug.

Il est possible qu'un fix récent (mais pas encore releasé) résolve le souci. Voici un build de la toute dernière révision du plugin. glpi-formcreator-2.13.7-bf.zip

Déplacez votre copie de Formcreator hors de GLPI, pour le sauvegarder (on pourrait avoir besoin de le remettre en place), puis installez la version que je joins ici. Voyez si le problème disparaît.

benjy2006 commented 1 year ago

Pourriez vous m'indiquer la procédure à suivre pour faire un backup du plugin formcreator svp ?

Pour info le plugin est bien à jour sur notre serveur GLPI à la dernière version "publique" : image

btry commented 1 year ago

Pour info le plugin est bien à jour sur notre serveur GLPI à la dernière version "publique" :

La version que j'ai partagée est la version 2.13.7 + tous les correctifs réalisés depuis.

Pourriez vous m'indiquer la procédure à suivre pour faire un backup du plugin formcreator svp ?

Copiez l'archive jointe dans le serveur, par exemple dans votre $HOME . Elle contient un dossier formcreator.

Connecté au serveur (via SSH par exemple), déplacez le dossier marketplace/formcreator ailleurs. La commande devrait ressembler à ceci

mv /var/www/html/glpi/marketplace/formcreator $HOME/formcreator-old

Notez que je renomme le dossier pour éviter une confusion pour la suite.

Si la nouvelle version est dans $HOME, vous pouvez la dézipper avec unzip glpi-formcreator-2.13.7-bf.zip Un dossier $HOME/formcreator sera créé et contiendra tous les fichiers du plugin. C'est pourquoi la sauvegarde a été placée dans un dossier au nom différent.

Vous aurez besoin de privilèges pour la suite. ${USER} doit être remplacé par le nom de l'utilisateur que vous utilisiez pour les commandes précédentes. /home/${USER} doit correspondre à la valeur de $HOME dans les commands précédentes.

Changez le propriétaire des fichers de la nouvelle version. Je suppose que c'est l'utilisateur et le groupe www-data.

chown -R www-data:www-data /home/${USER}/formcreator

Ensuite placez la nouvelle version dans votre glpi. Attention au chemin vers votre instance de GLPI, vous aurez peut être besoin d'adapter la commande.

mv /home${USER}/formcreator /var/www/html/glpi/marketplace/

Vérifiez dans GLPI que Formcreator est toujours activé. Enfin, voyez si le bug persiste.

benjy2006 commented 1 year ago

ça marche, merci. Je vais voir avec mon responsable si il est OK pour faire cette manipulation (étant donné que c'est un serveur de prod). Je vous tiens au courant.

btry commented 1 year ago

Je vous recommande de toujours avoir un serveur de préprod disponible. C'est une bonne pratique de copier la prod sur la préprod pour avoir exactement les mêmes données et le même code, puis tester un upgrade de GLPI et / ou ses plugins. En cas de problèmes vous pouvez tranquillement chercher une procédure sûre pour ensuite la répéter sur la prod.

informatiqueCHSA commented 11 months ago

Bonjour nous avons le même problème avec le plugin Form Creator 2.13.8 depuis sa sortie.

erreur

que faire ?

btry commented 11 months ago

Bonjour

Vérifiez de nouveau si le code HTTP de réponse est toujours 400, pour être sûr que rien n'a changé.

Prenez aussi une capture d'écran de la configuration de la question obligatoire que vous ne renseignez pas pour reproduire le souci. Je pense que maintenant, ily a de bonnes chances que je puisse reproduire et trouver le fix.

informatiqueCHSA commented 11 months ago

Bonjour en fait je remplis tous les champs obligatoires c'est ça le problème et l'erreur s'affiche.... je précise que le ticket associé est bien généré

btry commented 11 months ago

Donc le code HTTP de la requête vers ajax/formanswer.php est probablement 200. Pouvez-vous vérifier ?

Ensuite, répétez la requête avec curl ou powershell. pour voir si vous avez un texte de réponse (l'autre fois, la réponse était vide).

Enfin, vérifiez dans php-errors.log et sql-errors.log si vous avez une erreur pendant le traitement de la requête HTTP.

informatiqueCHSA commented 11 months ago

idem que benjy2006

informatiqueCHSA commented 11 months ago

les résultats sont les mêmes

informatiqueCHSA commented 11 months ago

que faire pour corriger le problème ?

informatiqueCHSA commented 11 months ago

sous [GLPI 10.0.10] avec formcreator | 2.13.8 ça ne fonctionne pas sous [GLPI 10.0.5] avec formcreator | 2.13.8 ça fonctionne

btry commented 11 months ago

Essayez d'appliquer ce patch. Il doit afficher dans la console JS la réponse obtenue du serveur quand il y a une erreur interne.

diff --git a/js/scripts.js b/js/scripts.js
index 1ef28519e..83c63f23f 100644
--- a/js/scripts.js
+++ b/js/scripts.js
@@ -1378,6 +1378,7 @@ var plugin_formcreator = new function() {
             return;
          }
          if (typeof(xhr.responseJSON) == 'undefined') {
+            console.log("Formcreator response: " + xhr.responseText);
             alert(i18n.textdomain('formcreator').__('An internal error occurred. Please report it to administrator.', 'formcreator'));
          }
          if (typeof(xhr.responseJSON.message) == 'undefined') {
informatiqueCHSA commented 11 months ago

Essayez d'appliquer ce patch. Il doit afficher dans la console JS la réponse obtenue du serveur quand il y a une erreur interne.

diff --git a/js/scripts.js b/js/scripts.js
index 1ef28519e..83c63f23f 100644
--- a/js/scripts.js
+++ b/js/scripts.js
@@ -1378,6 +1378,7 @@ var plugin_formcreator = new function() {
             return;
          }
          if (typeof(xhr.responseJSON) == 'undefined') {
+            console.log("Formcreator response: " + xhr.responseText);
             alert(i18n.textdomain('formcreator').__('An internal error occurred. Please report it to administrator.', 'formcreator'));
          }
          if (typeof(xhr.responseJSON.message) == 'undefined') {

image

informatiqueCHSA commented 11 months ago

Essayez d'appliquer ce patch. Il doit afficher dans la console JS la réponse obtenue du serveur quand il y a une erreur interne.

diff --git a/js/scripts.js b/js/scripts.js
index 1ef28519e..83c63f23f 100644
--- a/js/scripts.js
+++ b/js/scripts.js
@@ -1378,6 +1378,7 @@ var plugin_formcreator = new function() {
             return;
          }
          if (typeof(xhr.responseJSON) == 'undefined') {
+            console.log("Formcreator response: " + xhr.responseText);
             alert(i18n.textdomain('formcreator').__('An internal error occurred. Please report it to administrator.', 'formcreator'));
          }
          if (typeof(xhr.responseJSON.message) == 'undefined') {

image

image

informatiqueCHSA commented 11 months ago

Essayez d'appliquer ce patch. Il doit afficher dans la console JS la réponse obtenue du serveur quand il y a une erreur interne.

diff --git a/js/scripts.js b/js/scripts.js
index 1ef28519e..83c63f23f 100644
--- a/js/scripts.js
+++ b/js/scripts.js
@@ -1378,6 +1378,7 @@ var plugin_formcreator = new function() {
             return;
          }
          if (typeof(xhr.responseJSON) == 'undefined') {
+            console.log("Formcreator response: " + xhr.responseText);
             alert(i18n.textdomain('formcreator').__('An internal error occurred. Please report it to administrator.', 'formcreator'));
          }
          if (typeof(xhr.responseJSON.message) == 'undefined') {

image

image

image

btry commented 11 months ago

Essayez de déplacer la ligne ajoutée par le patch, d'une ligne plus haut (donc juste avant le bloc if qui la contient actuellement.

informatiqueCHSA commented 11 months ago

Essayez de déplacer la ligne ajoutée par le patch, d'une ligne plus haut (donc juste avant le bloc if qui la contient actuellement.

ca ne change rien

image

btry commented 11 months ago

Si : je vois que la réponse à la requête est vide.

EDIT : la ligne déplacée a ete exécutée, et on la voit entre les 2 erreurs JS affichées dans l console "Formcreator response:"

informatiqueCHSA commented 11 months ago

Si : je vois que la réponse à la requête est vide.

EDIT : la ligne déplacée a ete exécutée, et on la voit entre les 2 erreurs JS affichées dans l console "Formcreator response:"

diagnostic ?

btry commented 11 months ago

Reproduisiez le bug et une fois que l'erreur s'affiche, faites F5 pour rafraichir la page. Avez vous un toast en bas à droite affichant un message ?

Exemple ci-dessous avec une confirmation, mais dans votre cas, ce serait surement un erreur (donc une bande rouge au lieu d'une bande bleue)

image

informatiqueCHSA commented 11 months ago

Reproduisiez le bug et une fois que l'erreur s'affiche, faites F5 pour rafraichir la page. Avez vous un toast en bas à droite affichant un message ?

Exemple ci-dessous avec une confirmation, mais dans votre cas, ce serait surement un erreur (donc une bande rouge au lieu d'une bande bleue)

image

image

btry commented 11 months ago

J'ai l'impression qu'on n'entre pas dans la partie ci-dessous, ce qui signifierait qu'au lieu d'avoir une réponse vide on a 1 ou plusieurs caractères invisibles (espaces, sauts de ligne)

image

informatiqueCHSA commented 11 months ago

Reproduisiez le bug et une fois que l'erreur s'affiche, faites F5 pour rafraichir la page. Avez vous un toast en bas à droite affichant un message ? Exemple ci-dessous avec une confirmation, mais dans votre cas, ce serait surement un erreur (donc une bande rouge au lieu d'une bande bleue) image

image

non justement aprés validation du message OK image

le
image

informatiqueCHSA commented 11 months ago

J'ai l'impression qu'on n'entre pas dans la partie ci-dessous, ce qui signifierait qu'au lieu d'avoir une réponse vide on a 1 ou plusieurs caractères invisibles (espaces, sauts de ligne)

image

et du coup ?

btry commented 11 months ago

Ajoutez cete ligne au dessus de la ligne console.log déplacée tout à l'heure

         console.log("Formcreator response len: " + xhr.responseText.length);
informatiqueCHSA commented 11 months ago

Ajoutez cete ligne au dessus de la ligne console.log déplacée tout à l'heure

         console.log("Formcreator response len: " + xhr.responseText.length);

image

informatiqueCHSA commented 11 months ago

Ajoutez cete ligne au dessus de la ligne console.log déplacée tout à l'heure

         console.log("Formcreator response len: " + xhr.responseText.length);

image

image