fix : Firefox handling 4
This commit is contained in:
@@ -619,7 +619,35 @@ export function snapSignature(chain: string[]): boolean {
|
||||
/** Vrai si la commande mène à un Firefox empaqueté en snap. */
|
||||
export function isSnapFirefox(command: string): boolean {
|
||||
const resolved = locate(command);
|
||||
return resolved !== null && snapSignature(symlinkChain(resolved));
|
||||
if (!resolved) return false;
|
||||
// Deux formes rencontrées en pratique : un lien symbolique jusqu'à
|
||||
// `/usr/bin/snap` (le cas documenté), ou — sur certaines images Ubuntu —
|
||||
// `/usr/bin/firefox` en petit script shell qui exécute le snap en son sein,
|
||||
// sans aucun lien symbolique dans la chaîne. La première vérification ne
|
||||
// voyait pas la seconde forme.
|
||||
return snapSignature(symlinkChain(resolved)) || wrapperReferencesSnap(resolved);
|
||||
}
|
||||
|
||||
/**
|
||||
* Vrai si un script d'aiguillage mentionne le snap dans son propre texte.
|
||||
*
|
||||
* Ne s'applique qu'à un petit script shell (garde du `#!` et d'une taille
|
||||
* raisonnable) : un exécutable binaire réel ne doit pas être lu comme du
|
||||
* texte, et une lecture qui échoue n'est qu'un indice de moins, pas une
|
||||
* preuve d'absence. Un faux positif ici est sans conséquence — il ne fait que
|
||||
* choisir l'emplacement de profil déjà valable pour un Firefox non confiné —
|
||||
* donc la détection est volontairement large plutôt que stricte sur le
|
||||
* libellé exact.
|
||||
*/
|
||||
function wrapperReferencesSnap(resolved: string): boolean {
|
||||
try {
|
||||
const stat = fs.statSync(resolved);
|
||||
if (!stat.isFile() || stat.size === 0 || stat.size > 8192) return false;
|
||||
const content = fs.readFileSync(resolved, 'utf8');
|
||||
return content.startsWith('#!') && /\/snap\/|\bsnap run\b/.test(content);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** Chemin de départ suivi de chaque cible de lien, en absolu. */
|
||||
|
||||
Reference in New Issue
Block a user