← pag

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)