Application "Freebox"

  • État Nouveau
  • Pourcentage achevé
    0%
  • Type Anomalie
  • Catégorie Général → Divers
  • Assignée à Personne
  • Système d'exploitation Tous
  • Sévérité Moyenne
  • Priorité Très Basse
  • Basée sur la version 4.0.3
  • Due pour la version Non décidée
  • Échéance Non décidée
  • Votes 2
  • Privée
Concerne le projet: Application "Freebox"
Ouverte par overedge - 03/10/2022

FS#37085 - Impossible d'ecrire sur la box en websocket [qml]

Bonjour,

Impossible d’écrire en websocket un fichier sur le disque dur de la box ( /api/v8/ws/upload ) en effet le websocket de QML ne permet pas de mettre un autre header http ( token d’idendification (X-Fbx-App-Auth) ) .

L’idée serait de mettre le token d’identification dans le payload json OU dans le header pour avoir la compatibilité avec des système restreint et la rétro compatibilité avec vos app actuelles

Sinon avez vous le moyens d’ecrire un fichier dans la box sans passer par un websocket merci

Xaphan63 a commenté le 03.10.2022 20:12

Bonjour,
Effectivement fonctionnalité manquante. Je serai intéressé pour le même ajout.
merci d’avance

nbanba a commenté le 28.12.2022 10:24

Bonjour

Quand on ne peux pas upload sur un server mais que l'on peut executer des instructions dessus, on pourrait lui faire download ce que l'on voulait upload dessus…

Un call sur l'API "/downloads/add" qui créé une tache download de votre fichier à upload sur la box ferait le travail (fichier qu'il faudra préalablement héberger ailleurs, d'ailleurs c'est même possible de l'héberger sur la box elle-même, par exemple accessible au travers du FTP de la box ou d'un download link fourni par l'api)

$ ftp open mafreebox.freebox.fr
$... 
ftp > put myfile /pah/to/mydir

Et tout dépend du fichier, on peut écrire un fichier sans passer par les websockets si c'est un fichier type bittorrent ou nzb en faisant un POST avec comme content type : multipart/form-data

Exemple from : "la doc de l'api"


POST /api/v8/downloads/add HTTP/1.1
Host: mafreebox.freebox.fr
Content-Type: multipart/form-data; boundary=---------------------------176791920111939857911845395343
Content-Length: 26651

-----------------------------176791920111939857911845395343
Content-Disposition: form-data; name="download_dir"

L0Rpc3F1ZSBkdXIvVMOpbMOpY2hhcmdlbWVudHMv
-----------------------------176791920111939857911845395343
Content-Disposition: form-data; name="archive_password"


-----------------------------176791920111939857911845395343
Content-Disposition: form-data; name="download_file"; filename="debian-6.0.6-amd64-CD-1.iso.torrent"
Content-Type: application/x-bittorrent

d8:announce41:http://bttracker.debian.org:6969/announce7:comment [ ... ]


Après, je n'ai pas essayé mais l'API filesystem fourni 'cat' et je n'ai pas essayé mais voir si on peut faire comme sous linux (echo XXX | api_call cat > freebox-local-file)

D'autre part, si vous developpez sous UNIX like, vous pouvez interragir avec les websocket manuellement avec des trucs simple et built-in comme 'echo' ou 'printf'

ouverture d'1 tcp socket

$ host=mafreebox.freebox.fr
$ port=443
$ exec 3<>/dev/tcp/${host}/${port}

ouverture d'1 pipe de lecture sur le websocket:

READ=`echo -ne "\r"`
while read <&3; do echo TCPMSG : ${READ} ;  done

écrire dans le 'web'socket

echo -e "GET / HTTP/1.1\r
Host: ${host}\r
Connection: Upgrade\r
Upgrade: websocket\r
Sec-WebSocket-Accept: $(echo -n "mykey"|base64)\r
Origin: http://mafreebox.freebox.fr\r
\r" >&3

Après la seule véritable difficulté c'est de deal avec la partie "data masking" de la RFC6455:

 0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-------+-+-------------+-------------------------------+
 |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 |N|V|V|V|       |S|             |   (if payload len==126/127)   |
 | |1|2|3|       |K|             |                               |
 +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 |     Extended payload length continued, if payload len == 127  |
 + - - - - - - - - - - - - - - - +-------------------------------+
 |                               |Masking-key, if MASK set to 1  |
 +-------------------------------+-------------------------------+
 | Masking-key (continued)       |          Payload Data         |
 +-------------------------------- - - - - - - - - - - - - - - - +
 :                     Payload Data continued ...                :
 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
 |                     Payload Data continued ...                |
 +---------------------------------------------------------------+

PS:
je ne suis pas developpeur, et j'ai peut-être une mauvaise compréhension de la problématique ou une vision faussée de ce que l'on peut faire avec les websockets
C'est pourquoi j'essaye de toujours rester le plus proche du shell possible sans utiliser ni external tool ni external lib, dans le but de bypass le type de soucis que vous rencontrez avec QML

N'hésitez pas à reprendre / corriger si je n'ai pas bien compris votre souci

Cordialement
nbanba

Chargement...

Activer les raccourcis clavier

Liste des tâches

Détails de la tâche

Édition de la tâche