From dbdcfa7e1b731c47a39e0f7babd32eefee53bc28 Mon Sep 17 00:00:00 2001 From: Viktor Ashirov Date: Fri, 27 Feb 2026 15:25:23 +0100 Subject: [PATCH] Bump version to 3.2.0-4 - Resolves: RHEL-86312 - Crash in trim_changelog() during the Retro Changelog trimming. - Resolves: RHEL-133085 - Replica installation is failing with message MDB_BAD_VALSIZE: Unsupported size of key/DB name/data, or wrong DUPFIXED - Resolves: RHEL-137072 - CVE-2025-14905 389-ds-base: 389-ds-base: Remote Code Execution and Denial of Service via heap buffer overflow [rhel-10.2] - Resolves: RHEL-138729 - Crash ( Segmentation fault ) in atomic_compare_exchange() --- ...Issue-5853-Update-concread-to-0.5.10.patch | 952 +++++++++++++ ...ns-that-create-threads-need-to-updat.patch | 86 ++ ...chaining-environment-binding-as-remo.patch | 40 + ...x-typo-in-export-certificate-dialog-.patch | 46 + ...prove-password-policy-field-validati.patch | 1178 +++++++++++++++++ ...ct-formatting-of-Gen-as-CSN-in-dsctl.patch | 34 + 0063-Security-fix-for-CVE-2025-14905.patch | 93 ++ ...AD_VALSIZE-error-when-updating-index.patch | 654 +++++++++ 389-ds-base.spec | 20 +- sources | 4 +- 10 files changed, 3099 insertions(+), 8 deletions(-) create mode 100644 0057-Issue-5853-Update-concread-to-0.5.10.patch create mode 100644 0058-Issue-7271-plugins-that-create-threads-need-to-updat.patch create mode 100644 0059-Issue-7273-In-a-chaining-environment-binding-as-remo.patch create mode 100644 0060-Issue-7279-UI-Fix-typo-in-export-certificate-dialog-.patch create mode 100644 0061-Issue-7275-UI-Improve-password-policy-field-validati.patch create mode 100644 0062-Issue-7246-correct-formatting-of-Gen-as-CSN-in-dsctl.patch create mode 100644 0063-Security-fix-for-CVE-2025-14905.patch create mode 100644 0064-Issue-7267-MDB_BAD_VALSIZE-error-when-updating-index.patch diff --git a/0057-Issue-5853-Update-concread-to-0.5.10.patch b/0057-Issue-5853-Update-concread-to-0.5.10.patch new file mode 100644 index 0000000..c22eb4e --- /dev/null +++ b/0057-Issue-5853-Update-concread-to-0.5.10.patch @@ -0,0 +1,952 @@ +From 0e2d9c4288873446dcb3d8bff61c558ff2b6681a Mon Sep 17 00:00:00 2001 +From: Viktor Ashirov +Date: Mon, 23 Feb 2026 09:49:52 +0100 +Subject: [PATCH] Issue 5853 - Update concread to 0.5.10 + +Description: +Update concread to 0.5.10 and update Cargo.lock + +Relates: https://github.com/389ds/389-ds-base/issues/5853 + +Reviewed by: @droideck (Thanks!) +--- + src/Cargo.lock | 515 +++++++++++++++++++++++---------------- + src/librslapd/Cargo.toml | 2 +- + 2 files changed, 312 insertions(+), 205 deletions(-) + +diff --git a/src/Cargo.lock b/src/Cargo.lock +index 87aeee852..425371478 100644 +--- a/src/Cargo.lock ++++ b/src/Cargo.lock +@@ -2,27 +2,18 @@ + # It is not intended for manual editing. + version = 3 + +-[[package]] +-name = "addr2line" +-version = "0.24.2" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +-dependencies = [ +- "gimli", +-] +- +-[[package]] +-name = "adler2" +-version = "2.0.1" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +- + [[package]] + name = "allocator-api2" + version = "0.2.21" + source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + ++[[package]] ++name = "anyhow" ++version = "1.0.102" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" ++ + [[package]] + name = "atty" + version = "0.2.14" +@@ -40,21 +31,6 @@ version = "1.5.0" + source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +-[[package]] +-name = "backtrace" +-version = "0.3.75" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +-dependencies = [ +- "addr2line", +- "cfg-if", +- "libc", +- "miniz_oxide", +- "object", +- "rustc-demangle", +- "windows-targets", +-] +- + [[package]] + name = "base64" + version = "0.13.1" +@@ -69,9 +45,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + + [[package]] + name = "bitflags" +-version = "2.9.1" ++version = "2.11.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" ++checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + + [[package]] + name = "byteorder" +@@ -86,8 +62,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "da6bc11b07529f16944307272d5bd9b22530bc7d05751717c9d416586cedab49" + dependencies = [ + "clap", +- "heck", +- "indexmap", ++ "heck 0.4.1", ++ "indexmap 1.9.3", + "log", + "proc-macro2", + "quote", +@@ -100,10 +76,11 @@ dependencies = [ + + [[package]] + name = "cc" +-version = "1.2.27" ++version = "1.2.56" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" ++checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" + dependencies = [ ++ "find-msvc-tools", + "jobserver", + "libc", + "shlex", +@@ -111,9 +88,9 @@ dependencies = [ + + [[package]] + name = "cfg-if" +-version = "1.0.1" ++version = "1.0.4" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" ++checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + + [[package]] + name = "clap" +@@ -124,7 +101,7 @@ dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_lex", +- "indexmap", ++ "indexmap 1.9.3", + "strsim", + "termcolor", + "textwrap", +@@ -141,14 +118,14 @@ dependencies = [ + + [[package]] + name = "concread" +-version = "0.5.6" ++version = "0.5.10" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "7b639eeaa550eba0c8be45b292d5e272e6d29bfdffb4df6925d651ed9ed10fd6" ++checksum = "6588e9e68e11207fb9a5aabd88765187969e6bcba98763c40bcad87b2a73e9f5" + dependencies = [ + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +- "foldhash", ++ "foldhash 0.2.0", + "lru", + "smallvec", + "sptr", +@@ -210,9 +187,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + + [[package]] + name = "errno" +-version = "0.3.12" ++version = "0.3.14" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" ++checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" + dependencies = [ + "libc", + "windows-sys", +@@ -232,17 +209,29 @@ checksum = "93804560e638370a8be6d59ce71ed803e55e230abdbf42598e666b41adda9b1f" + dependencies = [ + "base64", + "byteorder", +- "getrandom 0.2.16", ++ "getrandom 0.2.17", + "openssl", + "zeroize", + ] + ++[[package]] ++name = "find-msvc-tools" ++version = "0.1.9" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" ++ + [[package]] + name = "foldhash" + version = "0.1.5" + source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + ++[[package]] ++name = "foldhash" ++version = "0.2.0" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" ++ + [[package]] + name = "foreign-types" + version = "0.3.2" +@@ -260,32 +249,39 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + + [[package]] + name = "getrandom" +-version = "0.2.16" ++version = "0.2.17" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" ++checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" + dependencies = [ + "cfg-if", + "libc", +- "wasi 0.11.1+wasi-snapshot-preview1", ++ "wasi", + ] + + [[package]] + name = "getrandom" +-version = "0.3.3" ++version = "0.3.4" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" ++checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" + dependencies = [ + "cfg-if", + "libc", + "r-efi", +- "wasi 0.14.2+wasi-0.2.4", ++ "wasip2", + ] + + [[package]] +-name = "gimli" +-version = "0.31.1" ++name = "getrandom" ++version = "0.4.1" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" ++checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" ++dependencies = [ ++ "cfg-if", ++ "libc", ++ "r-efi", ++ "wasip2", ++ "wasip3", ++] + + [[package]] + name = "hashbrown" +@@ -295,13 +291,22 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + + [[package]] + name = "hashbrown" +-version = "0.15.4" ++version = "0.15.5" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" ++checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" ++dependencies = [ ++ "foldhash 0.1.5", ++] ++ ++[[package]] ++name = "hashbrown" ++version = "0.16.1" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + dependencies = [ + "allocator-api2", + "equivalent", +- "foldhash", ++ "foldhash 0.2.0", + ] + + [[package]] +@@ -310,6 +315,12 @@ version = "0.4.1" + source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + ++[[package]] ++name = "heck" ++version = "0.5.0" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" ++ + [[package]] + name = "hermit-abi" + version = "0.1.19" +@@ -319,6 +330,12 @@ dependencies = [ + "libc", + ] + ++[[package]] ++name = "id-arena" ++version = "2.3.0" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" ++ + [[package]] + name = "indexmap" + version = "1.9.3" +@@ -329,27 +346,45 @@ dependencies = [ + "hashbrown 0.12.3", + ] + ++[[package]] ++name = "indexmap" ++version = "2.13.0" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" ++dependencies = [ ++ "equivalent", ++ "hashbrown 0.16.1", ++ "serde", ++ "serde_core", ++] ++ + [[package]] + name = "itoa" +-version = "1.0.15" ++version = "1.0.17" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" ++checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + + [[package]] + name = "jobserver" +-version = "0.1.33" ++version = "0.1.34" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" ++checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" + dependencies = [ +- "getrandom 0.3.3", ++ "getrandom 0.3.4", + "libc", + ] + ++[[package]] ++name = "leb128fmt" ++version = "0.1.0" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" ++ + [[package]] + name = "libc" +-version = "0.2.174" ++version = "0.2.182" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" ++checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + + [[package]] + name = "librnsslapd" +@@ -372,48 +407,30 @@ dependencies = [ + + [[package]] + name = "linux-raw-sys" +-version = "0.9.4" ++version = "0.11.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" ++checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + + [[package]] + name = "log" +-version = "0.4.27" ++version = "0.4.29" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" ++checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + + [[package]] + name = "lru" +-version = "0.13.0" ++version = "0.16.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" ++checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" + dependencies = [ +- "hashbrown 0.15.4", ++ "hashbrown 0.16.1", + ] + + [[package]] + name = "memchr" +-version = "2.7.5" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +- +-[[package]] +-name = "miniz_oxide" +-version = "0.8.9" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +-dependencies = [ +- "adler2", +-] +- +-[[package]] +-name = "object" +-version = "0.36.7" ++version = "2.8.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +-dependencies = [ +- "memchr", +-] ++checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + + [[package]] + name = "once_cell" +@@ -423,11 +440,11 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + + [[package]] + name = "openssl" +-version = "0.10.73" ++version = "0.10.75" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" ++checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" + dependencies = [ +- "bitflags 2.9.1", ++ "bitflags 2.11.0", + "cfg-if", + "foreign-types", + "libc", +@@ -444,14 +461,14 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" + dependencies = [ + "proc-macro2", + "quote", +- "syn 2.0.103", ++ "syn 2.0.117", + ] + + [[package]] + name = "openssl-sys" +-version = "0.9.109" ++version = "0.9.111" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" ++checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" + dependencies = [ + "cc", + "libc", +@@ -496,6 +513,16 @@ version = "0.3.32" + source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + ++[[package]] ++name = "prettyplease" ++version = "0.2.37" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" ++dependencies = [ ++ "proc-macro2", ++ "syn 2.0.117", ++] ++ + [[package]] + name = "proc-macro-hack" + version = "0.5.20+deprecated" +@@ -504,9 +531,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + + [[package]] + name = "proc-macro2" +-version = "1.0.95" ++version = "1.0.106" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" ++checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" + dependencies = [ + "unicode-ident", + ] +@@ -526,9 +553,9 @@ dependencies = [ + + [[package]] + name = "quote" +-version = "1.0.40" ++version = "1.0.44" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" ++checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" + dependencies = [ + "proc-macro2", + ] +@@ -539,19 +566,13 @@ version = "5.3.0" + source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +-[[package]] +-name = "rustc-demangle" +-version = "0.1.25" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +- + [[package]] + name = "rustix" +-version = "1.0.7" ++version = "1.1.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" ++checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" + dependencies = [ +- "bitflags 2.9.1", ++ "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys", +@@ -559,41 +580,52 @@ dependencies = [ + ] + + [[package]] +-name = "ryu" +-version = "1.0.20" ++name = "semver" ++version = "1.0.27" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" ++checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + + [[package]] + name = "serde" +-version = "1.0.219" ++version = "1.0.228" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" ++checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" ++dependencies = [ ++ "serde_core", ++ "serde_derive", ++] ++ ++[[package]] ++name = "serde_core" ++version = "1.0.228" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" + dependencies = [ + "serde_derive", + ] + + [[package]] + name = "serde_derive" +-version = "1.0.219" ++version = "1.0.228" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" ++checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" + dependencies = [ + "proc-macro2", + "quote", +- "syn 2.0.103", ++ "syn 2.0.117", + ] + + [[package]] + name = "serde_json" +-version = "1.0.140" ++version = "1.0.149" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" ++checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" + dependencies = [ + "itoa", + "memchr", +- "ryu", + "serde", ++ "serde_core", ++ "zmij", + ] + + [[package]] +@@ -649,9 +681,9 @@ dependencies = [ + + [[package]] + name = "syn" +-version = "2.0.103" ++version = "2.0.117" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" ++checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" + dependencies = [ + "proc-macro2", + "quote", +@@ -660,12 +692,12 @@ dependencies = [ + + [[package]] + name = "tempfile" +-version = "3.20.0" ++version = "3.25.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" ++checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" + dependencies = [ + "fastrand", +- "getrandom 0.3.3", ++ "getrandom 0.4.1", + "once_cell", + "rustix", + "windows-sys", +@@ -688,11 +720,10 @@ checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" + + [[package]] + name = "tokio" +-version = "1.45.1" ++version = "1.49.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" ++checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" + dependencies = [ +- "backtrace", + "pin-project-lite", + ] + +@@ -707,9 +738,9 @@ dependencies = [ + + [[package]] + name = "tracing" +-version = "0.1.41" ++version = "0.1.44" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" ++checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" + dependencies = [ + "pin-project-lite", + "tracing-attributes", +@@ -718,29 +749,35 @@ dependencies = [ + + [[package]] + name = "tracing-attributes" +-version = "0.1.30" ++version = "0.1.31" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" ++checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" + dependencies = [ + "proc-macro2", + "quote", +- "syn 2.0.103", ++ "syn 2.0.117", + ] + + [[package]] + name = "tracing-core" +-version = "0.1.34" ++version = "0.1.36" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" ++checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" + dependencies = [ + "once_cell", + ] + + [[package]] + name = "unicode-ident" +-version = "1.0.18" ++version = "1.0.24" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" ++checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" ++ ++[[package]] ++name = "unicode-xid" ++version = "0.2.6" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + + [[package]] + name = "uuid" +@@ -748,7 +785,7 @@ version = "0.8.2" + source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + dependencies = [ +- "getrandom 0.2.16", ++ "getrandom 0.2.17", + ] + + [[package]] +@@ -764,12 +801,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + + [[package]] +-name = "wasi" +-version = "0.14.2+wasi-0.2.4" ++name = "wasip2" ++version = "1.0.2+wasi-0.2.9" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" ++dependencies = [ ++ "wit-bindgen", ++] ++ ++[[package]] ++name = "wasip3" ++version = "0.4.0+wasi-0.3.0-rc-2026-01-06" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" ++dependencies = [ ++ "wit-bindgen", ++] ++ ++[[package]] ++name = "wasm-encoder" ++version = "0.244.0" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" ++dependencies = [ ++ "leb128fmt", ++ "wasmparser", ++] ++ ++[[package]] ++name = "wasm-metadata" ++version = "0.244.0" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" ++dependencies = [ ++ "anyhow", ++ "indexmap 2.13.0", ++ "wasm-encoder", ++ "wasmparser", ++] ++ ++[[package]] ++name = "wasmparser" ++version = "0.244.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" ++checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" + dependencies = [ +- "wit-bindgen-rt", ++ "bitflags 2.11.0", ++ "hashbrown 0.15.5", ++ "indexmap 2.13.0", ++ "semver", + ] + + [[package]] +@@ -790,9 +870,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + + [[package]] + name = "winapi-util" +-version = "0.1.9" ++version = "0.1.11" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" ++checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" + dependencies = [ + "windows-sys", + ] +@@ -804,103 +884,130 @@ source = "registry+https://github.com/rust-lang/crates.io-index" + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + + [[package]] +-name = "windows-sys" +-version = "0.59.0" ++name = "windows-link" ++version = "0.2.1" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +-dependencies = [ +- "windows-targets", +-] ++checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + + [[package]] +-name = "windows-targets" +-version = "0.52.6" ++name = "windows-sys" ++version = "0.61.2" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" ++checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" + dependencies = [ +- "windows_aarch64_gnullvm", +- "windows_aarch64_msvc", +- "windows_i686_gnu", +- "windows_i686_gnullvm", +- "windows_i686_msvc", +- "windows_x86_64_gnu", +- "windows_x86_64_gnullvm", +- "windows_x86_64_msvc", ++ "windows-link", + ] + + [[package]] +-name = "windows_aarch64_gnullvm" +-version = "0.52.6" ++name = "wit-bindgen" ++version = "0.51.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +- +-[[package]] +-name = "windows_aarch64_msvc" +-version = "0.52.6" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +- +-[[package]] +-name = "windows_i686_gnu" +-version = "0.52.6" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +- +-[[package]] +-name = "windows_i686_gnullvm" +-version = "0.52.6" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" ++checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" ++dependencies = [ ++ "wit-bindgen-rust-macro", ++] + + [[package]] +-name = "windows_i686_msvc" +-version = "0.52.6" ++name = "wit-bindgen-core" ++version = "0.51.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" ++checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" ++dependencies = [ ++ "anyhow", ++ "heck 0.5.0", ++ "wit-parser", ++] + + [[package]] +-name = "windows_x86_64_gnu" +-version = "0.52.6" ++name = "wit-bindgen-rust" ++version = "0.51.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" ++checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" ++dependencies = [ ++ "anyhow", ++ "heck 0.5.0", ++ "indexmap 2.13.0", ++ "prettyplease", ++ "syn 2.0.117", ++ "wasm-metadata", ++ "wit-bindgen-core", ++ "wit-component", ++] + + [[package]] +-name = "windows_x86_64_gnullvm" +-version = "0.52.6" ++name = "wit-bindgen-rust-macro" ++version = "0.51.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" ++checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" ++dependencies = [ ++ "anyhow", ++ "prettyplease", ++ "proc-macro2", ++ "quote", ++ "syn 2.0.117", ++ "wit-bindgen-core", ++ "wit-bindgen-rust", ++] + + [[package]] +-name = "windows_x86_64_msvc" +-version = "0.52.6" ++name = "wit-component" ++version = "0.244.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" ++checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" ++dependencies = [ ++ "anyhow", ++ "bitflags 2.11.0", ++ "indexmap 2.13.0", ++ "log", ++ "serde", ++ "serde_derive", ++ "serde_json", ++ "wasm-encoder", ++ "wasm-metadata", ++ "wasmparser", ++ "wit-parser", ++] + + [[package]] +-name = "wit-bindgen-rt" +-version = "0.39.0" ++name = "wit-parser" ++version = "0.244.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" ++checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" + dependencies = [ +- "bitflags 2.9.1", ++ "anyhow", ++ "id-arena", ++ "indexmap 2.13.0", ++ "log", ++ "semver", ++ "serde", ++ "serde_derive", ++ "serde_json", ++ "unicode-xid", ++ "wasmparser", + ] + + [[package]] + name = "zeroize" +-version = "1.8.1" ++version = "1.8.2" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" ++checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + dependencies = [ + "zeroize_derive", + ] + + [[package]] + name = "zeroize_derive" +-version = "1.4.2" ++version = "1.4.3" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" ++checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" + dependencies = [ + "proc-macro2", + "quote", +- "syn 2.0.103", ++ "syn 2.0.117", + ] ++ ++[[package]] ++name = "zmij" ++version = "1.0.21" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +diff --git a/src/librslapd/Cargo.toml b/src/librslapd/Cargo.toml +index f38f93f4c..61100f381 100644 +--- a/src/librslapd/Cargo.toml ++++ b/src/librslapd/Cargo.toml +@@ -16,7 +16,7 @@ crate-type = ["staticlib", "lib"] + [dependencies] + slapd = { path = "../slapd" } + libc = "0.2" +-concread = "0.5.6" ++concread = "0.5.10" + + [build-dependencies] + cbindgen = "0.26" +-- +2.53.0 + diff --git a/0058-Issue-7271-plugins-that-create-threads-need-to-updat.patch b/0058-Issue-7271-plugins-that-create-threads-need-to-updat.patch new file mode 100644 index 0000000..71a254d --- /dev/null +++ b/0058-Issue-7271-plugins-that-create-threads-need-to-updat.patch @@ -0,0 +1,86 @@ +From 8b4dbf35ace326e5b836982d428e7029313a2247 Mon Sep 17 00:00:00 2001 +From: Mark Reynolds +Date: Mon, 23 Feb 2026 12:37:26 -0500 +Subject: [PATCH] Issue 7271 - plugins that create threads need to update + active thread count + +Description: + +Plugins that create threads need to up to the global active thread count. +Otherwise when the server is being stopped the plugin's close function gets +called while these threads are still running and still using the plugin +configuration. This can lead to crashes. + +relates: https://github.com/389ds/389-ds-base/issues/7271 + +Reviewed by: progier & tbordaz (Thanks!!) +--- + ldap/servers/plugins/replication/repl5_protocol.c | 5 +++++ + ldap/servers/plugins/retrocl/retrocl_trim.c | 7 ++++++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +diff --git a/ldap/servers/plugins/replication/repl5_protocol.c b/ldap/servers/plugins/replication/repl5_protocol.c +index 5d4a0e455..bc9580319 100644 +--- a/ldap/servers/plugins/replication/repl5_protocol.c ++++ b/ldap/servers/plugins/replication/repl5_protocol.c +@@ -23,6 +23,7 @@ + + #include "repl5.h" + #include "repl5_prot_private.h" ++#include "slap.h" + + #define PROTOCOL_5_INCREMENTAL 1 + #define PROTOCOL_5_TOTAL 2 +@@ -237,6 +238,8 @@ prot_thread_main(void *arg) + return; + } + ++ g_incr_active_threadcnt(); ++ + set_thread_private_agmtname(agmt_get_long_name(agmt)); + + done = 0; +@@ -301,6 +304,8 @@ prot_thread_main(void *arg) + done = 1; + } + } ++ ++ g_decr_active_threadcnt(); + } + + /* +diff --git a/ldap/servers/plugins/retrocl/retrocl_trim.c b/ldap/servers/plugins/retrocl/retrocl_trim.c +index 8fcd3d32b..8fdc75c62 100644 +--- a/ldap/servers/plugins/retrocl/retrocl_trim.c ++++ b/ldap/servers/plugins/retrocl/retrocl_trim.c +@@ -243,6 +243,8 @@ trim_changelog(void) + + now_interval = slapi_current_rel_time_t(); /* monotonic time for interval */ + ++ g_incr_active_threadcnt(); ++ + PR_Lock(ts.ts_s_trim_mutex); + max_age = ts.ts_c_max_age; + trim_interval = ts.ts_c_trim_interval; +@@ -257,7 +259,7 @@ trim_changelog(void) + */ + done = 0; + now_maxage = slapi_current_utc_time(); /* real time for trim candidates */ +- while (!done && retrocl_trimming == 1) { ++ while (!done && retrocl_trimming == 1 && !slapi_is_shutting_down()) { + int did_delete; + + did_delete = 0; +@@ -309,6 +311,9 @@ trim_changelog(void) + "trim_changelog: removed %d change records\n", + num_deleted); + } ++ ++ g_decr_active_threadcnt(); ++ + return rc; + } + +-- +2.53.0 + diff --git a/0059-Issue-7273-In-a-chaining-environment-binding-as-remo.patch b/0059-Issue-7273-In-a-chaining-environment-binding-as-remo.patch new file mode 100644 index 0000000..89e9966 --- /dev/null +++ b/0059-Issue-7273-In-a-chaining-environment-binding-as-remo.patch @@ -0,0 +1,40 @@ +From ffe1909e69ab2aecef396f31cf95cdcecd992782 Mon Sep 17 00:00:00 2001 +From: Mark Reynolds +Date: Mon, 23 Feb 2026 12:10:32 -0500 +Subject: [PATCH] Issue 7273 - In a chaining environment binding as remote user + causes an invalid error in the logs + +Description: + +In a database link/chaining environment you can bind as a remote user, and +this triggers an error when trying to "upgrade_on_bind" as the user does not +locally have a userpassword since it's remote. There is no strong case to +log an error in this situation. + +relates: http://github.com/389ds/389-ds-base/issues/7273 + +Reviewed by: vashirov(Thanks!) +--- + ldap/servers/slapd/pw.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/ldap/servers/slapd/pw.c b/ldap/servers/slapd/pw.c +index c53ecf23d..88e32537d 100644 +--- a/ldap/servers/slapd/pw.c ++++ b/ldap/servers/slapd/pw.c +@@ -3564,10 +3564,8 @@ int32_t update_pw_encoding(Slapi_PBlock *orig_pb, Slapi_Entry *e, Slapi_DN *sdn, + * Does the entry have a pw? + */ + if (e == NULL || slapi_entry_attr_find(e, SLAPI_USERPWD_ATTR, &pw) != 0 || pw == NULL) { +- slapi_log_err(SLAPI_LOG_WARNING, +- "update_pw_encoding", "Could not read password attribute on '%s'\n", +- dn); +- res = -1; ++ /* The entry does not have a userpassword attribute so there is nothing to do. ++ * This typically happens when chaining is involved. */ + goto free_and_return; + } + +-- +2.53.0 + diff --git a/0060-Issue-7279-UI-Fix-typo-in-export-certificate-dialog-.patch b/0060-Issue-7279-UI-Fix-typo-in-export-certificate-dialog-.patch new file mode 100644 index 0000000..fa4e410 --- /dev/null +++ b/0060-Issue-7279-UI-Fix-typo-in-export-certificate-dialog-.patch @@ -0,0 +1,46 @@ +From 3a233116a564fc339aee1021913c995504951d86 Mon Sep 17 00:00:00 2001 +From: Simon Pichugin +Date: Tue, 24 Feb 2026 09:28:24 -0800 +Subject: [PATCH] Issue 7279 - UI - Fix typo in export certificate dialog + (#7280) + +Description: Fix typo "cetificate" -> "certificate" in the +export certificate dialog message. + +Fixes: https://github.com/389ds/389-ds-base/issues/7279 + +Reviewed by: @vashirov (Thanks!) +--- + src/cockpit/389-console/po/ja.po | 2 +- + src/cockpit/389-console/src/lib/security/securityModals.jsx | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/cockpit/389-console/po/ja.po b/src/cockpit/389-console/po/ja.po +index 27d21bf7a..12c10ded4 100644 +--- a/src/cockpit/389-console/po/ja.po ++++ b/src/cockpit/389-console/po/ja.po +@@ -11560,7 +11560,7 @@ msgstr "証明書のエクスポート:" + #: src/lib/security/securityModals.jsx:58 + msgid "" + "Enter the full path and file name, if the path portion is omitted the " +-"cetificate is written to the server's certificate directory " ++"certificate is written to the server's certificate directory " + msgstr "" + "ファイル名を含むフルパスを入力してください。パス部分を省略した場合、証明書は" + "サーバの証明書ディレクトリに書き込まれます。" +diff --git a/src/cockpit/389-console/src/lib/security/securityModals.jsx b/src/cockpit/389-console/src/lib/security/securityModals.jsx +index 4d6631fd2..f32d47596 100644 +--- a/src/cockpit/389-console/src/lib/security/securityModals.jsx ++++ b/src/cockpit/389-console/src/lib/security/securityModals.jsx +@@ -55,7 +55,7 @@ export class ExportCertModal extends React.Component { + } + + const title = <>{_("Export Certificate:")}   {nickName}; +- const desc = <>{_("Enter the full path and file name, if the path portion is omitted the cetificate is written to the server's certificate directory ")}{certDir}; ++ const desc = <>{_("Enter the full path and file name, if the path portion is omitted the certificate is written to the server's certificate directory ")}{certDir}; + + return ( + +Date: Tue, 24 Feb 2026 09:32:41 -0800 +Subject: [PATCH] Issue 7275 - UI - Improve password policy field validation in + Cockpit UI (#7276) + +Description: Password policy fields in the Cockpit UI lack client-side validation. +Invalid values only produce generic server-side errors after clicking Save. +Add a shared pwpValidation module and inline validation to all numeric +password policy fields in globalPwp.jsx and localPwp.jsx. + +Fixes: https://github.com/389ds/389-ds-base/issues/7275 + +Reviewed by: @mreynolds389 (Thanks!) +--- + .../src/lib/database/globalPwp.jsx | 61 ++++++++- + .../389-console/src/lib/database/localPwp.jsx | 117 +++++++++++++++++- + .../src/lib/database/pwpValidation.jsx | 105 ++++++++++++++++ + 3 files changed, 272 insertions(+), 11 deletions(-) + create mode 100644 src/cockpit/389-console/src/lib/database/pwpValidation.jsx + +diff --git a/src/cockpit/389-console/src/lib/database/globalPwp.jsx b/src/cockpit/389-console/src/lib/database/globalPwp.jsx +index d479c32e7..205e4735d 100644 +--- a/src/cockpit/389-console/src/lib/database/globalPwp.jsx ++++ b/src/cockpit/389-console/src/lib/database/globalPwp.jsx +@@ -23,6 +23,12 @@ import { + import TypeaheadSelect from "../../dsBasicComponents.jsx"; + import PropTypes from "prop-types"; + import { SyncAltIcon } from '@patternfly/react-icons'; ++import { ++ getValidationProps, ++ hasInvalidField, ++ renderValidationError, ++ updateFieldValidation, ++} from "./pwpValidation.jsx"; + + const _ = cockpit.gettext; + +@@ -114,6 +120,7 @@ export class GlobalPwPolicy extends React.Component { + saveSyntaxDisabled: true, + saveTPRDisabled: true, + isSelectOpen: false, ++ invalidFields: {}, + }; + + // Toggle currently active tab +@@ -242,6 +249,7 @@ export class GlobalPwPolicy extends React.Component { + const stateUpdate = { + [attr]: value, + saveGeneralDisabled: disableSaveBtn, ++ invalidFields: updateFieldValidation(this.state.invalidFields, attr, value), + }; + + this.setState(stateUpdate, () => { +@@ -363,6 +371,7 @@ export class GlobalPwPolicy extends React.Component { + this.setState({ + [attr]: value, + saveExpDisabled: disableSaveBtn, ++ invalidFields: updateFieldValidation(this.state.invalidFields, attr, value), + }); + } + +@@ -440,6 +449,7 @@ export class GlobalPwPolicy extends React.Component { + this.setState({ + [attr]: value, + saveLockoutDisabled: disableSaveBtn, ++ invalidFields: updateFieldValidation(this.state.invalidFields, attr, value), + }); + } + +@@ -541,12 +551,14 @@ export class GlobalPwPolicy extends React.Component { + this.setState({ + [attr]: Array.isArray(selection) ? selection : [], + saveSyntaxDisabled: disableSaveBtn, ++ invalidFields: updateFieldValidation(this.state.invalidFields, attr, value), + isSelectOpen: false + }); + } else { + this.setState({ + [attr]: value, + saveSyntaxDisabled: disableSaveBtn, ++ invalidFields: updateFieldValidation(this.state.invalidFields, attr, value), + isSelectOpen: false + }); + } +@@ -841,6 +853,7 @@ export class GlobalPwPolicy extends React.Component { + { + loaded: true, + loading: false, ++ invalidFields: {}, + saveGeneralDisabled: true, + savePasswordStorageDisabled: true, + saveUserDisabled: true, +@@ -996,10 +1009,12 @@ export class GlobalPwPolicy extends React.Component { + id="passwordminlength" + aria-describedby="horizontal-form-name-helper" + name="passwordminlength" ++ {...getValidationProps("passwordminlength", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> ++ {renderValidationError("passwordminlength", this.state.invalidFields)} + + + {_("Minimum Alpha's")} +@@ -1012,10 +1027,12 @@ export class GlobalPwPolicy extends React.Component { + id="passwordminalphas" + aria-describedby="horizontal-form-name-helper" + name="passwordminalphas" ++ {...getValidationProps("passwordminalphas", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> ++ {renderValidationError("passwordminalphas", this.state.invalidFields)} + + + +@@ -1030,10 +1047,12 @@ export class GlobalPwPolicy extends React.Component { + id="passwordmindigits" + aria-describedby="horizontal-form-name-helper" + name="passwordmindigits" ++ {...getValidationProps("passwordmindigits", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> ++ {renderValidationError("passwordmindigits", this.state.invalidFields)} + + + {_("Minimum Special")} +@@ -1046,10 +1065,12 @@ export class GlobalPwPolicy extends React.Component { + id="passwordminspecials" + aria-describedby="horizontal-form-name-helper" + name="passwordminspecials" ++ {...getValidationProps("passwordminspecials", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> ++ {renderValidationError("passwordminspecials", this.state.invalidFields)} + + + +@@ -1064,10 +1085,12 @@ export class GlobalPwPolicy extends React.Component { + id="passwordminuppers" + aria-describedby="horizontal-form-name-helper" + name="passwordminuppers" ++ {...getValidationProps("passwordminuppers", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> ++ {renderValidationError("passwordminuppers", this.state.invalidFields)} + + + {_("Minimum Lowercase")} +@@ -1080,10 +1103,12 @@ export class GlobalPwPolicy extends React.Component { + id="passwordminlowers" + aria-describedby="horizontal-form-name-helper" + name="passwordminlowers" ++ {...getValidationProps("passwordminlowers", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> ++ {renderValidationError("passwordminlowers", this.state.invalidFields)} + + + +@@ -1098,10 +1123,12 @@ export class GlobalPwPolicy extends React.Component { + id="passwordmin8bit" + aria-describedby="horizontal-form-name-helper" + name="passwordmin8bit" ++ {...getValidationProps("passwordmin8bit", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> ++ {renderValidationError("passwordmin8bit", this.state.invalidFields)} + + + {_("Minimum Categories")} +@@ -1114,10 +1141,12 @@ export class GlobalPwPolicy extends React.Component { + id="passwordmincategories" + aria-describedby="horizontal-form-name-helper" + name="passwordmincategories" ++ {...getValidationProps("passwordmincategories", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> ++ {renderValidationError("passwordmincategories", this.state.invalidFields)} + + + +@@ -1132,11 +1161,13 @@ export class GlobalPwPolicy extends React.Component { + id="passwordmaxsequence" + aria-describedby="horizontal-form-name-helper" + name="passwordmaxsequence" ++ {...getValidationProps("passwordmaxsequence", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> + ++ {renderValidationError("passwordmaxsequence", this.state.invalidFields)} + + {_("Max Sequence Sets")} + +@@ -1148,11 +1179,13 @@ export class GlobalPwPolicy extends React.Component { + id="passwordmaxseqsets" + aria-describedby="horizontal-form-name-helper" + name="passwordmaxseqsets" ++ {...getValidationProps("passwordmaxseqsets", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> + ++ {renderValidationError("passwordmaxseqsets", this.state.invalidFields)} + + + +@@ -1166,11 +1199,13 @@ export class GlobalPwPolicy extends React.Component { + id="passwordmaxclasschars" + aria-describedby="horizontal-form-name-helper" + name="passwordmaxclasschars" ++ {...getValidationProps("passwordmaxclasschars", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleSyntaxChange(e); + }} + /> + ++ {renderValidationError("passwordmaxclasschars", this.state.invalidFields)} + + + +@@ -1251,12 +1286,14 @@ export class GlobalPwPolicy extends React.Component { + type="number" + id="passwordmaxfailure" + aria-describedby="horizontal-form-name-helper" +- name="passwordmaxpasswordmaxfailureclasschars" ++ name="passwordmaxfailure" ++ {...getValidationProps("passwordmaxfailure", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleLockoutChange(e); + }} + /> + ++ {renderValidationError("passwordmaxfailure", this.state.invalidFields)} + + + +@@ -1269,11 +1306,13 @@ export class GlobalPwPolicy extends React.Component { + id="passwordresetfailurecount" + aria-describedby="horizontal-form-name-helper" + name="passwordresetfailurecount" ++ {...getValidationProps("passwordresetfailurecount", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleLockoutChange(e); + }} + /> + ++ {renderValidationError("passwordresetfailurecount", this.state.invalidFields)} + + + +@@ -1286,11 +1325,13 @@ export class GlobalPwPolicy extends React.Component { + id="passwordlockoutduration" + aria-describedby="horizontal-form-name-helper" + name="passwordlockoutduration" ++ {...getValidationProps("passwordlockoutduration", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleLockoutChange(e); + }} + /> + ++ {renderValidationError("passwordlockoutduration", this.state.invalidFields)} + + + +@@ -1322,11 +1363,13 @@ export class GlobalPwPolicy extends React.Component { + id="passwordmaxage" + aria-describedby="horizontal-form-name-helper" + name="passwordmaxage" ++ {...getValidationProps("passwordmaxage", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleExpChange(e); + }} + /> + ++ {renderValidationError("passwordmaxage", this.state.invalidFields)} + + + +@@ -1339,11 +1382,13 @@ export class GlobalPwPolicy extends React.Component { + id="passwordgracelimit" + aria-describedby="horizontal-form-name-helper" + name="passwordgracelimit" ++ {...getValidationProps("passwordgracelimit", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleExpChange(e); + }} + /> + ++ {renderValidationError("passwordgracelimit", this.state.invalidFields)} + + + +@@ -1356,11 +1401,13 @@ export class GlobalPwPolicy extends React.Component { + id="passwordwarning" + aria-describedby="horizontal-form-name-helper" + name="passwordwarning" ++ {...getValidationProps("passwordwarning", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleExpChange(e); + }} + /> + ++ {renderValidationError("passwordwarning", this.state.invalidFields)} + + + +@@ -1493,10 +1540,12 @@ export class GlobalPwPolicy extends React.Component { + id="passwordinhistory" + aria-describedby="horizontal-form-name-helper" + name="passwordinhistory" ++ {...getValidationProps("passwordinhistory", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleGeneralChange(e); + }} + /> ++ {renderValidationError("passwordinhistory", this.state.invalidFields)} + + + +@@ -1555,11 +1604,13 @@ export class GlobalPwPolicy extends React.Component { + id="passwordminage" + aria-describedby="horizontal-form-name-helper" + name="passwordminage" ++ {...getValidationProps("passwordminage", this.state.invalidFields)} + onChange={(e, checked) => { + this.handleGeneralChange(e); + }} + /> + ++ {renderValidationError("passwordminage", this.state.invalidFields)} + + + +