Skip to content

fix(dof): l import par clé API existe enfin — le helper n avait jamais été écrit - #286

Merged
NLygitadm merged 1 commit into
mainfrom
fix/dof-import-api
Sep 9, 2026
Merged

NLygitadm merged 1 commit into
mainfrom
fix/dof-import-api

Conversation

@NLygitadm

@NLygitadm NLygitadm commented Sep 9, 2026 •

Copy link
Copy Markdown
Contributor

La page DOF appelle /usr/local/sbin/pincabos-dof-online-api-import depuis toujours. Ce programme n'a jamais existé :

git log --all -- usr/local/sbin/pincabos-dof-online-api-import   →  rien
dans le master                                                    →  absent
dans .gitignore                                                   →  non

La page affichait donc « Import DOF via API indisponible — le helper API PinCabOS est absent » sur tous les cabinets PinCabOS, et seul l'import ZIP manuel fonctionnait.

Trouvé en cherchant pourquoi un testeur n'avait aucune LED en table : sans les directoutputconfig*.ini de son cabinet, DOF n'a rien à jouer. Le seul chemin automatique pour les récupérer n'était pas là.

Le contrat

Il vient du client de référence de Michael Kalkbrenner (mkalkbrenner/dof_configtool_client, DownloadController.php:65) :

copy('http://configtool.vpuniverse.com/api.php?query=getconfig&apikey=' . $apikey, $zip_file)

Un GET, une clé, une archive ZIP de *.ini, *.xml, *.png.

Trois choses que le client de référence ne fait pas

Le message de l'API est rendu à l'utilisateur. Quand la clé est refusée, l'API répond du texte et non un ZIP — le client de référence l'avale dans un catch. Ici :

NOGO [X] Le Config Tool n'a pas renvoyé d'archive.
         Sa réponse : Invalid API key
         Vérifiez la clé API sur configtool.vpuniverse.com.

On n'extrait jamais un chemin venu du réseau. Le client de référence fait un extractTo nu. Ici, seul le nom de base est retenu, et seulement en .ini/.xml/.png : ../../etc/passwd.ini devient passwd.ini et reste dans le dossier cible. Un test le vérifie.

Les deux dossiers sont servis. VPX (PrefPath) et VPinFE lisent chacun leur directoutputconfig — n'en servir qu'un donne un cabinet à moitié muet.

Le reste

Sauvegarde horodatée sous /opt/pincabos/backups/dof-configtool/ avant tout écrasement. noforce garde ce que l'utilisateur a déjà, et le dit plutôt que de l'écraser en silence.

Tests

test_dof_import_api.py, 13 tests : le programme existe au chemin exact que la WebApp appelle, l'URL est celle du client de référence, une réponse texte donne le code 2 avec le message de l'API, une clé vide est refusée avant tout appel réseau, le filtrage ne laisse passer ni .txt ni .sh, la traversée de chemin est neutralisée, un fichier identique n'est pas réécrit, et noforce préserve l'existant.

Tout est testable sans clé : seul l'appel réseau réel ne l'est pas — il faudra une vraie clé pour valider de bout en bout.

778 tests.

🤖 Generated with Claude Code

…s été écrit

La page DOF appelle /usr/local/sbin/pincabos-dof-online-api-import depuis
toujours. Ce programme n'a JAMAIS existé : ni dans le dépôt, ni dans
l'historique git, ni dans le master. La page affichait donc « Import DOF
via API indisponible » sur tous les cabinets PinCabOS, et seul l'import
ZIP manuel fonctionnait.

Trouvé en cherchant pourquoi un testeur n'avait aucune LED en table :
sans les directoutputconfig*.ini de SON cabinet, DOF n'a rien à jouer. Le
seul chemin automatique pour les récupérer n'était pas là.

Le contrat de l'API vient du client de référence de Michael Kalkbrenner
(github.com/mkalkbrenner/dof_configtool_client, DownloadController.php) :

    GET configtool.vpuniverse.com/api.php?query=getconfig&apikey=<clé>
        -> une archive ZIP de *.ini, *.xml, *.png

Trois choses que le client de référence ne fait pas et qu'on fait ici :

- Quand la clé est refusée, l'API répond du TEXTE et non un ZIP. C'est ce
  texte qui explique l'erreur : on le montre, plutôt qu'un « échec » muet.
- L'archive vient du réseau : on n'en extrait jamais un chemin. Seul le
  nom de base est retenu, et seulement en .ini/.xml/.png — « ../../etc/
  passwd.ini » devient « passwd.ini » et reste dans le dossier cible.
- VPX (PrefPath) et VPinFE lisent chacun LEUR directoutputconfig : les
  deux sont servis. Un seul donnerait un cabinet à moitié muet.

Sauvegarde horodatée avant écrasement. « noforce » garde ce que
l'utilisateur a déjà et le dit.

778 tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@NLygitadm
NLygitadm merged commit 0d25e1c into main Sep 9, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant