formcreator icon indicating copy to clipboard operation
formcreator copied to clipboard

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

Open benjy2006 opened this issue 1 year ago • 62 comments

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):

  • GLPI version 10.0.9

  • list of all plugins with their version (available in GLPI > Setup > General > tab System > bottom of the page)

    activity Name: Activités quotidiennes Version: 3.1.2 State: Enabled
    Install Method: Marketplace addressing Name: Adressage IP Version: 3.0.1 State: Enabled
    Install Method: Marketplace advancedplanning Name: advancedplanning Version: 1.1.0 State: Enabled
    Install Method: Marketplace screenshot Name: Capture d'écran Version: 2.0.2 State: Enabled
    Install Method: Marketplace positions Name: Cartographie Version: 6.0.2 State: Enabled
    Install Method: Marketplace servicecatalog Name: Catalogue de service Version: 2.0.4 State: Not installed
    Install Method: Marketplace fields Name: Champs supplémentaires Version: 1.21.4 State: Enabled
    Install Method: Marketplace timelineticket Name: Chronologie des tickets Version: 10.0+1.1 State: Enabled
    Install Method: Marketplace behaviors Name: Comportements Version: 2.7.2 State: Enabled
    Install Method: Marketplace connections Name: Connexions Version: 10.0.0 State: Enabled
    Install Method: Marketplace mydashboard Name: Dashboard Version: 2.1.5 State: Enabled
    Install Method: Marketplace datainjection Name: Data Injection Version: 2.13.3 State: Enabled
    Install Method: Marketplace purchaserequest Name: Demande d'achat Version: 3.0.1 State: Enabled
    Install Method: Marketplace escalade Name: Escalades Version: 2.9.2 State: Enabled
    Install Method: Marketplace formcreator Name: Form Creator Version: 2.13.7 State: Enabled
    Install Method: Marketplace genericobject Name: Gestion d'objets Version: 2.14.7 State: Enabled
    Install Method: Marketplace order Name: Gestion des commandes Version: 2.10.4 State: Enabled
    Install Method: Marketplace glpiinventory Name: GLPI Inventory Version: 1.2.3 State: Enabled
    Install Method: Marketplace manufacturersimports Name: Imports fabricants Version: 3.0.5 State: Enabled
    Install Method: Marketplace tasklists Name: Liste des tâches Version: 2.0.3 State: Enabled
    Install Method: Marketplace releases Name: Mises en production Version: 2.0.3 State: Not installed
    Install Method: Marketplace moreticket Name: More ticket Version: 1.7.3 State: Enabled
    Install Method: Marketplace oauthimap Name: Oauth IMAP Version: 1.4.3 State: Enabled
    Install Method: Marketplace mreporting Name: Plus de rapports Version: 1.8.2 State: Enabled
    Install Method: Marketplace statecheck Name: Régles de vérification d'état Version: 2.3.9 State: Enabled
    Install Method: Marketplace vip Name: VIP Version: 1.8.2 State: Enabled
    Install Method: Marketplace

Desktop (please complete the following information):

  • OS: [e.g. iOS] Windows
  • Browser [e.g. chrome, safari] Microsoft Edge
  • Version [e.g. 22] 10 22H2

Additional context Add any other context about the problem here.

benjy2006 avatar Nov 07 '23 11:11 benjy2006

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 avatar Nov 07 '23 11:11 btry

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ù.

btry avatar Nov 07 '23 11:11 btry

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.

benjy2006 avatar Nov 07 '23 12:11 benjy2006

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.

btry avatar Nov 07 '23 12:11 btry

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.

benjy2006 avatar Nov 08 '23 10:11 benjy2006

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

btry avatar Nov 08 '23 11:11 btry

Merci pour les indications.

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

image

benjy2006 avatar Nov 08 '23 13:11 benjy2006

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.

btry avatar Nov 08 '23 14:11 btry

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

benjy2006 avatar Nov 08 '23 14:11 benjy2006

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 avatar Nov 08 '23 14:11 btry

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.

btry avatar Nov 08 '23 14:11 btry

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 ?

benjy2006 avatar Nov 08 '23 14:11 benjy2006

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

btry avatar Nov 08 '23 14:11 btry

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 avatar Nov 08 '23 14:11 benjy2006

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

benjy2006 avatar Nov 08 '23 14:11 benjy2006

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")

btry avatar Nov 08 '23 15:11 btry

image

benjy2006 avatar Nov 08 '23 15:11 benjy2006

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 ?

btry avatar Nov 08 '23 15:11 btry

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)

benjy2006 avatar Nov 08 '23 15:11 benjy2006

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

btry avatar Nov 08 '23 15:11 btry

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

benjy2006 avatar Nov 09 '23 07:11 benjy2006

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.

btry avatar Nov 09 '23 07:11 btry

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

benjy2006 avatar Nov 09 '23 08:11 benjy2006

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.

btry avatar Nov 09 '23 08:11 btry

ç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.

benjy2006 avatar Nov 09 '23 08:11 benjy2006

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.

btry avatar Nov 09 '23 08:11 btry

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

erreur

que faire ?

informatiqueCHSA avatar Nov 23 '23 15:11 informatiqueCHSA

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.

btry avatar Nov 24 '23 07:11 btry

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é

informatiqueCHSA avatar Nov 24 '23 07:11 informatiqueCHSA

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.

btry avatar Nov 24 '23 07:11 btry