mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-22 22:48:11 +02:00
MAJ Windows : ne plus echouer sur un ecartement encore verrouille
Le remplacement du binaire renommait l'ancien en un nom FIXE (.old). Si un
processus tournait encore depuis ce .old (mise a jour precedente), le fichier
n'etait ni supprimable ni ecrasable : le renommage sortait en "Acces refuse"
(errno 5), que os.IsPermission rapporte comme un defaut de DROITS. L'UI
affichait donc "droits insuffisants, relance en administrateur", conseil faux :
aucun privilege ne remplace l'image d'un executable en cours d'execution.
- renameAside() ecarte sous un nom UNIQUE (.old-<horodatage>) : le renommage
passe meme si un ancien ecartement est verrouille (verifie sur banc d'essai
avec deux processus vivants)
- les trois endroits qui faisaient la manoeuvre l'utilisent (update, install,
premier lancement), et le menage ramasse le nom fixe herite + les uniques
- message d'erreur : Windows renvoie le meme code pour "droits insuffisants" et
"fichier utilise", les deux causes sont donc nommees
Aussi : la section Cartes graphiques restait affichee avec une seule carte.
L'attribut hidden etait sans effet, .pe-group{display:flex} l'emportant sur la
regle par defaut du navigateur.
This commit is contained in:
1 parent
e57fc0966e
commit
ae38aca9ba
6 files changed
+126
-12
No files matched your search
@@ -0,0 +1,71 @@
|
||||
package ajean
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// Le remplacement du binaire doit fonctionner MÊME si un écartement précédent
|
||||
// est toujours là et impossible à supprimer (processus encore vivant dessus).
|
||||
// Avec un nom fixe « .old », le renommage échouait alors en « Accès refusé »,
|
||||
// que jean traduisait par « droits insuffisants, relance en administrateur » :
|
||||
// un conseil faux, aucun privilège ne remplace une image en cours d'exécution.
|
||||
func TestRenameAsideNeBloquePasSurUnAncienEcartement(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
exe := filepath.Join(dir, "ajean.exe")
|
||||
if err := os.WriteFile(exe, []byte("v1"), 0o755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// Un écartement d'une mise à jour précédente occupe déjà le nom fixe.
|
||||
if err := os.WriteFile(exe+".old", []byte("v0"), 0o755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
aside, err := renameAside(exe)
|
||||
if err != nil {
|
||||
t.Fatalf("renameAside a échoué alors qu'un .old existe déjà : %v", err)
|
||||
}
|
||||
if aside == exe+".old" {
|
||||
t.Error("nom d'écartement fixe : c'est précisément ce qui bloquait")
|
||||
}
|
||||
if !strings.HasPrefix(filepath.Base(aside), "ajean.exe.old-") {
|
||||
t.Errorf("nom inattendu : %s", aside)
|
||||
}
|
||||
if _, err := os.Stat(exe); !os.IsNotExist(err) {
|
||||
t.Error("le binaire n'a pas été écarté")
|
||||
}
|
||||
// Deux écartements successifs ne doivent jamais se marcher dessus.
|
||||
if err := os.WriteFile(exe, []byte("v2"), 0o755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
aside2, err := renameAside(exe)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if aside2 == aside {
|
||||
t.Error("deux écartements ont produit le même nom")
|
||||
}
|
||||
}
|
||||
|
||||
// Le ménage doit ramasser l'ancien nom fixe ET les noms uniques.
|
||||
func TestRemoveOldBinaries(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
exe := filepath.Join(dir, "ajean.exe")
|
||||
for _, n := range []string{exe + ".old", exe + ".old-1", exe + ".old-2"} {
|
||||
if err := os.WriteFile(n, []byte("x"), 0o644); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
if err := os.WriteFile(exe, []byte("v1"), 0o755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
removeOldBinaries(exe)
|
||||
restes, _ := filepath.Glob(exe + ".old*")
|
||||
if len(restes) != 0 {
|
||||
t.Errorf("écartements non nettoyés : %v", restes)
|
||||
}
|
||||
if _, err := os.Stat(exe); err != nil {
|
||||
t.Errorf("le binaire courant a été supprimé : %v", err)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user