From 082c580e14080d6519c6c52ea8e73f19bc06c3ad Mon Sep 17 00:00:00 2001 From: chillcicada <2210227279@qq.com> Date: Fri, 12 Sep 2025 21:46:49 +0800 Subject: [PATCH] wpsoffice-cn: 12.1.0.17900 -> 12.1.2.22571 --- pkgs/by-name/wp/wpsoffice-cn/package.nix | 137 ++++++++++------------- pkgs/by-name/wp/wpsoffice-cn/sources.nix | 10 ++ pkgs/by-name/wp/wpsoffice-cn/update.sh | 36 ++++++ 3 files changed, 103 insertions(+), 80 deletions(-) create mode 100644 pkgs/by-name/wp/wpsoffice-cn/sources.nix create mode 100755 pkgs/by-name/wp/wpsoffice-cn/update.sh diff --git a/pkgs/by-name/wp/wpsoffice-cn/package.nix b/pkgs/by-name/wp/wpsoffice-cn/package.nix index 15d57395daab..45852245a759 100644 --- a/pkgs/by-name/wp/wpsoffice-cn/package.nix +++ b/pkgs/by-name/wp/wpsoffice-cn/package.nix @@ -8,46 +8,35 @@ libtool, libxkbcommon, nspr, - mesa, - libtiff, udev, gtk3, + libgbm, + libusb1, libsForQt5, xorg, cups, pango, - libjpeg, - gtk2, - gdk-pixbuf, - libpulseaudio, - libbsd, - libusb1, + bzip2, libmysqlclient, - llvmPackages, - dbus, - gcc-unwrapped, - freetype, - curl, - makeWrapper, runCommandLocal, - cacert, + curl, coreutils, + cacert, }: -let - pkgVersion = "12.1.0.17900"; - url = "https://wps-linux-personal.wpscdn.cn/wps/download/ep/Linux2023/${lib.last (lib.splitVersion pkgVersion)}/wps-office_${pkgVersion}_amd64.deb"; - hash = "sha256-i2EVCmDLE2gx7l2aAo+fW8onP/z+xlPIbQYwKhQ46+o="; - uri = builtins.replaceStrings [ "https://wps-linux-personal.wpscdn.cn" ] [ "" ] url; - securityKey = "7f8faaaa468174dc1c9cd62e5f218a5b"; -in -stdenv.mkDerivation rec { - pname = "wpsoffice-cn"; - version = pkgVersion; - src = - runCommandLocal "wps-office_${version}_amd64.deb" +let + pname = "wpsoffice-cn"; + sources = import ./sources.nix; + version = sources.version; + + fetch = + { + url, + uri, + hash, + }: + runCommandLocal "wpsoffice-cn-${version}-src" { - outputHashMode = "recursive"; outputHashAlgo = "sha256"; outputHash = hash; @@ -60,108 +49,95 @@ stdenv.mkDerivation rec { SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt"; } '' + readonly SECURITY_KEY="7f8faaaa468174dc1c9cd62e5f218a5b" + timestamp10=$(date '+%s') - md5hash=($(echo -n "${securityKey}${uri}$timestamp10" | md5sum)) - curl \ - --retry 3 --retry-delay 3 \ - "${url}?t=$timestamp10&k=$md5hash" \ - > $out + md5hash=($(printf '%s' "$SECURITY_KEY${uri}$timestamp10" | md5sum)) + + curl --retry 3 --retry-delay 3 "${url}?t=$timestamp10&k=$md5hash" > $out ''; + srcs = { + x86_64-linux = fetch sources.x86_64; + }; + + src = + srcs.${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}"); +in + +stdenv.mkDerivation { + inherit pname src version; + unpackCmd = "dpkg -x $src ."; sourceRoot = "."; nativeBuildInputs = [ dpkg autoPatchelfHook - makeWrapper ]; buildInputs = [ alsa-lib at-spi2-core libtool - libjpeg libxkbcommon nspr - mesa - libtiff udev gtk3 - libsForQt5.qt5.qtbase + libgbm + libusb1 + libsForQt5.qtbase xorg.libXdamage xorg.libXtst xorg.libXv - gtk2 - gdk-pixbuf - libpulseaudio - xorg.libXScrnSaver - xorg.libXxf86vm - libbsd - libusb1 - libmysqlclient - llvmPackages.openmp - dbus ]; dontWrapQtApps = true; + stripAllList = [ "opt" ]; + runtimeDependencies = map lib.getLib [ cups pango - freetype - gcc-unwrapped.lib ]; autoPatchelfIgnoreMissingDeps = [ - # distribution is missing libkappessframework.so - "libkappessframework.so" - # qt4 support is deprecated - "libQtCore.so.4" - "libQtNetwork.so.4" - "libQtXml.so.4" - # file manager integration. Not needed - "libnautilus-extension.so.1" - "libcaja-extension.so.1" "libpeony.so.3" - # libuof.so is a exclusive library in WPS. No need to repatch it - "libuof.so" ]; installPhase = '' runHook preInstall - prefix=$out/opt/kingsoft/wps-office + mkdir -p $out + cp -r opt $out - cp -r usr/* $out - for i in wps wpp et wpspdf; do - substituteInPlace $out/bin/$i \ - --replace /opt/kingsoft/wps-office $prefix - done - for i in $out/share/applications/*;do + cp -r usr/{bin,share} $out + + for i in $out/bin/*; do substituteInPlace $i \ - --replace /usr/bin $out/bin + --replace-fail /opt/kingsoft/wps-office $out/opt/kingsoft/wps-office done - # need system freetype and gcc lib to run properly - for i in wps wpp et wpspdf wpsoffice; do - wrapProgram $out/opt/kingsoft/wps-office/office6/$i \ - --set LD_PRELOAD "${freetype}/lib/libfreetype.so" \ - --set LD_LIBRARY_PATH "${lib.makeLibraryPath [ gcc-unwrapped.lib ]}" + + for i in $out/share/applications/*; do + substituteInPlace $i \ + --replace-fail /usr/bin $out/bin done + runHook postInstall ''; preFixup = '' - # The following libraries need libtiff.so.5, but nixpkgs provides libtiff.so.6 - patchelf --replace-needed libtiff.so.5 libtiff.so $out/opt/kingsoft/wps-office/office6/{libpdfmain.so,libqpdfpaint.so,qt/plugins/imageformats/libqtiff.so,addons/pdfbatchcompression/libpdfbatchcompressionapp.so} - patchelf --replace-needed libtiff.so.5 libtiff.so $out/opt/kingsoft/wps-office/office6/addons/ksplitmerge/libksplitmergeapp.so - patchelf --add-needed libtiff.so $out/opt/kingsoft/wps-office/office6/libwpsmain.so - # Fix: Wrong JPEG library version: library is 62, caller expects 80 - patchelf --add-needed libjpeg.so $out/opt/kingsoft/wps-office/office6/libwpsmain.so + # libbz2 dangling symlink + ln -sf ${bzip2.out}/lib/libbz2.so $out/opt/kingsoft/wps-office/office6/libbz2.so # dlopen dependency patchelf --add-needed libudev.so.1 $out/opt/kingsoft/wps-office/office6/addons/cef/libcef.so + # libmysqlclient dependency + patchelf --replace-needed libmysqlclient.so.18 libmysqlclient.so $out/opt/kingsoft/wps-office/office6/libFontWatermark.so + patchelf --add-rpath ${libmysqlclient}/lib/mariadb $out/opt/kingsoft/wps-office/office6/libFontWatermark.so ''; + passthru.updateScript = ./update.sh; + meta = with lib; { description = "Office suite, formerly Kingsoft Office"; homepage = "https://www.wps.com"; @@ -174,6 +150,7 @@ stdenv.mkDerivation rec { th0rgal wineee pokon548 + chillcicada ]; }; } diff --git a/pkgs/by-name/wp/wpsoffice-cn/sources.nix b/pkgs/by-name/wp/wpsoffice-cn/sources.nix new file mode 100644 index 000000000000..9d00360fd99f --- /dev/null +++ b/pkgs/by-name/wp/wpsoffice-cn/sources.nix @@ -0,0 +1,10 @@ +# Generated by ./update.sh - do not update manually! +# Last updated: 2025-09-15 +{ + version = "12.1.2.22571"; + x86_64 = { + url = "https://wps-linux-personal.wpscdn.cn/wps/download/ep/Linux2023/22571/wps-office_12.1.2.22571.AK.preread.sw_480057_amd64.deb"; + uri = "/wps/download/ep/Linux2023/22571/wps-office_12.1.2.22571.AK.preread.sw_480057_amd64.deb"; + hash = "sha256-aB1EWP0Ev5WuAuzih3ybD23qaRRTUjlES1emas+sUDA="; + }; +} diff --git a/pkgs/by-name/wp/wpsoffice-cn/update.sh b/pkgs/by-name/wp/wpsoffice-cn/update.sh new file mode 100755 index 000000000000..501bdec5ad63 --- /dev/null +++ b/pkgs/by-name/wp/wpsoffice-cn/update.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p nix curl cacert + +set -euo pipefail + +export SSL_CERT_FILE=$NIX_SSL_CERT_FILE + +readonly SECURITY_KEY="7f8faaaa468174dc1c9cd62e5f218a5b" +prefix="https://wps-linux-personal.wpscdn.cn" + +payload=$(curl -s "https://www.wps.cn/product/wpslinux") + +version=$(echo "$payload" | grep -oP '(?<=banner_txt">)[^<]+') + +amd64_url=$(echo "$payload" | grep -oP "downLoad\('[^']*'" | head -1 | sed "s/downLoad('//;s/'$//") +amd64_uri="${amd64_url#$prefix}" + +timestamp10=$(date '+%s') +md5hash=($(printf '%s' "$SECURITY_KEY$amd64_uri$timestamp10" | md5sum)) + +amd64_hash=$(nix-prefetch-url --name "wpsoffice-cn-$version.deb" "$amd64_url?t=$timestamp10&k=$md5hash") + +amd64_hash=$(nix --extra-experimental-features nix-command hash convert --to sri --hash-algo sha256 "$amd64_hash") + +cat > sources.nix << EOF +# Generated by ./update.sh - do not update manually! +# Last updated: $(date +%F) +{ + version = "$version"; + x86_64 = { + url = "$amd64_url"; + uri = "$amd64_uri"; + hash = "$amd64_hash"; + }; +} +EOF