# Copyright 1999-2026 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI=8

inherit rpm systemd xdg udev

DESCRIPTION="Cryptopro package"
HOMEPAGE="http://cryptopro.ru"
SRC_URI="amd64? ( linux-amd64.tgz )"

LICENSE="Cryptopro"
SLOT="0"
KEYWORDS="amd64"
IUSE="+kc1 +gui_gtk +readers +cptools stunnel +pkcs11 +import_ca +plugin +certprop +ifd-rutokens +block +pam"

REQUIRED_USE="
    gui_gtk? ( kc1 )
    readers? ( kc1 )
    cptools? ( kc1 )
    pkcs11? ( kc1 )
    import_ca? ( kc1 )
    plugin? ( gui_gtk )
    "

DEPEND="
    sys-apps/pcsc-tools
    sys-apps/pcsc-lite
    sys-apps/lsb-release
    app-crypt/ccid
    app-arch/rpm2targz
    "

RDEPEND="${DEPEND}"

RESTRICT="mirror strip"

src_unpack() {
    unpack ${A}
    mkdir ${S}
    SUFF="${PV}-7"
    cd ${WORKDIR}

    if use kc1; then
        rpm_unpack ./linux-amd64/lsb-cprocsp-kc1-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/lsb-cprocsp-base-${SUFF}.noarch.rpm
        rpm_unpack ./linux-amd64/lsb-cprocsp-capilite-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/lsb-cprocsp-rdr-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-curl-64-${SUFF}.x86_64.rpm
    fi

    if use gui_gtk; then
        rpm_unpack ./linux-amd64/cprocsp-rdr-gui-gtk-64-${SUFF}.x86_64.rpm
    fi

    if use readers; then
        rpm_unpack ./linux-amd64/cprocsp-rdr-pcsc-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-emv-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-inpaspot-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-kst-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-mskey-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-novacard-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-edoc-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-rutoken-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-cloud-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-cpfkc-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-infocrypt-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-rosan-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-cryptoki-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-esmart-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-jacarta-64-${SUFF}.x86_64.rpm
        rpm_unpack ./linux-amd64/cprocsp-rdr-relay-64-${SUFF}.x86_64.rpm
    fi

    if use cptools; then
        rpm_unpack ./linux-amd64/cprocsp-cptools-gtk-64-${SUFF}.x86_64.rpm
    fi

    if use pkcs11; then
        rpm_unpack ./linux-amd64/lsb-cprocsp-pkcs11-64-${SUFF}.x86_64.rpm
    fi

    if use import_ca; then
        rpm_unpack ./linux-amd64/lsb-cprocsp-ca-certs-${SUFF}.noarch.rpm
        rpm_unpack ./linux-amd64/lsb-cprocsp-import-ca-certs-${SUFF}.noarch.rpm
    fi

    if use pam; then
        rpm_unpack ./linux-amd64/cprocsp-pam-cryptopro-64-${SUFF}.x86_64.rpm
    fi

    if use block; then
        rpm_unpack ./linux-amd64/cprocsp-block-64-${SUFF}.x86_64.rpm
    fi

    # Исправленные имена пакетов плагина (у них старая замороженная версия в поставке 13800)
    if use plugin; then
        rpm_unpack ./linux-amd64/cprocsp-pki-cades-64-2.0.15700-1.amd64.rpm || die "Failed to unpack cades"
        rpm_unpack ./linux-amd64/cprocsp-pki-plugin-64-2.0.15700-1.amd64.rpm || die "Failed to unpack plugin"
    fi

    if use certprop; then
        rpm_unpack ./linux-amd64/cprocsp-certprop-64-${SUFF}.x86_64.rpm
    fi

    rm -rf ./linux-amd64/
}

