Merge release-26.05 into staging-next-26.05

This commit is contained in:
nixpkgs-ci[bot]
2026-08-03 00:36:05 +00:00
committed by GitHub
61 changed files with 1242 additions and 1092 deletions

View File

@@ -39,6 +39,8 @@ jobs:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
ref: ${{ github.event.pull_request.head.sha }}
# Avoid materializing full nixpkgs tree
sparse-checkout: .
token: ${{ steps.app-token.outputs.token }}
persist-credentials: true

View File

@@ -84,6 +84,7 @@ async function getCommitDetailsForPR({ core, pr, repoPath }) {
'log',
'--format=%s\t%aN\t%aE\t%cN\t%cE',
'--name-only',
'-m',
'-1',
sha,
],

View File

@@ -27019,6 +27019,12 @@
githubId = 51232929;
name = "Taito Horiuchi";
};
tallesCoelho = {
email = "talles.hoc@gmail.com";
github = "tallesCoelho";
githubId = 7442204;
name = "Talles Coelho";
};
talyz = {
email = "kim.lindberger@gmail.com";
matrix = "@talyz:matrix.org";

View File

@@ -52,7 +52,7 @@ in
'';
description =
let
documentationLink = "https://gitlab.com/mojo42/Jirafeau/-/blob/${cfg.package.version}/lib/config.original.php";
documentationLink = "https://gitlab.com/jirafeau/Jirafeau/-/blob/${cfg.package.version}/lib/config.original.php";
in
''
Jirefeau configuration. Refer to <${documentationLink}> for supported

View File

@@ -1,4 +1,4 @@
#!@python3@/bin/python3 -B
#!@python3@/bin/python3 -BP
from dataclasses import dataclass
from typing import Any, Callable, Dict, List, Optional, Tuple

View File

@@ -18,5 +18,20 @@
machine.wait_for_unit("nginx.service")
machine.wait_for_open_port(80)
machine.succeed("curl -sSfL http://localhost/ | grep 'Jirafeau'")
machine.succeed("printf '%s' '<svg xmlns=\"http://www.w3.org/2000/svg\"><script>alert(1)</script></svg>' > /tmp/preview.svg")
link = machine.succeed(
"curl --fail --silent --show-error "
"-F time=month -F 'file=@/tmp/preview.svg;type=image' "
"http://localhost/script.php"
).splitlines()[0]
headers = machine.succeed(
f"curl --fail --silent --show-error --dump-header - "
f"--output /tmp/preview-response 'http://localhost/f.php?h={link}&p=1'"
)
header_lines = {line.lower() for line in headers.splitlines()}
assert "x-content-type-options: nosniff" in header_lines
assert "content-type: image" in header_lines
machine.succeed("cmp /tmp/preview.svg /tmp/preview-response")
'';
}

View File

@@ -18,7 +18,7 @@ in
name = "kanidm-provisioning-${kanidmPackage.version}";
meta.maintainers = with pkgs.lib.maintainers; [ oddlama ];
_module.args.kanidmPackage = pkgs.lib.mkDefault pkgs.kanidmWithSecretProvisioning_1_10;
_module.args.kanidmPackage = pkgs.lib.mkDefault pkgs.kanidmWithSecretProvisioning_1_11;
nodes.provision =
{ pkgs, lib, ... }:

View File

@@ -22,7 +22,7 @@ in
oddlama
];
_module.args.kanidmPackage = pkgs.lib.mkDefault pkgs.kanidm_1_10;
_module.args.kanidmPackage = pkgs.lib.mkDefault pkgs.kanidm_1_11;
nodes.server =
{ pkgs, ... }:

View File

@@ -218,14 +218,14 @@ let
} source;
source = rec {
version = "1.5.901";
version = "1.5.915";
# Needs submodules
src = fetchFromGitHub {
owner = "mumble-voip";
repo = "mumble";
tag = "v${version}";
hash = "sha256-UBJH7EwfWvInuSD6ZALOKeVnWdfh/rmq8GVLG5URjOQ=";
hash = "sha256-pbO+V8p/vqn+jIFWvcHOKhpr1Nv0nXaHG9lFiMRTntM=";
fetchSubmodules = true;
};
};

View File

@@ -41,6 +41,7 @@ let
src = fetchgit {
url = repository;
rev = version;
fetchSubmodules = true; # this is the default, but let's be explicit
inherit sha256;
};
};

View File

