- README, PROTOCOL, FINDINGS, endpoints, rapport et outils traduits en français - docs/DISCLOSURE.md : courriel prêt à envoyer à hello@boti.education (compte démo codé en dur, transmission en clair, logging de production) - extract_endpoints.py vérifié après traduction (100 points d'accès toujours extraits)
47 lines
1.4 KiB
Bash
Executable File
47 lines
1.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Connexion à l'API Boti Education d'une école (variante Green Wood School)
|
|
# et mise en cache de la clé de session.
|
|
# Les identifiants sont lus dans boti.ini de $XDG_CONFIG_HOME (~/.config par
|
|
# défaut), jamais codés en dur.
|
|
#
|
|
# Format de boti.ini :
|
|
# [boti]
|
|
# login = 0600000000
|
|
# password = motdepasse
|
|
#
|
|
set -euo pipefail
|
|
|
|
BASE="https://boti.education/p/greenwood/botiapi/"
|
|
CONF="${XDG_CONFIG_HOME:-$HOME/.config}/boti.ini"
|
|
CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/boti-key"
|
|
|
|
if [[ ! -f "$CONF" ]]; then
|
|
echo "fichier $CONF manquant (format : voir l'en-tête de ce script)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
login=$(awk -F= '/^login/{gsub(/[[:space:]]/,"",$2); print $2}' "$CONF")
|
|
password=$(awk -F= '/^password/{gsub(/[[:space:]]/,"",$2); print $2}' "$CONF")
|
|
|
|
reponse=$(curl -sS -m 20 "$BASE/login" \
|
|
-F "login=$login" \
|
|
-F "password=$password" \
|
|
-F "privacy=true" \
|
|
-F "remembreMe=false")
|
|
|
|
if ! grep -q '"error":false' <<<"$reponse"; then
|
|
echo "échec de connexion : $(head -c 200 <<<"$reponse")" >&2
|
|
exit 1
|
|
fi
|
|
|
|
cle=$(sed -n 's/.*"keyToken":"\([0-9a-f]*\)".*/\1/p' <<<"$reponse")
|
|
if [[ -z "$cle" ]]; then
|
|
echo "keyToken absent de la réponse" >&2
|
|
exit 1
|
|
fi
|
|
|
|
umask 077
|
|
printf '%s' "$cle" > "$CACHE"
|
|
echo "clé de session enregistrée dans $CACHE (40 caractères hex)"
|
|
echo "usage : curl \"$BASE/<endpoint>?user_id=<userId>&key=$(cat "$CACHE")\""
|