Commit e6e26275 authored by Kourser's avatar Kourser
Browse files

Les variables ajoutées se relisent avant d'être subies

Compléter un .env posait les valeurs de .env.example et rendait la main. Ce
sont des exemples : un SMTP_HOST vide, un serveur média sur des ports que
personne n'a choisis. Les laisser sans rien dire revient à décider à la place
de l'exploitant, et à lui faire découvrir au démarrage ce qu'on ne lui a pas
demandé.

Chaque clé ajoutée est donc proposée, sa valeur du moment en défaut, entrée
pour la garder. La revue elle-même se refuse d'un mot : ce qui vient d'être
ajouté vaut mieux que rien, même non relu.

Ce qui n'est pas proposé
  Les secrets tirés au sort. Les relire n'apprend rien et invite à saisir une
  valeur plus faible que celle qu'on remplace.

  Ceux qui viennent d'ailleurs — SMTP_PASSWORD, APNS_KEY, FCM_KEY. Ce script
  ne les demande à aucune invite, et cette règle vaut ici comme partout
  ailleurs. Ils sont nommés à la fin, parce qu'une clé vide et muette se
  découvre au premier envoi qui échoue.

awk et non sed
  La valeur peut porter des « / », des « & » ou des « \ », que le
  remplacement de sed interprète — « & » y rappelle le motif entier. Échapper
  trois caractères dans deux dialectes coûte plus cher que de passer la valeur
  par l'environnement, où rien ne la relit.

Contrôlé
  Sur un .env réel d'avant le passage à l'anglais : dix-sept clés proposées,
  les quatre secrets tirés et les deux secrets externes écartés. Les valeurs
  saisies arrivent intactes, y compris « Nom & Cie <a/b@c.test> » et
  « smtp.a/b&c.test », qui auraient perdu leur sens avec sed. Aucune valeur
  d'origine altérée, aucun doublon, mode 600 conservé. Refuser la revue laisse
  les exemples en place et nomme quand même ce qui reste à coller.

Co-Authored-By: default avatarClaude Opus 5 <noreply@anthropic.com>
parent 71a4a840
Loading
Loading
Loading
Loading
Loading
+73 −0
Changes for outils/installer.sh: 73 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -237,6 +237,31 @@ FCM_ACCOUNT FCM_COMPTE
FCM_KEY FCM_CLE
"

# Les secrets qui viennent d'ailleurs. Ce script ne les demande pas — saisis à
# une invite, ils resteraient dans l'historique du terminal — et il ne propose
# donc pas non plus de les relire.
SECRETS_EXTERNES="SMTP_PASSWORD APNS_KEY FCM_KEY"

# Remplace la valeur d'une clé, en place. awk plutôt que sed : la valeur peut
# porter des « / », des « & » ou des « \ », que le remplacement de sed
# interprète, et échapper trois caractères dans deux dialectes coûte plus cher
# que de passer la valeur par l'environnement.
poser_valeur() {   # poser_valeur <cle> <valeur>
  VALEUR_POSEE="$2" awk -v c="$1" '
    BEGIN { v = ENVIRON["VALEUR_POSEE"] }
    $0 ~ "^" c "=" { print c "=" v; next }
    { print }
  ' .env > .env.pose
  cat .env.pose > .env
  rm -f .env.pose
}

# 0 si <mot> figure dans <liste>, comparaison sur des mots entiers.
dans_liste() {   # dans_liste <mot> <liste>
  case " $2 " in *" $1 "*) return 0 ;; esac
  return 1
}

migrer_env() {
  renommees=""
  ajoutees=""
@@ -678,6 +703,54 @@ if [ -f .env ]; then
        dire "    Rien à compléter : le fichier était déjà à jour." \
             "    Nothing to complete: the file was already up to date."
      fi

      # ── Renseigner ce qui vient d'être ajouté ────────────────────────────
      #
      # Compléter pose les valeurs de .env.example, qui sont des exemples. Les
      # laisser sans rien dire revient à décider à la place de l'exploitant, et
      # à lui faire découvrir au démarrage un SMTP_HOST vide ou un serveur
      # média qu'il n'a pas choisi. On les lui montre donc, une par une.
      #
      # Trois sortes sont écartées : les secrets tirés au sort, qui n'ont pas à
      # être relus ; ceux qui viennent d'ailleurs, que ce script ne demande
      # jamais ; et rien d'autre — le reste se pose, entrée pour garder.
      a_revoir=""
      for _c in $ajoutees; do
        dans_liste "$_c" "$tirees" && continue
        dans_liste "$_c" "$SECRETS_EXTERNES" && continue
        a_revoir="$a_revoir $_c"
      done

      if [ -n "$a_revoir" ]; then
        echo
        dire "  Les valeurs ajoutées viennent de .env.example : ce sont des" \
             "  The added values come from .env.example: they are examples."
        dire "  exemples. Entrée pour garder celle qui est proposée." \
             "  Press Enter to keep the one offered."
        echo
        if oui_non_b "Les passer en revue maintenant ?" "Review them now?" "o"; then
          for _c in $a_revoir; do
            demander_b "$_c" "$_c" "$(valeur_env "$_c")"
            poser_valeur "$_c" "$REPONSE"
          done
          echo
          dire "  ✓ Valeurs enregistrées." "  ✓ Values recorded."
        fi
      fi

      # Ceux qui se collent à la main ne se devinent pas : les nommer vaut
      # mieux que de les laisser vides et muets.
      a_coller=""
      for _c in $ajoutees; do
        if dans_liste "$_c" "$SECRETS_EXTERNES" && [ -z "$(valeur_env "$_c")" ]; then
          a_coller="$a_coller $_c"
        fi
      done
      if [ -n "$a_coller" ]; then
        echo
        dire "  ⚠  À coller dans .env, ce script ne les demande pas :$a_coller" \
             "  ⚠  To paste into .env, this script does not ask for them:$a_coller"
      fi
      # Une clé que .env.example ne connaît pas est signalée, jamais retirée :
      # elle vient peut-être d'un réglage local que ce script ignore.
      inconnues=""