Commit f9fc63b
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
# =============================================================================
@@ -245,12 +245,7 @@ def _gpg_verify_fp(sig_path: str, data_path: str, timeout: int = 30):
245
245
246
246
247
247
def _verify_local_pkg_signature(pkg_path: str) -> bool:
248
- """Weryfikuje lokalny .pag tym samym kluczem co zaufane repo.
249
-
250
- Otwarcie pliku z menedżera plików nie może omijać łańcucha zaufania.
251
- Brak podpisu, brak przypiętego klucza albo niezgodny fingerprint oznacza
252
- odmowę instalacji (bez trybu automatycznego TOFU dla plików lokalnych).
253
- """
248
+ """Weryfikuje lokalny .pag tym samym kluczem co zaufane repo."""
254
249
sig_path = next((pkg_path + ext for ext in (".asc", ".sig")
255
250
if os.path.isfile(pkg_path + ext)), "")
256
251
if not sig_path:
@@ -2732,6 +2727,40 @@ def cmd_install(package_names, as_dep=False, upgrade=False):
2732
2727
else:
2733
2728
downloaded = {}
2734
2729
2730
+ # --- Faza 1b: WERYFIKACJA WSZYSTKICH paczek PRZED instalacją ---
2731
+ # KLUCZOWE: GPG i SHA256 sprawdzamy dla WSZYSTKICH paczek, ZANIM
2732
+ # zainstalujemy choćby jedną. Inaczej instalowany pakiet może podmienić
2733
+ # bibliotekę używaną przez sam gpg (np. libassuan 3.0.1 zmienił namespace
2734
+ # symboli LIBASSUAN_1.0 -> LIBASSUAN_2.0) i wtedy weryfikacja kolejnych
2735
+ # paczek w tej samej transakcji pada, dając fałszywe
2736
+ # „NIEPRAWIDŁOWY PODPIS GPG".
2737
+ verified = {}
2738
+ _vfail = []
2739
+ for _name in to_install:
2740
+ _pkg = repo_pkgs.get(_name)
2741
+ if not _pkg:
2742
+ _vfail.append((_name, _('not_found')))
2743
+ continue
2744
+ _pp = downloaded.get(_name)
2745
+ if not _pp:
2746
+ _pp = _download_pkg(_pkg)
2747
+ if not _pp:
2748
+ _vfail.append((_name, _('download_fail')))
2749
+ continue
2750
+ _gok, _gmsg = _verify_pkg_gpg(_pp, repo_url=_pkg.repo_url)
2751
+ if not _gok:
2752
+ _vfail.append((_name, f"{_('gpg_fail')}: {_gmsg[:60]}"))
2753
+ continue
2754
+ if _pkg.sha256 and _sha256_file(_pp) != _pkg.sha256:
2755
+ _vfail.append((_name, _('sha256_mismatch')))
2756
+ continue
2757
+ verified[_name] = _pp
2758
+ if _vfail:
2759
+ for _n, _m in _vfail:
2760
+ print(f" ❌ {_n}: {_m}")
2761
+ print(" ↩ Przerwano PRZED instalacją – żadna paczka nie została zmieniona.")
2762
+ return 1
2763
+
2735
2764
# --- Faza 2: Instalacja – JEDNA nadpisywana linia postępu (jak przy
2736
2765
# pobieraniu), bez ściany tekstu na każdy pakiet. W trybie
2737
2766
# nieinteraktywnym (logi, netinstall instalatora) wypisujemy linię na
@@ -2780,29 +2809,16 @@ def cmd_install(package_names, as_dep=False, upgrade=False):
2780
2809
_pkg_i += 1
2781
2810
_bar_draw(_pkg_i, f"{name}-{pkg.version}")
2782
2811
2783
- # Pobierz (z cache fazy 1 lub bezpośrednio)
2784
- pkg_path = downloaded.get(name) if name in downloaded else _download_pkg(pkg)
2812
+ # Ścieżka pobrana i ZWERYFIKOWANA w fazie 1b – PRZED jakąkolwiek
2813
+ # instalacją (patrz komentarz przy fazie 1b). Dzięki temu podmiana
2814
+ # biblioteki używanej przez gpg nie psuje weryfikacji pozostałych.
2815
+ pkg_path = verified.get(name)
2785
2816
if not pkg_path:
2786
2817
_bar_end()
2787
2818
print(f" ❌ {name}: {_('download_fail')}")
2788
2819
failed.append(name)
2789
2820
break # przerwij transakcję
2790
2821
2791
- # GPG
2792
- gpg_ok, gpg_msg = _verify_pkg_gpg(pkg_path, repo_url=pkg.repo_url)
2793
- if not gpg_ok:
2794
- _bar_end()
2795
- print(f" ❌ {name}: {_('gpg_fail')}: {gpg_msg[:60]}")
2796
- failed.append(name)
2797
- break # PRZERWIJ – niezaufany pakiet
2798
-
2799
- # SHA256 całego pakietu
2800
- if pkg.sha256 and _sha256_file(pkg_path) != pkg.sha256:
2801
- _bar_end()
2802
- print(f" ❌ {name}: {_('sha256_mismatch')}")
2803
- failed.append(name)
2804
- break # PRZERWIJ – uszkodzony pakiet
2805
-
2806
2822
# Przed instalacją zapamiętaj pliki starej wersji (potrzebne w upgrade)
2807
2823
old_files = _db_get_package_files(name) if name in installed_db else []
2808
2824
# Stare sumy SHA256 – do wykrycia zmian użytkownika w plikach /etc (.pacnew)