← pag

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)