Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#151 Le 05/07/2013, à 17:25

Vinky41

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Normal :

{"downloader":true,"settings":false,"calls":true,"explorer":true,"contacts":true,"parental":false}},"success":true}

Il fait que tu ailles sur ta freebox (interface web) et que tu ailles dans parametres -> accès -> onglet applications-> double clic sur ton app -> coche ce qui correspond aux droits que tu veux que ton app aies. (Paramètres apriori)

Hors ligne

#152 Le 05/07/2013, à 17:53

gmarin

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Ben j'ai répondu trop tot.
avec curl -i  -X GET http://mafreebox.freebox.fr/api/v1/dhcp/config/ -H "X-Fbx-App-Auth: $result2" j'arrive à lire les informations du dhcp cela veut dire que l'authentification fonctionne.
je ne trouve pas ou définir les droits pour pouvoir lire les information rrd.
sur l'interface des applications je peux ajouter "Modification des réglages de la freebox" et "Accès au contrôle parental" mais pas de permissions pour les rrd.
même en cochant tout je n'ai plus de droits.
Gilbert

Hors ligne

#153 Le 05/07/2013, à 17:56

gmarin

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

en fait j'ai besoin de settings :
{"uid":"2bd25dd65be2ab0394c760f6417afc64","success":false,"missing_right":"settings","msg":"Cette application n'est pas autorisée à accéder à cette fonction","result":{"password_salt":"0rD6RM906Q3lockQ41KCgjQv9RZU4gdh"},"error_code":"insufficient_rights"}
mais je viens de le cocher et j'ai toujours la même réponse :
{"result":{"session_token":"P06xQxDmr3+amvOI3IzAQ+nC5t+JsPhBxWEsQRXGrbfNZ1DAcDpdRMrZPUNn9WUn","challenge":"7NVh3sBez21c5SBhCJJ1aEcxp3AzJGJy","password_salt":"0rD6RM906Q3lockQ41KCgjQv9RZU4gdh","permissions":{"downloader":true,"settings":false,"calls":true,"explorer":true,"contacts":true,"parental":false}},"success":true}
Gilbert

Hors ligne

#154 Le 05/07/2013, à 18:01

Vinky41

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Tu as plusieurs app ? C'est bien la bonne que tu as mises ?

Sinon, l'api que tu utilises est noté comme instable encore. Ça peut te causer des soucis.

Ça n'empêche que tes param devraient être à true si autorisé

Hors ligne

#155 Le 05/07/2013, à 18:01

gmarin

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

yo ca marche.
je n'avais pas modifié la bonne appli.
j'en avait un paquet!
Merci à toutes et à tous
je peux partir demain en vacances l'esprit tranquille
A bientôt
Gilbert

Hors ligne

#156 Le 05/07/2013, à 18:14

Vinky41

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Super bien joué smile

Pense à faire le ménage pour ne garder que les apps utilisés (idéalement je te conseillerais de faire une nouvelle app vu que tu as mis le app_token ici wink )

Hors ligne

#157 Le 05/07/2013, à 18:34

gmarin

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

pas de problème ma box n'est visible de l'extérieur
A+ et encore merci
Gilbert

Hors ligne

#158 Le 12/07/2013, à 21:16

Totor

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Bonsoir,

Je tente de me faire un outil pour tester une fonctionnalité de la freebox.
J'ai donc écris un script qui me permet de me donner l'app_token et un second pour ouvrir une session et tester la fonctionnalité souhaitée.

J'arrive très bien à obtenir le token de l'app mais je n'arrive pas à obtenir de token de session...
Je bute sur l'erreur "error_code":"invalid_token"

Je ne comprends absolument pas ! J'avais également constaté la protéction du "/" dans la réponse de curl (je m'appuie sur cet outil) et j'ai donc supprimé les "\" ..
Donc, pourriez-vous tester mes scripts et me faire un retour sur vos résultats à l'obtention du token de session ?

Script pour obtenir l'app_token  :

#!/bin/bash

app_id="$1"
app_name="$2"
app_version="$3"
device_name="$4"