@@ -57,7 +57,7 @@ for pname in depsDict:
repository = depDict["repository"]
strippedRepo = repository[4:]
eprint(f"Fetching {pname}@{version} ({strippedRepo})")
command = ["nix-prefetch-git", strippedRepo, version]
command = ["nix-prefetch-git", "--fetch-submodules", strippedRepo, version]
rawRes = subprocess.run(command, check=True, text=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout
sha256 = json.loads(rawRes)["sha256"]
lockedDepsDict[pname] = {"version": version, "repository": strippedRepo, "sha256": sha256}

View File

@@ -15,10 +15,10 @@
let
source = {
version = "2.35.1";
hash = "sha256-31cKSjSTJyUetjCSOCDY2wnTFV+Z52LcvGrh7Emc0cM=";
npmDepsHash = "sha256-wmbzbMQHrbHcL9JSpPXpc+vjjj5LTNN8e6Ug3ZRQ7mo=";
clientNpmDepsHash = "sha256-wJdCvUVLZzCY3iW/Q7QVuRu96s49TehnuQNqbImbe0g=";
version = "2.36.0";
hash = "sha256-oohjRiKARpIyoPFEXR24nlKK4xBBEHUMVTaq/i6NfV8=";
npmDepsHash = "sha256-uDIL9PxbFUa3MwLoPomTfq1A/R1ewDIv+EFWml/8uy8=";
clientNpmDepsHash = "sha256-0xqqpls8FLuXngjjdwjoNLpq9dSixWouROviTjsFCbU=";
};
src = fetchFromGitHub {

View File

@@ -12,14 +12,14 @@
stdenv.mkDerivation (finalAttrs: {
pname = "bird";
version = "2.19.1";
version = "2.19.2";
src = fetchFromGitLab {
domain = "gitlab.nic.cz";
owner = "labs";
repo = "bird";
tag = "v${finalAttrs.version}";
hash = "sha256-8D83U9IgNQ0HDWk2WSQsRsy82bDmjkgectkCOXy2RyI=";
hash = "sha256-5C7hVUWy5QOD2r0Qcu2b2j+xxRek8NsYoWgeRm2Exis=";
};
nativeBuildInputs = [

View File

@@ -12,14 +12,14 @@
stdenv.mkDerivation (finalAttrs: {
pname = "bird";
version = "3.3.1";
version = "3.3.2";
src = fetchFromGitLab {
domain = "gitlab.nic.cz";
owner = "labs";
repo = "bird";
tag = "v${finalAttrs.version}";
hash = "sha256-aJo6Ut/ULBDGoekSXgN1WvmFmonTzNA3TES1FHqCiOM=";
hash = "sha256-qrzi8uYZiohpIRosdPQXxnDu6fP3V9i8PPo8BV8XTZI=";
};
nativeBuildInputs = [

View File

@@ -35,6 +35,7 @@
pkg-config,
polkit,
python312Packages,
removeReferencesTo,
sscg,
systemd,
udev,
@@ -78,6 +79,7 @@ stdenv.mkDerivation (finalAttrs: {
pam
pkg-config
python3Packages.setuptools
removeReferencesTo
systemd
xmlto
];
@@ -250,9 +252,34 @@ stdenv.mkDerivation (finalAttrs: {
popd
''}
remove-references-to \
-t ${stdenv.cc.cc} \
-t ${lib.getDev stdenv.cc.libc} \
-t ${lib.getDev glib} \
-t ${lib.getDev json-glib} \
-t ${lib.getDev systemd} \
-t ${lib.getDev gnutls} \
-t ${lib.getDev krb5} \
"$out/lib/security/pam_ssh_add.so" \
"$out/libexec/cockpit-certificate-ensure" \
"$out/libexec/cockpit-session" \
"$out/libexec/cockpit-tls" \
"$out/libexec/cockpit-ws" \
"$out/libexec/cockpit-wsinstance-factory"
runHook postFixup
'';
disallowedRequisites = [
stdenv.cc.cc
(lib.getDev stdenv.cc.libc)
(lib.getDev glib)
(lib.getDev json-glib)
(lib.getDev systemd)
(lib.getDev gnutls)
(lib.getDev krb5)
];
nativeCheckInputs = [ python3Packages.pytestCheckHook ];
checkInputs = [

View File

@@ -16,7 +16,7 @@
buildGoModule rec {
pname = "containerd";
version = "2.3.1";
version = "2.3.3";
outputs = [
"out"
@@ -28,7 +28,7 @@ buildGoModule rec {
owner = "containerd";
repo = "containerd";
tag = "v${version}";
hash = "sha256-BpKBrMluU5MmojJp/9Og5UrkUBLHav5qx6Re1SFhlhY=";
hash = "sha256-wa9Pixaq5RRrJucWibbBe4n6s53Pdj+mr5gLoFmDgLU=";
};
postPatch = ''

View File

@@ -71,11 +71,11 @@ in
python3Packages.buildPythonApplication rec {
pname = "copyparty${nameSuffix}";
version = "1.20.17";
version = "1.20.19";
src = fetchurl {
url = "https://github.com/9001/copyparty/releases/download/v${version}/copyparty-${version}.tar.gz";
hash = "sha256-lJVTrv/qlCoN2r0+EtKKZD/qhi14kwuzbgrMxmxMlHU=";
hash = "sha256-g02X1jdXXLmy1TBSeQtlEvRisyQd/0ic9kFTnvYk/Ww=";
};
pyproject = true;

View File

@@ -10,13 +10,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "fuse-overlayfs";
version = "1.16";
version = "1.17";
src = fetchFromGitHub {
owner = "containers";
repo = "fuse-overlayfs";
rev = "v${finalAttrs.version}";
hash = "sha256-FwAv5PmiBz25PNH/IEIV6cHjhlE+1mDTrgvR2vN++ZY=";
hash = "sha256-oXSqyxe5+hsuFXKajuviqh2nKIz8Kw6rjLnb6XTF6GI=";
};
nativeBuildInputs = [

View File

@@ -24,7 +24,7 @@
stdenv.mkDerivation (finalAttrs: {
pname = "gammu";
version = "1.43.2";
version = "1.43.3";
__structuredAttrs = true;
@@ -32,7 +32,7 @@ stdenv.mkDerivation (finalAttrs: {
owner = "gammu";
repo = "gammu";
rev = finalAttrs.version;
sha256 = "sha256-+mZBELwFUEL4S3IUIIa83TaNIYQxjQE1TvWhXTcIfYc=";
sha256 = "sha256-qmpbAiu0aIjawdKTNClMa3yFSdakOlh/dY5gAY04K3M=";
};
patches = [

View File

@@ -12,13 +12,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "goaccess";
version = "1.10.2";
version = "1.11";
src = fetchFromGitHub {
owner = "allinurl";
repo = "goaccess";
tag = "v${finalAttrs.version}";
hash = "sha256-n0+Z3kkjMCjPN0Cb0R1QGSzzXH3S9kjDchy9ay6109s=";
hash = "sha256-9Z57T0MPs3ytwi32fMF67j8h7ml20cw4Hf+/DEg5AQY=";
};
nativeBuildInputs = [ autoreconfHook ];

View File

@@ -27,13 +27,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "h2o";
version = "2.3.0-rolling-2026-06-29";
version = "2.3.0-rolling-2026-07-31";
src = fetchFromGitHub {
owner = "h2o";
repo = "h2o";
rev = "edd7a120bfc4af11ac0cbebce2a43cc1f93f9af1";
hash = "sha256-WQy+v4zpwzgbMxT43+Nd33+YPynyZIwqzVTaknqjCmE=";
rev = "ba16320ad18c2bb2e28478ce9e37b9a57a5c98f6";
hash = "sha256-MmfypvlLJ3NeZ1Nyeyzo1mXxICllQPBwwseOo+rC1Ig=";
};
outputs = [
@@ -71,9 +71,9 @@ stdenv.mkDerivation (finalAttrs: {
++ lib.optional withZstandard zstd;
cmakeFlags = [
"-DWITH_BROTLI=${if withBrotli then "ON" else "OFF"}"
"-DWITH_MRUBY=${if withMruby then "ON" else "OFF"}"
"-DWITH_ZSTD=${if withZstandard then "ON" else "OFF"}"
(lib.cmakeBool "WITH_BROTLI" withBrotli)
(lib.cmakeBool "WITH_MRUBY" withMruby)
(lib.cmakeBool "WITH_ZSTD" withZstandard)
];
postInstall = ''

View File

@@ -14,13 +14,13 @@ let
in
stdenv.mkDerivation (finalAttrs: {
pname = "jirafeau";
version = "4.4.0";
version = "4.7.2";
src = fetchFromGitLab {
owner = "mojo42";
owner = "jirafeau";
repo = "Jirafeau";
rev = finalAttrs.version;
hash = "sha256-jJ2r8XTtAzawTVo2A2pDwy7Z6KHeyBkgXXaCPY0w/rg=";
hash = "sha256-zCmSdlHkYQVQXBeVk8AUPoC0UBxz3hWIdM2tGmnLTrw=";
};
installPhase = ''
@@ -34,7 +34,7 @@ stdenv.mkDerivation (finalAttrs: {
meta = {
description = "Website permitting upload of a file in a simple way and giving a unique link to it";
license = lib.licenses.agpl3Plus;
homepage = "https://gitlab.com/mojo42/Jirafeau";
homepage = "https://gitlab.com/jirafeau/Jirafeau";
platforms = lib.platforms.all;
maintainers = [ ];
};

View File

@@ -9,20 +9,21 @@
stdenv.mkDerivation (finalAttrs: {
pname = "lib60870";
version = "2.3.6";
version = "2.4.1";
src = fetchFromGitHub {
owner = "mz-automation";
repo = "lib60870";
rev = "v${finalAttrs.version}";
hash = "sha256-9VqLl1pDmi8TauBA8uCyymzsYd3w4b5AKtqH7XW80N4=";
hash = "sha256-WXEe+G7ib9XNAZSsNl/RZcFHXpIbCMKNfPLnxZzz09E=";
};
sourceRoot = "${finalAttrs.src.name}/lib60870-C";
postPatch = ''
# Keep system mbedTLS support enabled without vendored mbedTLS sources.
substituteInPlace CMakeLists.txt \
--replace-fail "cmake_minimum_required(VERSION 3.0)" "cmake_minimum_required(VERSION 3.10)"
--replace-fail "if(MBEDTLS_DIR)" "if(MBEDTLS_DIR OR WITH_MBEDTLS3)"
''
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
substituteInPlace src/CMakeLists.txt \

View File

@@ -15,13 +15,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "libks";
version = "2.0.10";
version = "2.0.11";
src = fetchFromGitHub {
owner = "signalwire";
repo = "libks";
tag = "v${finalAttrs.version}";
hash = "sha256-oLf1ECSKa6KLTA8MO0le44eEDaLmPz/RHoLa8ZSwjWs=";
hash = "sha256-tPhGXDEAKgeODAcM6hu4GDU83A3Zi7sIMnTQkfCGlFc=";
};
patches = [

View File

@@ -41,6 +41,18 @@ stdenv.mkDerivation (finalAttrs: {
url = "https://github.com/LibVNC/libvncserver/commit/e64fa928170f22a2e21b5bbd6d46c8f8e7dd7a96.patch";
hash = "sha256-AAZ3H34+nLqQggb/sNSx2gIGK96m4zatHX3wpyjNLOA=";
})
(fetchpatch {
name = "CVE-2026-32854.patch";
url = "https://github.com/LibVNC/libvncserver/commit/dc78dee51a7e270e537a541a17befdf2073f5314.patch";
hash = "sha256-CgVfvsrgZWnjIzu/0UegoAuCqO7WHhCDVvhH8Yk1cXo=";
})
(fetchpatch {
name = "CVE-2026-32853.patch";
url = "https://github.com/LibVNC/libvncserver/commit/009008e2f4d5a54dd71f422070df3af7b3dbc931.patch";
hash = "sha256-ZgpiIS7KoRzDmVLQ0J86wTFFykCBVMt6bZwJsFvIO74=";
})
];
nativeBuildInputs = [

View File

@@ -9,13 +9,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "luau";
version = "0.720";
version = "0.725";
src = fetchFromGitHub {
owner = "luau-lang";
repo = "luau";
tag = finalAttrs.version;
hash = "sha256-OF0Zsy1O+9rCcOlWRiBmoets7dAZES4Yy6X4QJ3ZdvQ=";
hash = "sha256-zRoB1psMrZRt8mLoaReyc0hvhRBPAotC1LmDNTYGLjA=";
};
nativeBuildInputs = [ cmake ];

View File

@@ -5,6 +5,7 @@
hash,
patches ? [ ],
fetchFromGitHub,
buildPackages,
cmake,
ninja,
@@ -87,6 +88,10 @@ stdenv.mkDerivation rec {
"-DCMAKE_C_FLAGS=-fzero-init-padding-bits=unions"
];
env = lib.optionalAttrs (stdenv.buildPlatform != stdenv.hostPlatform) {
HOSTCC = lib.getExe buildPackages.stdenv.cc;
};
doCheck = true;
# Parallel checking causes test failures

View File

@@ -152,7 +152,7 @@ stdenv.mkDerivation (finalAttrs: {
"i686-linux"
"x86_64-linux"
];
maintainers = [ ];
maintainers = with lib.maintainers; [ tallesCoelho ];
mainProgram = "megasync";
};
})

View File

@@ -48,11 +48,11 @@ let
in
stdenv.mkDerivation rec {
pname = "miniupnpd";
version = "2.3.9";
version = "2.3.10";
src = fetchurl {
url = "https://miniupnp.tuxfamily.org/files/miniupnpd-${version}.tar.gz";
sha256 = "sha256-Zss8PWl6srs6YdPEhigWbWujKNfC2+uViY/fKjICr3s=";
sha256 = "sha256-+cNO02MvtgzSSN1Yl72YR5oQOnVoiwVsovBp5oqzKYc=";
};
buildInputs = [

View File

@@ -6,7 +6,7 @@
}:
let
version = "1.2.0-23522718";
version = "1.3.1-24494674";
urlVersion = lib.replaceStrings [ "." ] [ "-" ] version;
in
@@ -16,7 +16,7 @@ stdenvNoCC.mkDerivation {
src = fetchzip {
url = "https://necesse.pwn.sh/server/necesse-server-linux64-${urlVersion}.zip";
hash = "sha256-PIguTYULddLKj6PpoSvX3gNSvqrS7oRTOPuwoA0/XOc=";
hash = "sha256-A2mWnIIRGNfbxg7aZDwEk7QvuDUUpr2ARIddasTlvFM=";
};
# removing packaged jre since we use our own

View File

@@ -14,7 +14,7 @@
}:
let
pname = "obsidian";
version = "1.12.7";
version = "1.13.4";
appname = "Obsidian";
meta = {
description = "Powerful knowledge base that works on top of a local folder of plain text Markdown files";
@@ -41,17 +41,17 @@ let
srcs = rec {
x86_64-linux = fetchurl {
url = "https://github.com/obsidianmd/obsidian-releases/releases/download/v${version}/obsidian-${version}.tar.gz";
hash = "sha256-/L4IsRHZwf2wm5wIlSsG4cgpxiFj66JYTEtOyFm+B50=";
hash = "sha256-66wkn5SbaJSBn7tLxWV+yIkvAGzv7ZVdNKbB/+Ji8Ws=";
};
aarch64-linux = fetchurl {
url = "https://github.com/obsidianmd/obsidian-releases/releases/download/v${version}/obsidian-${version}-arm64.tar.gz";
hash = "sha256-a8hye/27bXMdWvmgb1HW3nBhxoyQjIrotDqe03miAmA=";
hash = "sha256-4tRNJjab0DXhrVj2MRMHP7eRtS9MJsziLO1jtJKnE24=";
};
x86_64-darwin = fetchurl {
url = "https://github.com/obsidianmd/obsidian-releases/releases/download/v${version}/Obsidian-${version}.dmg";
hash = "sha256-O4XBO0zlVRLobhcKfNKklOLbaVrIiMBgHhU8uFt3iBs=";
hash = "sha256-6EuVlaul5QIhyX5D0+P0N0Fu379MSoTDeUYecPhU148=";
};
aarch64-darwin = x86_64-darwin;

View File

@@ -1,111 +0,0 @@
{
lib,
stdenv,
fetchFromGitHub,
fetchurl,
raspberrypifw,
pcre,
boost,
freetype,
zlib,
}:
let
ffmpeg = stdenv.mkDerivation rec {
pname = "ffmpeg";
version = "1.1.3";
src = fetchurl {
url = "http://www.ffmpeg.org/releases/ffmpeg-${version}.tar.bz2";
sha256 = "03s1zsprz5p6gjgwwqcf7b6cvzwwid6l8k7bamx9i0f1iwkgdm0j";
};
configurePlatforms = [ ];
configureFlags = [
"--arch=${stdenv.hostPlatform.parsed.cpu.name}"
]
++ lib.optionals stdenv.hostPlatform.isAarch32 [
# TODO be better with condition
"--cpu=arm1176jzf-s"
]
++ [
"--disable-muxers"
"--enable-muxer=spdif"
"--enable-muxer=adts"
"--disable-encoders"
"--enable-encoder=ac3"
"--enable-encoder=aac"
"--disable-decoder=mpeg_xvmc"
"--disable-devices"
"--disable-ffprobe"
"--disable-ffplay"
"--disable-ffserver"
"--disable-ffmpeg"
"--enable-shared"
"--disable-doc"
"--enable-postproc"
"--enable-gpl"
"--enable-protocol=http"
"--enable-pthreads"
"--disable-runtime-cpudetect"
"--enable-pic"
"--disable-armv5te"
"--disable-neon"
"--enable-armv6t2"
"--enable-armv6"
"--enable-hardcoded-tables"
"--disable-runtime-cpudetect"
"--disable-debug"
"--arch=${stdenv.hostPlatform.parsed.cpu.name}"
"--target_os=${stdenv.hostPlatform.parsed.kernel.name}"
]
++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
"--cross-prefix=${stdenv.cc.targetPrefix}"
"--enable-cross-compile"
];
enableParallelBuilding = true;
meta = {
homepage = "http://www.ffmpeg.org/";
description = "Complete, cross-platform solution to record, convert and stream audio and video";
};
};
in
stdenv.mkDerivation {
pname = "omxplayer";
version = "0-unstable-2013-03-28";
src = fetchFromGitHub {
owner = "huceke";
repo = "omxplayer";
rev = "fbee325dc20441138d04d8d2022ad85956302e97";
sha256 = "0fkvv8il7ffqxki2gp8cxa5shh6sz9jsy5vv3f4025g4gss6afkg";
};
postPatch = ''
sed -i 1d Makefile
export INCLUDES="-I${raspberrypifw}/include/interface/vcos/pthreads -I${raspberrypifw}/include/interface/vmcs_host/linux/"
'';
installPhase = ''
mkdir -p $out/bin
cp omxplayer.bin $out/bin
'';
buildInputs = [
raspberrypifw
ffmpeg
pcre
boost
freetype
zlib
];
meta = {
homepage = "https://github.com/huceke/omxplayer";
description = "Commandline OMX player for the Raspberry Pi";
license = lib.licenses.gpl2Plus;
platforms = lib.platforms.arm;
};
}

View File

@@ -8,11 +8,11 @@
stdenvNoCC.mkDerivation rec {
pname = "panoply";
version = "5.9.2";
version = "5.10.1";
src = fetchurl {
url = "https://www.giss.nasa.gov/tools/panoply/download/PanoplyJ-${version}.tgz";
hash = "sha256-fPaPd/ZFblZXOwM2yHeXPIUv/bxGAHki9jbeG2HTckI=";
hash = "sha256-xSvzYD7Bk3SC0WUhQVKRhkCZTiB1vAATM7qSGw9U7Lo=";
};
nativeBuildInputs = [ makeWrapper ];

View File

@@ -1,14 +1,14 @@
{
version = "1.83.0";
version = "1.83.1";
hashes = {
linux-aarch_64 = "sha256-Nwnk4Upg8VZCVbR/bpJDct/wI6GGaTICK+Sh711ZVEM=";
linux-ppcle_64 = "sha256-xUwugnrRQQqEkupYFh7SPtqtNmXmNCjAE+msHskmPXY=";
linux-s390_64 = "sha256-hj+QMaSxtX+hs6G5qCxf7ON2bDvpEGovt9iuVFwsXAQ=";
linux-x86_32 = "sha256-qJ034I7Im1pEn5u6W16y662y4+d7ZpB9EQtd7hkSCG4=";
linux-x86_64 = "sha256-oZrnSqTLA+HQEmlWKsYWXsMqhIp769AyrqmguVaXGLo=";
osx-aarch_64 = "sha256-w+3q+DtvfVzsqm9PfeMq6WyUn0jJorp0NngnH6HQh3I=";
osx-x86_64 = "sha256-w+3q+DtvfVzsqm9PfeMq6WyUn0jJorp0NngnH6HQh3I=";
windows-x86_32 = "sha256-fwDjhD8Jhy7M7qPSc8vJSUA8H/OhWeOyV/69uuZX+9Y=";
windows-x86_64 = "sha256-MER2cr8kaMO3zVTLujYr4jPX8jcbBqbHf9/Fxb0CbJY=";
linux-aarch_64 = "sha256-WvVUQ2m9hVcRGr++0hRTu2+oZ78yol8v/l9yNm5wXO8=";
linux-ppcle_64 = "sha256-X3+mYub01d3mwGZ6aNRfXSxfjNE2Tw1+xETUc/jC9Oc=";
linux-s390_64 = "sha256-CgdF8/0GCb/P8sUCMCdxByqHeD86PN6P4V1q9SbPLPs=";
linux-x86_32 = "sha256-N8xukQz+zPnnTi8RaELXjiP/PoT+ZBemSjvoXjp49R8=";
linux-x86_64 = "sha256-20BE54OR1aI0ORQ8gUfwe6WHdnVYe01I87aPvuOJNYk=";
osx-aarch_64 = "sha256-Ny4TslywWOpuOrbLVLoUWNXSu+HP3NN7xX6CuHJlbiE=";
osx-x86_64 = "sha256-Ny4TslywWOpuOrbLVLoUWNXSu+HP3NN7xX6CuHJlbiE=";
windows-x86_32 = "sha256-DdroVwr0NVeFGrM0JxnqfRJFXx1j3DVhGrEzTyJ6++8=";
windows-x86_64 = "sha256-9GVLC44frt+Jf0q811TFJQy0iv4H1ZXlbvyftHhzbHM=";
};
}

View File

@@ -2,7 +2,7 @@ source 'https://rubygems.org'
ruby '>= 3.2.0', '< 3.5.0'
gem 'rails', '7.2.3.1'
gem 'rails', '7.2.3.2'
gem 'rouge', '~> 4.5'
gem 'mini_mime', '~> 1.1.0'
gem "actionpack-xml_parser"

View File

@@ -1,29 +1,29 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (7.2.3.1)
actionpack (= 7.2.3.1)
activesupport (= 7.2.3.1)
actioncable (7.2.3.2)
actionpack (= 7.2.3.2)
activesupport (= 7.2.3.2)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (7.2.3.1)
actionpack (= 7.2.3.1)
activejob (= 7.2.3.1)
activerecord (= 7.2.3.1)
activestorage (= 7.2.3.1)
activesupport (= 7.2.3.1)
actionmailbox (7.2.3.2)
actionpack (= 7.2.3.2)
activejob (= 7.2.3.2)
activerecord (= 7.2.3.2)
activestorage (= 7.2.3.2)
activesupport (= 7.2.3.2)
mail (>= 2.8.0)
actionmailer (7.2.3.1)
actionpack (= 7.2.3.1)
actionview (= 7.2.3.1)
activejob (= 7.2.3.1)
activesupport (= 7.2.3.1)
actionmailer (7.2.3.2)
actionpack (= 7.2.3.2)
actionview (= 7.2.3.2)
activejob (= 7.2.3.2)
activesupport (= 7.2.3.2)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
actionpack (7.2.3.1)
actionview (= 7.2.3.1)
activesupport (= 7.2.3.1)
actionpack (7.2.3.2)
actionview (= 7.2.3.2)
activesupport (= 7.2.3.2)
cgi
nokogiri (>= 1.8.5)
racc
@@ -36,36 +36,36 @@ GEM
actionpack-xml_parser (2.0.1)
actionpack (>= 5.0)
railties (>= 5.0)
actiontext (7.2.3.1)
actionpack (= 7.2.3.1)
activerecord (= 7.2.3.1)
activestorage (= 7.2.3.1)
activesupport (= 7.2.3.1)
actiontext (7.2.3.2)
actionpack (= 7.2.3.2)
activerecord (= 7.2.3.2)
activestorage (= 7.2.3.2)
activesupport (= 7.2.3.2)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.2.3.1)
activesupport (= 7.2.3.1)
actionview (7.2.3.2)
activesupport (= 7.2.3.2)
builder (~> 3.1)
cgi
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activejob (7.2.3.1)
activesupport (= 7.2.3.1)
activejob (7.2.3.2)
activesupport (= 7.2.3.2)
globalid (>= 0.3.6)
activemodel (7.2.3.1)
activesupport (= 7.2.3.1)
activerecord (7.2.3.1)
activemodel (= 7.2.3.1)
activesupport (= 7.2.3.1)
activemodel (7.2.3.2)
activesupport (= 7.2.3.2)
activerecord (7.2.3.2)
activemodel (= 7.2.3.2)
activesupport (= 7.2.3.2)
timeout (>= 0.4.0)
activestorage (7.2.3.1)
actionpack (= 7.2.3.1)
activejob (= 7.2.3.1)
activerecord (= 7.2.3.1)
activesupport (= 7.2.3.1)
activestorage (7.2.3.2)
actionpack (= 7.2.3.2)
activejob (= 7.2.3.2)
activerecord (= 7.2.3.2)
activesupport (= 7.2.3.2)
marcel (~> 1.0)
activesupport (7.2.3.1)
activesupport (7.2.3.2)
base64
benchmark (>= 0.3)
bigdecimal
@@ -79,9 +79,11 @@ GEM
tzinfo (~> 2.0, >= 2.0.5)
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
anonymous_loader (0.1.3)
version_gem (~> 1.1, >= 1.1.14)
ast (2.4.3)
auth-sanitizer (0.2.1)
version_gem (~> 1.1, >= 1.1.10)
auth-sanitizer (0.2.3)
version_gem (~> 1.1, >= 1.1.14)
base64 (0.3.0)
bcrypt (3.1.22)
benchmark (0.5.0)
@@ -104,16 +106,17 @@ GEM
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
cgi (0.5.1)
cgi (0.5.2)
chunky_png (1.4.0)
commonmarker (2.3.2)
rb_sys (~> 0.9)
concurrent-ruby (1.3.7)
concurrent-ruby (1.3.8)
connection_pool (3.0.2)
crass (1.0.6)
css_parser (2.2.0)
crass (1.0.7)
css_parser (3.0.0)
addressable
csv (3.3.5)
ssrf_filter (~> 1.5)
csv (3.3.6)
date (3.5.1)
debug (1.11.1)
irb (~> 1.10)
@@ -125,7 +128,7 @@ GEM
doorkeeper-i18n (5.2.9)
doorkeeper (>= 5.2)
drb (2.2.3)
erb (6.0.4)
erb (6.0.6)
erubi (1.13.1)
faraday (2.14.3)
faraday-net_http (>= 2.0, < 3.5)
@@ -134,7 +137,7 @@ GEM
faraday-net_http (3.4.4)
net-http (~> 0.5)
ffi (1.17.4)
globalid (1.3.0)
globalid (1.4.0)
activesupport (>= 6.1)
hashie (5.1.0)
logger
@@ -157,17 +160,17 @@ GEM
prism (>= 1.3.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.19.9)
json (2.21.2)
jwt (3.2.0)
base64
language_server-protocol (3.17.0.5)
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
listen (3.10.0)
logger
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
logger (1.7.0)
loofah (2.25.1)
loofah (2.25.2)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
@@ -180,7 +183,7 @@ GEM
mime-types (3.7.0)
logger
mime-types-data (~> 3.2025, >= 3.2025.0507)
mime-types-data (3.2026.0414)
mime-types-data (3.2026.0701)
mini_magick (5.2.0)
benchmark
logger
@@ -207,24 +210,25 @@ GEM
net-protocol
netrc (0.11.0)
nio4r (2.7.5)
nokogiri (1.19.3)
nokogiri (1.19.4)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
oauth2 (2.0.23)
auth-sanitizer (~> 0.2, >= 0.2.1)
oauth2 (2.0.25)
anonymous_loader (~> 0.1, >= 0.1.3)
auth-sanitizer (~> 0.2, >= 0.2.3)
faraday (>= 0.17.3, < 4.0)
jwt (>= 1.0, < 4.0)
logger (~> 1.2)
multi_xml (~> 0.5)
rack (>= 1.2, < 4)
snaky_hash (~> 2.0, >= 2.0.6)
version_gem (~> 1.1, >= 1.1.11)
snaky_hash (~> 2.0, >= 2.0.7)
version_gem (~> 1.1, >= 1.1.14)
parallel (1.28.0)
parser (3.3.11.1)
parser (3.3.12.0)
ast (~> 2.4.1)
racc
pg (1.5.9)
pp (0.6.3)
pp (0.6.4)
prettyprint
prettyprint (0.2.0)
prism (1.9.0)
@@ -233,9 +237,6 @@ GEM
activesupport (>= 7.0.0)
rack
railties (>= 7.0.0)
psych (5.4.0)
date
stringio
public_suffix (7.0.5)
puma (8.0.2)
nio4r (~> 2.0)
@@ -248,30 +249,30 @@ GEM
rack (>= 1.3)
rackup (2.3.1)
rack (>= 3)
rails (7.2.3.1)
actioncable (= 7.2.3.1)
actionmailbox (= 7.2.3.1)
actionmailer (= 7.2.3.1)
actionpack (= 7.2.3.1)
actiontext (= 7.2.3.1)
actionview (= 7.2.3.1)
activejob (= 7.2.3.1)
activemodel (= 7.2.3.1)
activerecord (= 7.2.3.1)
activestorage (= 7.2.3.1)
activesupport (= 7.2.3.1)
rails (7.2.3.2)
actioncable (= 7.2.3.2)
actionmailbox (= 7.2.3.2)
actionmailer (= 7.2.3.2)
actionpack (= 7.2.3.2)
actiontext (= 7.2.3.2)
actionview (= 7.2.3.2)
activejob (= 7.2.3.2)
activemodel (= 7.2.3.2)
activerecord (= 7.2.3.2)
activestorage (= 7.2.3.2)
activesupport (= 7.2.3.2)
bundler (>= 1.15.0)
railties (= 7.2.3.1)
railties (= 7.2.3.2)
rails-dom-testing (2.3.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.7.0)
loofah (~> 2.25)
rails-html-sanitizer (1.7.1)
loofah (~> 2.25, >= 2.25.2)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
railties (7.2.3.1)
actionpack (= 7.2.3.1)
activesupport (= 7.2.3.1)
railties (7.2.3.2)
actionpack (= 7.2.3.2)
activesupport (= 7.2.3.2)
cgi
irb (~> 1.13)
rackup (>= 1.0.0)
@@ -291,9 +292,14 @@ GEM
htmlentities
rbpdf-font (~> 1.19.0)
rbpdf-font (1.19.1)
rdoc (7.2.0)
rbs (4.1.1)
logger
prism (>= 1.6.0)
tsort
rdoc (8.0.0)
erb
psych (>= 4.0.0)
prism (>= 1.6.0)
rbs (>= 4.0.0)
tsort
regexp_parser (2.12.0)
reline (0.6.3)
@@ -306,8 +312,8 @@ GEM
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
rexml (3.4.4)
roadie (5.3.0)
css_parser (>= 1.4, < 3.0)
roadie (5.3.1)
css_parser (>= 1.4, < 4.0)
nokogiri (~> 1.15)
roadie-rails (3.3.0)
railties (>= 5.1, < 8.1)
@@ -329,7 +335,7 @@ GEM
rubocop-ast (>= 1.45.1, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.49.1)
rubocop-ast (1.50.0)
parser (>= 3.3.7.2)
prism (~> 1.7)
rubocop-performance (1.25.0)
@@ -349,7 +355,7 @@ GEM
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
securerandom (0.4.1)
selenium-webdriver (4.45.0)
selenium-webdriver (4.46.0)
base64 (~> 0.2)
logger (~> 1.4)
rexml (~> 3.2, >= 3.2.5)
@@ -361,14 +367,14 @@ GEM
simplecov_json_formatter (~> 0.1)
simplecov-html (0.13.2)
simplecov_json_formatter (0.1.4)
snaky_hash (2.0.6)
snaky_hash (2.0.7)
hashie (>= 0.1.0, < 6)
version_gem (>= 1.1.8, < 3)
version_gem (~> 1.1, >= 1.1.14)
sqlite3 (2.5.0)
mini_portile2 (~> 2.8.0)
ssrf_filter (1.5.0)
stimulus-rails (1.3.4)
railties (>= 6.0.0)
stringio (3.2.0)
svg_optimizer (0.3.0)
nokogiri
svg_sprite (1.0.3)
@@ -387,10 +393,10 @@ GEM
uniform_notifier (1.18.0)
uri (1.1.1)
useragent (0.16.11)
version_gem (1.1.12)
version_gem (1.1.14)
webrick (1.9.2)
websocket (1.2.11)
websocket-driver (0.8.1)
websocket-driver (0.8.2)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
@@ -399,7 +405,7 @@ GEM
zeitwerk (>= 2.7)
xpath (3.2.0)
nokogiri (~> 1.8)
yard (0.9.44)
yard (0.9.45)
zeitwerk (2.8.2)
PLATFORMS
@@ -439,7 +445,7 @@ DEPENDENCIES
propshaft (~> 1.1.0)
puma
rack (>= 3.1.3)
rails (= 7.2.3.1)
rails (= 7.2.3.2)
rails-dom-testing (>= 2.3.0)
rbpdf (~> 1.21.4)
requestjs-rails (~> 0.0.13)

View File

@@ -11,10 +11,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0g5kbrqvhwlliyrzd2bhc3kdiqm58df0x3w716bs0ygwyjil1gyk";
sha256 = "0mvb7hkrbg1nrb0xy347f1wb2vlf61kc3gs3yi2swawl34axkzq4";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
actionmailbox = {
dependencies = [
@@ -29,10 +29,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0hf59r6sk0qb5va0ga549rbadcb5n1a2ry8nlkszzcksr6039rx4";
sha256 = "19ccdmx2l8rdz698686n7yzlkwlry4qaiqacw68w6c5nqnc6x7yi";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
actionmailer = {
dependencies = [
@@ -47,10 +47,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0rq4aan18y6gwziabnj1q1486349k1v1i5m7ysv206pqqpavcy7m";
sha256 = "0ndpcw5q3hyxwkncg6wf37qlzyn8qcvd4q19inrcsrr8hwkc79j5";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
actionpack = {
dependencies = [
@@ -70,10 +70,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1jp4w493wvfh9246wxk7g00m1a3vmzkvs0rznq62fwvjjdzzwsmn";
sha256 = "0av5562qr6f7lddlr4ipycp2qk54q8pl3caa0vp7690gvz2b3yy1";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
actionpack-xml_parser = {
dependencies = [
@@ -102,10 +102,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1qs350j3zm7sd6xxn61d93mv3lx1ravbjqja12c7nd7a0zs1h52v";
sha256 = "1c7h6fyyi8q1kqgclcdr55vrm28v7swriam9ara6m5xb0wm7xaqr";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
actionview = {
dependencies = [
@@ -120,10 +120,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0z7zy6ibfpsdj9jbdm54bx3ws4dszcq7qa564jn645rr8dlbh6fy";
sha256 = "00fw5sqg71zjw5bgk5l620l05aj07kbl6clzz8fjg4qc0ikdkgs2";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
activejob = {
dependencies = [
@@ -134,10 +134,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1n3fiwm1x3dxwj36n9pspd2bgffyw28ys9yd36hjvf3iwdy25i0b";
sha256 = "0fm9fghq86z09xdrsdqq1z8bbasxsb8w1f2c1hzq44c9i5qa0gxq";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
activemodel = {
dependencies = [ "activesupport" ];
@@ -145,10 +145,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1l60a6mqx1wgp15ki1cp68djci0czgrikpydii5bd877hndqdq9r";
sha256 = "09v987j1jy4821s06cpm3h50ldybv89k0ll70grn05fxv1yccxrp";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
activerecord = {
dependencies = [
@@ -160,10 +160,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0pd0f1hy6rvyanmrklqir33xq0jb2my4jajz7hc38nysfpi175dq";
sha256 = "1iw5f93c6rq080xphy4776lamc4iahibjbhjxlj0v0jzgsx28bg6";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
activestorage = {
dependencies = [
@@ -177,10 +177,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1azzbpfp726yigwzmj8g2jji149wisnwrgb86zix6mk25sj4w8hb";
sha256 = "1z6v9rz1lvqdn2x28vbcbyq6m1gvzqwvkp9apramal433frb8g46";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
activesupport = {
dependencies = [
@@ -204,10 +204,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0d6bhg9cim83g8cypjd7cms45ng4p9ga69v26i3vp823d98yvsqi";
sha256 = "04ikxwixhpnv2dih9hy3af45qgra7kz0fd70miw6s248vl8hvjfx";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
addressable = {
dependencies = [ "public_suffix" ];
@@ -223,6 +223,20 @@
};
version = "2.9.0";
};
anonymous_loader = {
dependencies = [ "version_gem" ];
groups = [
"default"
"test"
];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0mfb8kf2a4qmam6jvlrsb38zqh9gk3y1vhbx8iaxji4i8gi1hjh8";
type = "gem";
};
version = "0.1.3";
};
ast = {
groups = [
"default"
@@ -245,10 +259,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0xy5gjb12kv6zjn4zyd16yfv4bygd02ykbr6cz10d6sqyw0wyzci";
sha256 = "0g1yjdchydvk44v4303rjhb5sfb73nzbrvipnr5cdr7v5k4sl46v";
type = "gem";
};
version = "0.2.1";
version = "0.2.3";
};
base64 = {
groups = [
@@ -377,10 +391,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1s8qdw1nfh3njd47q154njlfyc2llcgi4ik13vz39adqd7yclgz9";
sha256 = "1fzqwshg1xzbdm97havskfp6wifsgbjii00dzba0y6bih4lk1jk1";
type = "gem";
};
version = "0.5.1";
version = "0.5.2";
};
chunky_png = {
groups = [ "default" ];
@@ -412,10 +426,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1c2i64xsd35vijnb50rxb70g508s0x674xi0qpyyb8jy7bncl4j4";
sha256 = "1qfi2ns3zwkgq616fc127xiqhan7g7m7gqpwriwcr34nds1vxwdj";
type = "gem";
};
version = "1.3.7";
version = "1.3.8";
};
connection_pool = {
groups = [
@@ -436,38 +450,37 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw";
sha256 = "15djj19ynz3sbw54fsf8n7y3sha8a333f2mgvjfwhr46jhcqg1ll";
type = "gem";
};
version = "1.0.6";
version = "1.0.7";
};
css_parser = {
dependencies = [ "addressable" ];
dependencies = [
"addressable"
"ssrf_filter"
];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "09b3zwmx95jhdp3da6qx9w0d6s2yfpxjjip55wpwny5wsx3v5l93";
sha256 = "119q8j23xyb9pifka1n6jjrw04099zpwwdajh5pd10fm7wlfkw7a";
type = "gem";
};
version = "2.2.0";
version = "3.0.0";
};
csv = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0gz7r2kazwwwyrwi95hbnhy54kwkfac5swh2gy5p5vw36fn38lbf";
sha256 = "0mj4kq4wwpc7c8ll52q30hsir1jrcd5kq7yb8lyz0rksa1z1x9mb";
type = "gem";
};
version = "3.3.5";
version = "3.3.6";
};
date = {
groups = [
"default"
"development"
"test"
];
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
@@ -564,10 +577,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1ncmbdjf2bwmk0jf5cxywns9zbxyfiy4h4p3pzi7yddyjhv81qrq";
sha256 = "1raacipbb5m0176w05m3n21ip91w7i0cb5zjqhkz2nqgf234kcm9";
type = "gem";
};
version = "6.0.4";
version = "6.0.6";
};
erubi = {
groups = [ "default" ];
@@ -647,10 +660,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "04gzhqvsm4z4l12r9dkac9a75ah45w186ydhl0i4andldsnkkih5";
sha256 = "09zl0rkskfq0cwfrk9ypjvflvzanfg3xbhh1slaa1myry7xi4zq3";
type = "gem";
};
version = "1.3.0";
version = "1.4.0";
};
hashie = {
dependencies = [ "logger" ];
@@ -789,10 +802,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "16mp8vzgxa8nsa81np042za453j8b0ihpjkf666s7byxrnvjb44v";
sha256 = "0shwgjqbj856mb6m9kgkpy08nhym2gdvc2yaprlimfmky9y3n78z";
type = "gem";
};
version = "2.19.9";
version = "2.21.2";
};
jwt = {
dependencies = [ "base64" ];
@@ -816,10 +829,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1k0311vah76kg5m6zr7wmkwyk5p2f9d9hyckjpn3xgr83ajkj7px";
sha256 = "1w5p8c2145lmqzr25bxh4ikzjm6k8y1k5lriqqdpw9pq730w1wjy";
type = "gem";
};
version = "3.17.0.5";
version = "3.17.0.6";
};
lint_roller = {
groups = [
@@ -873,10 +886,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "011fdngxzr1p9dq2hxqz7qq1glj2g44xnhaadjqlf48cplywfdnl";
sha256 = "062r891hxis58j5q735kk9sj5srxx0rv813f8m95bilsjm3gf1r0";
type = "gem";
};
version = "2.25.1";
version = "2.25.2";
};
mail = {
dependencies = [
@@ -942,10 +955,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1k28j6ww8rf43r5i8278jvm2cq3pnzsvqm7yqpb4p93kadjlq726";
sha256 = "03vkd9g09jnxsp8mdacvjbplrrqfl5l26n50kd4kdn49zghi326d";
type = "gem";
};
version = "3.2026.0414";
version = "3.2026.0701";
};
mini_magick = {
dependencies = [
@@ -1148,13 +1161,14 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1s30b7h7qpyim30m8060xs415mbr3ci7i5hdg09chh1aqfx2qcbq";
sha256 = "1d9safb4dly6qmc2g06444l0zifby52yy6j1a5fa1g4j3ihm3jah";
type = "gem";
};
version = "1.19.3";
version = "1.19.4";
};
oauth2 = {
dependencies = [
"anonymous_loader"
"auth-sanitizer"
"faraday"
"jwt"
@@ -1168,10 +1182,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0k428i1mlk6g7c054iks86g2h4h2p1y0mg2l3g6w84gd9l8604g6";
sha256 = "1b42dax3qwm1zbz86c9zcii7v45vi6c3rp083dyadjn2jcpnlwrg";
type = "gem";
};
version = "2.0.23";
version = "2.0.25";
};
parallel = {
groups = [
@@ -1198,10 +1212,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0m2xqvn1la62hji1mn04y59giikww95p2hs0r4y2rrz3mdxcwyni";
sha256 = "0a4q5h2hcihk79dbr20scgkm56l79qp7fsvfvkxlv8nmapvxg9i1";
type = "gem";
};
version = "3.3.11.1";
version = "3.3.12.0";
};
pg = {
groups = [ "default" ];
@@ -1223,10 +1237,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1xlxmg86k5kifci1xvlmgw56x88dmqf04zfzn7zcr4qb8ladal99";
sha256 = "0w5mha75hs8gdj75g8vl0sxpyp8rzvwq8a4jcmi4ah8cf370zjyz";
type = "gem";
};
version = "0.6.3";
version = "0.6.4";
};
prettyprint = {
groups = [
@@ -1272,24 +1286,6 @@
};
version = "1.1.0";
};
psych = {
dependencies = [
"date"
"stringio"
];
groups = [
"default"
"development"
"test"
];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1dx5bc3s1mb1i53np4cdkypg7ccygnvagr3hglyndbqilrljvxql";
type = "gem";
};
version = "5.4.0";
};
public_suffix = {
groups = [
"default"
@@ -1399,10 +1395,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "155skqkjrckvzj1qy37lrnafrillc47qhf3l80g3zvw100ba1h4n";
sha256 = "0g0iq4i93h24fzccp55aggg9agv1myi57y8ljpvv01chkxkr14i7";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
rails-dom-testing = {
dependencies = [
@@ -1428,10 +1424,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "128y5g3fyi8fds41jasrr4va1jrs7hcamzklk1523k7rxb64bc98";
sha256 = "1hi25xz5ijz3kjx4vsiywqbq05mlkas7di8pwc3p6mhyn34sg5z7";
type = "gem";
};
version = "1.7.0";
version = "1.7.1";
};
railties = {
dependencies = [
@@ -1449,10 +1445,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0np1m8xqb4wbzwpg66yjnqjban0di92lbjzcrgnwwhq2w4z3k8xf";
sha256 = "17n2zx2ryjqq8a95pzin7v4k92b49ancy6cn2ddzia80rkgwc9pn";
type = "gem";
};
version = "7.2.3.1";
version = "7.2.3.2";
};
rainbow = {
groups = [
@@ -1549,10 +1545,10 @@
};
version = "1.19.1";
};
rdoc = {
rbs = {
dependencies = [
"erb"
"psych"
"logger"
"prism"
"tsort"
];
groups = [
@@ -1563,10 +1559,30 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "14iiyb4yi1chdzrynrk74xbhmikml3ixgdayjma3p700singfl46";
sha256 = "17ibc9hx9v6f30fphmvy4ph63djja54msr2pcfax672xz7r1iw8v";
type = "gem";
};
version = "7.2.0";
version = "4.1.1";
};
rdoc = {
dependencies = [
"erb"
"prism"
"rbs"
"tsort"
];
groups = [
"default"
"development"
"test"
];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0sf4909q2mr9z0rpygv94z12b0yamg07gz8cba2mi5k3m448rgq3";
type = "gem";
};
version = "8.0.0";
};
regexp_parser = {
groups = [
@@ -1645,10 +1661,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1jlzxlq52qbsacxkz4gny988j2pcip73ydp1fg9s1q98ra4h6554";
sha256 = "1h8w5kv6l9lrqzd4d3ja05zp3fa3plf36hdkhdaq1g2zy66nlnk6";
type = "gem";
};
version = "5.3.0";
version = "5.3.1";
};
roadie-rails = {
dependencies = [
@@ -1742,10 +1758,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0dahfpnzz63hyqxa03x8rypnrxzwyvh4i5a8ri34bzpnf3pg64j4";
sha256 = "1nw84xk6vc2ls8sxqvyhxs2agh4l0jrws85d4bi3x0501lq8ijmr";
type = "gem";
};
version = "1.49.1";
version = "1.50.0";
};
rubocop-performance = {
dependencies = [
@@ -1858,10 +1874,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1lg22fmcalwnzgnanswn5g7vc24wmancnvbyf1ynzb46vyj6bb7c";
sha256 = "0mzrk5dk8sx5z9xwfr2sf7rmvzp9n3f4rcghkms43h7ag5pzlv6b";
type = "gem";
};
version = "4.45.0";
version = "4.46.0";
};
simplecov = {
dependencies = [
@@ -1916,10 +1932,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0jk50mjq69065ygdhkhbmxp9k2c7knizhp022ysq5xfyikjclqrn";
sha256 = "0kfbrd4sgajhnjwhqpk1mb4h10whfx2h5kb0i3j35yd3280cf0kx";
type = "gem";
};
version = "2.0.6";
version = "2.0.7";
};
sqlite3 = {
dependencies = [ "mini_portile2" ];
@@ -1932,6 +1948,16 @@
};
version = "2.5.0";
};
ssrf_filter = {
groups = [ "default" ];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1xlpb8y555frl82cx4q2i922mps36mmn0ajk21kpy3bks6wwsgg0";
type = "gem";
};
version = "1.5.0";
};
stimulus-rails = {
dependencies = [ "railties" ];
groups = [ "default" ];
@@ -1943,20 +1969,6 @@
};
version = "1.3.4";
};
stringio = {
groups = [
"default"
"development"
"test"
];
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "1q92y9627yisykyscv0bdsrrgyaajc2qr56dwlzx7ysgigjv4z63";
type = "gem";
};
version = "3.2.0";
};
svg_optimizer = {
dependencies = [ "nokogiri" ];
groups = [
@@ -2120,10 +2132,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0gfv1qxfn202xffasw2mrrrf2jkdp6hsps0177k9fyc0fwb6k3xp";
sha256 = "04snz16b89rwmqjw6v7j8jwfqb2f8jrim631fl30cva1x73hcwvb";
type = "gem";
};
version = "1.1.12";
version = "1.1.14";
};
webrick = {
groups = [ "default" ];
@@ -2157,10 +2169,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "15idgibqpdaj97f734drx8a7k1jcc8wvxlk2nbafac72ihikicjs";
sha256 = "0ij19k6034x0c4hw0ywa7wnk5s912r8aq0hhjss10d5z36q5dicp";
type = "gem";
};
version = "0.8.1";
version = "0.8.2";
};
websocket-extensions = {
groups = [ "default" ];
@@ -2205,10 +2217,10 @@
platforms = [ ];
source = {
remotes = [ "https://rubygems.org" ];
sha256 = "0a3zi3v7qjm7lm4yp9z2sm959533k543sc4z0ixqik8wcfdpw27b";
sha256 = "0lfwngmsz3xq9k9la9890cqpm4vk3rda4171yzms7f3w7x4i3qjj";
type = "gem";
};
version = "0.9.44";
version = "0.9.45";
};
zeitwerk = {
groups = [ "default" ];

View File

@@ -3,6 +3,7 @@
lib,
stdenvNoCC,
fetchurl,
fetchpatch,
bundlerEnv,
ruby_3_4,
makeWrapper,
@@ -72,6 +73,14 @@ stdenvNoCC.mkDerivation (finalAttrs: {
hash = "sha256-YdswCMf9GKOvxVntZW/Tj9+N+CIKxpWYsxkJUYMZC3o=";
};
patches = [
(fetchpatch {
name = "update_rails_7_2_3_2.patch";
url = "https://github.com/redmine/redmine/commit/4817525723f7bd900f12ce8c16f05326c25cbadf.patch";
hash = "sha256-UYmaDnVNpuO0nZuuDHLecBd9rFkDq2jTCCX4Rm0xsB8=";
})
];
nativeBuildInputs = [ makeWrapper ];
buildInputs = [
rubyEnv

View File

@@ -2,7 +2,7 @@
lib,
stdenv,
fetchFromGitHub,
fetchpatch2,
fetchpatch,
autoreconfHook,
perl,
nixosTests,
@@ -22,10 +22,26 @@ stdenv.mkDerivation (finalAttrs: {
patches = [
# Fix case-sensitive matching of "chunked" (CVE-2026-31842)
(fetchpatch2 {
(fetchpatch {
name = "fix-chunked-case-sensitivity.patch";
url = "https://github.com/tinyproxy/tinyproxy/commit/879bf844abffa0bf5fae6aff0c73179024dd9f98.patch";
hash = "sha256-Nav3nXyxdoM/tIvfyPJHEYEjAtrRrJlvkMXzsQCZan4=";
hash = "sha256-kU9Vqf2YtnKNJU4eQlau/ijtXkGPS/n+YSeficfu7JM=";
})
# Remove when updating to the first upstream release containing these fixes.
(fetchpatch {
name = "CVE-2026-54387.patch";
url = "https://github.com/tinyproxy/tinyproxy/commit/623bfc093df009296f0b85d40bc677ef9d5c09bb.patch";
hash = "sha256-BSnK3XkBFW43cnD937RKr7FJzQT90BxJkILXz/QPZo8=";
})
(fetchpatch {
name = "CVE-2026-54388.patch";
url = "https://github.com/tinyproxy/tinyproxy/commit/364cdb67e0ea00a8e4a7037e2693e0711e816adb.patch";
hash = "sha256-+Z/Rj/zNldfOPVzWUlFHa37LEfSh/PtXOaN8z++ONJQ=";
})
(fetchpatch {
name = "CVE-2026-55202.patch";
url = "https://github.com/tinyproxy/tinyproxy/commit/09312a185ae25cc486b4ff5987638a7917a48bce.patch";
hash = "sha256-kwYk5E95KQK42ebLV0nHB706VynDnjHB/5eENKO7Eaw=";
})
];

View File

@@ -23,7 +23,6 @@
dbus,
cups,
libexif,
ffmpeg,
systemd,
libva,
libGL,
@@ -67,7 +66,7 @@
stdenv.mkDerivation rec {
pname = "vivaldi";
version = "8.1.4087.48";
version = "8.1.4087.58";
suffix =
{
@@ -80,8 +79,8 @@ stdenv.mkDerivation rec {
url = "https://downloads.vivaldi.com/stable/vivaldi-stable_${version}-1_${suffix}.deb";
hash =
{
aarch64-linux = "sha256-T6mBi4FpHz2iGXeF91giTbuVp4KjFG1DUnPNpKEV06c=";
x86_64-linux = "sha256-/Bgh+Y6DHWe7al9vLsWWH1HM5JQGwv91KUxQ9TNkqjs=";
aarch64-linux = "sha256-Yvs3HRbsrgTeYXAKrRliLArXtK96jnjjf7x/sdpwvig=";
x86_64-linux = "sha256-/2GdNvj9+O6LDfqJdjNNdNWJymNAtnpTnzznW/4jINE=";
}
.${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
};
@@ -131,7 +130,6 @@ stdenv.mkDerivation rec {
gtk3
gdk-pixbuf
libexif
ffmpeg
systemd
libva
qt6.qtbase
@@ -163,7 +161,7 @@ stdenv.mkDerivation rec {
+ lib.optionalString (stdenv.hostPlatform.is64bit) (
":" + lib.makeSearchPathOutput "lib" "lib64" buildInputs
)
+ ":$out/opt/vivaldi/lib";
+ ":$out/opt/vivaldi";
buildPhase = ''
runHook preBuild

View File

@@ -2,12 +2,18 @@ diff --git a/warpgate-common/src/version.rs b/warpgate-common/src/version.rs
index 0e7985a..62c2b67 100644
--- a/warpgate-common/src/version.rs
+++ b/warpgate-common/src/version.rs
@@ -1,8 +1,3 @@
@@ -1,14 +1,3 @@
-use git_version::git_version;
-
pub const fn warpgate_version() -> &'static str {
- git_version!(
- args = ["--tags", "--always", "--dirty=-modified"],
- args = [
- "--tags",
- "--always",
- "--dirty=-modified",
- "--match",
- "v[0-9]*"
- ],
- fallback = "unknown"
- )
+ "v@version@"

View File

@@ -1,12 +1,12 @@
{
lib,
replaceVars,
fetchurl,
fetchFromGitHub,
rustPlatform,
buildNpmPackage,
openapi-generator-cli,
nixosTests,
nix-update-script,
}:
rustPlatform.buildRustPackage (
finalAttrs:
@@ -20,7 +20,7 @@ rustPlatform.buildRustPackage (
patches = [ ./web-ui-package-json.patch ];
npmDepsHash = "sha256-JW3nibMIETj5PQcaNRS5UVZgguSvGd9Bw8uGD3kb5uM=";
npmDepsHash = "sha256-McQI5EmTfrbdcWnYRsoRHjhZphrZVaV/fN9i9MX8XF0=";
nativeBuildInputs = [ openapi-generator-cli ];
@@ -35,16 +35,16 @@ rustPlatform.buildRustPackage (
in
{
pname = "warpgate";
version = "0.23.4";
version = "0.26.1";
src = fetchFromGitHub {
owner = "warp-tech";
repo = "warpgate";
tag = "v${finalAttrs.version}";
hash = "sha256-/IhnDBQq7Ed5vaGiCHNTcE7Uu9b9VrBN1ipCd2Tai1o=";
hash = "sha256-1Dg7bzhBQNe+u90Tw+kcmVaxV5IK0/t505HZr18qP5I=";
};
cargoHash = "sha256-PRR+bzvmWcWUVdV1HqDqD08SwvDCvGXMvkIVoFEnaQI=";
cargoHash = "sha256-A5rRLrqlAZV/3ID8F+wUO8OP3Ocivg7vYrNDiMqRKik=";
patches = [
(replaceVars ./hardcode-version.patch { inherit (finalAttrs) version; })
@@ -67,13 +67,20 @@ rustPlatform.buildRustPackage (
# skip check, project included tests require python stuff and docker
doCheck = false;
passthru.tests = {
inherit (nixosTests) warpgate;
passthru = {
inherit warpgate-web;
tests = {
inherit (nixosTests) warpgate;
};
updateScript = nix-update-script {
extraArgs = [ "--subpackage=warpgate-web" ];
};
};
meta = {
description = "Smart SSH, HTTPS, MySQL and Postgres bastion that requires no additional client-side software";
homepage = "https://warpgate.null.page";
changelog = "https://github.com/warp-tech/warpgate/releases/tag/v${finalAttrs.version}";
license = lib.licenses.asl20;
platforms = lib.platforms.linux ++ lib.platforms.darwin;
mainProgram = "warpgate";

View File

@@ -2,25 +2,30 @@ diff --git a/Cargo.toml b/Cargo.toml
index 0e92acb..d187ebc 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -100,21 +100,3 @@ strip = "debuginfo"
@@ -1,5 +1,3 @@
-cargo-features = ["profile-rustflags"]
-
[workspace]
members = [
"warpgate",
@@ -160,20 +158,2 @@
[profile.coverage]
inherits = "dev"
# rustflags = ["-Cinstrument-coverage"]
-
-[profile.dev.package.aws-sdk-ec2]
-rustflags = ["-Zhint-mostly-unused"]
-hint-mostly-unused = true
-
-[profile.release.package.aws-sdk-ec2]
-rustflags = ["-Zhint-mostly-unused"]
-hint-mostly-unused = true
-
-[profile.dev.package.aws-sdk-rds]
-rustflags = ["-Zhint-mostly-unused"]
-hint-mostly-unused = true
-
-[profile.release.package.aws-sdk-rds]
-rustflags = ["-Zhint-mostly-unused"]
-hint-mostly-unused = true
-
-[profile.dev.package.aws-sdk-eks]
-rustflags = ["-Zhint-mostly-unused"]
-hint-mostly-unused = true
-
-[profile.release.package.aws-sdk-eks]
-rustflags = ["-Zhint-mostly-unused"]
-hint-mostly-unused = true

View File

@@ -14,20 +14,20 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "zigbee2mqtt";
version = "2.12.1";
version = "2.13.0";
src = fetchFromGitHub {
owner = "Koenkk";
repo = "zigbee2mqtt";
tag = finalAttrs.version;
hash = "sha256-DTL27AcPmAI5XEEHb2S74LYWm4f6kUASsTmQeGftDzM=";
hash = "sha256-JSmJXjEF0dQ1sWyXvtLmN9gfAg3PjXWPOlb7xCxz8RI=";
};
pnpmDeps = fetchPnpmDeps {
inherit (finalAttrs) pname version src;
pnpm = pnpm_10;
fetcherVersion = 4;
hash = "sha256-RI6tz8pyqYg/L6wSc0Rt5ZqHT8aktReyVjNgISPqKRQ=";
hash = "sha256-5S3VnPxR7P4dwXcFQSjNbTJ5KOWteb4ZBpTy7gtoY4I=";
};
nativeBuildInputs = [

View File

@@ -69,16 +69,16 @@ let
in
{
php82 = mkPhp {
version = "8.2.32";
hash = "sha256-jyHpiMpN1eFN2fuImIRIeENWbkhygAJ8Tvq2yTGIotE=";
version = "8.2.33";
hash = "sha256-U2Lyp6DnFoznIv6gBIsaHSjg98wmXEF99nDGVnBpUBg=";
};
php83 = mkPhp {
version = "8.3.32";
hash = "sha256-93fKJGYZZvlLMfaEDNrUN88wUBU324uHKxt6HCRLjQI=";
version = "8.3.33";
hash = "sha256-+cn00M12ksbj2jY81MpyqCakmuGPXtQwtvyue8KIHhg=";
};
php84 = mkPhp {
version = "8.4.23";
hash = "sha256-wULAY7EM/2jQcnZuP/v7NlSgibk4ZosIMDVkN+6V4Po=";
version = "8.4.24";
hash = "sha256-KGiQRHWIUQ3xEO3p6c4J8etPmFZjC0f9xA7OcOIDc88=";
};
php85 = mkPhp {
version = "8.5.9";

View File

@@ -36,6 +36,11 @@ buildPythonPackage rec {
url = "https://github.com/eclipse-paho/paho.mqtt.python/pull/931.diff";
hash = "sha256-A7rWwpR4PnCi77F1VqsQKHBxHNrdeHgmVM6BGMeUpjs=";
})
# backports an upstream fix for flaky tests as repoted here:
# https://github.com/NixOS/nixpkgs/issues/542586
# the fix has already landed in master of paho-mqtt:
# https://github.com/eclipse-paho/paho.mqtt.python/pull/934
./fix-flaky-tests-backport-934.patch
];
build-system = [

View File

@@ -0,0 +1,184 @@
diff --git a/tests/lib/conftest.py b/tests/lib/conftest.py
index 98bbebe..5999085 100644
--- a/tests/lib/conftest.py
+++ b/tests/lib/conftest.py
@@ -2,6 +2,7 @@ import os
import signal
import subprocess
import sys
+import time
import pytest
@@ -45,7 +46,29 @@ def alpn_ssl_server_socket(monkeypatch, ssl_certs_path):
yield from _yield_server(monkeypatch, create_server_socket_ssl(path=ssl_certs_path, alpn_protocols=["paho-test-protocol"]))
-def stop_process(proc: subprocess.Popen) -> None:
+def terminate_process(proc: subprocess.Popen) -> None:
+ proc.terminate()
+ try:
+ # At least on Unix, terminate() isn't an unconditional kill, process
+ # could ignore/handle it.
+ proc.wait(1)
+ except subprocess.TimeoutExpired:
+ # So use kill which is unstoppable on Unix
+ proc.kill()
+ proc.wait(1) # If here we timeout, there is nothing more to do.
+
+
+def stop_process(proc: subprocess.Popen, ready_file) -> None:
+ deadline = time.monotonic() + 5
+ while proc.poll() is None and not ready_file.exists():
+ if time.monotonic() >= deadline:
+ terminate_process(proc)
+ raise RuntimeError("Client did not become ready to stop")
+ time.sleep(0.01)
+
+ if proc.poll() is not None:
+ return
+
if sys.platform == "win32":
proc.send_signal(signal.CTRL_C_EVENT)
else:
@@ -53,17 +76,19 @@ def stop_process(proc: subprocess.Popen) -> None:
try:
proc.wait(5)
except subprocess.TimeoutExpired:
- proc.terminate()
+ terminate_process(proc)
@pytest.fixture()
-def start_client(request: pytest.FixtureRequest, ssl_certs_path):
+def start_client(request: pytest.FixtureRequest, ssl_certs_path, tmp_path):
def starter(name: str, expected_returncode: int = 0) -> None:
client_path = clients_path / name
if not client_path.exists():
raise FileNotFoundError(client_path)
+ ready_file = tmp_path / f"{name}.ready"
env = dict(
os.environ,
+ PAHO_TEST_READY_FILE=str(ready_file),
PAHO_SSL_PATH=str(ssl_certs_path),
PYTHONPATH=f"{tests_path}{os.pathsep}{os.environ.get('PYTHONPATH', '')}",
)
@@ -74,7 +99,7 @@ def start_client(request: pytest.FixtureRequest, ssl_certs_path):
], env=env)
def fin():
- stop_process(proc)
+ stop_process(proc, ready_file)
if proc.returncode != expected_returncode:
raise RuntimeError(f"Client {name} exited with code {proc.returncode}, expected {expected_returncode}")
diff --git a/tests/paho_test.py b/tests/paho_test.py
index 3df996e..188ceef 100644
--- a/tests/paho_test.py
+++ b/tests/paho_test.py
@@ -402,6 +402,11 @@ def pack_remaining_length(remaining_length):
if remaining_length == 0:
return s
+def signal_client_ready():
+ ready_file = os.environ.get("PAHO_TEST_READY_FILE")
+ if ready_file is not None:
+ with open(ready_file, "w"):
+ pass
def loop_until_keyboard_interrupt(mqttc):
"""
@@ -413,6 +418,7 @@ def loop_until_keyboard_interrupt(mqttc):
and stop the client gracefully.
"""
try:
+ signal_client_ready()
while True:
mqttc.loop()
except KeyboardInterrupt:
@@ -431,6 +437,7 @@ def wait_for_keyboard_interrupt():
"""
yield # If we get a KeyboardInterrupt during the block, it's too soon!
try:
+ signal_client_ready()
while True:
time.sleep(0.1)
except KeyboardInterrupt:
diff --git a/tests/test_client.py b/tests/test_client.py
index 09e4606..86652ca 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -864,19 +864,19 @@ class TestCompatibility:
disconnect_packet = paho_test.gen_disconnect()
fake_broker.expect_packet("disconnect", disconnect_packet)
- assert callback_called == [
- "on_connect",
- "on_subscribe",
- "on_publish",
- "on_message",
- "on_unsubscribe",
- "on_disconnect",
- ]
-
finally:
mqttc.disconnect()
mqttc.loop_stop()
+ assert callback_called == [
+ "on_connect",
+ "on_subscribe",
+ "on_publish",
+ "on_message",
+ "on_unsubscribe",
+ "on_disconnect",
+ ]
+
packet_in = fake_broker.receive_packet(1)
assert not packet_in # Check connection is closed
@@ -1004,18 +1004,18 @@ class TestCompatibility:
disconnect_packet = paho_test.gen_disconnect()
fake_broker.expect_packet("disconnect", disconnect_packet)
- assert callback_called == [
- "on_connect",
- "on_subscribe",
- "on_publish",
- "on_message",
- "on_unsubscribe",
- "on_disconnect",
- ]
-
finally:
mqttc.disconnect()
mqttc.loop_stop()
+ assert callback_called == [
+ "on_connect",
+ "on_subscribe",
+ "on_publish",
+ "on_message",
+ "on_unsubscribe",
+ "on_disconnect",
+ ]
+
packet_in = fake_broker.receive_packet(1)
assert not packet_in # Check connection is closed
diff --git a/tests/testsupport/broker.py b/tests/testsupport/broker.py
index e08cf73..a587599 100644
--- a/tests/testsupport/broker.py
+++ b/tests/testsupport/broker.py
@@ -59,8 +59,10 @@ class FakeBroker:
if self._conn is None:
raise ValueError('Connection is not open')
- packet_in = self._conn.recv(num_bytes)
- return packet_in
+ try:
+ return self._conn.recv(num_bytes)
+ except ConnectionResetError:
+ return b""
def send_packet(self, packet_out):
if self._conn is None:

View File

@@ -14,6 +14,9 @@
xmlto,
meson,
ninja,
gnome,
librsvg,
makeWrapper,
acl,
appstream,
@@ -42,6 +45,11 @@
attr,
}:
let
gdkPixbufLoadersCache = gnome._gdkPixbufCacheBuilder_DO_NOT_USE {
extraLoaders = [ librsvg ];
};
in
stdenv.mkDerivation (finalAttrs: {
pname = "flatpak-builder";
version = "1.4.4";
@@ -95,6 +103,7 @@ stdenv.mkDerivation (finalAttrs: {
libxslt
pkg-config
xmlto
makeWrapper
];
buildInputs = [
@@ -132,6 +141,7 @@ stdenv.mkDerivation (finalAttrs: {
for file in ${installed_testdir}/{test-builder.sh,test-builder-python.sh,test-builder-deprecated.sh}; do
patchShebangs $file
done
wrapProgram $out/bin/flatpak-builder --set GDK_PIXBUF_MODULE_FILE ${gdkPixbufLoadersCache}
'';
passthru = {

View File

@@ -348,7 +348,7 @@ let
dontDisableStatic = true;
configureScript = "${python.interpreter} configure.py";
configureScript = "${python.pythonOnBuildForHost.interpreter} configure.py";
# In order to support unsupported cross configurations, we copy some intermediate executables
# from a native build and replace all the build-system tools with a script which simply touches

View File

@@ -43,5 +43,8 @@ callPackage ../nginx/generic.nix args rec {
license = lib.licenses.bsd2;
platforms = lib.platforms.all;
maintainers = with lib.maintainers; [ izorkin ];
knownVulnerabilities = [
"angie is insufficiently maintained in nixpkgs. Security updates are frequently delayed. Please consider stepping up as maintainer or switching to an alternative."
];
};
}

View File

@@ -1,5 +1,6 @@
import ./generic.nix {
version = "1.10.4";
hash = "sha256-+PutvVt7mqnZN+/vr0FwstB8JPuO3kJ4TSmX2Sx8WvA=";
cargoHash = "sha256-rfANfheiQnHEcbBODRW0nrPrlPdWQx3S7NmSQ50q010=";
version = "1.10.5";
hash = "sha256-mNdG5iPtnhwvy9PABaRPV6KQfvD+/ZKH2hC6Hfo0y48=";
cargoHash = "sha256-UE/jZaX/mEJUHBqsk2o0rBcocpoFg5XWAmVk4smm5mc=";
eolDate = "2026-08-31";
}

View File

@@ -0,0 +1,5 @@
import ./generic.nix {
version = "1.11.0";
hash = "sha256-3dcJxJx8UFebW6WMdVTH6kfsNBed+55JFwHWVhZulOU=";
cargoHash = "sha256-qOs/uSs3iaiTGsqydpNbZ6KSLNE+k+5bM7k3ijRzNT0=";
}

View File

@@ -91,14 +91,23 @@ rustPlatform.buildRustPackage (finalAttrs: {
// lib.optionalAttrs (lib.versionAtLeast finalAttrs.version "1.9") {
server_migration_path = "/etc/kanidm/migrations.d";
};
# lower required rust-version in Cargo.toml to allow backporting
rustVersion =
if lib.versionAtLeast finalAttrs.version "1.11" then
{
from = "1.96";
to = "1.95";
}
else
null;
in
''
cp ${format profile} libs/profiles/${finalAttrs.env.KANIDM_BUILD_PROFILE}.toml
substituteInPlace libs/profiles/${finalAttrs.env.KANIDM_BUILD_PROFILE}.toml --replace-fail '@htmx_ui_pkg_path@' "$out/ui/hpkg"
''
+ lib.optionalString (lib.versionAtLeast finalAttrs.version "1.9") ''
+ lib.optionalString (rustVersion != null) ''
substituteInPlace Cargo.toml \
--replace-fail 'rust-version = "1.93"' 'rust-version = "1.91"'
--replace-fail 'rust-version = "${rustVersion.from}"' 'rust-version = "${rustVersion.to}"'
'';
nativeBuildInputs = [

View File

@@ -0,0 +1,159 @@
From 5b97267c49def10f5a4b7bb372963261c0f4b08d Mon Sep 17 00:00:00 2001
From: oddlama <oddlama@oddlama.org>
Date: Fri, 1 May 2026 15:01:05 +0200
Subject: [PATCH 1/2] oauth2 basic secret modify
---
server/core/src/actors/v1_write.rs | 42 +++++++++++++++++++++++++++++
server/core/src/https/v1.rs | 6 ++++-
server/core/src/https/v1_oauth2.rs | 29 ++++++++++++++++++++
server/lib/src/server/migrations.rs | 16 +++++++++++
4 files changed, 92 insertions(+), 1 deletion(-)
diff --git a/server/core/src/actors/v1_write.rs b/server/core/src/actors/v1_write.rs
index 977292ae9..bf79c42a1 100644
--- a/server/core/src/actors/v1_write.rs
+++ b/server/core/src/actors/v1_write.rs
@@ -326,6 +326,48 @@ impl QueryServerWriteV1 {
.and_then(|_| idms_prox_write.commit().map(|_| ()))
}
+ #[instrument(
+ level = "info",
+ skip_all,
+ fields(uuid = ?eventid)
+ )]
+ pub async fn handle_oauth2_basic_secret_write(
+ &self,
+ client_auth_info: ClientAuthInfo,
+ filter: Filter<FilterInvalid>,
+ new_secret: String,
+ eventid: Uuid,
+ ) -> Result<(), OperationError> {
+ // Given a protoEntry, turn this into a modification set.
+ let ct = duration_from_epoch_now();
+ let mut idms_prox_write = self.idms.proxy_write(ct).await?;
+ let ident = idms_prox_write
+ .validate_client_auth_info_to_ident(client_auth_info, ct)
+ .map_err(|e| {
+ admin_error!(err = ?e, "Invalid identity");
+ e
+ })?;
+
+ let modlist = ModifyList::new_purge_and_set(
+ Attribute::OAuth2RsBasicSecret,
+ Value::SecretValue(new_secret),
+ );
+
+ let mdf =
+ ModifyEvent::from_internal_parts(ident, &modlist, &filter, &idms_prox_write.qs_write)
+ .map_err(|e| {
+ admin_error!(err = ?e, "Failed to begin modify during handle_oauth2_basic_secret_write");
+ e
+ })?;
+
+ trace!(?mdf, "Begin modify event");
+
+ idms_prox_write
+ .qs_write
+ .modify(&mdf)
+ .and_then(|_| idms_prox_write.commit())
+ }
+
#[instrument(
level = "info",
skip_all,
diff --git a/server/core/src/https/v1.rs b/server/core/src/https/v1.rs
index ba3ea2827..489ce0002 100644
--- a/server/core/src/https/v1.rs
+++ b/server/core/src/https/v1.rs
@@ -10,7 +10,7 @@ use axum::extract::{Path, State};
use axum::http::{HeaderMap, HeaderValue};
use axum::middleware::from_fn;
use axum::response::{IntoResponse, Response};
-use axum::routing::{delete, get, post, put};
+use axum::routing::{delete, get, post, put, patch};
use axum::{Extension, Json, Router};
use axum_extra::extract::cookie::{Cookie, CookieJar, SameSite};
use compact_jwt::{Jwk, Jws, JwsSigner};
@@ -3156,6 +3156,10 @@ pub(crate) fn route_setup(state: ServerState) -> Router<ServerState> {
"/v1/oauth2/{rs_name}/_basic_secret",
get(super::v1_oauth2::oauth2_id_get_basic_secret),
)
+ .route(
+ "/v1/oauth2/{rs_name}/_basic_secret",
+ patch(super::v1_oauth2::oauth2_id_patch_basic_secret),
+ )
.route(
"/v1/oauth2/{rs_name}/_scopemap/{group}",
post(super::v1_oauth2::oauth2_id_scopemap_post)
diff --git a/server/core/src/https/v1_oauth2.rs b/server/core/src/https/v1_oauth2.rs
index fdc3647b4..ed4709d27 100644
--- a/server/core/src/https/v1_oauth2.rs
+++ b/server/core/src/https/v1_oauth2.rs
@@ -149,6 +149,35 @@ pub(crate) async fn oauth2_id_get_basic_secret(
.map_err(WebError::from)
}
+#[utoipa::path(
+ patch,
+ path = "/v1/oauth2/{rs_name}/_basic_secret",
+ request_body=ProtoEntry,
+ responses(
+ DefaultApiResponse,
+ ),
+ security(("token_jwt" = [])),
+ tag = "v1/oauth2",
+ operation_id = "oauth2_id_patch_basic_secret"
+)]
+/// Overwrite the basic secret for a given OAuth2 Resource Server.
+#[instrument(level = "info", skip(state, new_secret))]
+pub(crate) async fn oauth2_id_patch_basic_secret(
+ State(state): State<ServerState>,
+ Extension(kopid): Extension<KOpId>,
+ VerifiedClientInformation(client_auth_info): VerifiedClientInformation,
+ Path(rs_name): Path<String>,
+ Json(new_secret): Json<String>,
+) -> Result<Json<()>, WebError> {
+ let filter = oauth2_id(&rs_name);
+ state
+ .qe_w_ref
+ .handle_oauth2_basic_secret_write(client_auth_info, filter, new_secret, kopid.eventid)
+ .await
+ .map(Json::from)
+ .map_err(WebError::from)
+}
+
#[utoipa::path(
patch,
path = "/v1/oauth2/{rs_name}",
diff --git a/server/lib/src/server/migrations.rs b/server/lib/src/server/migrations.rs
index b3effb95b..5c6a56d24 100644
--- a/server/lib/src/server/migrations.rs
+++ b/server/lib/src/server/migrations.rs
@@ -220,6 +220,22 @@ impl QueryServer {
reload_required = true;
};
+ // secret provisioning: allow idm_admin to modify OAuth2RsBasicSecret.
+ write_txn.internal_modify_uuid(
+ UUID_IDM_ACP_OAUTH2_MANAGE_V1,
+ &ModifyList::new_append(
+ Attribute::AcpCreateAttr,
+ Attribute::OAuth2RsBasicSecret.into(),
+ ),
+ )?;
+ write_txn.internal_modify_uuid(
+ UUID_IDM_ACP_OAUTH2_MANAGE_V1,
+ &ModifyList::new_append(
+ Attribute::AcpModifyPresentAttr,
+ Attribute::OAuth2RsBasicSecret.into(),
+ ),
+ )?;
+
// Execute whatever operations we have batched up and ready to go. This is needed
// to preserve ordering of the operations - if we reloaded after a remigrate then
// we would have skipped the patch level fix which needs to have occurred *first*.
--
2.53.0

View File

@@ -0,0 +1,128 @@
From e8cd69afcee9d8d37233fa998cf9d1fa124ae90d Mon Sep 17 00:00:00 2001
From: oddlama <oddlama@oddlama.org>
Date: Fri, 1 May 2026 15:01:14 +0200
Subject: [PATCH 2/2] recover account
---
server/core/src/actors/internal.rs | 5 +++--
server/core/src/admin.rs | 6 +++---
server/daemon/src/main.rs | 24 +++++++++++++++++++++++-
server/daemon/src/opt.rs | 7 +++++++
4 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/server/core/src/actors/internal.rs b/server/core/src/actors/internal.rs
index deed7350d..f4e9e486a 100644
--- a/server/core/src/actors/internal.rs
+++ b/server/core/src/actors/internal.rs
@@ -189,17 +189,18 @@ impl QueryServerWriteV1 {
#[instrument(
level = "info",
- skip(self, eventid),
+ skip(self, password, eventid),
fields(uuid = ?eventid)
)]
pub(crate) async fn handle_admin_recover_account(
&self,
name: String,
+ password: Option<String>,
eventid: Uuid,
) -> Result<String, OperationError> {
let ct = duration_from_epoch_now();
let mut idms_prox_write = self.idms.proxy_write(ct).await?;
- let pw = idms_prox_write.recover_account(name.as_str(), None)?;
+ let pw = idms_prox_write.recover_account(name.as_str(), password.as_deref())?;
idms_prox_write.commit().map(|()| pw)
}
diff --git a/server/core/src/admin.rs b/server/core/src/admin.rs
index 6a13dcaab..6b1070113 100644
--- a/server/core/src/admin.rs
+++ b/server/core/src/admin.rs
@@ -27,7 +27,7 @@ const REPL_CTRL_TIMEOUT: Duration = Duration::from_secs(15);
#[derive(Serialize, Deserialize, Debug)]
pub enum AdminTaskRequest {
- RecoverAccount { name: String },
+ RecoverAccount { name: String, password: Option<String> },
DisableAccount { name: String },
ShowReplicationCertificate,
ShowReplicationCertificateMetadata,
@@ -416,8 +416,8 @@ async fn handle_client(
let resp = async {
match req {
- AdminTaskRequest::RecoverAccount { name } => {
- match server_rw.handle_admin_recover_account(name, eventid).await {
+ AdminTaskRequest::RecoverAccount { name, password } => {
+ match server_rw.handle_admin_recover_account(name, password, eventid).await {
Ok(password) => AdminTaskResponse::RecoverAccount { password },
Err(e) => {
error!(err = ?e, "error during recover-account");
diff --git a/server/daemon/src/main.rs b/server/daemon/src/main.rs
index 13653a5cb..ae560f9ce 100644
--- a/server/daemon/src/main.rs
+++ b/server/daemon/src/main.rs
@@ -380,11 +380,32 @@ fn check_file_ownership(opt: &KanidmdParser) -> Result<(), ExitCode> {
async fn scripting_command(cmd: ScriptingCommand, config: Configuration) -> ExitCode {
match cmd {
- ScriptingCommand::RecoverAccount { name } => {
+ ScriptingCommand::RecoverAccount { name, from_environment } => {
+ let password = if from_environment {
+ match std::env::var("KANIDM_RECOVER_ACCOUNT_PASSWORD_FILE") {
+ Ok(path) => match tokio::fs::read_to_string(&path).await {
+ Ok(contents) => Some(contents),
+ Err(e) => {
+ error!("Failed to read password file '{}': {}", path, e);
+ return ExitCode::FAILURE;
+ }
+ },
+ Err(_) => match std::env::var("KANIDM_RECOVER_ACCOUNT_PASSWORD") {
+ Ok(val) => Some(val),
+ Err(_) => {
+ error!("Neither KANIDM_RECOVER_ACCOUNT_PASSWORD_FILE nor KANIDM_RECOVER_ACCOUNT_PASSWORD was set");
+ return ExitCode::FAILURE;
+ }
+ }
+ }
+ } else {
+ None
+ };
submit_admin_req_json(
config.adminbindpath.as_str(),
AdminTaskRequest::RecoverAccount {
name: name.to_owned(),
+ password,
},
)
.await;
@@ -1008,6 +1029,7 @@ async fn kanidm_main(config: Configuration, opt: KanidmdParser) -> ExitCode {
config.adminbindpath.as_str(),
AdminTaskRequest::RecoverAccount {
name: name.to_owned(),
+ password: None,
},
)
.await;
diff --git a/server/daemon/src/opt.rs b/server/daemon/src/opt.rs
index 524ba3134..fa3d70f44 100644
--- a/server/daemon/src/opt.rs
+++ b/server/daemon/src/opt.rs
@@ -128,6 +128,13 @@ enum ScriptingCommand {
#[clap(value_parser)]
/// The account name to recover credentials for.
name: String,
+ /// Use a password given via an environment variable.
+ /// - `KANIDM_RECOVER_ACCOUNT_PASSWORD_FILE` takes precedence and reads the desired
+ /// password from the given file
+ /// - `KANIDM_RECOVER_ACCOUNT_PASSWORD` directly takes a
+ /// password - beware that this will leave the password in the environment
+ #[clap(long = "from-environment")]
+ from_environment: bool,
},
/// Backup
Backup {
--
2.53.0

View File

@@ -50,11 +50,11 @@ assert !(withJemalloc && withTcmalloc);
stdenv.mkDerivation (finalAttrs: {
pname = "percona-server";
version = "8.4.8-8";
version = "8.4.10-10";
src = fetchurl {
url = "https://downloads.percona.com/downloads/Percona-Server-${lib.versions.majorMinor finalAttrs.version}/Percona-Server-${finalAttrs.version}/source/tarball/percona-server-${finalAttrs.version}.tar.gz";
hash = "sha256-jsGaovy3FNBrprC27R7cNofAZmTjqSK21U6wn6TEiBA=";
hash = "sha256-IjHeflYc3AMd6hNXDEYegXm14wjyt9hX3gIVtOQzauU=";
};
nativeBuildInputs = [

View File

@@ -12,6 +12,9 @@
addons ? [ ],
}:
let
extraLdLibraries = lib.flatten (map (x: x.extraLdLibraries or [ ]) addons);
in
symlinkJoin {
name = "fcitx5-with-addons-${fcitx5.version}";
@@ -37,10 +40,11 @@ symlinkJoin {
--set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" \
--prefix FCITX_ADDON_DIRS : "$out/lib/fcitx5" \
--suffix XDG_DATA_DIRS : "$out/share" \
--suffix PATH : "$out/bin" \
--suffix LD_LIBRARY_PATH : "${
lib.makeLibraryPath (lib.flatten (map (x: x.extraLdLibraries or [ ]) addons))
}"
--suffix PATH : "$out/bin" ${
lib.optionalString (
extraLdLibraries != [ ]
) ''--suffix LD_LIBRARY_PATH : "${lib.makeLibraryPath extraLdLibraries}"''
}
${lib.optionalString withConfigtool ''
# Configtool call libexec/fcitx5-qt5-gui-wrapper for gui addons in FCITX_ADDON_DIRS

View File

@@ -1596,6 +1596,7 @@ mapAliases {
oil = throw "'oil' has been renamed to/replaced by 'oils-for-unix'"; # Converted to throw 2025-10-27
olaris-server = throw "'olaris-server' has been removed as it failed to build since 2024"; # Added 2026-01-15
olive-editor = throw "'olive-editor' has been removed as it is unmaintained upstream and broken"; # Added 2026-05-22
omxplayer = throw "'omxplayer' has been removed because it depends on a severely outdated upstream, a severely outdated FFmpeg, and the new upstream was deprecated since 2020. Please use 'vlc' instead."; # Added 2026-07-24
oneDNN = onednn; # Added 2026-02-08
oneDNN_2 = onednn_2; # Added 2026-02-08
onevpl-intel-gpu = throw "'onevpl-intel-gpu' has been renamed to/replaced by 'vpl-gpu-rt'"; # Converted to throw 2025-10-27

View File

@@ -7748,17 +7748,23 @@ with pkgs;
kanidm_1_10 = callPackage ../servers/kanidm/1_10.nix {
kanidmWithSecretProvisioning = kanidmWithSecretProvisioning_1_10;
};
kanidm_1_11 = callPackage ../servers/kanidm/1_11.nix {
kanidmWithSecretProvisioning = kanidmWithSecretProvisioning_1_11;
};
kanidmWithSecretProvisioning_1_8 = kanidm_1_8.override { enableSecretProvisioning = true; };
kanidmWithSecretProvisioning_1_9 = kanidm_1_9.override { enableSecretProvisioning = true; };
kanidmWithSecretProvisioning_1_10 = kanidm_1_10.override { enableSecretProvisioning = true; };
kanidmWithSecretProvisioning_1_11 = kanidm_1_11.override { enableSecretProvisioning = true; };
})
kanidm_1_8
kanidm_1_9
kanidm_1_10
kanidm_1_11
kanidmWithSecretProvisioning_1_8
kanidmWithSecretProvisioning_1_9
kanidmWithSecretProvisioning_1_10
kanidmWithSecretProvisioning_1_11
;
lemmy-server = callPackage ../servers/web-apps/lemmy/server.nix { };

View File

@@ -8914,8 +8914,21 @@ with self;
url = "mirror://cpan/authors/id/S/SB/SBECK/Date-Manip-6.98.tar.gz";
hash = "sha256-rP2KYFGbpM0YHIpnqD1/ApxtmrTosCEtxH5B1iEP2kk=";
};
# Remove when updating to the first release containing both CVE fixes.
patches = [
(fetchpatch {
name = "CVE-2026-60074.patch";
url = "https://security.metacpan.org/patches/D/Date-Manip/6.99/CVE-2026-60074-r1.patch";
hash = "sha256-leXFfzLyy0yBpBXgT3u3ZyFaIbsbJSFzVkdam9hb3+0=";
})
(fetchpatch {
name = "CVE-2026-60075.patch";
url = "https://security.metacpan.org/patches/D/Date-Manip/6.99/CVE-2026-60075-r1.patch";
hash = "sha256-vMsOrUhrfn8efKRzfJ+jaypOHER8MlUIob5u88n/TAw=";
})
];
# for some reason, parsing /etc/localtime does not work anymore - make sure that the fallback "/bin/date +%Z" will work
patchPhase = ''
postPatch = ''
sed -i "s#/bin/date#${pkgs.coreutils}/bin/date#" lib/Date/Manip/TZ.pm
'';
doCheck = !stdenv.hostPlatform.isi686; # build freezes during tests on i686