mirror of
https://github.com/kanidm/kanidm.git
synced 2025-06-16 21:17:46 +02:00
Compare commits
8 commits
9f167d95f1
...
8ec181c763
Author | SHA1 | Date | |
---|---|---|---|
|
8ec181c763 | ||
|
c75c97893e | ||
|
638904f12c | ||
|
e1b9063b99 | ||
|
bf1e9b0989 | ||
|
11c7266ff3 | ||
|
8ad70c6111 | ||
|
ed342e562d |
237
Cargo.lock
generated
237
Cargo.lock
generated
|
@ -232,9 +232,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "async-compression"
|
||||
version = "0.4.20"
|
||||
version = "0.4.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "310c9bcae737a48ef5cdee3174184e6d548b292739ede61a1f955ef76a738861"
|
||||
checksum = "c0cf008e5e1a9e9e22a7d3c9a4992e21a350290069e36d8fb72304ed17e8f2d2"
|
||||
dependencies = [
|
||||
"flate2",
|
||||
"futures-core",
|
||||
|
@ -267,9 +267,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
version = "0.1.87"
|
||||
version = "0.1.88"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97"
|
||||
checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -299,7 +299,7 @@ dependencies = [
|
|||
"memoffset",
|
||||
"openssl",
|
||||
"openssl-sys",
|
||||
"rand",
|
||||
"rand 0.8.5",
|
||||
"runloop",
|
||||
"serde",
|
||||
"serde_bytes",
|
||||
|
@ -425,20 +425,17 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "axum-server"
|
||||
version = "0.7.1"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "56bac90848f6a9393ac03c63c640925c4b7c8ca21654de40d53f55964667c7d8"
|
||||
checksum = "495c05f60d6df0093e8fb6e74aa5846a0ad06abaf96d76166283720bf740f8ab"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-util",
|
||||
"fs-err",
|
||||
"http 1.3.1",
|
||||
"http-body 1.0.1",
|
||||
"http-body-util",
|
||||
"hyper 1.6.0",
|
||||
"hyper-util",
|
||||
"pin-project-lite",
|
||||
"tokio",
|
||||
"tower 0.4.13",
|
||||
"tower-service",
|
||||
]
|
||||
|
||||
|
@ -665,9 +662,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
|||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.16"
|
||||
version = "1.2.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c"
|
||||
checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a"
|
||||
dependencies = [
|
||||
"shlex",
|
||||
]
|
||||
|
@ -749,9 +746,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "clap_complete"
|
||||
version = "4.5.46"
|
||||
version = "4.5.47"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f5c5508ea23c5366f77e53f5a0070e5a84e51687ec3ef9e0464c86dc8d13ce98"
|
||||
checksum = "c06f5378ea264ad4f82bbc826628b5aad714a75abf6ece087e923010eb937fb6"
|
||||
dependencies = [
|
||||
"clap",
|
||||
]
|
||||
|
@ -812,9 +809,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "concread"
|
||||
version = "0.5.4"
|
||||
version = "0.5.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0a06c26e76cd1d7a88a44324d0cf18b11589be552e97af09bee345f7e7334c6d"
|
||||
checksum = "cdefc169c45893a578093c2f90733e3c56b60e67b0a8670a16ade3437b2fe392"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"arc-swap",
|
||||
|
@ -1044,7 +1041,7 @@ dependencies = [
|
|||
"kanidmd_core",
|
||||
"mimalloc",
|
||||
"prctl",
|
||||
"reqwest 0.12.14",
|
||||
"reqwest 0.12.15",
|
||||
"sd-notify",
|
||||
"serde_json",
|
||||
"sketching",
|
||||
|
@ -1170,9 +1167,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deranged"
|
||||
version = "0.3.11"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
|
||||
checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
|
||||
dependencies = [
|
||||
"powerfmt",
|
||||
"serde",
|
||||
|
@ -1554,9 +1551,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
|
|||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.1.4"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "foreign-types"
|
||||
|
@ -1592,6 +1589,16 @@ dependencies = [
|
|||
"num",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fs-err"
|
||||
version = "3.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f89bda4c2a21204059a977ed3bfe746677dfd137b83c339e702b0ac91d482aa"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fs4"
|
||||
version = "0.12.0"
|
||||
|
@ -1725,14 +1732,16 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.3.1"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
|
||||
checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"js-sys",
|
||||
"libc",
|
||||
"wasi 0.13.3+wasi-0.2.2",
|
||||
"windows-targets 0.52.6",
|
||||
"r-efi",
|
||||
"wasi 0.14.2+wasi-0.2.4",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -2851,7 +2860,7 @@ dependencies = [
|
|||
"percent-encoding",
|
||||
"referencing",
|
||||
"regex-syntax 0.8.5",
|
||||
"reqwest 0.12.14",
|
||||
"reqwest 0.12.15",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"uuid-simd",
|
||||
|
@ -2942,7 +2951,7 @@ dependencies = [
|
|||
"hyper 1.6.0",
|
||||
"kanidm_lib_file_permissions",
|
||||
"kanidm_proto",
|
||||
"reqwest 0.12.14",
|
||||
"reqwest 0.12.15",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
|
@ -2962,7 +2971,7 @@ dependencies = [
|
|||
"anyhow",
|
||||
"kanidm_proto",
|
||||
"oauth2 5.0.0",
|
||||
"reqwest 0.12.14",
|
||||
"reqwest 0.12.15",
|
||||
"sketching",
|
||||
"tokio",
|
||||
"tracing",
|
||||
|
@ -2981,7 +2990,7 @@ dependencies = [
|
|||
"md-5",
|
||||
"openssl",
|
||||
"openssl-sys",
|
||||
"rand",
|
||||
"rand 0.8.5",
|
||||
"serde",
|
||||
"sha-crypt",
|
||||
"sha2",
|
||||
|
@ -3207,7 +3216,7 @@ dependencies = [
|
|||
"num_enum",
|
||||
"openssl",
|
||||
"openssl-sys",
|
||||
"rand",
|
||||
"rand 0.8.5",
|
||||
"regex",
|
||||
"rusqlite",
|
||||
"serde",
|
||||
|
@ -3258,7 +3267,7 @@ dependencies = [
|
|||
"oauth2 4.4.2",
|
||||
"openssl",
|
||||
"petgraph",
|
||||
"reqwest 0.12.14",
|
||||
"reqwest 0.12.15",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sketching",
|
||||
|
@ -3376,9 +3385,9 @@ checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
|
|||
|
||||
[[package]]
|
||||
name = "libmimalloc-sys"
|
||||
version = "0.1.39"
|
||||
version = "0.1.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44"
|
||||
checksum = "07d0e07885d6a754b9c7993f2625187ad694ee985d60f23355ff0e7077261502"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
|
@ -3444,9 +3453,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
|
|||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.9.2"
|
||||
version = "0.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9"
|
||||
checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413"
|
||||
|
||||
[[package]]
|
||||
name = "litemap"
|
||||
|
@ -3533,7 +3542,7 @@ version = "0.13.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a42bf938e4c9a6ad581cf528d5606eb50c5458ac759ca23719291e2f6499bec"
|
||||
dependencies = [
|
||||
"rand",
|
||||
"rand 0.8.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -3572,9 +3581,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "mimalloc"
|
||||
version = "0.1.43"
|
||||
version = "0.1.44"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633"
|
||||
checksum = "99585191385958383e13f6b822e6b6d8d9cf928e7d286ceb092da92b43c87bc1"
|
||||
dependencies = [
|
||||
"libmimalloc-sys",
|
||||
]
|
||||
|
@ -3899,7 +3908,7 @@ dependencies = [
|
|||
"chrono",
|
||||
"getrandom 0.2.15",
|
||||
"http 0.2.12",
|
||||
"rand",
|
||||
"rand 0.8.5",
|
||||
"reqwest 0.11.27",
|
||||
"serde",
|
||||
"serde_json",
|
||||
|
@ -3919,8 +3928,8 @@ dependencies = [
|
|||
"chrono",
|
||||
"getrandom 0.2.15",
|
||||
"http 1.3.1",
|
||||
"rand",
|
||||
"reqwest 0.12.14",
|
||||
"rand 0.8.5",
|
||||
"reqwest 0.12.15",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_path_to_error",
|
||||
|
@ -4083,7 +4092,7 @@ dependencies = [
|
|||
"glob",
|
||||
"opentelemetry",
|
||||
"percent-encoding",
|
||||
"rand",
|
||||
"rand 0.8.5",
|
||||
"serde_json",
|
||||
"thiserror 1.0.69",
|
||||
"tokio",
|
||||
|
@ -4106,8 +4115,8 @@ dependencies = [
|
|||
"kanidm_client",
|
||||
"mathru",
|
||||
"mimalloc",
|
||||
"rand",
|
||||
"rand_chacha",
|
||||
"rand 0.8.5",
|
||||
"rand_chacha 0.3.1",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tokio",
|
||||
|
@ -4170,7 +4179,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166"
|
||||
dependencies = [
|
||||
"base64ct",
|
||||
"rand_core",
|
||||
"rand_core 0.6.4",
|
||||
"subtle",
|
||||
]
|
||||
|
||||
|
@ -4324,7 +4333,7 @@ version = "0.2.21"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
|
||||
dependencies = [
|
||||
"zerocopy 0.8.23",
|
||||
"zerocopy 0.8.24",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -4453,11 +4462,12 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
|
|||
|
||||
[[package]]
|
||||
name = "quinn"
|
||||
version = "0.11.6"
|
||||
version = "0.11.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef"
|
||||
checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"cfg_aliases",
|
||||
"pin-project-lite",
|
||||
"quinn-proto",
|
||||
"quinn-udp",
|
||||
|
@ -4467,17 +4477,18 @@ dependencies = [
|
|||
"thiserror 2.0.12",
|
||||
"tokio",
|
||||
"tracing",
|
||||
"web-time",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quinn-proto"
|
||||
version = "0.11.9"
|
||||
version = "0.11.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d"
|
||||
checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"getrandom 0.2.15",
|
||||
"rand",
|
||||
"getrandom 0.3.2",
|
||||
"rand 0.9.0",
|
||||
"ring",
|
||||
"rustc-hash 2.1.1",
|
||||
"rustls",
|
||||
|
@ -4512,6 +4523,12 @@ dependencies = [
|
|||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "r-efi"
|
||||
version = "5.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.8.5"
|
||||
|
@ -4519,8 +4536,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"rand_chacha",
|
||||
"rand_core",
|
||||
"rand_chacha 0.3.1",
|
||||
"rand_core 0.6.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
|
||||
dependencies = [
|
||||
"rand_chacha 0.9.0",
|
||||
"rand_core 0.9.3",
|
||||
"zerocopy 0.8.24",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -4530,7 +4558,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||
dependencies = [
|
||||
"ppv-lite86",
|
||||
"rand_core",
|
||||
"rand_core 0.6.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_chacha"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
|
||||
dependencies = [
|
||||
"ppv-lite86",
|
||||
"rand_core 0.9.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -4542,6 +4580,15 @@ dependencies = [
|
|||
"getrandom 0.2.15",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
|
||||
dependencies = [
|
||||
"getrandom 0.3.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.5.10"
|
||||
|
@ -4684,9 +4731,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "reqwest"
|
||||
version = "0.12.14"
|
||||
version = "0.12.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "989e327e510263980e231de548a33e63d34962d29ae61b467389a1a09627a254"
|
||||
checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb"
|
||||
dependencies = [
|
||||
"async-compression",
|
||||
"base64 0.22.1",
|
||||
|
@ -4862,22 +4909,22 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "1.0.2"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825"
|
||||
checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96"
|
||||
dependencies = [
|
||||
"bitflags 2.9.0",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys 0.9.2",
|
||||
"linux-raw-sys 0.9.3",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls"
|
||||
version = "0.23.23"
|
||||
version = "0.23.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395"
|
||||
checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"ring",
|
||||
|
@ -4919,9 +4966,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "rustls-webpki"
|
||||
version = "0.102.8"
|
||||
version = "0.103.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
|
||||
checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f"
|
||||
dependencies = [
|
||||
"ring",
|
||||
"rustls-pki-types",
|
||||
|
@ -5178,7 +5225,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "88e79009728d8311d42d754f2f319a975f9e38f156fd5e422d2451486c78b286"
|
||||
dependencies = [
|
||||
"base64ct",
|
||||
"rand",
|
||||
"rand 0.8.5",
|
||||
"sha2",
|
||||
"subtle",
|
||||
]
|
||||
|
@ -5470,14 +5517,14 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
|
|||
|
||||
[[package]]
|
||||
name = "tempfile"
|
||||
version = "3.19.0"
|
||||
version = "3.19.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "488960f40a3fd53d72c2a29a58722561dee8afdd175bd88e3db4677d7b2ba600"
|
||||
checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf"
|
||||
dependencies = [
|
||||
"fastrand",
|
||||
"getrandom 0.3.1",
|
||||
"getrandom 0.3.2",
|
||||
"once_cell",
|
||||
"rustix 1.0.2",
|
||||
"rustix 1.0.3",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
|
@ -5548,9 +5595,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "time"
|
||||
version = "0.3.39"
|
||||
version = "0.3.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8"
|
||||
checksum = "9d9c75b47bdff86fa3334a3db91356b8d7d86a9b839dab7d0bdc5c3d3a077618"
|
||||
dependencies = [
|
||||
"deranged",
|
||||
"itoa",
|
||||
|
@ -5565,15 +5612,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "time-core"
|
||||
version = "0.1.3"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef"
|
||||
checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
|
||||
|
||||
[[package]]
|
||||
name = "time-macros"
|
||||
version = "0.2.20"
|
||||
version = "0.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c"
|
||||
checksum = "29aa485584182073ed57fd5004aa09c371f021325014694e432313345865fd04"
|
||||
dependencies = [
|
||||
"num-conv",
|
||||
"time-core",
|
||||
|
@ -5777,7 +5824,7 @@ dependencies = [
|
|||
"indexmap 1.9.3",
|
||||
"pin-project",
|
||||
"pin-project-lite",
|
||||
"rand",
|
||||
"rand 0.8.5",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
|
@ -6111,11 +6158,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.15.1"
|
||||
version = "1.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587"
|
||||
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
|
||||
dependencies = [
|
||||
"getrandom 0.3.1",
|
||||
"getrandom 0.3.2",
|
||||
"serde",
|
||||
]
|
||||
|
||||
|
@ -6181,9 +6228,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
|||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.13.3+wasi-0.2.2"
|
||||
version = "0.14.2+wasi-0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
|
||||
checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
|
||||
dependencies = [
|
||||
"wit-bindgen-rt",
|
||||
]
|
||||
|
@ -6359,8 +6406,8 @@ dependencies = [
|
|||
"hex",
|
||||
"nom",
|
||||
"openssl",
|
||||
"rand",
|
||||
"rand_chacha",
|
||||
"rand 0.8.5",
|
||||
"rand_chacha 0.3.1",
|
||||
"serde",
|
||||
"serde_cbor_2",
|
||||
"serde_json",
|
||||
|
@ -6501,9 +6548,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "windows-link"
|
||||
version = "0.1.0"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3"
|
||||
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
|
||||
|
||||
[[package]]
|
||||
name = "windows-registry"
|
||||
|
@ -6518,9 +6565,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "windows-result"
|
||||
version = "0.3.1"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189"
|
||||
checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
@ -6818,9 +6865,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rt"
|
||||
version = "0.33.0"
|
||||
version = "0.39.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
|
||||
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
|
||||
dependencies = [
|
||||
"bitflags 2.9.0",
|
||||
]
|
||||
|
@ -6901,11 +6948,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.23"
|
||||
version = "0.8.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6"
|
||||
checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879"
|
||||
dependencies = [
|
||||
"zerocopy-derive 0.8.23",
|
||||
"zerocopy-derive 0.8.24",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -6921,9 +6968,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.23"
|
||||
version = "0.8.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154"
|
||||
checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
|
@ -164,7 +164,7 @@ clap_complete = "^4.5.42"
|
|||
# Forced by saffron/cron
|
||||
chrono = "^0.4.39"
|
||||
compact_jwt = { version = "^0.4.2", default-features = false }
|
||||
concread = "^0.5.3"
|
||||
concread = "^0.5.5"
|
||||
cron = "0.15.0"
|
||||
crossbeam = "0.8.4"
|
||||
csv = "1.3.1"
|
||||
|
|
|
@ -45,6 +45,7 @@ can take many forms such as.
|
|||
- firstname firstname lastname
|
||||
- firstname lastname lastname
|
||||
- firstname
|
||||
- middlename lastname
|
||||
- lastname firstname
|
||||
|
||||
And many many more that are not listed here. This is why our names are displayName as a freetext
|
||||
|
|
|
@ -566,7 +566,7 @@ Due to a [lack of public client support](https://github.com/oauth2-proxy/oauth2-
|
|||
|
||||
```bash
|
||||
kanidm system oauth2 create webapp 'webapp.example.com' 'https://webapp.example.com'
|
||||
kanidm system add-redirect-url webapp 'https://webapp.example.com/oauth2/callback'
|
||||
kanidm system oauth2 add-redirect-url webapp 'https://webapp.example.com/oauth2/callback'
|
||||
kanidm system oauth2 update-scope-map webapp email openid
|
||||
kanidm system oauth2 get webapp
|
||||
kanidm system oauth2 show-basic-secret webapp
|
||||
|
|
60
examples/bookstack.md
Normal file
60
examples/bookstack.md
Normal file
|
@ -0,0 +1,60 @@
|
|||
# Bookstack (non-docker version)
|
||||
|
||||
## On Kanidm
|
||||
### 1. Create the bookstack resource server
|
||||
```
|
||||
kanidm system oauth2 create bookstack "Bookstack" https://yourbookstack.example.com
|
||||
```
|
||||
### 2. Create the appropriate group(s)
|
||||
```
|
||||
kanidm group create bookstack-users --name idm_admin
|
||||
```
|
||||
### 3. Add the appropriate users to the group
|
||||
```
|
||||
kanidm group add-members bookstack-users user.name
|
||||
```
|
||||
### 4. Add the scopes:
|
||||
```
|
||||
kanidm system ouath2 update-scope-map bookstack openid profile email keys
|
||||
```
|
||||
### 5. Get the client secret:
|
||||
```
|
||||
kanidm system oauth2 show-basic-secret bookstack
|
||||
```
|
||||
Copy the value that is returned.
|
||||
|
||||
### 6. Disable PKCE / Enable Legacy crypto
|
||||
```
|
||||
kanidm system oauth2 warning-insecure-client-disable-pkce bookstack
|
||||
kanidm system oauth2 warning-enable-legacy-crypto
|
||||
```
|
||||
## On Bookstack server
|
||||
### 1. Add the following to the .env file at the bottom
|
||||
```
|
||||
#OIDC
|
||||
AUTH_AUTO_INITIATE=false
|
||||
OIDC_NAME=Kanidm
|
||||
OIDC_DISPLAY_NAME_CLAIMS=openid
|
||||
OIDC_CLIENT_ID=bookstack
|
||||
OIDC_CLIENT_SECRET=<secret from step 5>
|
||||
OIDC_ISSUER=https://idm.example.com:8443/oauth2/openid/bookstack
|
||||
OIDC_END_SESSION_ENDPOINT=false
|
||||
OIDC_ISSUER_DISCOVER=true
|
||||
OIDC_DUMP_USER_DETAILS=false
|
||||
OIDC_EXTERNAL_ID_CLAIM=openid
|
||||
```
|
||||
### 2. Change the AUTH_METHOD to oidc in the .env file
|
||||
```
|
||||
AUTH_METHOD=oidc
|
||||
```
|
||||
### 3. Open the `app/Access/Oidc/OidcService.php` file with your favorite editor.
|
||||
### 4. Go to line 214 and make the following changes:
|
||||
```
|
||||
return [
|
||||
'external_id' => $token->getClaim('sub'),
|
||||
'email' => $token->getClaim('email'),
|
||||
'name' => $token->getClaim('name'),
|
||||
'groups' => $this->getUserGroups($token),
|
||||
];
|
||||
```
|
||||
Open your bookstack URL and click the Signin with Kanidm button.
|
|
@ -80,6 +80,7 @@ pub enum Attribute {
|
|||
IdVerificationEcKey,
|
||||
Image,
|
||||
Index,
|
||||
Indexed,
|
||||
IpaNtHash,
|
||||
IpaSshPubKey,
|
||||
JwsEs256PrivateKey,
|
||||
|
@ -311,6 +312,7 @@ impl Attribute {
|
|||
Attribute::IdVerificationEcKey => ATTR_ID_VERIFICATION_ECKEY,
|
||||
Attribute::Image => ATTR_IMAGE,
|
||||
Attribute::Index => ATTR_INDEX,
|
||||
Attribute::Indexed => ATTR_INDEXED,
|
||||
Attribute::IpaNtHash => ATTR_IPANTHASH,
|
||||
Attribute::IpaSshPubKey => ATTR_IPASSHPUBKEY,
|
||||
Attribute::JwsEs256PrivateKey => ATTR_JWS_ES256_PRIVATE_KEY,
|
||||
|
@ -495,6 +497,7 @@ impl Attribute {
|
|||
ATTR_ID_VERIFICATION_ECKEY => Attribute::IdVerificationEcKey,
|
||||
ATTR_IMAGE => Attribute::Image,
|
||||
ATTR_INDEX => Attribute::Index,
|
||||
ATTR_INDEXED => Attribute::Indexed,
|
||||
ATTR_IPANTHASH => Attribute::IpaNtHash,
|
||||
ATTR_IPASSHPUBKEY => Attribute::IpaSshPubKey,
|
||||
ATTR_JWS_ES256_PRIVATE_KEY => Attribute::JwsEs256PrivateKey,
|
||||
|
|
|
@ -124,6 +124,7 @@ pub const ATTR_GROUP: &str = "group";
|
|||
pub const ATTR_ID_VERIFICATION_ECKEY: &str = "id_verification_eckey";
|
||||
pub const ATTR_IMAGE: &str = "image";
|
||||
pub const ATTR_INDEX: &str = "index";
|
||||
pub const ATTR_INDEXED: &str = "indexed";
|
||||
pub const ATTR_IPANTHASH: &str = "ipanthash";
|
||||
pub const ATTR_IPASSHPUBKEY: &str = "ipasshpubkey";
|
||||
pub const ATTR_JWS_ES256_PRIVATE_KEY: &str = "jws_es256_private_key";
|
||||
|
|
|
@ -21,7 +21,8 @@ sudo apt-get install -y \
|
|||
libsystemd-dev \
|
||||
libudev-dev \
|
||||
pkg-config \
|
||||
ripgrep
|
||||
ripgrep \
|
||||
lld
|
||||
|
||||
export PATH="$HOME/.cargo/bin:$PATH"
|
||||
|
||||
|
@ -36,7 +37,7 @@ sudo chgrp vscode ~/ -R
|
|||
# shellcheck disable=SC1091
|
||||
source scripts/devcontainer_poststart.sh
|
||||
|
||||
cargo install
|
||||
cargo install \
|
||||
cargo-audit \
|
||||
mdbook-mermaid \
|
||||
mdbook
|
||||
|
|
|
@ -29,7 +29,9 @@ if [ ! -f "${CONFIG_FILE}" ]; then
|
|||
exit 1
|
||||
fi
|
||||
|
||||
pushd "${SCRIPT_DIR}" > /dev/null 2>&1
|
||||
# Save current directory and change to script directory without pushd
|
||||
OLD_DIR=$(pwd)
|
||||
cd "${SCRIPT_DIR}" || exit 1
|
||||
if [ -n "${1}" ]; then
|
||||
COMMAND=$*
|
||||
#shellcheck disable=SC2086
|
||||
|
@ -40,4 +42,4 @@ else
|
|||
#shellcheck disable=SC2086
|
||||
cargo run ${KANI_CARGO_OPTS} --bin kanidmd -- server -c "${CONFIG_FILE}"
|
||||
fi
|
||||
popd > /dev/null 2>&1
|
||||
cd "${OLD_DIR}" || exit 1
|
||||
|
|
|
@ -549,10 +549,11 @@ pub trait BackendTransaction {
|
|||
}
|
||||
(_, fp) => {
|
||||
plan.push(fp);
|
||||
filter_error!(
|
||||
let setplan = FilterPlan::InclusionInvalid(plan);
|
||||
error!(
|
||||
?setplan,
|
||||
"Inclusion is unable to proceed - all terms must be fully indexed!"
|
||||
);
|
||||
let setplan = FilterPlan::InclusionInvalid(plan);
|
||||
return Ok((IdList::Partial(IDLBitRange::new()), setplan));
|
||||
}
|
||||
}
|
||||
|
@ -1427,20 +1428,16 @@ impl<'a> BackendWriteTransaction<'a> {
|
|||
if self.is_idx_slopeyness_generated()? {
|
||||
trace!("Indexing slopes available");
|
||||
} else {
|
||||
admin_warn!(
|
||||
"No indexing slopes available. You should consider reindexing to generate these"
|
||||
);
|
||||
warn!("No indexing slopes available. You should consider reindexing to generate these");
|
||||
};
|
||||
|
||||
// Setup idxkeys here. By default we set these all to "max slope" aka
|
||||
// all indexes are "equal" but also worse case unless analysed. If they
|
||||
// have been analysed, we can set the slope factor into here.
|
||||
let idxkeys: Result<Map<_, _>, _> = idxkeys
|
||||
let mut idxkeys = idxkeys
|
||||
.into_iter()
|
||||
.map(|k| self.get_idx_slope(&k).map(|slope| (k, slope)))
|
||||
.collect();
|
||||
|
||||
let mut idxkeys = idxkeys?;
|
||||
.collect::<Result<Map<_, _>, _>>()?;
|
||||
|
||||
std::mem::swap(&mut self.idxmeta_wr.deref_mut().idxkeys, &mut idxkeys);
|
||||
Ok(())
|
||||
|
|
|
@ -136,8 +136,6 @@ pub const UUID_SCHEMA_ATTR_PRIMARY_CREDENTIAL: Uuid = uuid!("00000000-0000-0000-
|
|||
pub const UUID_SCHEMA_CLASS_PERSON: Uuid = uuid!("00000000-0000-0000-0000-ffff00000044");
|
||||
pub const UUID_SCHEMA_CLASS_GROUP: Uuid = uuid!("00000000-0000-0000-0000-ffff00000045");
|
||||
pub const UUID_SCHEMA_CLASS_ACCOUNT: Uuid = uuid!("00000000-0000-0000-0000-ffff00000046");
|
||||
pub const UUID_SCHEMA_ATTR_LDAP_MAXIMUM_QUERYABLE_ATTRIBUTES: Uuid =
|
||||
uuid!("00000000-0000-0000-0000-ffff00000187");
|
||||
pub const UUID_SCHEMA_ATTR_ATTRIBUTENAME: Uuid = uuid!("00000000-0000-0000-0000-ffff00000048");
|
||||
pub const UUID_SCHEMA_ATTR_CLASSNAME: Uuid = uuid!("00000000-0000-0000-0000-ffff00000049");
|
||||
pub const UUID_SCHEMA_ATTR_LEGALNAME: Uuid = uuid!("00000000-0000-0000-0000-ffff00000050");
|
||||
|
@ -329,6 +327,9 @@ pub const UUID_SCHEMA_ATTR_ALLOW_PRIMARY_CRED_FALLBACK: Uuid =
|
|||
uuid!("00000000-0000-0000-0000-ffff00000185");
|
||||
pub const UUID_SCHEMA_ATTR_DOMAIN_ALLOW_EASTER_EGGS: Uuid =
|
||||
uuid!("00000000-0000-0000-0000-ffff00000186");
|
||||
pub const UUID_SCHEMA_ATTR_LDAP_MAXIMUM_QUERYABLE_ATTRIBUTES: Uuid =
|
||||
uuid!("00000000-0000-0000-0000-ffff00000187");
|
||||
pub const UUID_SCHEMA_ATTR_INDEXED: Uuid = uuid!("00000000-0000-0000-0000-ffff00000188");
|
||||
|
||||
// System and domain infos
|
||||
// I'd like to strongly criticise william of the past for making poor choices about these allocations.
|
||||
|
|
|
@ -492,6 +492,97 @@ impl Entry<EntryInit, EntryNew> {
|
|||
}
|
||||
}
|
||||
|
||||
impl From<SchemaAttribute> for EntryInitNew {
|
||||
fn from(value: SchemaAttribute) -> Self {
|
||||
EntryInitNew::from(&value)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&SchemaAttribute> for EntryInitNew {
|
||||
fn from(s: &SchemaAttribute) -> Self {
|
||||
// Build the Map of the attributes
|
||||
let mut attrs = Eattrs::new();
|
||||
attrs.insert(Attribute::AttributeName, vs_iutf8![s.name.as_str()]);
|
||||
attrs.insert(Attribute::Description, vs_utf8![s.description.to_owned()]);
|
||||
attrs.insert(Attribute::Uuid, vs_uuid![s.uuid]);
|
||||
attrs.insert(Attribute::MultiValue, vs_bool![s.multivalue]);
|
||||
attrs.insert(Attribute::Phantom, vs_bool![s.phantom]);
|
||||
attrs.insert(Attribute::SyncAllowed, vs_bool![s.sync_allowed]);
|
||||
attrs.insert(Attribute::Replicated, vs_bool![s.replicated.into()]);
|
||||
attrs.insert(Attribute::Unique, vs_bool![s.unique]);
|
||||
attrs.insert(Attribute::Indexed, vs_bool![s.indexed]);
|
||||
attrs.insert(Attribute::Syntax, vs_syntax![s.syntax]);
|
||||
attrs.insert(
|
||||
Attribute::Class,
|
||||
vs_iutf8![
|
||||
EntryClass::Object.into(),
|
||||
EntryClass::System.into(),
|
||||
EntryClass::AttributeType.into()
|
||||
],
|
||||
);
|
||||
|
||||
// Insert stuff.
|
||||
|
||||
Entry {
|
||||
valid: EntryInit,
|
||||
state: EntryNew,
|
||||
attrs,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<SchemaClass> for EntryInitNew {
|
||||
fn from(value: SchemaClass) -> Self {
|
||||
EntryInitNew::from(&value)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&SchemaClass> for EntryInitNew {
|
||||
fn from(s: &SchemaClass) -> Self {
|
||||
let mut attrs = Eattrs::new();
|
||||
attrs.insert(Attribute::ClassName, vs_iutf8![s.name.as_str()]);
|
||||
attrs.insert(Attribute::Description, vs_utf8![s.description.to_owned()]);
|
||||
attrs.insert(Attribute::SyncAllowed, vs_bool![s.sync_allowed]);
|
||||
attrs.insert(Attribute::Uuid, vs_uuid![s.uuid]);
|
||||
attrs.insert(
|
||||
Attribute::Class,
|
||||
vs_iutf8![
|
||||
EntryClass::Object.into(),
|
||||
EntryClass::System.into(),
|
||||
EntryClass::ClassType.into()
|
||||
],
|
||||
);
|
||||
|
||||
let vs_systemmay = ValueSetIutf8::from_iter(s.systemmay.iter().map(|sm| sm.as_str()));
|
||||
if let Some(vs) = vs_systemmay {
|
||||
attrs.insert(Attribute::SystemMay, vs);
|
||||
}
|
||||
|
||||
let vs_systemmust = ValueSetIutf8::from_iter(s.systemmust.iter().map(|sm| sm.as_str()));
|
||||
if let Some(vs) = vs_systemmust {
|
||||
attrs.insert(Attribute::SystemMust, vs);
|
||||
}
|
||||
|
||||
let vs_systemexcludes =
|
||||
ValueSetIutf8::from_iter(s.systemexcludes.iter().map(|sm| sm.as_str()));
|
||||
if let Some(vs) = vs_systemexcludes {
|
||||
attrs.insert(Attribute::SystemExcludes, vs);
|
||||
}
|
||||
|
||||
let vs_systemsupplements =
|
||||
ValueSetIutf8::from_iter(s.systemsupplements.iter().map(|sm| sm.as_str()));
|
||||
if let Some(vs) = vs_systemsupplements {
|
||||
attrs.insert(Attribute::SystemSupplements, vs);
|
||||
}
|
||||
|
||||
Entry {
|
||||
valid: EntryInit,
|
||||
state: EntryNew,
|
||||
attrs,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Entry<EntryRefresh, EntryNew> {
|
||||
pub fn from_repl_entry_v1(repl_entry: ReplEntryV1) -> Result<Self, OperationError> {
|
||||
// From the entry, we have to rebuild the ecstate and the attrs.
|
||||
|
@ -1949,7 +2040,7 @@ impl<STATE> Entry<EntryValid, STATE> {
|
|||
};
|
||||
|
||||
if !valid_supplements {
|
||||
admin_warn!(
|
||||
warn!(
|
||||
"Validation error, the following possible supplement classes are missing - {:?}",
|
||||
supplements_classes
|
||||
);
|
||||
|
@ -2633,21 +2724,6 @@ impl<VALID, STATE> Entry<VALID, STATE> {
|
|||
// These are special types to allow returning typed values from
|
||||
// an entry, if we "know" what we expect to receive.
|
||||
|
||||
/// This returns an array of IndexTypes, when the type is an Optional
|
||||
/// multivalue in schema - IE this will *not* fail if the attribute is
|
||||
/// empty, yielding and empty array instead.
|
||||
///
|
||||
/// However, the conversion to IndexType is fallible, so in case of a failure
|
||||
/// to convert, an empty vec is returned
|
||||
pub(crate) fn get_ava_opt_index<A: AsRef<Attribute>>(&self, attr: A) -> Option<Vec<IndexType>> {
|
||||
if let Some(vs) = self.get_ava_set(attr) {
|
||||
vs.as_indextype_iter().map(|i| i.collect())
|
||||
} else {
|
||||
// Empty, but consider as valid.
|
||||
Some(vec![])
|
||||
}
|
||||
}
|
||||
|
||||
/// Return a single value of this attributes name, or `None` if it is NOT present, or
|
||||
/// there are multiple values present (ambiguous).
|
||||
pub fn get_ava_single<A: AsRef<Attribute>>(&self, attr: A) -> Option<Value> {
|
||||
|
@ -3260,97 +3336,6 @@ impl<VALID, STATE> PartialEq for Entry<VALID, STATE> {
|
|||
}
|
||||
}
|
||||
|
||||
impl From<&SchemaAttribute> for Entry<EntryInit, EntryNew> {
|
||||
fn from(s: &SchemaAttribute) -> Self {
|
||||
// Convert an Attribute to an entry ... make it good!
|
||||
let uuid_v = vs_uuid![s.uuid];
|
||||
let name_v = vs_iutf8![s.name.as_str()];
|
||||
let desc_v = vs_utf8![s.description.to_owned()];
|
||||
|
||||
let multivalue_v = vs_bool![s.multivalue];
|
||||
let sync_allowed_v = vs_bool![s.sync_allowed];
|
||||
let replicated_v = vs_bool![s.replicated];
|
||||
let phantom_v = vs_bool![s.phantom];
|
||||
let unique_v = vs_bool![s.unique];
|
||||
|
||||
let index_v = ValueSetIndex::from_iter(s.index.iter().copied());
|
||||
|
||||
let syntax_v = vs_syntax![s.syntax];
|
||||
|
||||
// Build the Map of the attributes relevant
|
||||
// let mut attrs: Map<AttrString, Set<Value>> = Map::with_capacity(8);
|
||||
let mut attrs: Map<Attribute, ValueSet> = Map::new();
|
||||
attrs.insert(Attribute::AttributeName, name_v);
|
||||
attrs.insert(Attribute::Description, desc_v);
|
||||
attrs.insert(Attribute::Uuid, uuid_v);
|
||||
attrs.insert(Attribute::MultiValue, multivalue_v);
|
||||
attrs.insert(Attribute::Phantom, phantom_v);
|
||||
attrs.insert(Attribute::SyncAllowed, sync_allowed_v);
|
||||
attrs.insert(Attribute::Replicated, replicated_v);
|
||||
attrs.insert(Attribute::Unique, unique_v);
|
||||
if let Some(vs) = index_v {
|
||||
attrs.insert(Attribute::Index, vs);
|
||||
}
|
||||
attrs.insert(Attribute::Syntax, syntax_v);
|
||||
attrs.insert(
|
||||
Attribute::Class,
|
||||
vs_iutf8![
|
||||
EntryClass::Object.into(),
|
||||
EntryClass::System.into(),
|
||||
EntryClass::AttributeType.into()
|
||||
],
|
||||
);
|
||||
|
||||
// Insert stuff.
|
||||
|
||||
Entry {
|
||||
valid: EntryInit,
|
||||
state: EntryNew,
|
||||
attrs,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&SchemaClass> for Entry<EntryInit, EntryNew> {
|
||||
fn from(s: &SchemaClass) -> Self {
|
||||
let uuid_v = vs_uuid![s.uuid];
|
||||
let name_v = vs_iutf8![s.name.as_str()];
|
||||
let desc_v = vs_utf8![s.description.to_owned()];
|
||||
let sync_allowed_v = vs_bool![s.sync_allowed];
|
||||
|
||||
let mut attrs: Map<Attribute, ValueSet> = Map::new();
|
||||
attrs.insert(Attribute::ClassName, name_v);
|
||||
attrs.insert(Attribute::Description, desc_v);
|
||||
attrs.insert(Attribute::SyncAllowed, sync_allowed_v);
|
||||
attrs.insert(Attribute::Uuid, uuid_v);
|
||||
attrs.insert(
|
||||
Attribute::Class,
|
||||
vs_iutf8![
|
||||
EntryClass::Object.into(),
|
||||
EntryClass::System.into(),
|
||||
EntryClass::ClassType.into()
|
||||
],
|
||||
);
|
||||
|
||||
let vs_systemmay = ValueSetIutf8::from_iter(s.systemmay.iter().map(|sm| sm.as_str()));
|
||||
if let Some(vs) = vs_systemmay {
|
||||
attrs.insert(Attribute::SystemMay, vs);
|
||||
}
|
||||
|
||||
let vs_systemmust = ValueSetIutf8::from_iter(s.systemmust.iter().map(|sm| sm.as_str()));
|
||||
|
||||
if let Some(vs) = vs_systemmust {
|
||||
attrs.insert(Attribute::SystemMust, vs);
|
||||
}
|
||||
|
||||
Entry {
|
||||
valid: EntryInit,
|
||||
state: EntryNew,
|
||||
attrs,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::prelude::*;
|
||||
|
|
|
@ -527,7 +527,8 @@ impl Filter<FilterValid> {
|
|||
// cases! The exception is *large* filters, especially from the memberof plugin. We
|
||||
// want to skip these because they can really jam up the server.
|
||||
|
||||
let cacheable = FilterResolved::resolve_cacheable(&self.state.inner);
|
||||
// Don't cache anything unless we have valid indexing metadata.
|
||||
let cacheable = idxmeta.is_some() && FilterResolved::resolve_cacheable(&self.state.inner);
|
||||
|
||||
let cache_key = if cacheable {
|
||||
// do we have a cache?
|
||||
|
@ -536,6 +537,7 @@ impl Filter<FilterValid> {
|
|||
let cache_key = (ev.get_event_origin_id(), Arc::new(self.clone()));
|
||||
if let Some(f) = rcache.get(&cache_key) {
|
||||
// Got it? Shortcut and return!
|
||||
trace!("shortcut: a resolved filter already exists.");
|
||||
return Ok(f.as_ref().clone());
|
||||
};
|
||||
// Not in cache? Set the cache_key.
|
||||
|
@ -574,6 +576,7 @@ impl Filter<FilterValid> {
|
|||
// if cacheable == false.
|
||||
if let Some(cache_key) = cache_key {
|
||||
if let Some(rcache) = rsv_cache.as_mut() {
|
||||
trace!(?resolved_filt, "inserting filter to resolved cache");
|
||||
rcache.insert(cache_key, Arc::new(resolved_filt.clone()));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -124,8 +124,8 @@ pub mod prelude {
|
|||
pub use kanidmd_lib_macros::*;
|
||||
|
||||
pub(crate) use crate::valueset::{
|
||||
ValueSet, ValueSetBool, ValueSetCid, ValueSetIndex, ValueSetIutf8, ValueSetRefer,
|
||||
ValueSetSyntax, ValueSetT, ValueSetUtf8, ValueSetUuid,
|
||||
ValueSet, ValueSetBool, ValueSetCid, ValueSetIutf8, ValueSetRefer, ValueSetSyntax,
|
||||
ValueSetT, ValueSetUtf8, ValueSetUuid,
|
||||
};
|
||||
|
||||
pub(crate) use kanidm_proto::scim_v1::{
|
||||
|
|
|
@ -620,22 +620,6 @@ macro_rules! vs_syntax {
|
|||
});
|
||||
}
|
||||
|
||||
#[allow(unused_macros)]
|
||||
#[macro_export]
|
||||
macro_rules! vs_index {
|
||||
() => (
|
||||
compile_error!("ValueSetIndex needs at least 1 element")
|
||||
);
|
||||
($e:expr) => ({
|
||||
ValueSetIndex::new($e)
|
||||
});
|
||||
($e:expr, $($item:expr),*) => ({
|
||||
let mut x = ValueSetIndex::new($e);
|
||||
$(assert!(x.push($item));)*
|
||||
x
|
||||
});
|
||||
}
|
||||
|
||||
#[allow(unused_macros)]
|
||||
#[macro_export]
|
||||
macro_rules! vs_cid {
|
||||
|
|
|
@ -69,7 +69,6 @@ pub fn phase_1_schema_attrs() -> Vec<EntryInitNew> {
|
|||
SCHEMA_ATTR_SYNC_TOKEN_SESSION.clone().into(),
|
||||
SCHEMA_ATTR_UNIX_PASSWORD.clone().into(),
|
||||
SCHEMA_ATTR_USER_AUTH_TOKEN_SESSION.clone().into(),
|
||||
SCHEMA_ATTR_DENIED_NAME.clone().into(),
|
||||
SCHEMA_ATTR_CREDENTIAL_TYPE_MINIMUM.clone().into(),
|
||||
SCHEMA_ATTR_WEBAUTHN_ATTESTATION_CA_LIST.clone().into(),
|
||||
// DL4
|
||||
|
|
|
@ -2,52 +2,25 @@
|
|||
use crate::constants::entries::{Attribute, EntryClass};
|
||||
use crate::constants::uuids::*;
|
||||
use crate::schema::{SchemaAttribute, SchemaClass};
|
||||
use crate::value::IndexType;
|
||||
use crate::value::SyntaxType;
|
||||
|
||||
lazy_static!(
|
||||
|
||||
pub static ref SCHEMA_ATTR_DISPLAYNAME: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_DISPLAYNAME,
|
||||
name: Attribute::DisplayName,
|
||||
description: "The publicly visible display name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_ATTR_DISPLAYNAME_DL7: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_DISPLAYNAME,
|
||||
name: Attribute::DisplayName,
|
||||
description: "The publicly visible display name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::SubString],
|
||||
indexed: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_ATTR_MAIL: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_MAIL,
|
||||
name: Attribute::Mail,
|
||||
description: "Mail addresses of the object".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::EmailAddress,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_ATTR_MAIL_DL7: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_MAIL,
|
||||
name: Attribute::Mail,
|
||||
description: "Mail addresses of the object".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::SubString],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
|
@ -59,8 +32,7 @@ pub static ref SCHEMA_ATTR_EC_KEY_PRIVATE: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_EC_KEY_PRIVATE,
|
||||
name: Attribute::IdVerificationEcKey,
|
||||
description: "Account verification private key".to_string(),
|
||||
|
||||
index: vec![IndexType::Presence],
|
||||
indexed: true,
|
||||
unique: false,
|
||||
sync_allowed: false,
|
||||
syntax: SyntaxType::EcKeyPrivate,
|
||||
|
@ -82,30 +54,17 @@ pub static ref SCHEMA_ATTR_PRIMARY_CREDENTIAL: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_PRIMARY_CREDENTIAL,
|
||||
name: Attribute::PrimaryCredential,
|
||||
description: "Primary credential material of the account for authentication interactively".to_string(),
|
||||
|
||||
index: vec![IndexType::Presence],
|
||||
indexed: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Credential,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_ATTR_LEGALNAME: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_LEGALNAME,
|
||||
name: Attribute::LegalName,
|
||||
description: "The private and sensitive legal name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_ATTR_LEGALNAME_DL7: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_LEGALNAME,
|
||||
name: Attribute::LegalName,
|
||||
description: "The private and sensitive legal name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::SubString],
|
||||
indexed: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -115,8 +74,7 @@ pub static ref SCHEMA_ATTR_NAME_HISTORY: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_NAME_HISTORY,
|
||||
name: Attribute::NameHistory,
|
||||
description: "The history of names that a person has had".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::AuditLogString,
|
||||
|
@ -127,7 +85,6 @@ pub static ref SCHEMA_ATTR_RADIUS_SECRET: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_RADIUS_SECRET,
|
||||
name: Attribute::RadiusSecret,
|
||||
description: "The accounts generated radius secret for device network authentication".to_string(),
|
||||
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::SecretUtf8String,
|
||||
..Default::default()
|
||||
|
@ -137,8 +94,7 @@ pub static ref SCHEMA_ATTR_DOMAIN_NAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_NAME,
|
||||
name: Attribute::DomainName,
|
||||
description: "The domain's DNS name for webauthn and SPN generation purposes".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::Presence],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8StringIname,
|
||||
..Default::default()
|
||||
|
@ -148,7 +104,6 @@ pub static ref SCHEMA_ATTR_LDAP_ALLOW_UNIX_PW_BIND: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_LDAP_ALLOW_UNIX_PW_BIND,
|
||||
name: Attribute::LdapAllowUnixPwBind,
|
||||
description: "Configuration to enable binds to LDAP objects using their UNIX password".to_string(),
|
||||
|
||||
unique: false,
|
||||
syntax: SyntaxType::Boolean,
|
||||
..Default::default()
|
||||
|
@ -158,7 +113,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_LDAP_BASEDN: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_LDAP_BASEDN,
|
||||
name: Attribute::DomainLdapBasedn,
|
||||
description: "The domain's optional ldap basedn. If unset defaults to domain components of domain name".to_string(),
|
||||
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8StringInsensitive,
|
||||
..Default::default()
|
||||
|
@ -168,7 +122,6 @@ pub static ref SCHEMA_ATTR_LDAP_MAXIMUM_QUERYABLE_ATTRIBUTES: SchemaAttribute =
|
|||
uuid: UUID_SCHEMA_ATTR_LDAP_MAXIMUM_QUERYABLE_ATTRIBUTES,
|
||||
name: Attribute::LdapMaxQueryableAttrs,
|
||||
description: "The maximum number of LDAP attributes that can be queried in one operation".to_string(),
|
||||
|
||||
multivalue: false,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Uint32,
|
||||
|
@ -179,8 +132,7 @@ pub static ref SCHEMA_ATTR_DOMAIN_DISPLAY_NAME: SchemaAttribute = SchemaAttribut
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_DISPLAY_NAME,
|
||||
name: Attribute::DomainDisplayName,
|
||||
description: "The user-facing display name of the Kanidm domain".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -189,8 +141,7 @@ pub static ref SCHEMA_ATTR_DOMAIN_UUID: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_UUID,
|
||||
name: Attribute::DomainUuid,
|
||||
description: "The domain's uuid, used in CSN and trust relationships".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
syntax: SyntaxType::Uuid,
|
||||
..Default::default()
|
||||
|
@ -200,27 +151,16 @@ pub static ref SCHEMA_ATTR_DOMAIN_SSID: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_SSID,
|
||||
name: Attribute::DomainSsid,
|
||||
description: "The domains site-wide SSID for device autoconfiguration of wireless".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_ATTR_DENIED_NAME: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_DENIED_NAME,
|
||||
name: Attribute::DeniedName,
|
||||
description: "Iname values that are not allowed to be used in 'name'.".to_string(),
|
||||
|
||||
syntax: SyntaxType::Utf8StringIname,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_ATTR_DENIED_NAME_DL10: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_DENIED_NAME,
|
||||
name: Attribute::DeniedName,
|
||||
description: "Iname values that are not allowed to be used in 'name'.".to_string(),
|
||||
|
||||
syntax: SyntaxType::Utf8StringIname,
|
||||
multivalue: true,
|
||||
..Default::default()
|
||||
|
@ -230,7 +170,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_TOKEN_KEY: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_TOKEN_KEY,
|
||||
name: Attribute::DomainTokenKey,
|
||||
description: "The domain token encryption private key (NOT USED)".to_string(),
|
||||
|
||||
syntax: SyntaxType::SecretUtf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -248,8 +187,7 @@ pub static ref SCHEMA_ATTR_GIDNUMBER: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_GIDNUMBER,
|
||||
name: Attribute::GidNumber,
|
||||
description: "The groupid (uid) number of a group or account.to_string(). This is the same value as the UID number on posix accounts for security reasons".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Uint32,
|
||||
|
@ -260,7 +198,6 @@ pub static ref SCHEMA_ATTR_BADLIST_PASSWORD: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_BADLIST_PASSWORD,
|
||||
name: Attribute::BadlistPassword,
|
||||
description: "A password that is badlisted meaning that it can not be set as a valid password by any user account".to_string(),
|
||||
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::Utf8StringInsensitive,
|
||||
..Default::default()
|
||||
|
@ -270,7 +207,6 @@ pub static ref SCHEMA_ATTR_AUTH_SESSION_EXPIRY: SchemaAttribute = SchemaAttribut
|
|||
uuid: UUID_SCHEMA_ATTR_AUTH_SESSION_EXPIRY,
|
||||
name: Attribute::AuthSessionExpiry,
|
||||
description: "An expiration time for an authentication session".to_string(),
|
||||
|
||||
syntax: SyntaxType::Uint32,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -279,7 +215,6 @@ pub static ref SCHEMA_ATTR_AUTH_PRIVILEGE_EXPIRY: SchemaAttribute = SchemaAttrib
|
|||
uuid: UUID_SCHEMA_ATTR_AUTH_PRIVILEGE_EXPIRY,
|
||||
name: Attribute::PrivilegeExpiry,
|
||||
description: "An expiration time for a privileged authentication session".to_string(),
|
||||
|
||||
syntax: SyntaxType::Uint32,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -288,7 +223,6 @@ pub static ref SCHEMA_ATTR_AUTH_PASSWORD_MINIMUM_LENGTH: SchemaAttribute = Schem
|
|||
uuid: UUID_SCHEMA_ATTR_AUTH_PASSWORD_MINIMUM_LENGTH,
|
||||
name: Attribute::AuthPasswordMinimumLength,
|
||||
description: "Minimum length of passwords".to_string(),
|
||||
|
||||
syntax: SyntaxType::Uint32,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -297,7 +231,6 @@ pub static ref SCHEMA_ATTR_LOGINSHELL: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_LOGINSHELL,
|
||||
name: Attribute::LoginShell,
|
||||
description: "A POSIX user's UNIX login shell".to_string(),
|
||||
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8StringInsensitive,
|
||||
..Default::default()
|
||||
|
@ -307,8 +240,7 @@ pub static ref SCHEMA_ATTR_UNIX_PASSWORD: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_UNIX_PASSWORD,
|
||||
name: Attribute::UnixPassword,
|
||||
description: "A POSIX user's UNIX login password".to_string(),
|
||||
|
||||
index: vec![IndexType::Presence],
|
||||
indexed: true,
|
||||
syntax: SyntaxType::Credential,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -317,8 +249,7 @@ pub static ref SCHEMA_ATTR_NSUNIQUEID: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_NSUNIQUEID,
|
||||
name: Attribute::NsUniqueId,
|
||||
description: "A unique id compatibility for 389-ds/dsee".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::NsUniqueId,
|
||||
|
@ -329,7 +260,6 @@ pub static ref SCHEMA_ATTR_ACCOUNT_EXPIRE: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_ACCOUNT_EXPIRE,
|
||||
name: Attribute::AccountExpire,
|
||||
description: "The datetime after which this account no longer may authenticate".to_string(),
|
||||
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::DateTime,
|
||||
..Default::default()
|
||||
|
@ -339,7 +269,6 @@ pub static ref SCHEMA_ATTR_ACCOUNT_VALID_FROM: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_ACCOUNT_VALID_FROM,
|
||||
name: Attribute::AccountValidFrom,
|
||||
description: "The datetime after which this account may commence authenticating".to_string(),
|
||||
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::DateTime,
|
||||
..Default::default()
|
||||
|
@ -349,7 +278,6 @@ pub static ref SCHEMA_ATTR_WEBAUTHN_ATTESTATION_CA_LIST: SchemaAttribute = Schem
|
|||
uuid: UUID_SCHEMA_ATTR_WEBAUTHN_ATTESTATION_CA_LIST,
|
||||
name: Attribute::WebauthnAttestationCaList,
|
||||
description: "A set of CA's that limit devices that can be used with webauthn".to_string(),
|
||||
|
||||
syntax: SyntaxType::WebauthnAttestationCaList,
|
||||
multivalue: true,
|
||||
..Default::default()
|
||||
|
@ -359,27 +287,16 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_NAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_NAME,
|
||||
name: Attribute::OAuth2RsName,
|
||||
description: "The unique name of an external Oauth2 resource".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8StringIname,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_ATTR_OAUTH2_RS_ORIGIN: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_ORIGIN,
|
||||
name: Attribute::OAuth2RsOrigin,
|
||||
description: "The origin domain of an oauth2 resource server".to_string(),
|
||||
|
||||
syntax: SyntaxType::Url,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_ATTR_OAUTH2_RS_ORIGIN_DL7: SchemaAttribute = SchemaAttribute {
|
||||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_ORIGIN,
|
||||
name: Attribute::OAuth2RsOrigin,
|
||||
description: "The origin domain of an OAuth2 client".to_string(),
|
||||
|
||||
syntax: SyntaxType::Url,
|
||||
multivalue: true,
|
||||
..Default::default()
|
||||
|
@ -389,7 +306,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_ORIGIN_LANDING: SchemaAttribute = SchemaAtt
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_ORIGIN_LANDING,
|
||||
name: Attribute::OAuth2RsOriginLanding,
|
||||
description: "The landing page of an RS, that will automatically trigger the auth process".to_string(),
|
||||
|
||||
syntax: SyntaxType::Url,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -399,7 +315,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_ALLOW_LOCALHOST_REDIRECT_DL4: SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_ALLOW_LOCALHOST_REDIRECT,
|
||||
name: Attribute::OAuth2AllowLocalhostRedirect,
|
||||
description: "Allow public clients associated to this RS to redirect to localhost".to_string(),
|
||||
|
||||
syntax: SyntaxType::Boolean,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -408,8 +323,7 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_CLAIM_MAP_DL4: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_CLAIM_MAP,
|
||||
name: Attribute::OAuth2RsClaimMap,
|
||||
description: "A set of custom claims mapped to group memberships of accounts".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
// CHANGE ME
|
||||
syntax: SyntaxType::OauthClaimMap,
|
||||
|
@ -420,8 +334,7 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_SCOPE_MAP: SchemaAttribute = SchemaAttribut
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_SCOPE_MAP,
|
||||
name: Attribute::OAuth2RsScopeMap,
|
||||
description: "A reference to a group mapped to scopes for the associated oauth2 resource server".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScopeMap,
|
||||
..Default::default()
|
||||
|
@ -431,8 +344,7 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_SUP_SCOPE_MAP: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_SUP_SCOPE_MAP,
|
||||
name: Attribute::OAuth2RsSupScopeMap,
|
||||
description: "A reference to a group mapped to scopes for the associated oauth2 resource server".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScopeMap,
|
||||
..Default::default()
|
||||
|
@ -442,7 +354,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_BASIC_SECRET: SchemaAttribute = SchemaAttri
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_BASIC_SECRET,
|
||||
name: Attribute::OAuth2RsBasicSecret,
|
||||
description: "When using oauth2 basic authentication, the secret string of the resource server".to_string(),
|
||||
|
||||
syntax: SyntaxType::SecretUtf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -451,7 +362,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_TOKEN_KEY: SchemaAttribute = SchemaAttribut
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_TOKEN_KEY,
|
||||
name: Attribute::OAuth2RsTokenKey,
|
||||
description: "An oauth2 resource servers unique token signing key".to_string(),
|
||||
|
||||
syntax: SyntaxType::SecretUtf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -460,7 +370,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_IMPLICIT_SCOPES: SchemaAttribute = SchemaAt
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_IMPLICIT_SCOPES,
|
||||
name: Attribute::OAuth2RsImplicitScopes,
|
||||
description: "An oauth2 resource servers scopes that are implicitly granted to all users".to_string(),
|
||||
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScope,
|
||||
..Default::default()
|
||||
|
@ -470,8 +379,7 @@ pub static ref SCHEMA_ATTR_OAUTH2_CONSENT_SCOPE_MAP: SchemaAttribute = SchemaAtt
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_CONSENT_SCOPE_MAP,
|
||||
name: Attribute::OAuth2ConsentScopeMap,
|
||||
description: "A set of scopes mapped from a relying server to a user, where the user has previously consented to the following. If changed or deleted, consent will be re-sought".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScopeMap,
|
||||
..Default::default()
|
||||
|
@ -481,7 +389,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_STRICT_REDIRECT_URI_DL7: SchemaAttribute = Sch
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_STRICT_REDIRECT_URI,
|
||||
name: Attribute::OAuth2StrictRedirectUri,
|
||||
description: "Represents if strict redirect uri enforcement is enabled.".to_string(),
|
||||
|
||||
syntax: SyntaxType::Boolean,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -491,7 +398,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_DEVICE_FLOW_ENABLE_DL9: SchemaAttribute = Sche
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_DEVICE_FLOW_ENABLE,
|
||||
name: Attribute::OAuth2DeviceFlowEnable,
|
||||
description: "Represents if OAuth2 Device Flow is permitted on this client.".to_string(),
|
||||
|
||||
syntax: SyntaxType::Boolean,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -500,7 +406,6 @@ pub static ref SCHEMA_ATTR_ES256_PRIVATE_KEY_DER: SchemaAttribute = SchemaAttrib
|
|||
uuid: UUID_SCHEMA_ATTR_ES256_PRIVATE_KEY_DER,
|
||||
name: Attribute::Es256PrivateKeyDer,
|
||||
description: "An es256 private key".to_string(),
|
||||
|
||||
syntax: SyntaxType::PrivateBinary,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -509,7 +414,6 @@ pub static ref SCHEMA_ATTR_RS256_PRIVATE_KEY_DER: SchemaAttribute = SchemaAttrib
|
|||
uuid: UUID_SCHEMA_ATTR_RS256_PRIVATE_KEY_DER,
|
||||
name: Attribute::Rs256PrivateKeyDer,
|
||||
description: "An rs256 private key".to_string(),
|
||||
|
||||
syntax: SyntaxType::PrivateBinary,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -518,8 +422,7 @@ pub static ref SCHEMA_ATTR_JWS_ES256_PRIVATE_KEY: SchemaAttribute = SchemaAttrib
|
|||
uuid: UUID_SCHEMA_ATTR_JWS_ES256_PRIVATE_KEY,
|
||||
name: Attribute::JwsEs256PrivateKey,
|
||||
description: "An es256 private key for jws".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
syntax: SyntaxType::JwsKeyEs256,
|
||||
..Default::default()
|
||||
|
@ -530,7 +433,6 @@ pub static ref SCHEMA_ATTR_PRIVATE_COOKIE_KEY: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_PRIVATE_COOKIE_KEY,
|
||||
name: Attribute::PrivateCookieKey,
|
||||
description: "An private cookie hmac key".to_string(),
|
||||
|
||||
syntax: SyntaxType::PrivateBinary,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -539,7 +441,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_ALLOW_INSECURE_CLIENT_DISABLE_PKCE: SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_ALLOW_INSECURE_CLIENT_DISABLE_PKCE,
|
||||
name: Attribute::OAuth2AllowInsecureClientDisablePkce,
|
||||
description: "Allows disabling of PKCE for insecure OAuth2 clients".to_string(),
|
||||
|
||||
syntax: SyntaxType::Boolean,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -548,7 +449,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_JWT_LEGACY_CRYPTO_ENABLE: SchemaAttribute = Sc
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_JWT_LEGACY_CRYPTO_ENABLE,
|
||||
name: Attribute::OAuth2JwtLegacyCryptoEnable,
|
||||
description: "Allows enabling legacy JWT cryptograhpy for clients".to_string(),
|
||||
|
||||
syntax: SyntaxType::Boolean,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -557,8 +457,7 @@ pub static ref SCHEMA_ATTR_CREDENTIAL_UPDATE_INTENT_TOKEN: SchemaAttribute = Sch
|
|||
uuid: UUID_SCHEMA_ATTR_CREDENTIAL_UPDATE_INTENT_TOKEN,
|
||||
name: Attribute::CredentialUpdateIntentToken,
|
||||
description: "The status of a credential update intent token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::IntentToken,
|
||||
..Default::default()
|
||||
|
@ -568,8 +467,7 @@ pub static ref SCHEMA_ATTR_PASSKEYS: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_PASSKEYS,
|
||||
name: Attribute::PassKeys,
|
||||
description: "A set of registered passkeys".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Passkey,
|
||||
|
@ -580,8 +478,7 @@ pub static ref SCHEMA_ATTR_ATTESTED_PASSKEYS: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_ATTESTED_PASSKEYS,
|
||||
name: Attribute::AttestedPasskeys,
|
||||
description: "A set of registered device keys".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::AttestedPasskey,
|
||||
|
@ -592,7 +489,6 @@ pub static ref SCHEMA_ATTR_DYNGROUP_FILTER: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DYNGROUP_FILTER,
|
||||
name: Attribute::DynGroupFilter,
|
||||
description: "A filter describing the set of entries to add to a dynamic group".to_string(),
|
||||
|
||||
syntax: SyntaxType::JsonFilter,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -601,7 +497,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_PREFER_SHORT_USERNAME: SchemaAttribute = Schem
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_PREFER_SHORT_USERNAME,
|
||||
name: Attribute::OAuth2PreferShortUsername,
|
||||
description: "Use 'name' instead of 'spn' in the preferred_username claim".to_string(),
|
||||
|
||||
syntax: SyntaxType::Boolean,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -610,8 +505,7 @@ pub static ref SCHEMA_ATTR_API_TOKEN_SESSION: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_API_TOKEN_SESSION,
|
||||
name: Attribute::ApiTokenSession,
|
||||
description: "A session entry related to an issued API token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::ApiToken,
|
||||
|
@ -622,8 +516,7 @@ pub static ref SCHEMA_ATTR_USER_AUTH_TOKEN_SESSION: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_USER_AUTH_TOKEN_SESSION,
|
||||
name: Attribute::UserAuthTokenSession,
|
||||
description: "A session entry related to an issued user auth token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::Session,
|
||||
|
@ -634,8 +527,7 @@ pub static ref SCHEMA_ATTR_OAUTH2_SESSION: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_SESSION,
|
||||
name: Attribute::OAuth2Session,
|
||||
description: "A session entry to an active oauth2 session, bound to a parent user auth token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::Oauth2Session,
|
||||
..Default::default()
|
||||
|
@ -645,8 +537,7 @@ pub static ref SCHEMA_ATTR_SYNC_TOKEN_SESSION: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_SYNC_TOKEN_SESSION,
|
||||
name: Attribute::SyncTokenSession,
|
||||
description: "A session entry related to an issued sync token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
unique: true,
|
||||
syntax: SyntaxType::ApiToken,
|
||||
..Default::default()
|
||||
|
@ -656,7 +547,6 @@ pub static ref SCHEMA_ATTR_SYNC_COOKIE: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_SYNC_COOKIE,
|
||||
name: Attribute::SyncCookie,
|
||||
description: "A private sync cookie for a remote IDM source".to_string(),
|
||||
|
||||
syntax: SyntaxType::PrivateBinary,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -665,8 +555,7 @@ pub static ref SCHEMA_ATTR_GRANT_UI_HINT: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_GRANT_UI_HINT,
|
||||
name: Attribute::GrantUiHint,
|
||||
description: "A UI hint that is granted via membership to a group".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
indexed: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::UiHint,
|
||||
..Default::default()
|
||||
|
@ -676,7 +565,6 @@ pub static ref SCHEMA_ATTR_SYNC_CREDENTIAL_PORTAL: SchemaAttribute = SchemaAttri
|
|||
uuid: UUID_SCHEMA_ATTR_SYNC_CREDENTIAL_PORTAL,
|
||||
name: Attribute::SyncCredentialPortal,
|
||||
description: "The url of an external credential portal for synced accounts to visit to update their credentials".to_string(),
|
||||
|
||||
syntax: SyntaxType::Url,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -685,7 +573,6 @@ pub static ref SCHEMA_ATTR_SYNC_YIELD_AUTHORITY: SchemaAttribute = SchemaAttribu
|
|||
uuid: UUID_SCHEMA_ATTR_SYNC_YIELD_AUTHORITY,
|
||||
name: Attribute::SyncYieldAuthority,
|
||||
description: "A set of attributes that have their authority yielded to Kanidm in a sync agreement".to_string(),
|
||||
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::Utf8StringInsensitive,
|
||||
..Default::default()
|
||||
|
@ -695,7 +582,6 @@ pub static ref SCHEMA_ATTR_CREDENTIAL_TYPE_MINIMUM: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_CREDENTIAL_TYPE_MINIMUM,
|
||||
name: Attribute::CredentialTypeMinimum,
|
||||
description: "The minimum level of credential type that can satisfy this policy".to_string(),
|
||||
|
||||
multivalue: false,
|
||||
syntax: SyntaxType::CredentialType,
|
||||
..Default::default()
|
||||
|
@ -705,7 +591,6 @@ pub static ref SCHEMA_ATTR_LIMIT_SEARCH_MAX_RESULTS_DL6: SchemaAttribute = Schem
|
|||
uuid: UUID_SCHEMA_ATTR_LIMIT_SEARCH_MAX_RESULTS,
|
||||
name: Attribute::LimitSearchMaxResults,
|
||||
description: "The maximum number of query results that may be returned in a single operation".to_string(),
|
||||
|
||||
multivalue: false,
|
||||
syntax: SyntaxType::Uint32,
|
||||
..Default::default()
|
||||
|
@ -715,7 +600,6 @@ pub static ref SCHEMA_ATTR_LIMIT_SEARCH_MAX_FILTER_TEST_DL6: SchemaAttribute = S
|
|||
uuid: UUID_SCHEMA_ATTR_LIMIT_SEARCH_MAX_FILTER_TEST,
|
||||
name: Attribute::LimitSearchMaxFilterTest,
|
||||
description: "The maximum number of entries that may be examined in a partially indexed query".to_string(),
|
||||
|
||||
multivalue: false,
|
||||
syntax: SyntaxType::Uint32,
|
||||
..Default::default()
|
||||
|
@ -735,6 +619,7 @@ pub static ref SCHEMA_ATTR_KEY_PROVIDER_DL6: SchemaAttribute = SchemaAttribute {
|
|||
name: Attribute::KeyProvider,
|
||||
description: "".to_string(),
|
||||
multivalue: false,
|
||||
indexed: true,
|
||||
syntax: SyntaxType::ReferenceUuid,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -800,6 +685,7 @@ pub static ref SCHEMA_ATTR_REFERS_DL7: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_REFERS,
|
||||
name: Attribute::Refers,
|
||||
description: "A reference to linked object".to_string(),
|
||||
indexed: true,
|
||||
multivalue: false,
|
||||
syntax: SyntaxType::ReferenceUuid,
|
||||
..Default::default()
|
||||
|
@ -809,8 +695,8 @@ pub static ref SCHEMA_ATTR_LINKED_GROUP_DL8: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_LINKED_GROUP,
|
||||
name: Attribute::LinkedGroup,
|
||||
description: "A reference linking a group to an entry".to_string(),
|
||||
|
||||
multivalue: false,
|
||||
indexed: true,
|
||||
syntax: SyntaxType::ReferenceUuid,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -819,7 +705,6 @@ pub static ref SCHEMA_ATTR_ALLOW_PRIMARY_CRED_FALLBACK_DL8: SchemaAttribute = Sc
|
|||
uuid: UUID_SCHEMA_ATTR_ALLOW_PRIMARY_CRED_FALLBACK,
|
||||
name: Attribute::AllowPrimaryCredFallback,
|
||||
description: "Allow fallback to primary password if no POSIX password exists".to_string(),
|
||||
|
||||
multivalue: false,
|
||||
syntax: SyntaxType::Boolean,
|
||||
..Default::default()
|
||||
|
@ -838,57 +723,13 @@ pub static ref SCHEMA_ATTR_APPLICATION_PASSWORD_DL8: SchemaAttribute = SchemaAtt
|
|||
uuid: UUID_SCHEMA_ATTR_APPLICATION_PASSWORD,
|
||||
name: Attribute::ApplicationPassword,
|
||||
description: "A set of application passwords".to_string(),
|
||||
|
||||
multivalue: true,
|
||||
indexed: true,
|
||||
syntax: SyntaxType::ApplicationPassword,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
// === classes ===
|
||||
|
||||
pub static ref SCHEMA_CLASS_PERSON: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_PERSON,
|
||||
name: EntryClass::Person.into(),
|
||||
description: "Object representation of a person".to_string(),
|
||||
|
||||
sync_allowed: true,
|
||||
systemmay: vec![
|
||||
Attribute::Mail,
|
||||
Attribute::LegalName,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::DisplayName,
|
||||
Attribute::Name,
|
||||
Attribute::IdVerificationEcKey],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_PERSON_DL5: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_PERSON,
|
||||
name: EntryClass::Person.into(),
|
||||
description: "Object representation of a person".to_string(),
|
||||
|
||||
sync_allowed: true,
|
||||
systemmay: vec![
|
||||
Attribute::PrimaryCredential,
|
||||
Attribute::PassKeys,
|
||||
Attribute::AttestedPasskeys,
|
||||
Attribute::CredentialUpdateIntentToken,
|
||||
Attribute::SshPublicKey,
|
||||
Attribute::RadiusSecret,
|
||||
Attribute::OAuth2ConsentScopeMap,
|
||||
Attribute::UserAuthTokenSession,
|
||||
Attribute::OAuth2Session,
|
||||
Attribute::Mail,
|
||||
Attribute::LegalName,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::IdVerificationEcKey
|
||||
],
|
||||
systemexcludes: vec![EntryClass::ServiceAccount.into(), EntryClass::Application.into()],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_PERSON_DL8: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_PERSON,
|
||||
name: EntryClass::Person.into(),
|
||||
|
@ -961,24 +802,6 @@ pub static ref SCHEMA_CLASS_DYNGROUP: SchemaClass = SchemaClass {
|
|||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_ACCOUNT_POLICY_DL6: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_ACCOUNT_POLICY,
|
||||
name: EntryClass::AccountPolicy.into(),
|
||||
description: "Policies applied to accounts that are members of a group".to_string(),
|
||||
|
||||
systemmay: vec![
|
||||
Attribute::AuthSessionExpiry,
|
||||
Attribute::PrivilegeExpiry,
|
||||
Attribute::AuthPasswordMinimumLength,
|
||||
Attribute::CredentialTypeMinimum,
|
||||
Attribute::WebauthnAttestationCaList,
|
||||
Attribute::LimitSearchMaxResults,
|
||||
Attribute::LimitSearchMaxFilterTest,
|
||||
],
|
||||
systemsupplements: vec![Attribute::Group.into()],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_ACCOUNT_POLICY_DL8: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_ACCOUNT_POLICY,
|
||||
name: EntryClass::AccountPolicy.into(),
|
||||
|
@ -998,40 +821,6 @@ pub static ref SCHEMA_CLASS_ACCOUNT_POLICY_DL8: SchemaClass = SchemaClass {
|
|||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_ACCOUNT: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_ACCOUNT,
|
||||
name: EntryClass::Account.into(),
|
||||
description: "Object representation of an account".to_string(),
|
||||
|
||||
sync_allowed: true,
|
||||
systemmay: vec![
|
||||
Attribute::PrimaryCredential,
|
||||
Attribute::PassKeys,
|
||||
Attribute::AttestedPasskeys,
|
||||
Attribute::CredentialUpdateIntentToken,
|
||||
Attribute::SshPublicKey,
|
||||
Attribute::RadiusSecret,
|
||||
Attribute::AccountExpire,
|
||||
Attribute::AccountValidFrom,
|
||||
Attribute::Mail,
|
||||
Attribute::OAuth2ConsentScopeMap,
|
||||
Attribute::UserAuthTokenSession,
|
||||
Attribute::OAuth2Session,
|
||||
Attribute::Description,
|
||||
Attribute::NameHistory,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::DisplayName,
|
||||
Attribute::Name,
|
||||
Attribute::Spn
|
||||
],
|
||||
systemsupplements: vec![
|
||||
EntryClass::Person.into(),
|
||||
EntryClass::ServiceAccount.into(),
|
||||
],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_ACCOUNT_DL5: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_ACCOUNT,
|
||||
name: EntryClass::Account.into(),
|
||||
|
@ -1056,29 +845,6 @@ pub static ref SCHEMA_CLASS_ACCOUNT_DL5: SchemaClass = SchemaClass {
|
|||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_SERVICE_ACCOUNT_DL6: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_SERVICE_ACCOUNT,
|
||||
name: EntryClass::ServiceAccount.into(),
|
||||
description: "Object representation of service account".to_string(),
|
||||
|
||||
sync_allowed: true,
|
||||
systemmay: vec![
|
||||
Attribute::SshPublicKey,
|
||||
Attribute::UserAuthTokenSession,
|
||||
Attribute::OAuth2Session,
|
||||
Attribute::OAuth2ConsentScopeMap,
|
||||
Attribute::Description,
|
||||
|
||||
Attribute::Mail,
|
||||
Attribute::PrimaryCredential,
|
||||
Attribute::ApiTokenSession,
|
||||
|
||||
Attribute::JwsEs256PrivateKey,
|
||||
],
|
||||
systemexcludes: vec![EntryClass::Person.into()],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_SERVICE_ACCOUNT_DL7: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_SERVICE_ACCOUNT,
|
||||
name: EntryClass::ServiceAccount.into(),
|
||||
|
@ -1100,23 +866,6 @@ pub static ref SCHEMA_CLASS_SERVICE_ACCOUNT_DL7: SchemaClass = SchemaClass {
|
|||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_SYNC_ACCOUNT_DL6: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_SYNC_ACCOUNT,
|
||||
name: EntryClass::SyncAccount.into(),
|
||||
description: "Object representation of sync account".to_string(),
|
||||
|
||||
systemmust: vec![Attribute::Name],
|
||||
systemmay: vec![
|
||||
Attribute::SyncTokenSession,
|
||||
Attribute::SyncCookie,
|
||||
Attribute::SyncCredentialPortal,
|
||||
Attribute::SyncYieldAuthority,
|
||||
Attribute::JwsEs256PrivateKey,
|
||||
],
|
||||
systemexcludes: vec![EntryClass::Account.into()],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_SYNC_ACCOUNT_DL7: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_SYNC_ACCOUNT,
|
||||
name: EntryClass::SyncAccount.into(),
|
||||
|
@ -1133,100 +882,6 @@ pub static ref SCHEMA_CLASS_SYNC_ACCOUNT_DL7: SchemaClass = SchemaClass {
|
|||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_DOMAIN_INFO_DL6: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_DOMAIN_INFO,
|
||||
name: EntryClass::DomainInfo.into(),
|
||||
description: "Local domain information and configuration".to_string(),
|
||||
|
||||
systemmay: vec![
|
||||
Attribute::DomainSsid,
|
||||
Attribute::DomainLdapBasedn,
|
||||
Attribute::LdapAllowUnixPwBind,
|
||||
Attribute::PrivateCookieKey,
|
||||
Attribute::FernetPrivateKeyStr,
|
||||
Attribute::Es256PrivateKeyDer,
|
||||
Attribute::PatchLevel,
|
||||
Attribute::DomainDevelopmentTaint,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::Name,
|
||||
Attribute::DomainUuid,
|
||||
Attribute::DomainName,
|
||||
Attribute::DomainDisplayName,
|
||||
Attribute::Version,
|
||||
],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_DOMAIN_INFO_DL7: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_DOMAIN_INFO,
|
||||
name: EntryClass::DomainInfo.into(),
|
||||
description: "Local domain information and configuration".to_string(),
|
||||
|
||||
systemmay: vec![
|
||||
Attribute::DomainSsid,
|
||||
Attribute::DomainLdapBasedn,
|
||||
Attribute::LdapAllowUnixPwBind,
|
||||
Attribute::PatchLevel,
|
||||
Attribute::DomainDevelopmentTaint,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::Name,
|
||||
Attribute::DomainUuid,
|
||||
Attribute::DomainName,
|
||||
Attribute::DomainDisplayName,
|
||||
Attribute::Version,
|
||||
],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_DOMAIN_INFO_DL8: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_DOMAIN_INFO,
|
||||
name: EntryClass::DomainInfo.into(),
|
||||
description: "Local domain information and configuration".to_string(),
|
||||
|
||||
systemmay: vec![
|
||||
Attribute::DomainSsid,
|
||||
Attribute::DomainLdapBasedn,
|
||||
Attribute::LdapAllowUnixPwBind,
|
||||
Attribute::Image,
|
||||
Attribute::PatchLevel,
|
||||
Attribute::DomainDevelopmentTaint,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::Name,
|
||||
Attribute::DomainUuid,
|
||||
Attribute::DomainName,
|
||||
Attribute::DomainDisplayName,
|
||||
Attribute::Version,
|
||||
],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_DOMAIN_INFO_DL9: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_DOMAIN_INFO,
|
||||
name: EntryClass::DomainInfo.into(),
|
||||
description: "Local domain information and configuration".to_string(),
|
||||
|
||||
systemmay: vec![
|
||||
Attribute::DomainSsid,
|
||||
Attribute::DomainLdapBasedn,
|
||||
Attribute::LdapAllowUnixPwBind,
|
||||
Attribute::Image,
|
||||
Attribute::PatchLevel,
|
||||
Attribute::DomainDevelopmentTaint,
|
||||
Attribute::DomainAllowEasterEggs,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::Name,
|
||||
Attribute::DomainUuid,
|
||||
Attribute::DomainName,
|
||||
Attribute::DomainDisplayName,
|
||||
Attribute::Version,
|
||||
],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_DOMAIN_INFO_DL10: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_DOMAIN_INFO,
|
||||
name: EntryClass::DomainInfo.into(),
|
||||
|
@ -1290,83 +945,6 @@ pub static ref SCHEMA_CLASS_SYSTEM_CONFIG: SchemaClass = SchemaClass {
|
|||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_OAUTH2_RS_DL4: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_OAUTH2_RS,
|
||||
name: EntryClass::OAuth2ResourceServer.into(),
|
||||
description: "The class representing a configured Oauth2 Resource Server".to_string(),
|
||||
|
||||
systemmay: vec![
|
||||
Attribute::Description,
|
||||
Attribute::OAuth2RsScopeMap,
|
||||
Attribute::OAuth2RsSupScopeMap,
|
||||
Attribute::Rs256PrivateKeyDer,
|
||||
Attribute::OAuth2JwtLegacyCryptoEnable,
|
||||
Attribute::OAuth2PreferShortUsername,
|
||||
Attribute::OAuth2RsOriginLanding,
|
||||
Attribute::Image,
|
||||
Attribute::OAuth2RsClaimMap,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::OAuth2RsName,
|
||||
Attribute::DisplayName,
|
||||
Attribute::OAuth2RsOrigin,
|
||||
Attribute::OAuth2RsTokenKey,
|
||||
Attribute::Es256PrivateKeyDer,
|
||||
],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_OAUTH2_RS_DL5: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_OAUTH2_RS,
|
||||
name: EntryClass::OAuth2ResourceServer.into(),
|
||||
description: "The class representing a configured Oauth2 Resource Server".to_string(),
|
||||
|
||||
systemmay: vec![
|
||||
Attribute::Description,
|
||||
Attribute::OAuth2RsScopeMap,
|
||||
Attribute::OAuth2RsSupScopeMap,
|
||||
Attribute::Rs256PrivateKeyDer,
|
||||
Attribute::OAuth2JwtLegacyCryptoEnable,
|
||||
Attribute::OAuth2PreferShortUsername,
|
||||
Attribute::OAuth2RsOriginLanding,
|
||||
Attribute::Image,
|
||||
Attribute::OAuth2RsClaimMap,
|
||||
Attribute::OAuth2Session,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::OAuth2RsOrigin,
|
||||
Attribute::OAuth2RsTokenKey,
|
||||
Attribute::Es256PrivateKeyDer,
|
||||
],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_OAUTH2_RS_DL7: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_OAUTH2_RS,
|
||||
name: EntryClass::OAuth2ResourceServer.into(),
|
||||
description: "The class representing a configured OAuth2 Client".to_string(),
|
||||
|
||||
systemmay: vec![
|
||||
Attribute::Description,
|
||||
Attribute::OAuth2RsScopeMap,
|
||||
Attribute::OAuth2RsSupScopeMap,
|
||||
Attribute::Rs256PrivateKeyDer,
|
||||
Attribute::OAuth2JwtLegacyCryptoEnable,
|
||||
Attribute::OAuth2PreferShortUsername,
|
||||
Attribute::Image,
|
||||
Attribute::OAuth2RsClaimMap,
|
||||
Attribute::OAuth2Session,
|
||||
Attribute::OAuth2RsOrigin,
|
||||
Attribute::OAuth2StrictRedirectUri,
|
||||
],
|
||||
systemmust: vec![
|
||||
Attribute::OAuth2RsOriginLanding,
|
||||
Attribute::OAuth2RsTokenKey,
|
||||
Attribute::Es256PrivateKeyDer,
|
||||
],
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
pub static ref SCHEMA_CLASS_OAUTH2_RS_DL9: SchemaClass = SchemaClass {
|
||||
uuid: UUID_SCHEMA_CLASS_OAUTH2_RS,
|
||||
name: EntryClass::OAuth2ResourceServer.into(),
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
use crate::constants::entries::{Attribute, EntryClass};
|
||||
use crate::constants::uuids::*;
|
||||
use crate::schema::{SchemaAttribute, SchemaClass};
|
||||
use crate::value::IndexType;
|
||||
use crate::value::SyntaxType;
|
||||
|
||||
lazy_static!(
|
||||
|
@ -11,8 +10,6 @@ pub static ref SCHEMA_ATTR_DISPLAYNAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DISPLAYNAME,
|
||||
name: Attribute::DisplayName,
|
||||
description: "The publicly visible display name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -22,8 +19,6 @@ pub static ref SCHEMA_ATTR_DISPLAYNAME_DL7: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DISPLAYNAME,
|
||||
name: Attribute::DisplayName,
|
||||
description: "The publicly visible display name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::SubString],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -33,8 +28,6 @@ pub static ref SCHEMA_ATTR_MAIL: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_MAIL,
|
||||
name: Attribute::Mail,
|
||||
description: "Mail addresses of the object".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
|
@ -46,8 +39,6 @@ pub static ref SCHEMA_ATTR_MAIL_DL7: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_MAIL,
|
||||
name: Attribute::Mail,
|
||||
description: "Mail addresses of the object".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::SubString],
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
|
@ -59,8 +50,6 @@ pub static ref SCHEMA_ATTR_EC_KEY_PRIVATE: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_EC_KEY_PRIVATE,
|
||||
name: Attribute::IdVerificationEcKey,
|
||||
description: "Account verification private key".to_string(),
|
||||
|
||||
index: vec![IndexType::Presence],
|
||||
unique: false,
|
||||
sync_allowed: false,
|
||||
syntax: SyntaxType::EcKeyPrivate,
|
||||
|
@ -82,8 +71,6 @@ pub static ref SCHEMA_ATTR_PRIMARY_CREDENTIAL: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_PRIMARY_CREDENTIAL,
|
||||
name: Attribute::PrimaryCredential,
|
||||
description: "Primary credential material of the account for authentication interactively".to_string(),
|
||||
|
||||
index: vec![IndexType::Presence],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Credential,
|
||||
..Default::default()
|
||||
|
@ -93,8 +80,6 @@ pub static ref SCHEMA_ATTR_LEGALNAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_LEGALNAME,
|
||||
name: Attribute::LegalName,
|
||||
description: "The private and sensitive legal name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -104,8 +89,6 @@ pub static ref SCHEMA_ATTR_LEGALNAME_DL7: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_LEGALNAME,
|
||||
name: Attribute::LegalName,
|
||||
description: "The private and sensitive legal name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::SubString],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -115,8 +98,6 @@ pub static ref SCHEMA_ATTR_NAME_HISTORY: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_NAME_HISTORY,
|
||||
name: Attribute::NameHistory,
|
||||
description: "The history of names that a person has had".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::AuditLogString,
|
||||
|
@ -137,8 +118,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_NAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_NAME,
|
||||
name: Attribute::DomainName,
|
||||
description: "The domain's DNS name for webauthn and SPN generation purposes".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::Presence],
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8StringIname,
|
||||
..Default::default()
|
||||
|
@ -168,8 +147,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_DISPLAY_NAME: SchemaAttribute = SchemaAttribut
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_DISPLAY_NAME,
|
||||
name: Attribute::DomainDisplayName,
|
||||
description: "The user-facing display name of the Kanidm domain".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -178,8 +155,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_UUID: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_UUID,
|
||||
name: Attribute::DomainUuid,
|
||||
description: "The domain's uuid, used in CSN and trust relationships".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::Uuid,
|
||||
..Default::default()
|
||||
|
@ -189,8 +164,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_SSID: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_SSID,
|
||||
name: Attribute::DomainSsid,
|
||||
description: "The domains site-wide SSID for device autoconfiguration of wireless".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -237,8 +210,6 @@ pub static ref SCHEMA_ATTR_GIDNUMBER: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_GIDNUMBER,
|
||||
name: Attribute::GidNumber,
|
||||
description: "The groupid (uid) number of a group or account.to_string(). This is the same value as the UID number on posix accounts for security reasons".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Uint32,
|
||||
|
@ -296,8 +267,6 @@ pub static ref SCHEMA_ATTR_UNIX_PASSWORD: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_UNIX_PASSWORD,
|
||||
name: Attribute::UnixPassword,
|
||||
description: "A POSIX user's UNIX login password".to_string(),
|
||||
|
||||
index: vec![IndexType::Presence],
|
||||
syntax: SyntaxType::Credential,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -306,8 +275,6 @@ pub static ref SCHEMA_ATTR_NSUNIQUEID: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_NSUNIQUEID,
|
||||
name: Attribute::NsUniqueId,
|
||||
description: "A unique id compatibility for 389-ds/dsee".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::NsUniqueId,
|
||||
|
@ -348,8 +315,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_NAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_NAME,
|
||||
name: Attribute::OAuth2RsName,
|
||||
description: "The unique name of an external Oauth2 resource".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8StringIname,
|
||||
..Default::default()
|
||||
|
@ -397,8 +362,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_CLAIM_MAP_DL4: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_CLAIM_MAP,
|
||||
name: Attribute::OAuth2RsClaimMap,
|
||||
description: "A set of custom claims mapped to group memberships of accounts".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
// CHANGE ME
|
||||
syntax: SyntaxType::OauthClaimMap,
|
||||
|
@ -409,8 +372,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_SCOPE_MAP: SchemaAttribute = SchemaAttribut
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_SCOPE_MAP,
|
||||
name: Attribute::OAuth2RsScopeMap,
|
||||
description: "A reference to a group mapped to scopes for the associated oauth2 resource server".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScopeMap,
|
||||
..Default::default()
|
||||
|
@ -420,8 +381,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_SUP_SCOPE_MAP: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_SUP_SCOPE_MAP,
|
||||
name: Attribute::OAuth2RsSupScopeMap,
|
||||
description: "A reference to a group mapped to scopes for the associated oauth2 resource server".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScopeMap,
|
||||
..Default::default()
|
||||
|
@ -459,8 +418,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_CONSENT_SCOPE_MAP: SchemaAttribute = SchemaAtt
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_CONSENT_SCOPE_MAP,
|
||||
name: Attribute::OAuth2ConsentScopeMap,
|
||||
description: "A set of scopes mapped from a relying server to a user, where the user has previously consented to the following. If changed or deleted, consent will be re-sought".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScopeMap,
|
||||
..Default::default()
|
||||
|
@ -507,8 +464,6 @@ pub static ref SCHEMA_ATTR_JWS_ES256_PRIVATE_KEY: SchemaAttribute = SchemaAttrib
|
|||
uuid: UUID_SCHEMA_ATTR_JWS_ES256_PRIVATE_KEY,
|
||||
name: Attribute::JwsEs256PrivateKey,
|
||||
description: "An es256 private key for jws".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::JwsKeyEs256,
|
||||
..Default::default()
|
||||
|
@ -546,8 +501,6 @@ pub static ref SCHEMA_ATTR_CREDENTIAL_UPDATE_INTENT_TOKEN: SchemaAttribute = Sch
|
|||
uuid: UUID_SCHEMA_ATTR_CREDENTIAL_UPDATE_INTENT_TOKEN,
|
||||
name: Attribute::CredentialUpdateIntentToken,
|
||||
description: "The status of a credential update intent token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::IntentToken,
|
||||
..Default::default()
|
||||
|
@ -557,8 +510,6 @@ pub static ref SCHEMA_ATTR_PASSKEYS: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_PASSKEYS,
|
||||
name: Attribute::PassKeys,
|
||||
description: "A set of registered passkeys".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Passkey,
|
||||
|
@ -569,8 +520,6 @@ pub static ref SCHEMA_ATTR_ATTESTED_PASSKEYS: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_ATTESTED_PASSKEYS,
|
||||
name: Attribute::AttestedPasskeys,
|
||||
description: "A set of registered device keys".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::AttestedPasskey,
|
||||
|
@ -599,8 +548,6 @@ pub static ref SCHEMA_ATTR_API_TOKEN_SESSION: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_API_TOKEN_SESSION,
|
||||
name: Attribute::ApiTokenSession,
|
||||
description: "A session entry related to an issued API token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::ApiToken,
|
||||
|
@ -611,8 +558,6 @@ pub static ref SCHEMA_ATTR_USER_AUTH_TOKEN_SESSION: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_USER_AUTH_TOKEN_SESSION,
|
||||
name: Attribute::UserAuthTokenSession,
|
||||
description: "A session entry related to an issued user auth token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::Session,
|
||||
|
@ -623,8 +568,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_SESSION: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_SESSION,
|
||||
name: Attribute::OAuth2Session,
|
||||
description: "A session entry to an active oauth2 session, bound to a parent user auth token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::Oauth2Session,
|
||||
..Default::default()
|
||||
|
@ -634,8 +577,6 @@ pub static ref SCHEMA_ATTR_SYNC_TOKEN_SESSION: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_SYNC_TOKEN_SESSION,
|
||||
name: Attribute::SyncTokenSession,
|
||||
description: "A session entry related to an issued sync token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::ApiToken,
|
||||
..Default::default()
|
||||
|
@ -654,8 +595,6 @@ pub static ref SCHEMA_ATTR_GRANT_UI_HINT: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_GRANT_UI_HINT,
|
||||
name: Attribute::GrantUiHint,
|
||||
description: "A UI hint that is granted via membership to a group".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::UiHint,
|
||||
..Default::default()
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
use crate::constants::entries::{Attribute, EntryClass};
|
||||
use crate::constants::uuids::*;
|
||||
use crate::schema::{SchemaAttribute, SchemaClass};
|
||||
use crate::value::IndexType;
|
||||
use crate::value::SyntaxType;
|
||||
|
||||
lazy_static!(
|
||||
|
@ -11,8 +10,6 @@ pub static ref SCHEMA_ATTR_DISPLAYNAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DISPLAYNAME,
|
||||
name: Attribute::DisplayName,
|
||||
description: "The publicly visible display name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -22,8 +19,6 @@ pub static ref SCHEMA_ATTR_DISPLAYNAME_DL7: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DISPLAYNAME,
|
||||
name: Attribute::DisplayName,
|
||||
description: "The publicly visible display name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::SubString],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -33,8 +28,6 @@ pub static ref SCHEMA_ATTR_MAIL: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_MAIL,
|
||||
name: Attribute::Mail,
|
||||
description: "Mail addresses of the object".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
|
@ -46,8 +39,6 @@ pub static ref SCHEMA_ATTR_MAIL_DL7: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_MAIL,
|
||||
name: Attribute::Mail,
|
||||
description: "Mail addresses of the object".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::SubString],
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
|
@ -59,8 +50,6 @@ pub static ref SCHEMA_ATTR_EC_KEY_PRIVATE: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_EC_KEY_PRIVATE,
|
||||
name: Attribute::IdVerificationEcKey,
|
||||
description: "Account verification private key".to_string(),
|
||||
|
||||
index: vec![IndexType::Presence],
|
||||
unique: false,
|
||||
sync_allowed: false,
|
||||
syntax: SyntaxType::EcKeyPrivate,
|
||||
|
@ -82,8 +71,6 @@ pub static ref SCHEMA_ATTR_PRIMARY_CREDENTIAL: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_PRIMARY_CREDENTIAL,
|
||||
name: Attribute::PrimaryCredential,
|
||||
description: "Primary credential material of the account for authentication interactively".to_string(),
|
||||
|
||||
index: vec![IndexType::Presence],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Credential,
|
||||
..Default::default()
|
||||
|
@ -93,8 +80,6 @@ pub static ref SCHEMA_ATTR_LEGALNAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_LEGALNAME,
|
||||
name: Attribute::LegalName,
|
||||
description: "The private and sensitive legal name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -104,8 +89,6 @@ pub static ref SCHEMA_ATTR_LEGALNAME_DL7: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_LEGALNAME,
|
||||
name: Attribute::LegalName,
|
||||
description: "The private and sensitive legal name of this person".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::SubString],
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -115,8 +98,6 @@ pub static ref SCHEMA_ATTR_NAME_HISTORY: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_NAME_HISTORY,
|
||||
name: Attribute::NameHistory,
|
||||
description: "The history of names that a person has had".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::AuditLogString,
|
||||
|
@ -137,8 +118,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_NAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_NAME,
|
||||
name: Attribute::DomainName,
|
||||
description: "The domain's DNS name for webauthn and SPN generation purposes".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality, IndexType::Presence],
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8StringIname,
|
||||
..Default::default()
|
||||
|
@ -168,8 +147,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_DISPLAY_NAME: SchemaAttribute = SchemaAttribut
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_DISPLAY_NAME,
|
||||
name: Attribute::DomainDisplayName,
|
||||
description: "The user-facing display name of the Kanidm domain".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -178,8 +155,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_UUID: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_UUID,
|
||||
name: Attribute::DomainUuid,
|
||||
description: "The domain's uuid, used in CSN and trust relationships".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::Uuid,
|
||||
..Default::default()
|
||||
|
@ -189,8 +164,6 @@ pub static ref SCHEMA_ATTR_DOMAIN_SSID: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_DOMAIN_SSID,
|
||||
name: Attribute::DomainSsid,
|
||||
description: "The domains site-wide SSID for device autoconfiguration of wireless".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8String,
|
||||
..Default::default()
|
||||
|
@ -237,8 +210,6 @@ pub static ref SCHEMA_ATTR_GIDNUMBER: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_GIDNUMBER,
|
||||
name: Attribute::GidNumber,
|
||||
description: "The groupid (uid) number of a group or account.to_string(). This is the same value as the UID number on posix accounts for security reasons".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Uint32,
|
||||
|
@ -296,8 +267,6 @@ pub static ref SCHEMA_ATTR_UNIX_PASSWORD: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_UNIX_PASSWORD,
|
||||
name: Attribute::UnixPassword,
|
||||
description: "A POSIX user's UNIX login password".to_string(),
|
||||
|
||||
index: vec![IndexType::Presence],
|
||||
syntax: SyntaxType::Credential,
|
||||
..Default::default()
|
||||
};
|
||||
|
@ -306,8 +275,6 @@ pub static ref SCHEMA_ATTR_NSUNIQUEID: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_NSUNIQUEID,
|
||||
name: Attribute::NsUniqueId,
|
||||
description: "A unique id compatibility for 389-ds/dsee".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::NsUniqueId,
|
||||
|
@ -348,8 +315,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_NAME: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_NAME,
|
||||
name: Attribute::OAuth2RsName,
|
||||
description: "The unique name of an external Oauth2 resource".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::Utf8StringIname,
|
||||
..Default::default()
|
||||
|
@ -397,8 +362,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_CLAIM_MAP_DL4: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_CLAIM_MAP,
|
||||
name: Attribute::OAuth2RsClaimMap,
|
||||
description: "A set of custom claims mapped to group memberships of accounts".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
// CHANGE ME
|
||||
syntax: SyntaxType::OauthClaimMap,
|
||||
|
@ -409,8 +372,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_SCOPE_MAP: SchemaAttribute = SchemaAttribut
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_SCOPE_MAP,
|
||||
name: Attribute::OAuth2RsScopeMap,
|
||||
description: "A reference to a group mapped to scopes for the associated oauth2 resource server".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScopeMap,
|
||||
..Default::default()
|
||||
|
@ -420,8 +381,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_RS_SUP_SCOPE_MAP: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_RS_SUP_SCOPE_MAP,
|
||||
name: Attribute::OAuth2RsSupScopeMap,
|
||||
description: "A reference to a group mapped to scopes for the associated oauth2 resource server".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScopeMap,
|
||||
..Default::default()
|
||||
|
@ -459,8 +418,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_CONSENT_SCOPE_MAP: SchemaAttribute = SchemaAtt
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_CONSENT_SCOPE_MAP,
|
||||
name: Attribute::OAuth2ConsentScopeMap,
|
||||
description: "A set of scopes mapped from a relying server to a user, where the user has previously consented to the following. If changed or deleted, consent will be re-sought".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::OauthScopeMap,
|
||||
..Default::default()
|
||||
|
@ -507,8 +464,6 @@ pub static ref SCHEMA_ATTR_JWS_ES256_PRIVATE_KEY: SchemaAttribute = SchemaAttrib
|
|||
uuid: UUID_SCHEMA_ATTR_JWS_ES256_PRIVATE_KEY,
|
||||
name: Attribute::JwsEs256PrivateKey,
|
||||
description: "An es256 private key for jws".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::JwsKeyEs256,
|
||||
..Default::default()
|
||||
|
@ -546,8 +501,6 @@ pub static ref SCHEMA_ATTR_CREDENTIAL_UPDATE_INTENT_TOKEN: SchemaAttribute = Sch
|
|||
uuid: UUID_SCHEMA_ATTR_CREDENTIAL_UPDATE_INTENT_TOKEN,
|
||||
name: Attribute::CredentialUpdateIntentToken,
|
||||
description: "The status of a credential update intent token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::IntentToken,
|
||||
..Default::default()
|
||||
|
@ -557,8 +510,6 @@ pub static ref SCHEMA_ATTR_PASSKEYS: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_PASSKEYS,
|
||||
name: Attribute::PassKeys,
|
||||
description: "A set of registered passkeys".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::Passkey,
|
||||
|
@ -569,8 +520,6 @@ pub static ref SCHEMA_ATTR_ATTESTED_PASSKEYS: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_ATTESTED_PASSKEYS,
|
||||
name: Attribute::AttestedPasskeys,
|
||||
description: "A set of registered device keys".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
sync_allowed: true,
|
||||
syntax: SyntaxType::AttestedPasskey,
|
||||
|
@ -599,8 +548,6 @@ pub static ref SCHEMA_ATTR_API_TOKEN_SESSION: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_API_TOKEN_SESSION,
|
||||
name: Attribute::ApiTokenSession,
|
||||
description: "A session entry related to an issued API token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::ApiToken,
|
||||
|
@ -611,8 +558,6 @@ pub static ref SCHEMA_ATTR_USER_AUTH_TOKEN_SESSION: SchemaAttribute = SchemaAttr
|
|||
uuid: UUID_SCHEMA_ATTR_USER_AUTH_TOKEN_SESSION,
|
||||
name: Attribute::UserAuthTokenSession,
|
||||
description: "A session entry related to an issued user auth token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::Session,
|
||||
|
@ -623,8 +568,6 @@ pub static ref SCHEMA_ATTR_OAUTH2_SESSION: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_OAUTH2_SESSION,
|
||||
name: Attribute::OAuth2Session,
|
||||
description: "A session entry to an active oauth2 session, bound to a parent user auth token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::Oauth2Session,
|
||||
..Default::default()
|
||||
|
@ -634,8 +577,6 @@ pub static ref SCHEMA_ATTR_SYNC_TOKEN_SESSION: SchemaAttribute = SchemaAttribute
|
|||
uuid: UUID_SCHEMA_ATTR_SYNC_TOKEN_SESSION,
|
||||
name: Attribute::SyncTokenSession,
|
||||
description: "A session entry related to an issued sync token".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
unique: true,
|
||||
syntax: SyntaxType::ApiToken,
|
||||
..Default::default()
|
||||
|
@ -654,8 +595,6 @@ pub static ref SCHEMA_ATTR_GRANT_UI_HINT: SchemaAttribute = SchemaAttribute {
|
|||
uuid: UUID_SCHEMA_ATTR_GRANT_UI_HINT,
|
||||
name: Attribute::GrantUiHint,
|
||||
description: "A UI hint that is granted via membership to a group".to_string(),
|
||||
|
||||
index: vec![IndexType::Equality],
|
||||
multivalue: true,
|
||||
syntax: SyntaxType::UiHint,
|
||||
..Default::default()
|
||||
|
|
|
@ -109,7 +109,7 @@ impl DynGroup {
|
|||
nd_group.purge_ava(Attribute::DynMember);
|
||||
}
|
||||
|
||||
// Insert it to the dyngroup cache with the compiled/resolved filter for
|
||||
// Insert it to the dyngroup cache with the parsed filter for
|
||||
// fast matching in other paths.
|
||||
if dyn_groups.insts.insert(uuid, scope_i).is_none() == expect {
|
||||
error!("{} cache uuid conflict {}", Attribute::DynGroup, uuid);
|
||||
|
@ -175,6 +175,11 @@ impl DynGroup {
|
|||
) -> Result<BTreeSet<Uuid>, OperationError> {
|
||||
let mut affected_uuids = BTreeSet::new();
|
||||
|
||||
if qs.get_phase() < ServerPhase::SchemaReady {
|
||||
debug!("Server is not ready to apply dyngroups");
|
||||
return Ok(affected_uuids);
|
||||
}
|
||||
|
||||
let ident_internal = Identity::from_internal();
|
||||
|
||||
let (n_dyn_groups, entries): (Vec<&Entry<_, _>>, Vec<_>) = cand.iter().partition(|entry| {
|
||||
|
@ -202,9 +207,7 @@ impl DynGroup {
|
|||
let dg_filter_valid = dg_filter
|
||||
.validate(qs.get_schema())
|
||||
.map_err(OperationError::SchemaViolation)
|
||||
.and_then(|f| {
|
||||
f.resolve(&ident_internal, None, Some(qs.get_resolve_filter_cache()))
|
||||
})?;
|
||||
.and_then(|f| f.resolve(&ident_internal, None, qs.get_resolve_filter_cache()))?;
|
||||
|
||||
// Did any of our modified entries match our dyn group filter?
|
||||
let matches: Vec<_> = entries
|
||||
|
@ -291,6 +294,11 @@ impl DynGroup {
|
|||
) -> Result<BTreeSet<Uuid>, OperationError> {
|
||||
let mut affected_uuids = BTreeSet::new();
|
||||
|
||||
if qs.get_phase() < ServerPhase::SchemaReady {
|
||||
debug!("Server is not ready to apply dyngroups");
|
||||
return Ok(affected_uuids);
|
||||
}
|
||||
|
||||
let ident_internal = Identity::from_internal();
|
||||
|
||||
// Probably should be filter here instead.
|
||||
|
@ -338,9 +346,7 @@ impl DynGroup {
|
|||
let dg_filter_valid = dg_filter
|
||||
.validate(qs.get_schema())
|
||||
.map_err(OperationError::SchemaViolation)
|
||||
.and_then(|f| {
|
||||
f.resolve(&ident_internal, None, Some(qs.get_resolve_filter_cache()))
|
||||
})?;
|
||||
.and_then(|f| f.resolve(&ident_internal, None, qs.get_resolve_filter_cache()))?;
|
||||
|
||||
let matches: Vec<_> = pre_entries
|
||||
.iter()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use super::proto::*;
|
||||
use crate::plugins::Plugins;
|
||||
use crate::prelude::*;
|
||||
use crate::server::ChangeFlag;
|
||||
use crate::server::{ChangeFlag, ServerPhase};
|
||||
use std::collections::{BTreeMap, BTreeSet};
|
||||
use std::sync::Arc;
|
||||
|
||||
|
@ -343,7 +343,7 @@ impl QueryServerWriteTransaction<'_> {
|
|||
}
|
||||
}
|
||||
|
||||
#[instrument(level = "debug", skip_all)]
|
||||
#[instrument(level = "info", skip_all)]
|
||||
fn consumer_apply_changes_v1(
|
||||
&mut self,
|
||||
ctx_domain_version: DomainVersion,
|
||||
|
@ -548,7 +548,7 @@ impl QueryServerWriteTransaction<'_> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
#[instrument(level = "debug", skip_all)]
|
||||
#[instrument(level = "info", skip_all)]
|
||||
fn consumer_apply_refresh_v1(
|
||||
&mut self,
|
||||
ctx_domain_version: DomainVersion,
|
||||
|
@ -583,6 +583,7 @@ impl QueryServerWriteTransaction<'_> {
|
|||
};
|
||||
|
||||
// == ⚠️ Below this point we begin to make changes! ==
|
||||
self.set_phase_bootstrap();
|
||||
|
||||
// Update the d_uuid. This is what defines us as being part of this repl topology!
|
||||
self.be_txn
|
||||
|
@ -597,7 +598,6 @@ impl QueryServerWriteTransaction<'_> {
|
|||
self.reset_server_uuid()?;
|
||||
|
||||
// Delete all entries - *proper delete, not just tombstone!*
|
||||
|
||||
self.be_txn
|
||||
.danger_delete_all_db_content()
|
||||
.inspect_err(|err| {
|
||||
|
@ -609,6 +609,12 @@ impl QueryServerWriteTransaction<'_> {
|
|||
error!(?err, "Failed to reset in memory schema to clean state");
|
||||
})?;
|
||||
|
||||
// Reindex now to force some basic indexes to exist as we consume the schema
|
||||
// from our replica.
|
||||
self.reindex(false).inspect_err(|err| {
|
||||
error!(?err, "Failed to reload schema");
|
||||
})?;
|
||||
|
||||
// Apply the schema entries first. This is the foundation that everything
|
||||
// else will build upon!
|
||||
self.consumer_refresh_create_entries(ctx_schema_entries)
|
||||
|
@ -621,6 +627,9 @@ impl QueryServerWriteTransaction<'_> {
|
|||
error!(?err, "Failed to reload schema");
|
||||
})?;
|
||||
|
||||
// Schema is now ready
|
||||
self.set_phase(ServerPhase::SchemaReady);
|
||||
|
||||
// We have to reindex to force all the existing indexes to be dumped
|
||||
// and recreated before we start to import.
|
||||
self.reindex(false).inspect_err(|err| {
|
||||
|
@ -652,7 +661,10 @@ impl QueryServerWriteTransaction<'_> {
|
|||
| ChangeFlag::KEY_MATERIAL,
|
||||
);
|
||||
|
||||
// That's it! We are GOOD to go!
|
||||
// Domain info is now ready.
|
||||
self.set_phase(ServerPhase::DomainInfoReady);
|
||||
|
||||
// ==== That's it! We are GOOD to go! ====
|
||||
|
||||
// Create all the entries. Note we don't hit plugins here beside post repl plugs.
|
||||
self.consumer_refresh_create_entries(ctx_entries)
|
||||
|
@ -672,6 +684,9 @@ impl QueryServerWriteTransaction<'_> {
|
|||
error!(?err, "Unable to update RUV with supplier ranges.");
|
||||
})?;
|
||||
|
||||
// Refresh complete
|
||||
self.set_phase(ServerPhase::Running);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -31,7 +31,7 @@ use crate::value::{CredentialType, EXTRACT_VAL_DN};
|
|||
use crate::valueset::uuid_to_proto_string;
|
||||
use crate::valueset::ScimValueIntermediate;
|
||||
use crate::valueset::*;
|
||||
use concread::arcache::{ARCacheBuilder, ARCacheReadTxn};
|
||||
use concread::arcache::{ARCacheBuilder, ARCacheReadTxn, ARCacheWriteTxn};
|
||||
use concread::cowcell::*;
|
||||
use hashbrown::{HashMap, HashSet};
|
||||
use kanidm_proto::internal::{DomainInfo as ProtoDomainInfo, ImageValue, UiHint};
|
||||
|
@ -205,6 +205,13 @@ pub struct QueryServerWriteTransaction<'a> {
|
|||
pub(super) changed_uuid: HashSet<Uuid>,
|
||||
_db_ticket: SemaphorePermit<'a>,
|
||||
_write_ticket: SemaphorePermit<'a>,
|
||||
resolve_filter_cache_clear: bool,
|
||||
resolve_filter_cache_write: ARCacheWriteTxn<
|
||||
'a,
|
||||
(IdentityId, Arc<Filter<FilterValid>>),
|
||||
Arc<Filter<FilterValidResolved>>,
|
||||
(),
|
||||
>,
|
||||
resolve_filter_cache: ARCacheReadTxn<
|
||||
'a,
|
||||
(IdentityId, Arc<Filter<FilterValid>>),
|
||||
|
@ -260,7 +267,7 @@ pub trait QueryServerTransaction<'a> {
|
|||
|
||||
fn get_domain_image_value(&self) -> Option<ImageValue>;
|
||||
|
||||
fn get_resolve_filter_cache(&mut self) -> &mut ResolveFilterCacheReadTxn<'a>;
|
||||
fn get_resolve_filter_cache(&mut self) -> Option<&mut ResolveFilterCacheReadTxn<'a>>;
|
||||
|
||||
// Because of how borrowck in rust works, if we need to get two inner types we have to get them
|
||||
// in a single fn.
|
||||
|
@ -269,7 +276,7 @@ pub trait QueryServerTransaction<'a> {
|
|||
&mut self,
|
||||
) -> (
|
||||
&mut Self::BackendTransactionType,
|
||||
&mut ResolveFilterCacheReadTxn<'a>,
|
||||
Option<&mut ResolveFilterCacheReadTxn<'a>>,
|
||||
);
|
||||
|
||||
/// Conduct a search and apply access controls to yield a set of entries that
|
||||
|
@ -326,11 +333,15 @@ pub trait QueryServerTransaction<'a> {
|
|||
// NOTE: Filters are validated in event conversion.
|
||||
|
||||
let (be_txn, resolve_filter_cache) = self.get_resolve_filter_cache_and_be_txn();
|
||||
|
||||
let idxmeta = be_txn.get_idxmeta_ref();
|
||||
|
||||
trace!(resolve_filter_cache = %resolve_filter_cache.is_some());
|
||||
|
||||
// Now resolve all references and indexes.
|
||||
let vfr = se
|
||||
.filter
|
||||
.resolve(&se.ident, Some(idxmeta), Some(resolve_filter_cache))
|
||||
.resolve(&se.ident, Some(idxmeta), resolve_filter_cache)
|
||||
.map_err(|e| {
|
||||
admin_error!(?e, "search filter resolve failure");
|
||||
e
|
||||
|
@ -366,7 +377,7 @@ pub trait QueryServerTransaction<'a> {
|
|||
|
||||
let vfr = ee
|
||||
.filter
|
||||
.resolve(&ee.ident, Some(idxmeta), Some(resolve_filter_cache))
|
||||
.resolve(&ee.ident, Some(idxmeta), resolve_filter_cache)
|
||||
.map_err(|e| {
|
||||
admin_error!(?e, "Failed to resolve filter");
|
||||
e
|
||||
|
@ -1444,17 +1455,17 @@ impl<'a> QueryServerTransaction<'a> for QueryServerReadTransaction<'a> {
|
|||
&self.key_providers
|
||||
}
|
||||
|
||||
fn get_resolve_filter_cache(&mut self) -> &mut ResolveFilterCacheReadTxn<'a> {
|
||||
&mut self.resolve_filter_cache
|
||||
fn get_resolve_filter_cache(&mut self) -> Option<&mut ResolveFilterCacheReadTxn<'a>> {
|
||||
Some(&mut self.resolve_filter_cache)
|
||||
}
|
||||
|
||||
fn get_resolve_filter_cache_and_be_txn(
|
||||
&mut self,
|
||||
) -> (
|
||||
&mut BackendReadTransaction<'a>,
|
||||
&mut ResolveFilterCacheReadTxn<'a>,
|
||||
Option<&mut ResolveFilterCacheReadTxn<'a>>,
|
||||
) {
|
||||
(&mut self.be_txn, &mut self.resolve_filter_cache)
|
||||
(&mut self.be_txn, Some(&mut self.resolve_filter_cache))
|
||||
}
|
||||
|
||||
fn pw_badlist(&self) -> &HashSet<String> {
|
||||
|
@ -1678,17 +1689,25 @@ impl<'a> QueryServerTransaction<'a> for QueryServerWriteTransaction<'a> {
|
|||
&self.key_providers
|
||||
}
|
||||
|
||||
fn get_resolve_filter_cache(&mut self) -> &mut ResolveFilterCacheReadTxn<'a> {
|
||||
&mut self.resolve_filter_cache
|
||||
fn get_resolve_filter_cache(&mut self) -> Option<&mut ResolveFilterCacheReadTxn<'a>> {
|
||||
if self.resolve_filter_cache_clear || *self.phase < ServerPhase::SchemaReady {
|
||||
None
|
||||
} else {
|
||||
Some(&mut self.resolve_filter_cache)
|
||||
}
|
||||
}
|
||||
|
||||
fn get_resolve_filter_cache_and_be_txn(
|
||||
&mut self,
|
||||
) -> (
|
||||
&mut BackendWriteTransaction<'a>,
|
||||
&mut ResolveFilterCacheReadTxn<'a>,
|
||||
Option<&mut ResolveFilterCacheReadTxn<'a>>,
|
||||
) {
|
||||
(&mut self.be_txn, &mut self.resolve_filter_cache)
|
||||
if self.resolve_filter_cache_clear || *self.phase < ServerPhase::SchemaReady {
|
||||
(&mut self.be_txn, None)
|
||||
} else {
|
||||
(&mut self.be_txn, Some(&mut self.resolve_filter_cache))
|
||||
}
|
||||
}
|
||||
|
||||
fn pw_badlist(&self) -> &HashSet<String> {
|
||||
|
@ -2003,6 +2022,8 @@ impl QueryServer {
|
|||
_db_ticket: db_ticket,
|
||||
_write_ticket: write_ticket,
|
||||
resolve_filter_cache: self.resolve_filter_cache.read(),
|
||||
resolve_filter_cache_clear: false,
|
||||
resolve_filter_cache_write: self.resolve_filter_cache.write(),
|
||||
dyngroup_cache: self.dyngroup_cache.write(),
|
||||
key_providers: self.key_providers.write(),
|
||||
})
|
||||
|
@ -2152,16 +2173,13 @@ impl<'a> QueryServerWriteTransaction<'a> {
|
|||
))
|
||||
}?;
|
||||
|
||||
// TODO: Clear the filter resolve cache.
|
||||
// currently we can't do this because of the limits of types with arccache txns. The only
|
||||
// thing this impacts is if something in indexed though, and the backend does handle
|
||||
// incorrectly indexed items correctly.
|
||||
// Since we reloaded the schema, we need to reload the filter cache since it
|
||||
// may have incorrect or outdated information about indexes now.
|
||||
self.resolve_filter_cache_clear = true;
|
||||
|
||||
// Trigger reloads on services that require post-schema reloads.
|
||||
// Mainly this is plugins.
|
||||
if *self.phase >= ServerPhase::SchemaReady {
|
||||
DynGroup::reload(self)?;
|
||||
}
|
||||
DynGroup::reload(self)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -2584,7 +2602,14 @@ impl<'a> QueryServerWriteTransaction<'a> {
|
|||
self.changed_flags.remove(ChangeFlag::OAUTH2)
|
||||
}
|
||||
|
||||
fn set_phase(&mut self, phase: ServerPhase) {
|
||||
/// Indicate that we are about to re-bootstrap this server. You should ONLY
|
||||
/// call this during a replication refresh!!!
|
||||
pub(crate) fn set_phase_bootstrap(&mut self) {
|
||||
*self.phase = ServerPhase::Bootstrap;
|
||||
}
|
||||
|
||||
/// Raise the currently running server phase.
|
||||
pub(crate) fn set_phase(&mut self, phase: ServerPhase) {
|
||||
// Phase changes are one way
|
||||
if phase > *self.phase {
|
||||
*self.phase = phase
|
||||
|
@ -2698,6 +2723,8 @@ impl<'a> QueryServerWriteTransaction<'a> {
|
|||
changed_flags,
|
||||
changed_uuid: _,
|
||||
resolve_filter_cache: _,
|
||||
resolve_filter_cache_clear,
|
||||
mut resolve_filter_cache_write,
|
||||
} = self;
|
||||
debug_assert!(!committed);
|
||||
|
||||
|
@ -2711,6 +2738,12 @@ impl<'a> QueryServerWriteTransaction<'a> {
|
|||
be_txn.set_db_ts_max(cid.ts)?;
|
||||
cid.commit();
|
||||
|
||||
// We don't care if this passes/fails, committing this is fine.
|
||||
if resolve_filter_cache_clear {
|
||||
resolve_filter_cache_write.clear();
|
||||
}
|
||||
resolve_filter_cache_write.commit();
|
||||
|
||||
// Point of no return - everything has been validated and reloaded.
|
||||
//
|
||||
// = Lets commit =
|
||||
|
|
|
@ -388,6 +388,65 @@ impl fmt::Display for SyntaxType {
|
|||
}
|
||||
}
|
||||
|
||||
impl SyntaxType {
|
||||
pub fn index_types(&self) -> &[IndexType] {
|
||||
match self {
|
||||
SyntaxType::Utf8String => &[IndexType::Equality, IndexType::Presence],
|
||||
// Used by classes, needs to change ...
|
||||
// Probably need an attrname syntax too
|
||||
SyntaxType::Utf8StringInsensitive => &[IndexType::Equality, IndexType::Presence],
|
||||
SyntaxType::Utf8StringIname => &[
|
||||
IndexType::Equality,
|
||||
IndexType::Presence,
|
||||
IndexType::SubString,
|
||||
],
|
||||
SyntaxType::Uuid => &[IndexType::Equality, IndexType::Presence],
|
||||
SyntaxType::Boolean => &[IndexType::Equality],
|
||||
SyntaxType::SyntaxId => &[],
|
||||
SyntaxType::IndexId => &[],
|
||||
SyntaxType::ReferenceUuid => &[IndexType::Equality, IndexType::Presence],
|
||||
SyntaxType::JsonFilter => &[],
|
||||
SyntaxType::Credential => &[IndexType::Equality],
|
||||
SyntaxType::SecretUtf8String => &[],
|
||||
SyntaxType::SshKey => &[IndexType::Equality, IndexType::Presence],
|
||||
SyntaxType::SecurityPrincipalName => &[
|
||||
IndexType::Equality,
|
||||
IndexType::Presence,
|
||||
IndexType::SubString,
|
||||
],
|
||||
SyntaxType::Uint32 => &[IndexType::Equality, IndexType::Presence],
|
||||
SyntaxType::Cid => &[],
|
||||
SyntaxType::NsUniqueId => &[IndexType::Equality, IndexType::Presence],
|
||||
SyntaxType::DateTime => &[],
|
||||
SyntaxType::EmailAddress => &[IndexType::Equality, IndexType::SubString],
|
||||
SyntaxType::Url => &[],
|
||||
SyntaxType::OauthScope => &[],
|
||||
SyntaxType::OauthScopeMap => &[IndexType::Equality],
|
||||
SyntaxType::PrivateBinary => &[],
|
||||
SyntaxType::IntentToken => &[IndexType::Equality],
|
||||
SyntaxType::Passkey => &[IndexType::Equality],
|
||||
SyntaxType::AttestedPasskey => &[IndexType::Equality],
|
||||
SyntaxType::Session => &[IndexType::Equality],
|
||||
SyntaxType::JwsKeyEs256 => &[],
|
||||
SyntaxType::JwsKeyRs256 => &[],
|
||||
SyntaxType::Oauth2Session => &[IndexType::Equality],
|
||||
SyntaxType::UiHint => &[],
|
||||
SyntaxType::TotpSecret => &[],
|
||||
SyntaxType::ApiToken => &[IndexType::Equality],
|
||||
SyntaxType::AuditLogString => &[],
|
||||
SyntaxType::EcKeyPrivate => &[],
|
||||
SyntaxType::Image => &[],
|
||||
SyntaxType::CredentialType => &[],
|
||||
SyntaxType::WebauthnAttestationCaList => &[],
|
||||
SyntaxType::OauthClaimMap => &[IndexType::Equality],
|
||||
SyntaxType::KeyInternal => &[],
|
||||
SyntaxType::HexString => &[],
|
||||
SyntaxType::Certificate => &[],
|
||||
SyntaxType::ApplicationPassword => &[IndexType::Equality],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(
|
||||
Hash,
|
||||
Debug,
|
||||
|
|
Loading…
Reference in a new issue