# demande d'autorisation de l'application avec récupération du token :
IFS='"' read -a values < <(curl http://mafreebox.free.fr/api/v1/login/authorize/ -d '{"app_id":"'${app_id}'", "app_name":"'${app_name}'", "app_version":"'${app_version}'" , "device_name":"'${device_name}'"}' 2>/dev/null)
app_token="${values[7]//\\}"
app_track="${values[10]//[:\}]}"

echo "En attente d'authorisation..."
while grep -q pending < <(curl http://mafreebox.free.fr/api/v1/login/authorize/${app_track} 2>/dev/null)
do
	printf "."
	sleep 1
done
echo

reponse=$(curl "http://mafreebox.free.fr/api/v1/login/authorize/${app_track}" 2>/dev/null)
case ${reponse} in	
	*timeout*)
		echo "Réponse trop tardive (time out) !";;
	*granted*)
		printf "APP_TOKEN=%s\nTRACK_ID=%s\n" "${app_token}" "${app_track}";;
	*denied*)
		echo "Autorisation refusée !";;
	*unknown*)
		echo "Erreur de token !";;
esac

A utiliser sous la forme :
nomScript <app_id> <app_name> <app_version> <device_name>

Script d'obtention du token de session :

#!/bin/bash

APP_ID="$1"
APP_TOKEN="$2"