src_install() {
    cd ${WORKDIR}

    find . -maxdepth 1 -type f -exec cp -a {} "${D}" \; 2>/dev/null
    find . -maxdepth 1 -type d -not -name "." -not -name "cprocsp-5.0.13800" -exec cp -a {} "${D}" \; || die

    if [ -f "${D}/etc/init.d/cprocsp" ]; then
        mkdir -p "${D}/opt/cprocsp"
        mv "${D}/etc/init.d/cprocsp" "${D}/opt/cprocsp/cprocsp.init" || die
        chmod 755 "${D}/opt/cprocsp/cprocsp.init"
        rm -rf "${D}/etc/init.d" 2>/dev/null || true
    fi

    find "${D}" -type f -name "*.so*" -exec chmod 755 {} \; 2>/dev/null

    keepdir /var/opt/cprocsp/dsrf
    keepdir /var/opt/cprocsp/dsrf/db1
    keepdir /var/opt/cprocsp/dsrf/db2
    keepdir /var/opt/cprocsp/keys
    keepdir /var/opt/cprocsp/lmk
    keepdir /var/opt/cprocsp/tmp
    keepdir /var/opt/cprocsp/users/stores
    keepdir /var/opt/cprocsp/mnt

    echo "PATH=/opt/cprocsp/bin/amd64:/opt/cprocsp/sbin/amd64" > "${T}/99cprocsp"
    doenvd "${T}/99cprocsp"

    systemd_dounit "${FILESDIR}/cprocsp.service"

    # Создание изолирующей LD_PRELOAD обертки для nmcades против ABI-конфликтов GCC 15
    if use plugin; then
        einfo "Creating environment wrapper for nmcades binary..."
        mv "${D}/opt/cprocsp/bin/amd64/nmcades" "${D}/opt/cprocsp/bin/amd64/nmcades.orig" || die

        cat << 'EOF' > "${D}/opt/cprocsp/bin/amd64/nmcades"
#!/bin/bash
export LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/cprocsp/lib/amd64/libcsp.so
exec /opt/cprocsp/bin/amd64/nmcades.orig "$@"
EOF
        chmod 755 "${D}/opt/cprocsp/bin/amd64/nmcades" || die
    fi
}

pkg_postinst() {
    # Принудительно накатываем ваш ОРИГИНАЛЬНЫЙ рабочий конфиг и лицензию
    cp -f ${FILESDIR}/config64.ini /etc/opt/cprocsp/config64.ini 2>/dev/null || ewarn "config64.ini not found"
    cp -f ${FILESDIR}/license.ini /etc/opt/cprocsp/license.ini 2>/dev/null || ewarn "license.ini not found"

    mkdir -p /var/opt/cprocsp/tmp
    chmod -R 755 /var/opt/cprocsp
    chmod 1777 /var/opt/cprocsp/tmp

    if ! grep -q '/opt/cprocsp/lib/amd64' /etc/ld.so.conf 2>/dev/null; then
        echo "/opt/cprocsp/lib/amd64" > /etc/ld.so.conf.d/cprocsp-lib-amd64.conf
    fi
    /sbin/ldconfig -f /etc/ld.so.conf 2>/dev/null || true

    # Отключаем контроль дисковой целостности модулей для кастомного ядра Gentoo
    if [ -x /opt/cprocsp/sbin/amd64/cpconfig ]; then
        /opt/cprocsp/sbin/amd64/cpconfig -ini '\config\parameters' -add long check_integrity 0 2>/dev/null
    fi

    if [ -f "${FILESDIR}/addcerts.sh" ]; then
        /bin/bash ${FILESDIR}/addcerts.sh
    fi

    systemd_reenable ${PN}.service

    if ! systemctl is-active --quiet ${PN}.service; then
        systemctl start ${PN}.service
    fi

    elog "CryptoPro service has been successfully deployed with your custom configuration."
    xdg_desktop_database_update
    udev_reload
}

pkg_prerm() {
    systemctl stop ${PN}.service 2>/dev/null || true
    rm -Rv /etc/opt/cprocsp 2>/dev/null || true
    rm -fv /etc/ld.so.conf.d/cprocsp-lib-amd64.conf 2>/dev/null || true
}

pkg_postrm() {
    udev_reload
}

