Commit ea11d57
0
plików
+0
dodanych
-0
usuniętych
@@ -55,7 +55,7 @@ import threading, itertools
55
55
import uuid # serialNumber SBOM (CycloneDX)
56
56
57
57
# Wersja klienta – do porównania z repo.json["pag_version"] (self-update)
58
-PAG_VERSION = "3.3.22"
58
+PAG_VERSION = "3.3.23"
59
59
from urllib.error import URLError, HTTPError
60
60
61
61
# =============================================================================
@@ -2698,6 +2698,40 @@ def cmd_install(package_names, as_dep=False, upgrade=False):
2698
2698
else:
2699
2699
downloaded = {}
2700
2700
2701
+ # --- Faza 1b: WERYFIKACJA WSZYSTKICH paczek PRZED instalacją ---
2702
+ # KLUCZOWE: GPG i SHA256 sprawdzamy dla WSZYSTKICH paczek, ZANIM
2703
+ # zainstalujemy choćby jedną. Inaczej instalowany pakiet może podmienić
2704
+ # bibliotekę używaną przez sam gpg (np. libassuan 3.0.1 zmienił namespace
2705
+ # symboli LIBASSUAN_1.0 -> LIBASSUAN_2.0) i wtedy weryfikacja kolejnych
2706
+ # paczek w tej samej transakcji pada, dając fałszywe
2707
+ # „NIEPRAWIDŁOWY PODPIS GPG".
2708
+ verified = {}
2709
+ _vfail = []
2710
+ for _name in to_install:
2711
+ _pkg = repo_pkgs.get(_name)
2712
+ if not _pkg:
2713
+ _vfail.append((_name, _('not_found')))
2714
+ continue
2715
+ _pp = downloaded.get(_name)
2716
+ if not _pp:
2717
+ _pp = _download_pkg(_pkg)
2718
+ if not _pp:
2719
+ _vfail.append((_name, _('download_fail')))
2720
+ continue
2721
+ _gok, _gmsg = _verify_pkg_gpg(_pp, repo_url=_pkg.repo_url)
2722
+ if not _gok:
2723
+ _vfail.append((_name, f"{_('gpg_fail')}: {_gmsg[:60]}"))
2724
+ continue
2725
+ if _pkg.sha256 and _sha256_file(_pp) != _pkg.sha256:
2726
+ _vfail.append((_name, _('sha256_mismatch')))
2727
+ continue
2728
+ verified[_name] = _pp
2729
+ if _vfail:
2730
+ for _n, _m in _vfail:
2731
+ print(f" ❌ {_n}: {_m}")
2732
+ print(" ↩ Przerwano PRZED instalacją – żadna paczka nie została zmieniona.")
2733
+ return 1
2734
+
2701
2735
# --- Faza 2: Instalacja – JEDNA nadpisywana linia postępu (jak przy
2702
2736
# pobieraniu), bez ściany tekstu na każdy pakiet. W trybie
2703
2737
# nieinteraktywnym (logi, netinstall instalatora) wypisujemy linię na
@@ -2746,29 +2780,16 @@ def cmd_install(package_names, as_dep=False, upgrade=False):
2746
2780
_pkg_i += 1
2747
2781
_bar_draw(_pkg_i, f"{name}-{pkg.version}")
2748
2782
2749
- # Pobierz (z cache fazy 1 lub bezpośrednio)
2750
- pkg_path = downloaded.get(name) if name in downloaded else _download_pkg(pkg)
2783
+ # Ścieżka pobrana i ZWERYFIKOWANA w fazie 1b – PRZED jakąkolwiek
2784
+ # instalacją (patrz komentarz przy fazie 1b). Dzięki temu podmiana
2785
+ # biblioteki używanej przez gpg nie psuje weryfikacji pozostałych.
2786
+ pkg_path = verified.get(name)
2751
2787
if not pkg_path:
2752
2788
_bar_end()
2753
2789
print(f" ❌ {name}: {_('download_fail')}")
2754
2790
failed.append(name)
2755
2791
break # przerwij transakcję
2756
2792
2757
- # GPG
2758
- gpg_ok, gpg_msg = _verify_pkg_gpg(pkg_path, repo_url=pkg.repo_url)
2759
- if not gpg_ok:
2760
- _bar_end()
2761
- print(f" ❌ {name}: {_('gpg_fail')}: {gpg_msg[:60]}")
2762
- failed.append(name)
2763
- break # PRZERWIJ – niezaufany pakiet
2764
-
2765
- # SHA256 całego pakietu
2766
- if pkg.sha256 and _sha256_file(pkg_path) != pkg.sha256:
2767
- _bar_end()
2768
- print(f" ❌ {name}: {_('sha256_mismatch')}")
2769
- failed.append(name)
2770
- break # PRZERWIJ – uszkodzony pakiet
2771
-
2772
2793
# Przed instalacją zapamiętaj pliki starej wersji (potrzebne w upgrade)
2773
2794
old_files = _db_get_package_files(name) if name in installed_db else []
2774
2795
# Stare sumy SHA256 – do wykrycia zmian użytkownika w plikach /etc (.pacnew)