# demande du chanllenge :
IFS='"' read -a values < <(curl http://mafreebox.free.fr/api/v1/login/)
CHALLENGE="${values[9]//\\}"

read foo PASSWORD < <(openssl dgst -sha1 -hmac ${APP_TOKEN} <<< ${CHALLENGE})

curl -v http://mafreebox.free.fr/api/v1/login/session/ -d '{"app_id":"'${APP_ID}'", "password":"'${PASSWORD}'"}'

A utiliser sous la forme :
nomScript <app_id> <app_token>

Merci d'avance pour vos tests (et correction ?) !

Dernière modification par Totor (Le 13/07/2013, à 11:36)


-- Lucid Lynx --

Hors ligne

#159 Le 12/07/2013, à 22:21

Vinky41

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Je suis sur smartphone, mais j'ai pas l'impression que tu fasses un hash entre le challenge et l'app_token, si ?

Après je ne connais pas trop ce que tu as utilisé.

Mais tu peux essayer de comparer avec les différents scripts affichés au dessus pour comparer les résultats wink

Dernière modification par Vinky41 (Le 12/07/2013, à 22:24)

Hors ligne

#160 Le 13/07/2013, à 13:07

Totor

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Vinky41 a écrit :

Pour ce qui est des \ je les ai tous supprimés grâce à cette commande :

| sed 's/\\\//g'

Ceci ne peut pas fonctionner car l'expression est incomplète.
Je vois cette erreur partout où il est question d'utiliser l'api free os...

Pour répondre à ton interrogation, si, je fais bien le hash :

read foo PASSWORD < <(openssl dgst -sha1 -hmac ${APP_TOKEN} <<< ${CHALLENGE})

-- Lucid Lynx --

Hors ligne

#161 Le 13/07/2013, à 13:13

Totor

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Bon j'ai trouvé ...
Bon sang...  c'est l'utilisation de la forme Here-String qui posait soucis ...
Je l'utiliser pensant qu'elle n'ajoutait pas de retour à la ligne et finalement si, c'est le cas hmm


-- Lucid Lynx --

Hors ligne

#162 Le 15/07/2013, à 19:20

Zakhar

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

@totor ton script est certainement bien, mais inapproprié pour ce que je veux en faire, car il est plein de bashisms !

Comme une des mes contraintes c'est que ça doit tourner sur ma Synology, dont le moteur de script est Ash, je préfère en rester à la compatibilité Posix. Et qui peut le plus peut le moins... un script qui fonctionne sous Ash et Dash fonctionne en général sans problème sous bash.

Donc pour la connexion, voici :

#!/bin/sh

APP_ID='YourAppID'   # Mettre ici le nom de votre application tel qu'il a été déclaré pour l'autorisation de l'appli
APP_TOKEN='############################################' # Mettre ici la token de votre application retournée par l'autorisation. ATTENTION: SANS les \

# demande du chanllenge :
challenge="$(curl -s http://mafreebox.free.fr/api/v1/login/ | sed 's/.*"challenge":"//;s/","password_salt".*//' | sed 's/\\//g')"
echo "challenge=${challenge}"

password="$( printf '%s' "${challenge}" | openssl dgst -sha1 -hmac ${APP_TOKEN}  | sed 's/(stdin)= //' )"
echo "password=${password}"

curl -v http://mafreebox.free.fr/api/v1/login/session/ -H "Content-type: application/json" -d '{"app_id":"'${APP_ID}'", "password":"'${password}'"}'

C'est un peu "en dur" (numéro de version par exemple), mais ça donne l'idée.

J'ai rajouté un sed sur le hmac, car sur Precise, le résultat de la commande est :

(stdin)= hmac_du_machin_qu'on_a_demandé

... bizarre !..
Si le hmac donne une résultat sans le (stdin) devant, le sed ne gène pas, il fait juste rien du tout !..

Résultat en images :

$ ./gettok.sh
challenge=6rHwjJQVajgC3nkQvxjW1IsS4HTM/YEs
password=3db80954ddf036de51bde7eb46921bc51dc2557a
* About to connect() to mafreebox.free.fr port 80 (#0)
*   Trying 212.27.38.253... connected
> POST /api/v1/login/session/ HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: mafreebox.free.fr
> Accept: */*
> Content-type: application/json
> Content-Length: 74
> 
* upload completely sent off: 74out of 74 bytes
< HTTP/1.1 200 OK
< Server: nginx
< Date: Mon, 15 Jul 2013 17:11:32 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< 
* Connection #0 to host mafreebox.free.fr left intact
* Closing connection #0
{"result":{"session_token":"2w3vu01S0tBsdMDocVY5GqyjZM2WvIAkHl37Gqs5RlYqPJl2iVmUrWzdpXnXvfXF","challenge":"6rHwjJQVajgC3nkQvxjW1IsS4HTM\/YEs","password_salt":"+LQx59uUq4JlNN4jlnNB7hQDNLVRylZZ","permissions":{"downloader":true,"settings":false,"calls":true,"explorer":true,"contacts":true,"parental":false}},"success":true}

Cette base va me permettre de remettre à jour mon script.
Je vais en profiter pour remettre aussi un peu d'ordre... comme par exemple nommer les variables dans le fichier de config à l'identique des options longues... ainsi ça évite de devoir aller voir le script pour savoir que mettre dans le fichier de config, et c'est assez naturel comme façon de faire.

P.S.: pour la même raison (bashisms) je ne vais pas utiliser resty. Un bon vieux sed fera parfaitement l'affaire !

Dernière modification par Zakhar (Le 15/07/2013, à 19:25)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#163 Le 15/07/2013, à 21:17

Totor

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

@Zakhar : roll:/
Je n'ai pas demandé d'avis sur mon script ni à savoir si il était approprié à ton besoin ou pas.. mais uniquement si il fonctionnait chez vous.


-- Lucid Lynx --

Hors ligne

#164 Le 15/07/2013, à 21:45

Zakhar

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

En fait non, il n'a pas fonctionné.
Mais j'ai essayé seulement le deuxième car j'avais déjà fait la 1ère partie "à la main".

A vrai dire je n'ai pas insisté, peut-être la sombre histoire des \


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#165 Le 15/07/2013, à 22:20

Zakhar

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Ah... ben visiblement on n'a même plus besoin de "ruser" en mettant un donwload pour uploader un fichier, puisque désormais il existe l'API upload !..

Ca manquait ce truc, et ça va sérieusement simplifier le script...
Ca retirera aussi l'affichage du temps global restant, mais pour la simplicité, c'est pas plus mal !


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#166 Le 15/07/2013, à 23:23

Zakhar

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Bon, donc voila qui est fait en 10 lignes !..
Testé en local, ça fonctionne.

C'est super brut de décoffrage avec aucun test nulle part... tout est sensé marcher ;-)

Vous sauvegardez ça sur le nom qui vous plaît, et vous lancez juste le script avec en paramètre le nom du fichier à uploader.

Limitations :
- fonctionne seulement en local (c'est 'en dur' pour le PoC)
- Télécharge sur /Disque dur/Téléchargements
- aucun tests d'erreur !

#!/bin/sh

APP_ID='YourAppID'   # Mettre ici le nom de votre application tel qu'il a été déclaré lors de l'autorisation
APP_TOKEN='======================' # Mettre ici le token de votre application retournée par l'autorisation. ATTENTION: SANS les \
upload='{"dirname": "L0Rpc3F1ZSBkdXIvVMOpbMOpY2hhcmdlbWVudHM=", "upload_name": "${1}"}' # Dir= /Disque dur/Téléchargements

challenge="$(curl -s http://mafreebox.free.fr/api/v1/login/ | sed 's/.*"challenge":"//;s/","password_salt".*//;s/\\//g' )"
password="$( printf '%s' "${challenge}" | openssl dgst -sha1 -hmac ${APP_TOKEN}  | sed 's/(stdin)= //' )"
session_token="$( curl -s http://mafreebox.free.fr/api/v1/login/session/ -H "Content-type: application/json" -d '{"app_id":"'${APP_ID}'", "password":"'${password}'"}' | sed 's/.*"session_token":"//;s/",".*//;s/\\//g' )"
id="$(curl -s http://mafreebox.free.fr/api/v1/upload/ -H "X-Fbx-App-Auth: ${session_token}" -H "Content-type: application/json; charset=utf-8" --data "${upload}" | sed 's/.*"id"://;s/}.*//' )"
echo "id=${id}"
curl -v  -F "file=@${1}" "http://mafreebox.free.fr/api/v1/upload/${id}/send" -H "X-Fbx-App-Auth: ${session_token}"

Il va falloir que je teste aussi "à distance" (merci Freewifi pour ça).

Par contre il y a un manque sur l'interface standard : on ne voit les tâches que lorsqu'elles sont en cours, et quand c'est fini, je n'ai pas trouvé le moyen de voir tout ça.
Quelqu'un a vu où ça se trouve ?
Visiblement l'API pour lister les tâches finies existe, mais sauf si on programme un truc, il ne semble pas y avoir d'interface toute faite pour les gérer.

[Edit] en fait si, on voit les tâches finies... s'il y en a !.. Sinon pas d'interface.

Dernière modification par Zakhar (Le 26/07/2013, à 09:35)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#167 Le 26/07/2013, à 09:38

Zakhar

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Sinon, voici un petit bout de code C pour calculer le mot de passe à partir de votre app_token et du challenge:

Les instructions de compilation (et installation de librairies) en commentaire au début du code.
L'usage:

hmac app_token challenge

En retour on a:
- code retour 0
- le mot de passe

Si le code retour n'est pas 0 (tester avec $?) la chaîne retournée explique l'erreur.

/*
1) Install opnssl & crypto libs: 
     sudo apt-get install libssl-dev libssl-doc libssl0.9.8
      (the exact name of common libssl library migth vary according
       to your distro, this is for Precise)

2) Compile with:
     gcc hmac.c -o hmac -O3 -Wall -Wextra -lcrypto
*/
#include <openssl/hmac.h>
#include <stdio.h>
#include <string.h>

static unsigned char password[EVP_MAX_MD_SIZE];
static char hexpassword[ 2 * EVP_MAX_MD_SIZE ];

void usage(argc)
       int argc;
{
  printf("Usage: hmac app_token challenge\nGiven: %u argument(s)\n",argc - 1);
}

int main (argc, argv)
      int argc;
     char **argv;
{
  unsigned char *ret;
  unsigned int  pwlen, i;

  if (argc != 3)
   {
     usage( argc );
     return 1;
   }

  ret= HMAC( EVP_sha1(),                        argv[1] , strlen(argv[1]),
                        (const unsigned char *)(argv[2]), strlen(argv[2]),
                                                password, &pwlen            );

  if (ret==NULL)
   {
     printf("Error HMAC\n");
     return 1;
   }

  for (i=0; i < pwlen; i++)
    {
      sprintf(hexpassword + 2*i, "%.2x", password[i] );
    }
  hexpassword[2*i]= '\0';
  printf("%s\n",hexpassword);
  return 0;
}

Dernière modification par Zakhar (Le 28/07/2013, à 09:51)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#168 Le 16/08/2013, à 17:28

gmarin

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Salut à tous,
suite à ma participation à cette discussion, je viens de publier un article sur comment se connecter à la Freebox.
http://www.prestaopen.com/supervision/s … eebox.html
Bonne lecture et n'hésitez par à faire vos commentaires ici et sur mon site.
Cordialement
Gilbert

Hors ligne

#169 Le 19/08/2013, à 14:29

BorX

Re : [Utilitaire Freebox] Script pour télécharger sur votre V6

Salut,

Super, gmarin !
Cette présentation a l'avantage de montrer dans le détail le fonctionnement de chaque requête.
Petite remarque pour la suite : l'ensemble mériterait un peu de factorisation, car les scripts en annexe deviennent vite indigestes tongue
(fonction pour la requête de base, fonction pour le login, pour l'authentification, fonction générique pour aller chercher telle ou telle valeur, fonction pour interpréter le JSON, ...).
Ainsi, tu pourrais plus facilement éviter de passer systématiquement par des fichiers temporaires en pipant directement le résultat de tes fonctions.

Enfin, on commence à trouver des implémentations Shell de l'API Freebox !

À ce sujet, j'ai trouvé une excellente implémentation simple et efficace sur GitHub : https://github.com/JrCs/freeboxos-bash-api
Cherchant depuis longtemps à redémarrer ma Freebox automatiquement, j'ai repris ce Shell pour lui ajouter l'authentification et le reboot :
https://github.com/BorX/freeboxos-bash-api

Hors ligne