All files / src/utils shell.js

0% Statements 0/8
0% Branches 0/9
0% Functions 0/2
0% Lines 0/8

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45                                                                                         
/**
 * Utilitaires d'échappement shell — Protection contre l'injection de commandes.
 *
 * Chaque valeur insérée dans une commande SSH doit passer par ces fonctions.
 * Ne JAMAIS concaténer directement des entrées utilisateur dans une commande shell.
 *
 * @module utils/shell
 */
 
/**
 * Échappe une chaîne pour une utilisation sûre dans un argument shell simple-quoté.
 * Principe : on ferme le simple quote, on insère un simple quote échappé, on réouvre.
 * Exemple : "l'ami" → 'l'\''ami'
 *
 * @param {string} str — La chaîne à échapper
 * @returns {string} — La chaîne entourée de simples quotes, sûre pour le shell
 */
function shellEscape(str) {
  if (typeof str !== 'string') {
    throw new TypeError('shellEscape attend une chaîne de caractères.');
  }
  // Remplacer chaque ' par '\'' (ferme quote, échappe, réouvre quote)
  return "'" + str.replaceAll("'", String.raw`'\''`) + "'";
}
 
/**
 * Échappe un nombre pour l'utiliser dans une commande shell.
 * Vérifie que c'est bien un entier positif (ex : nombre de lignes, port).
 *
 * @param {number|string} n — Le nombre à valider
 * @param {number} [min=0] — Valeur minimum acceptée
 * @param {number} [max=Infinity] — Valeur maximum acceptée
 * @returns {number} — Le nombre validé
 * @throws {Error} Si la valeur n'est pas un entier dans la plage
 */
function shellInt(n, min = 0, max = Infinity) {
  const parsed = Number.parseInt(n, 10);
  if (!Number.isFinite(parsed) || parsed < min || parsed > max) {
    throw new Error(`Valeur numérique invalide : ${n} (attendu ${min}-${max}).`);
  }
  return parsed;
}
 
module.exports = { shellEscape, shellInt };