mirror of
https://github.com/kanidm/kanidm.git
synced 2025-02-23 20:47:01 +01:00
deploy: 9456cac15b
This commit is contained in:
parent
17c9b2365a
commit
578c04fa57
|
@ -12,8 +12,8 @@
|
|||
Fields<a href="#fields" class="anchor"></a></h2><span id="structfield.type_" class="structfield small-section-header"><a href="#structfield.type_" class="anchor field"></a><code>type_: <a class="enum" href="enum.DbCredTypeV1.html" title="enum kanidm::be::dbvalue::DbCredTypeV1">DbCredTypeV1</a></code></span><span id="structfield.password" class="structfield small-section-header"><a href="#structfield.password" class="anchor field"></a><code>password: <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="enum.DbPasswordV1.html" title="enum kanidm::be::dbvalue::DbPasswordV1">DbPasswordV1</a>></code></span><span id="structfield.webauthn" class="structfield small-section-header"><a href="#structfield.webauthn" class="anchor field"></a><code>webauthn: <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="https://doc.rust-lang.org/1.54.0/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="struct" href="struct.DbWebauthnV1.html" title="struct kanidm::be::dbvalue::DbWebauthnV1">DbWebauthnV1</a>>></code></span><span id="structfield.totp" class="structfield small-section-header"><a href="#structfield.totp" class="anchor field"></a><code>totp: <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="struct.DbTotpV1.html" title="struct kanidm::be::dbvalue::DbTotpV1">DbTotpV1</a>></code></span><span id="structfield.backup_code" class="structfield small-section-header"><a href="#structfield.backup_code" class="anchor field"></a><code>backup_code: <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="struct.DbBackupCodeV1.html" title="struct kanidm::be::dbvalue::DbBackupCodeV1">DbBackupCodeV1</a>></code></span><span id="structfield.claims" class="structfield small-section-header"><a href="#structfield.claims" class="anchor field"></a><code>claims: <a class="struct" href="https://doc.rust-lang.org/1.54.0/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="struct" href="https://doc.rust-lang.org/1.54.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>></code></span><span id="structfield.uuid" class="structfield small-section-header"><a href="#structfield.uuid" class="anchor field"></a><code>uuid: <a class="struct" href="../../prelude/struct.Uuid.html" title="struct kanidm::prelude::Uuid">Uuid</a></code></span><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor"></a></h2><div id="trait-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Debug" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h3><a href="#impl-Debug" class="anchor"></a><a class="srclink" href="../../../src/kanidm/be/dbvalue.rs.html#102" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.fmt" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html#tymethod.fmt" class="fnname">fmt</a>(&self, f: &mut <a class="struct" href="https://doc.rust-lang.org/1.54.0/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a><'_>) -> <a class="type" href="https://doc.rust-lang.org/1.54.0/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></h4><a href="#method.fmt" class="anchor"></a><a class="srclink" href="../../../src/kanidm/be/dbvalue.rs.html#102" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Deserialize%3C%27de%3E" class="impl has-srclink"><h3 class="code-header in-band">impl<'de> <a class="trait" href="https://docs.rs/serde/1.0.126/serde/de/trait.Deserialize.html" title="trait serde::de::Deserialize">Deserialize</a><'de> for <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h3><a href="#impl-Deserialize%3C%27de%3E" class="anchor"></a><a class="srclink" href="../../../src/kanidm/be/dbvalue.rs.html#102" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.deserialize" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://docs.rs/serde/1.0.126/serde/de/trait.Deserialize.html#tymethod.deserialize" class="fnname">deserialize</a><__D>(__deserializer: __D) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, __D::<a class="type" href="https://docs.rs/serde/1.0.126/serde/de/trait.Deserializer.html#associatedtype.Error" title="type serde::de::Deserializer::Error">Error</a>> <span class="where fmt-newline">where<br> __D: <a class="trait" href="https://docs.rs/serde/1.0.126/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a><'de>, </span></h4><a href="#method.deserialize" class="anchor"></a><a class="srclink" href="../../../src/kanidm/be/dbvalue.rs.html#102" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.126/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Serialize" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://docs.rs/serde/1.0.126/serde/ser/trait.Serialize.html" title="trait serde::ser::Serialize">Serialize</a> for <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h3><a href="#impl-Serialize" class="anchor"></a><a class="srclink" href="../../../src/kanidm/be/dbvalue.rs.html#102" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.serialize" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://docs.rs/serde/1.0.126/serde/ser/trait.Serialize.html#tymethod.serialize" class="fnname">serialize</a><__S>(&self, __serializer: __S) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><__S::<a class="type" href="https://docs.rs/serde/1.0.126/serde/ser/trait.Serializer.html#associatedtype.Ok" title="type serde::ser::Serializer::Ok">Ok</a>, __S::<a class="type" href="https://docs.rs/serde/1.0.126/serde/ser/trait.Serializer.html#associatedtype.Error" title="type serde::ser::Serializer::Error">Error</a>> <span class="where fmt-newline">where<br> __S: <a class="trait" href="https://docs.rs/serde/1.0.126/serde/ser/trait.Serializer.html" title="trait serde::ser::Serializer">Serializer</a>, </span></h4><a href="#method.serialize" class="anchor"></a><a class="srclink" href="../../../src/kanidm/be/dbvalue.rs.html#102" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde/1.0.126/serde/ser/trait.Serialize.html#tymethod.serialize">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-TryFrom%3CDbCredV1%3E" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><<a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a>> for <a class="struct" href="../../credential/struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-TryFrom%3CDbCredV1%3E" class="anchor"></a><a class="srclink" href="../../../src/kanidm/credential/mod.rs.html#319-390" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><div id="associatedtype.Error" class="type trait-impl has-srclink"><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#associatedtype.Error" class="type">Error</a> = <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.unit.html">()</a></h4><a href="#associatedtype.Error" class="anchor"></a></div></summary><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.try_from" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#tymethod.try_from" class="fnname">try_from</a>(value: <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, Self::<a class="type" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></h4><a href="#method.try_from" class="anchor"></a><a class="srclink" href="../../../src/kanidm/credential/mod.rs.html#322-389" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Performs the conversion.</p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-TryFrom%3CDbCredV1%3E" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><<a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a>> for <a class="struct" href="../../credential/struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-TryFrom%3CDbCredV1%3E" class="anchor"></a><a class="srclink" href="../../../src/kanidm/credential/mod.rs.html#319-387" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><div id="associatedtype.Error" class="type trait-impl has-srclink"><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#associatedtype.Error" class="type">Error</a> = <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.unit.html">()</a></h4><a href="#associatedtype.Error" class="anchor"></a></div></summary><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.try_from" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#tymethod.try_from" class="fnname">try_from</a>(value: <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, Self::<a class="type" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></h4><a href="#method.try_from" class="anchor"></a><a class="srclink" href="../../../src/kanidm/credential/mod.rs.html#322-386" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Performs the conversion.</p>
|
||||
</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor"></a></h2><div id="synthetic-implementations-list"><div id="impl-RefUnwindSafe" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h3><a href="#impl-RefUnwindSafe" class="anchor"></a></div><div id="impl-Send" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h3><a href="#impl-Send" class="anchor"></a></div><div id="impl-Sync" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h3><a href="#impl-Sync" class="anchor"></a></div><div id="impl-Unpin" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h3><a href="#impl-Unpin" class="anchor"></a></div><div id="impl-UnwindSafe" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a> for <a class="struct" href="struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h3><a href="#impl-UnwindSafe" class="anchor"></a></div></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor"></a></h2><div id="blanket-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Any" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T <span class="where fmt-newline">where<br> T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-Any" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/any.rs.html#131-135" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.type_id" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html#tymethod.type_id" class="fnname">type_id</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/1.54.0/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></h4><a href="#method.type_id" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/any.rs.html#132" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html#tymethod.type_id">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Borrow%3CT%3E" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-Borrow%3CT%3E" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#208-213" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.borrow" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.Borrow.html#tymethod.borrow" class="fnname">borrow</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.reference.html">&</a>T</h4><a href="#method.borrow" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#210" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-BorrowMut%3CT%3E" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-BorrowMut%3CT%3E" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#216-220" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.borrow_mut" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut" class="fnname">borrow_mut</a>(&mut self) -> <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.reference.html">&mut </a>T</h4><a href="#method.borrow_mut" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#217" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></p>
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="API documentation for the Rust `FsType` enum in crate `kanidm`."><meta name="keywords" content="rust, rustlang, rust-lang, FsType"><title>FsType in kanidm::be - Rust</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled ><script id="default-settings"></script><script src="../../storage.js"></script><script src="../../crates.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../favicon.svg">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-16x16.png">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc enum"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Enum FsType</h2><div class="sidebar-elems"><div class="block items"><h3 class="sidebar-title"><a href="#variants">Variants</a></h3><div class="sidebar-links"><a href="#variant.Generic">Generic</a><a href="#variant.Zfs">Zfs</a></div><h3 class="sidebar-title"><a href="#implementations">Methods</a></h3><div class="sidebar-links"><a href="#method.checkpoint_pages">checkpoint_pages</a></div><h3 class="sidebar-title"><a href="#trait-implementations">Trait Implementations</a></h3><div class="sidebar-links"><a href="#impl-Clone">Clone</a><a href="#impl-Copy">Copy</a><a href="#impl-Debug">Debug</a></div><h3 class="sidebar-title"><a href="#synthetic-implementations">Auto Trait Implementations</a></h3><div class="sidebar-links"><a href="#impl-RefUnwindSafe">RefUnwindSafe</a><a href="#impl-Send">Send</a><a href="#impl-Sync">Sync</a><a href="#impl-Unpin">Unpin</a><a href="#impl-UnwindSafe">UnwindSafe</a></div><h3 class="sidebar-title"><a href="#blanket-implementations">Blanket Implementations</a></h3><div class="sidebar-links"><a href="#impl-Any">Any</a><a href="#impl-Borrow%3CT%3E">Borrow<T></a><a href="#impl-BorrowMut%3CT%3E">BorrowMut<T></a><a href="#impl-From%3CT%3E">From<T></a><a href="#impl-Instrument">Instrument</a><a href="#impl-Into%3CU%3E">Into<U></a><a href="#impl-Pointable">Pointable</a><a href="#impl-Same%3CT%3E">Same<T></a><a href="#impl-ToOwned">ToOwned</a><a href="#impl-TryFrom%3CU%3E">TryFrom<U></a><a href="#impl-TryInto%3CU%3E">TryInto<U></a><a href="#impl-VZip%3CV%3E">VZip<V></a></div></div><h2 class="location">Other items in<br><a href="../index.html">kanidm</a>::<wbr><a href="index.html">be</a></h2><div id="sidebar-vars" data-name="FsType" data-ty="enum" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Enum <a href="../index.html">kanidm</a>::<wbr><a href="index.html">be</a>::<wbr><a class="enum" href="#">FsType</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#36-39" title="goto source code">[src]</a></span></h1><div class="docblock type-decl"><pre class="rust enum">#[repr(u32)]
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc enum"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Enum FsType</h2><div class="sidebar-elems"><div class="block items"><h3 class="sidebar-title"><a href="#variants">Variants</a></h3><div class="sidebar-links"><a href="#variant.Generic">Generic</a><a href="#variant.Zfs">Zfs</a></div><h3 class="sidebar-title"><a href="#implementations">Methods</a></h3><div class="sidebar-links"><a href="#method.checkpoint_pages">checkpoint_pages</a></div><h3 class="sidebar-title"><a href="#trait-implementations">Trait Implementations</a></h3><div class="sidebar-links"><a href="#impl-Clone">Clone</a><a href="#impl-Copy">Copy</a><a href="#impl-Debug">Debug</a></div><h3 class="sidebar-title"><a href="#synthetic-implementations">Auto Trait Implementations</a></h3><div class="sidebar-links"><a href="#impl-RefUnwindSafe">RefUnwindSafe</a><a href="#impl-Send">Send</a><a href="#impl-Sync">Sync</a><a href="#impl-Unpin">Unpin</a><a href="#impl-UnwindSafe">UnwindSafe</a></div><h3 class="sidebar-title"><a href="#blanket-implementations">Blanket Implementations</a></h3><div class="sidebar-links"><a href="#impl-Any">Any</a><a href="#impl-Borrow%3CT%3E">Borrow<T></a><a href="#impl-BorrowMut%3CT%3E">BorrowMut<T></a><a href="#impl-From%3CT%3E">From<T></a><a href="#impl-Instrument">Instrument</a><a href="#impl-Into%3CU%3E">Into<U></a><a href="#impl-Pointable">Pointable</a><a href="#impl-Same%3CT%3E">Same<T></a><a href="#impl-ToOwned">ToOwned</a><a href="#impl-TryFrom%3CU%3E">TryFrom<U></a><a href="#impl-TryInto%3CU%3E">TryInto<U></a><a href="#impl-VZip%3CV%3E">VZip<V></a></div></div><h2 class="location">Other items in<br><a href="../index.html">kanidm</a>::<wbr><a href="index.html">be</a></h2><div id="sidebar-vars" data-name="FsType" data-ty="enum" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Enum <a href="../index.html">kanidm</a>::<wbr><a href="index.html">be</a>::<wbr><a class="enum" href="#">FsType</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#38-41" title="goto source code">[src]</a></span></h1><div class="docblock type-decl"><pre class="rust enum">#[repr(u32)]
|
||||
pub enum FsType {
|
||||
Generic,
|
||||
Zfs,
|
||||
}</pre></div><h2 id="variants" class="variants small-section-header">
|
||||
Variants<a href="#variants" class="anchor"></a></h2>
|
||||
<div id="variant.Generic" class="variant small-section-header"><a href="#variant.Generic" class="anchor field"></a><code>Generic</code></div><div id="variant.Zfs" class="variant small-section-header"><a href="#variant.Zfs" class="anchor field"></a><code>Zfs</code></div><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor"></a></h2><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#41-48" title="goto source code">[src]</a></div></summary><div class="impl-items"><div id="method.checkpoint_pages" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.checkpoint_pages" class="fnname">checkpoint_pages</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.u32.html">u32</a></h4><a href="#method.checkpoint_pages" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#42-47" title="goto source code">[src]</a></div></div></details><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor"></a></h2><div id="trait-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Clone" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Clone" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#35" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.clone" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#tymethod.clone" class="fnname">clone</a>(&self) -> <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h4><a href="#method.clone" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#35" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
|
||||
<div id="variant.Generic" class="variant small-section-header"><a href="#variant.Generic" class="anchor field"></a><code>Generic</code></div><div id="variant.Zfs" class="variant small-section-header"><a href="#variant.Zfs" class="anchor field"></a><code>Zfs</code></div><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor"></a></h2><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#43-50" title="goto source code">[src]</a></div></summary><div class="impl-items"><div id="method.checkpoint_pages" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.checkpoint_pages" class="fnname">checkpoint_pages</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.u32.html">u32</a></h4><a href="#method.checkpoint_pages" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#44-49" title="goto source code">[src]</a></div></div></details><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor"></a></h2><div id="trait-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Clone" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Clone" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#37" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.clone" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#tymethod.clone" class="fnname">clone</a>(&self) -> <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h4><a href="#method.clone" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#37" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.clone_from" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#method.clone_from" class="fnname">clone_from</a>(&mut self, source: <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.reference.html">&</a>Self)</h4><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span><a href="#method.clone_from" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/clone.rs.html#130" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Performs copy-assignment from <code>source</code>. <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#method.clone_from">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Debug" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Debug" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#35" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.fmt" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html#tymethod.fmt" class="fnname">fmt</a>(&self, f: &mut <a class="struct" href="https://doc.rust-lang.org/1.54.0/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a><'_>) -> <a class="type" href="https://doc.rust-lang.org/1.54.0/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></h4><a href="#method.fmt" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#35" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
|
||||
</div></details></div></details><div id="impl-Copy" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Copy" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#35" title="goto source code">[src]</a></div></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor"></a></h2><div id="synthetic-implementations-list"><div id="impl-RefUnwindSafe" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-RefUnwindSafe" class="anchor"></a></div><div id="impl-Send" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Send" class="anchor"></a></div><div id="impl-Sync" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Sync" class="anchor"></a></div><div id="impl-Unpin" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Unpin" class="anchor"></a></div><div id="impl-UnwindSafe" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-UnwindSafe" class="anchor"></a></div></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor"></a></h2><div id="blanket-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Any" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T <span class="where fmt-newline">where<br> T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-Any" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/any.rs.html#131-135" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.type_id" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html#tymethod.type_id" class="fnname">type_id</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/1.54.0/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></h4><a href="#method.type_id" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/any.rs.html#132" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html#tymethod.type_id">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Debug" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Debug" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#37" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.fmt" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html#tymethod.fmt" class="fnname">fmt</a>(&self, f: &mut <a class="struct" href="https://doc.rust-lang.org/1.54.0/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a><'_>) -> <a class="type" href="https://doc.rust-lang.org/1.54.0/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></h4><a href="#method.fmt" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#37" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
|
||||
</div></details></div></details><div id="impl-Copy" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Copy" class="anchor"></a><a class="srclink" href="../../src/kanidm/be/idl_sqlite.rs.html#37" title="goto source code">[src]</a></div></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor"></a></h2><div id="synthetic-implementations-list"><div id="impl-RefUnwindSafe" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-RefUnwindSafe" class="anchor"></a></div><div id="impl-Send" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Send" class="anchor"></a></div><div id="impl-Sync" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Sync" class="anchor"></a></div><div id="impl-Unpin" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-Unpin" class="anchor"></a></div><div id="impl-UnwindSafe" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a> for <a class="enum" href="enum.FsType.html" title="enum kanidm::be::FsType">FsType</a></h3><a href="#impl-UnwindSafe" class="anchor"></a></div></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor"></a></h2><div id="blanket-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Any" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T <span class="where fmt-newline">where<br> T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-Any" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/any.rs.html#131-135" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.type_id" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html#tymethod.type_id" class="fnname">type_id</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/1.54.0/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></h4><a href="#method.type_id" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/any.rs.html#132" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html#tymethod.type_id">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Borrow%3CT%3E" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-Borrow%3CT%3E" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#208-213" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.borrow" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.Borrow.html#tymethod.borrow" class="fnname">borrow</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.reference.html">&</a>T</h4><a href="#method.borrow" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#210" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-BorrowMut%3CT%3E" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-BorrowMut%3CT%3E" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#216-220" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.borrow_mut" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut" class="fnname">borrow_mut</a>(&mut self) -> <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.reference.html">&mut </a>T</h4><a href="#method.borrow_mut" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#217" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-From%3CT%3E" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.From.html" title="trait core::convert::From">From</a><T> for T</h3><a href="#impl-From%3CT%3E" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/convert/mod.rs.html#544-548" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.from" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.From.html#tymethod.from" class="fnname">from</a>(t: T) -> T</h4><a href="#method.from" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/convert/mod.rs.html#545" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Performs the conversion.</p>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="API documentation for the Rust `credential` mod in crate `kanidm`."><meta name="keywords" content="rust, rustlang, rust-lang, credential"><title>kanidm::credential - Rust</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled ><script id="default-settings"></script><script src="../../storage.js"></script><script src="../../crates.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../favicon.svg">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-16x16.png">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Module credential</h2><div class="sidebar-elems"><div class="block items"><ul><li><a href="#modules">Modules</a></li><li><a href="#structs">Structs</a></li><li><a href="#enums">Enums</a></li></ul></div><div id="sidebar-vars" data-name="credential" data-ty="mod" data-relpath="./"></div><script defer src="./sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Module <a href="../index.html">kanidm</a>::<wbr><a class="mod" href="#">credential</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#1-930" title="goto source code">[src]</a></span></h1><h2 id="modules" class="section-header"><a href="#modules">Modules</a></h2>
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Module credential</h2><div class="sidebar-elems"><div class="block items"><ul><li><a href="#modules">Modules</a></li><li><a href="#structs">Structs</a></li><li><a href="#enums">Enums</a></li></ul></div><div id="sidebar-vars" data-name="credential" data-ty="mod" data-relpath="./"></div><script defer src="./sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Module <a href="../index.html">kanidm</a>::<wbr><a class="mod" href="#">credential</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#1-927" title="goto source code">[src]</a></span></h1><h2 id="modules" class="section-header"><a href="#modules">Modules</a></h2>
|
||||
<table><tr class="module-item"><td><a class="mod" href="policy/index.html" title="kanidm::credential::policy mod">policy</a></td><td class="docblock-short"></td></tr><tr class="module-item"><td><a class="mod" href="softlock/index.html" title="kanidm::credential::softlock mod">softlock</a></td><td class="docblock-short"></td></tr><tr class="module-item"><td><a class="mod" href="totp/index.html" title="kanidm::credential::totp mod">totp</a></td><td class="docblock-short"></td></tr><tr class="module-item"><td><a class="mod" href="webauthn/index.html" title="kanidm::credential::webauthn mod">webauthn</a></td><td class="docblock-short"></td></tr></table><h2 id="structs" class="section-header"><a href="#structs">Structs</a></h2>
|
||||
<table><tr class="module-item"><td><a class="struct" href="struct.BackupCodes.html" title="kanidm::credential::BackupCodes struct">BackupCodes</a></td><td class="docblock-short"></td></tr><tr class="module-item"><td><a class="struct" href="struct.Credential.html" title="kanidm::credential::Credential struct">Credential</a></td><td class="docblock-short"><p>This is how we store credentials in the server. An account can have many credentials, and
|
||||
a credential can have many factors. Only successful auth to a credential as a whole unit
|
||||
|
|
|
@ -10,26 +10,26 @@ the auth as the password of B was incorrect. Additionally, while A only needs th
|
|||
B requires both the password and otp to be valid.</p>
|
||||
<p>In this way, each Credential provides it’s own password requirements and policy, and requires
|
||||
some metadata to support this such as it’s source and strength etc.</p>
|
||||
</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor"></a></h2><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#392-877" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.new_password_only" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.new_password_only" class="fnname">new_password_only</a>(<br> policy: &<a class="struct" href="policy/struct.CryptoPolicy.html" title="struct kanidm::credential::policy::CryptoPolicy">CryptoPolicy</a>, <br> cleartext: &<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.str.html">str</a><br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.new_password_only" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#394-399" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Create a new credential that contains a CredentialType::Password</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.new_generatedpassword_only" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.new_generatedpassword_only" class="fnname">new_generatedpassword_only</a>(<br> policy: &<a class="struct" href="policy/struct.CryptoPolicy.html" title="struct kanidm::credential::policy::CryptoPolicy">CryptoPolicy</a>, <br> cleartext: &<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.str.html">str</a><br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.new_generatedpassword_only" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#402-407" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Create a new credential that contains a CredentialType::GeneratedPassword</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.new_webauthn_only" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.new_webauthn_only" class="fnname">new_webauthn_only</a>(label: <a class="struct" href="https://doc.rust-lang.org/1.54.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>, cred: WebauthnCredential) -> Self</h4><a href="#method.new_webauthn_only" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#410-418" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Create a new credential that contains a CredentialType::Webauthn</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.set_password" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.set_password" class="fnname">set_password</a>(<br> &self, <br> policy: &<a class="struct" href="policy/struct.CryptoPolicy.html" title="struct kanidm::credential::policy::CryptoPolicy">CryptoPolicy</a>, <br> cleartext: &<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.str.html">str</a><br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.set_password" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#422-428" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Update the state of the Password on this credential, if a password is present. If possible
|
||||
</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor"></a></h2><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#389-874" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.new_password_only" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.new_password_only" class="fnname">new_password_only</a>(<br> policy: &<a class="struct" href="policy/struct.CryptoPolicy.html" title="struct kanidm::credential::policy::CryptoPolicy">CryptoPolicy</a>, <br> cleartext: &<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.str.html">str</a><br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.new_password_only" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#391-396" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Create a new credential that contains a CredentialType::Password</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.new_generatedpassword_only" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.new_generatedpassword_only" class="fnname">new_generatedpassword_only</a>(<br> policy: &<a class="struct" href="policy/struct.CryptoPolicy.html" title="struct kanidm::credential::policy::CryptoPolicy">CryptoPolicy</a>, <br> cleartext: &<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.str.html">str</a><br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.new_generatedpassword_only" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#399-404" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Create a new credential that contains a CredentialType::GeneratedPassword</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.new_webauthn_only" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.new_webauthn_only" class="fnname">new_webauthn_only</a>(label: <a class="struct" href="https://doc.rust-lang.org/1.54.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>, cred: WebauthnCredential) -> Self</h4><a href="#method.new_webauthn_only" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#407-415" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Create a new credential that contains a CredentialType::Webauthn</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.set_password" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.set_password" class="fnname">set_password</a>(<br> &self, <br> policy: &<a class="struct" href="policy/struct.CryptoPolicy.html" title="struct kanidm::credential::policy::CryptoPolicy">CryptoPolicy</a>, <br> cleartext: &<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.str.html">str</a><br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.set_password" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#419-425" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Update the state of the Password on this credential, if a password is present. If possible
|
||||
this will convert the credential to a PasswordMFA in some cases, or fail in others.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.append_webauthn" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.append_webauthn" class="fnname">append_webauthn</a>(<br> &self, <br> label: <a class="struct" href="https://doc.rust-lang.org/1.54.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>, <br> cred: WebauthnCredential<br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.append_webauthn" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#433-472" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Extend this credential with another alternate webauthn credential. This is especially
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.append_webauthn" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.append_webauthn" class="fnname">append_webauthn</a>(<br> &self, <br> label: <a class="struct" href="https://doc.rust-lang.org/1.54.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>, <br> cred: WebauthnCredential<br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.append_webauthn" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#430-469" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Extend this credential with another alternate webauthn credential. This is especially
|
||||
useful for <code>PasswordMfa</code> where you can have many webauthn credentials and a password
|
||||
generally so that one is a backup.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.remove_webauthn" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.remove_webauthn" class="fnname">remove_webauthn</a>(&self, label: &<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.str.html">str</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.remove_webauthn" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#475-530" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Remove a webauthn token identified by <code>label</code> from this Credential.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.update_webauthn_counter" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.update_webauthn_counter" class="fnname">update_webauthn_counter</a>(<br> &self, <br> cid: &CredentialID, <br> counter: Counter<br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="enum" href="https://doc.rust-lang.org/1.54.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a><Self>, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.update_webauthn_counter" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#535-588" title="goto source code">[src]</a></div></summary><div class="docblock"><p>After a successful authentication with Webauthn, we need to advance the credentials
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.remove_webauthn" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.remove_webauthn" class="fnname">remove_webauthn</a>(&self, label: &<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.str.html">str</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.remove_webauthn" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#472-527" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Remove a webauthn token identified by <code>label</code> from this Credential.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.update_webauthn_counter" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.update_webauthn_counter" class="fnname">update_webauthn_counter</a>(<br> &self, <br> cid: &CredentialID, <br> counter: Counter<br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="enum" href="https://doc.rust-lang.org/1.54.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a><Self>, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.update_webauthn_counter" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#532-585" title="goto source code">[src]</a></div></summary><div class="docblock"><p>After a successful authentication with Webauthn, we need to advance the credentials
|
||||
counter value to prevent certain classes of replay attacks.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.webauthn_ref" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.webauthn_ref" class="fnname">webauthn_ref</a>(<br> &self<br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><&Map<<a class="struct" href="https://doc.rust-lang.org/1.54.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>, WebauthnCredential>, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.webauthn_ref" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#591-598" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Get a reference to the contained webuthn credentials, if any.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.password_ref" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.password_ref" class="fnname">password_ref</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><&<a class="struct" href="struct.Password.html" title="struct kanidm::credential::Password">Password</a>, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.password_ref" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#601-610" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Get a reference to the contained password, if any.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.to_db_valuev1" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.to_db_valuev1" class="fnname">to_db_valuev1</a>(&self) -> <a class="struct" href="../be/dbvalue/struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h4><a href="#method.to_db_valuev1" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#618-681" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Extract this credential into it’s Serialisable Database form, ready for persistence.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.webauthn_ref" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.webauthn_ref" class="fnname">webauthn_ref</a>(<br> &self<br>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><&Map<<a class="struct" href="https://doc.rust-lang.org/1.54.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>, WebauthnCredential>, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.webauthn_ref" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#588-595" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Get a reference to the contained webuthn credentials, if any.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.password_ref" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.password_ref" class="fnname">password_ref</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><&<a class="struct" href="struct.Password.html" title="struct kanidm::credential::Password">Password</a>, <a class="enum" href="../prelude/enum.OperationError.html" title="enum kanidm::prelude::OperationError">OperationError</a>></h4><a href="#method.password_ref" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#598-607" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Get a reference to the contained password, if any.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.to_db_valuev1" class="method has-srclink"><h4 class="code-header">pub fn <a href="#method.to_db_valuev1" class="fnname">to_db_valuev1</a>(&self) -> <a class="struct" href="../be/dbvalue/struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a></h4><a href="#method.to_db_valuev1" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#615-678" title="goto source code">[src]</a></div></summary><div class="docblock"><p>Extract this credential into it’s Serialisable Database form, ready for persistence.</p>
|
||||
</div></details></div></details><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor"></a></h2><div id="trait-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Clone" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a> for <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-Clone" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#248" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.clone" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#tymethod.clone" class="fnname">clone</a>(&self) -> <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h4><a href="#method.clone" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#248" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.clone_from" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#method.clone_from" class="fnname">clone_from</a>(&mut self, source: <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.reference.html">&</a>Self)</h4><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span><a href="#method.clone_from" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/clone.rs.html#130" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Performs copy-assignment from <code>source</code>. <a href="https://doc.rust-lang.org/1.54.0/core/clone/trait.Clone.html#method.clone_from">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Debug" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-Debug" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#248" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.fmt" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html#tymethod.fmt" class="fnname">fmt</a>(&self, f: &mut <a class="struct" href="https://doc.rust-lang.org/1.54.0/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a><'_>) -> <a class="type" href="https://doc.rust-lang.org/1.54.0/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></h4><a href="#method.fmt" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#248" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/1.54.0/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Into%3CCredentialDetail%3E" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="struct" href="../../kanidm_proto/v1/struct.CredentialDetail.html" title="struct kanidm_proto::v1::CredentialDetail">CredentialDetail</a>> for &<a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-Into%3CCredentialDetail%3E" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#292-317" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.into" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.Into.html#tymethod.into" class="fnname">into</a>(self) -> <a class="struct" href="../../kanidm_proto/v1/struct.CredentialDetail.html" title="struct kanidm_proto::v1::CredentialDetail">CredentialDetail</a></h4><a href="#method.into" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#293-316" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Performs the conversion.</p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-TryFrom%3CDbCredV1%3E" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><<a class="struct" href="../be/dbvalue/struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a>> for <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-TryFrom%3CDbCredV1%3E" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#319-390" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><div id="associatedtype.Error" class="type trait-impl has-srclink"><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#associatedtype.Error" class="type">Error</a> = <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.unit.html">()</a></h4><a href="#associatedtype.Error" class="anchor"></a></div></summary><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.try_from" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#tymethod.try_from" class="fnname">try_from</a>(value: <a class="struct" href="../be/dbvalue/struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, Self::<a class="type" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></h4><a href="#method.try_from" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#322-389" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Performs the conversion.</p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-TryFrom%3CDbCredV1%3E" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a><<a class="struct" href="../be/dbvalue/struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a>> for <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-TryFrom%3CDbCredV1%3E" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#319-387" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><div id="associatedtype.Error" class="type trait-impl has-srclink"><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#associatedtype.Error" class="type">Error</a> = <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.unit.html">()</a></h4><a href="#associatedtype.Error" class="anchor"></a></div></summary><div class='docblock'><p>The type returned in the event of a conversion error.</p>
|
||||
</div></details><details class="rustdoc-toggle method-toggle" open><summary><div id="method.try_from" class="method trait-impl has-srclink"><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#tymethod.try_from" class="fnname">try_from</a>(value: <a class="struct" href="../be/dbvalue/struct.DbCredV1.html" title="struct kanidm::be::dbvalue::DbCredV1">DbCredV1</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><Self, Self::<a class="type" href="https://doc.rust-lang.org/1.54.0/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>></h4><a href="#method.try_from" class="anchor"></a><a class="srclink" href="../../src/kanidm/credential/mod.rs.html#322-386" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Performs the conversion.</p>
|
||||
</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor"></a></h2><div id="synthetic-implementations-list"><div id="impl-RefUnwindSafe" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/std/panic/trait.RefUnwindSafe.html" title="trait std::panic::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-RefUnwindSafe" class="anchor"></a></div><div id="impl-Send" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-Send" class="anchor"></a></div><div id="impl-Sync" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-Sync" class="anchor"></a></div><div id="impl-Unpin" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-Unpin" class="anchor"></a></div><div id="impl-UnwindSafe" class="impl has-srclink"><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.54.0/std/panic/trait.UnwindSafe.html" title="trait std::panic::UnwindSafe">UnwindSafe</a> for <a class="struct" href="struct.Credential.html" title="struct kanidm::credential::Credential">Credential</a></h3><a href="#impl-UnwindSafe" class="anchor"></a></div></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor"></a></h2><div id="blanket-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Any" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T <span class="where fmt-newline">where<br> T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-Any" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/any.rs.html#131-135" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.type_id" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html#tymethod.type_id" class="fnname">type_id</a>(&self) -> <a class="struct" href="https://doc.rust-lang.org/1.54.0/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></h4><a href="#method.type_id" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/any.rs.html#132" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/1.54.0/core/any/trait.Any.html#tymethod.type_id">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-Borrow%3CT%3E" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-Borrow%3CT%3E" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#208-213" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.borrow" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.Borrow.html#tymethod.borrow" class="fnname">borrow</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.reference.html">&</a>T</h4><a href="#method.borrow" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#210" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></p>
|
||||
</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><div id="impl-BorrowMut%3CT%3E" class="impl has-srclink"><h3 class="code-header in-band">impl<T> <a class="trait" href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a><T> for T <span class="where fmt-newline">where<br> T: ?<a class="trait" href="https://doc.rust-lang.org/1.54.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>, </span></h3><a href="#impl-BorrowMut%3CT%3E" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#216-220" title="goto source code">[src]</a></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.borrow_mut" class="method trait-impl has-srclink"><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut" class="fnname">borrow_mut</a>(&mut self) -> <a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.reference.html">&mut </a>T</h4><a href="#method.borrow_mut" class="anchor"></a><a class="srclink" href="https://doc.rust-lang.org/1.54.0/src/core/borrow.rs.html#217" title="goto source code">[src]</a></div></summary><div class='docblock'><p>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.54.0/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></p>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="`server` contains the query server, which is the main high level construction to coordinate queries and operations in the server."><meta name="keywords" content="rust, rustlang, rust-lang, server"><title>kanidm::server - Rust</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled ><script id="default-settings"></script><script src="../../storage.js"></script><script src="../../crates.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../favicon.svg">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-16x16.png">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Module server</h2><div class="sidebar-elems"><div class="block items"><ul><li><a href="#structs">Structs</a></li><li><a href="#traits">Traits</a></li></ul></div><div id="sidebar-vars" data-name="server" data-ty="mod" data-relpath="./"></div><script defer src="./sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Module <a href="../index.html">kanidm</a>::<wbr><a class="mod" href="#">server</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/server.rs.html#1-4277" title="goto source code">[src]</a></span></h1><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p><code>server</code> contains the query server, which is the main high level construction
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Module server</h2><div class="sidebar-elems"><div class="block items"><ul><li><a href="#structs">Structs</a></li><li><a href="#traits">Traits</a></li></ul></div><div id="sidebar-vars" data-name="server" data-ty="mod" data-relpath="./"></div><script defer src="./sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Module <a href="../index.html">kanidm</a>::<wbr><a class="mod" href="#">server</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/server.rs.html#1-4227" title="goto source code">[src]</a></span></h1><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p><code>server</code> contains the query server, which is the main high level construction
|
||||
to coordinate queries and operations in the server.</p>
|
||||
</div></details><h2 id="structs" class="section-header"><a href="#structs">Structs</a></h2>
|
||||
<table><tr class="module-item"><td><a class="struct" href="struct.QueryServer.html" title="kanidm::server::QueryServer struct">QueryServer</a></td><td class="docblock-short"></td></tr><tr class="module-item"><td><a class="struct" href="struct.QueryServerReadTransaction.html" title="kanidm::server::QueryServerReadTransaction struct">QueryServerReadTransaction</a></td><td class="docblock-short"></td></tr><tr class="module-item"><td><a class="struct" href="struct.QueryServerWriteTransaction.html" title="kanidm::server::QueryServerWriteTransaction struct">QueryServerWriteTransaction</a></td><td class="docblock-short"></td></tr></table><h2 id="traits" class="section-header"><a href="#traits">Traits</a></h2>
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,3 +1,3 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="API documentation for the Rust `main_init` fn in crate `kanidm`."><meta name="keywords" content="rust, rustlang, rust-lang, main_init"><title>main_init in kanidm::tracing_tree - Rust</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled ><script id="default-settings"></script><script src="../../storage.js"></script><script src="../../crates.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../favicon.svg">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-16x16.png">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc fn"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><div class="sidebar-elems"><h2 class="location">Other items in<br><a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a></h2><div id="sidebar-vars" data-name="main_init" data-ty="fn" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Function <a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a>::<wbr><a class="fn" href="#">main_init</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/tracing_tree/subscriber.rs.html#507-512" title="goto source code">[src]</a></span></h1><pre class="rust fn">pub fn main_init() -> JoinHandle<<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.unit.html">()</a>></pre></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="kanidm" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script></body></html>
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc fn"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><div class="sidebar-elems"><h2 class="location">Other items in<br><a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a></h2><div id="sidebar-vars" data-name="main_init" data-ty="fn" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Function <a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a>::<wbr><a class="fn" href="#">main_init</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/tracing_tree/subscriber.rs.html#521-527" title="goto source code">[src]</a></span></h1><pre class="rust fn">pub fn main_init() -> JoinHandle<<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.unit.html">()</a>></pre></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="kanidm" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script></body></html>
|
|
@ -1,3 +1,3 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="API documentation for the Rust `operation_id` fn in crate `kanidm`."><meta name="keywords" content="rust, rustlang, rust-lang, operation_id"><title>operation_id in kanidm::tracing_tree - Rust</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled ><script id="default-settings"></script><script src="../../storage.js"></script><script src="../../crates.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../favicon.svg">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-16x16.png">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc fn"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><div class="sidebar-elems"><h2 class="location">Other items in<br><a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a></h2><div id="sidebar-vars" data-name="operation_id" data-ty="fn" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Function <a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a>::<wbr><a class="fn" href="#">operation_id</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/tracing_tree/subscriber.rs.html#491-505" title="goto source code">[src]</a></span></h1><pre class="rust fn">pub fn operation_id() -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="../prelude/struct.Uuid.html" title="struct kanidm::prelude::Uuid">Uuid</a>></pre></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="kanidm" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script></body></html>
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc fn"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><div class="sidebar-elems"><h2 class="location">Other items in<br><a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a></h2><div id="sidebar-vars" data-name="operation_id" data-ty="fn" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Function <a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a>::<wbr><a class="fn" href="#">operation_id</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/tracing_tree/subscriber.rs.html#504-519" title="goto source code">[src]</a></span></h1><pre class="rust fn">pub fn operation_id() -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="../prelude/struct.Uuid.html" title="struct kanidm::prelude::Uuid">Uuid</a>></pre></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="kanidm" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script></body></html>
|
|
@ -1,3 +1,3 @@
|
|||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="API documentation for the Rust `test_init` fn in crate `kanidm`."><meta name="keywords" content="rust, rustlang, rust-lang, test_init"><title>test_init in kanidm::tracing_tree - Rust</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled ><script id="default-settings"></script><script src="../../storage.js"></script><script src="../../crates.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../favicon.svg">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-16x16.png">
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc fn"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><div class="sidebar-elems"><h2 class="location">Other items in<br><a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a></h2><div id="sidebar-vars" data-name="test_init" data-ty="fn" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Function <a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a>::<wbr><a class="fn" href="#">test_init</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/tracing_tree/subscriber.rs.html#519-526" title="goto source code">[src]</a></span></h1><pre class="rust fn">pub fn test_init() -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.unit.html">()</a>, <a class="struct" href="https://docs.rs/tracing-core/0.1.18/tracing_core/dispatcher/struct.SetGlobalDefaultError.html" title="struct tracing_core::dispatcher::SetGlobalDefaultError">SetGlobalDefaultError</a>></pre></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="kanidm" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script></body></html>
|
||||
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc fn"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">☰</div><a href='../../kanidm/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><div class="sidebar-elems"><h2 class="location">Other items in<br><a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a></h2><div id="sidebar-vars" data-name="test_init" data-ty="fn" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Function <a href="../index.html">kanidm</a>::<wbr><a href="index.html">tracing_tree</a>::<wbr><a class="fn" href="#">test_init</a><button id="copy-path" onclick="copy_path(this)" title="copy path"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item import" title="Copy item import to clipboard"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span><a class="srclink" href="../../src/kanidm/tracing_tree/subscriber.rs.html#534-541" title="goto source code">[src]</a></span></h1><pre class="rust fn">pub fn test_init() -> <a class="enum" href="https://doc.rust-lang.org/1.54.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="https://doc.rust-lang.org/1.54.0/std/primitive.unit.html">()</a>, <a class="struct" href="https://docs.rs/tracing-core/0.1.18/tracing_core/dispatcher/struct.SetGlobalDefaultError.html" title="struct tracing_core::dispatcher::SetGlobalDefaultError">SetGlobalDefaultError</a>></pre></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="kanidm" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script></body></html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -2478,66 +2478,6 @@
|
|||
<span id="2476">2476</span>
|
||||
<span id="2477">2477</span>
|
||||
<span id="2478">2478</span>
|
||||
<span id="2479">2479</span>
|
||||
<span id="2480">2480</span>
|
||||
<span id="2481">2481</span>
|
||||
<span id="2482">2482</span>
|
||||
<span id="2483">2483</span>
|
||||
<span id="2484">2484</span>
|
||||
<span id="2485">2485</span>
|
||||
<span id="2486">2486</span>
|
||||
<span id="2487">2487</span>
|
||||
<span id="2488">2488</span>
|
||||
<span id="2489">2489</span>
|
||||
<span id="2490">2490</span>
|
||||
<span id="2491">2491</span>
|
||||
<span id="2492">2492</span>
|
||||
<span id="2493">2493</span>
|
||||
<span id="2494">2494</span>
|
||||
<span id="2495">2495</span>
|
||||
<span id="2496">2496</span>
|
||||
<span id="2497">2497</span>
|
||||
<span id="2498">2498</span>
|
||||
<span id="2499">2499</span>
|
||||
<span id="2500">2500</span>
|
||||
<span id="2501">2501</span>
|
||||
<span id="2502">2502</span>
|
||||
<span id="2503">2503</span>
|
||||
<span id="2504">2504</span>
|
||||
<span id="2505">2505</span>
|
||||
<span id="2506">2506</span>
|
||||
<span id="2507">2507</span>
|
||||
<span id="2508">2508</span>
|
||||
<span id="2509">2509</span>
|
||||
<span id="2510">2510</span>
|
||||
<span id="2511">2511</span>
|
||||
<span id="2512">2512</span>
|
||||
<span id="2513">2513</span>
|
||||
<span id="2514">2514</span>
|
||||
<span id="2515">2515</span>
|
||||
<span id="2516">2516</span>
|
||||
<span id="2517">2517</span>
|
||||
<span id="2518">2518</span>
|
||||
<span id="2519">2519</span>
|
||||
<span id="2520">2520</span>
|
||||
<span id="2521">2521</span>
|
||||
<span id="2522">2522</span>
|
||||
<span id="2523">2523</span>
|
||||
<span id="2524">2524</span>
|
||||
<span id="2525">2525</span>
|
||||
<span id="2526">2526</span>
|
||||
<span id="2527">2527</span>
|
||||
<span id="2528">2528</span>
|
||||
<span id="2529">2529</span>
|
||||
<span id="2530">2530</span>
|
||||
<span id="2531">2531</span>
|
||||
<span id="2532">2532</span>
|
||||
<span id="2533">2533</span>
|
||||
<span id="2534">2534</span>
|
||||
<span id="2535">2535</span>
|
||||
<span id="2536">2536</span>
|
||||
<span id="2537">2537</span>
|
||||
<span id="2538">2538</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="doccomment">//! Access Control Profiles</span>
|
||||
<span class="doccomment">//!</span>
|
||||
|
@ -3123,7 +3063,7 @@
|
|||
<span class="comment">// add search_attrs to allowed.</span>
|
||||
<span class="prelude-val">Some</span>(<span class="ident">acs</span>.<span class="ident">attrs</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">as_str</span>()))
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">trace!</span>(<span class="ident">entry</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">e</span>.<span class="ident">get_uuid</span>(), <span class="ident">acs</span> <span class="op">=</span> <span class="op">%</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>, <span class="string">"entry matches acs"</span>); <span class="comment">// should this be `security_access`?</span>
|
||||
<span class="macro">trace!</span>(<span class="ident">entry</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">e</span>.<span class="ident">get_uuid</span>(), <span class="ident">acs</span> <span class="op">=</span> <span class="op">%</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>, <span class="string">"entry DOES NOT match acs"</span>); <span class="comment">// should this be `security_access`?</span>
|
||||
<span class="macro">ltrace!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"entry {:?} DOES NOT match acs {}"</span>,
|
||||
|
@ -3282,82 +3222,73 @@
|
|||
<span class="string">"access::search_filter_entry_attributes<allowed_entries>"</span>,
|
||||
<span class="op">|</span><span class="op">|</span> {
|
||||
<span class="ident">entries</span>
|
||||
.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="comment">// Get the set of attributes you can see for this entry</span>
|
||||
<span class="comment">// this is within your related acp scope.</span>
|
||||
<span class="kw">let</span> <span class="ident">allowed_attrs</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">related_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">filter_map</span>(<span class="op">|</span>(<span class="ident">acs</span>, <span class="ident">f_res</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">e</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
<span class="macro">security_access!</span>(
|
||||
<span class="ident">target</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acs</span> <span class="op">=</span> <span class="op">%</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>,
|
||||
<span class="string">"target entry matches acs"</span>,
|
||||
);
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"target entry {:?} matches acs {}"</span>,
|
||||
<span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>
|
||||
);
|
||||
<span class="comment">// add search_attrs to allowed iterator</span>
|
||||
<span class="prelude-val">Some</span>(
|
||||
<span class="ident">acs</span>.<span class="ident">attrs</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">as_str</span>()) <span class="comment">// TODO: Refactor in another PR</span>
|
||||
.<span class="ident">filter</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> {
|
||||
<span class="comment">// could simplify with as_ref, map, and unwrap_or(true)</span>
|
||||
<span class="kw">match</span> <span class="kw-2">&</span><span class="ident">req_attrs</span> {
|
||||
<span class="comment">// We return all as we requested all.</span>
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="prelude-val">Some</span>(<span class="ident">r_attrs</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="comment">// If we have a req_attrs set, we only return</span>
|
||||
<span class="comment">// things that were requested.</span>
|
||||
<span class="ident">r_attrs</span>.<span class="ident">contains</span>(<span class="ident">s</span>)
|
||||
}
|
||||
}
|
||||
}),
|
||||
)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">trace!</span>(
|
||||
<span class="ident">target</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acs</span> <span class="op">=</span> <span class="op">%</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>,
|
||||
<span class="string">"target entry DOES NOT match acs"</span>,
|
||||
);
|
||||
<span class="macro">ltrace!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"target entry {:?} DOES NOT match acs {}"</span>,
|
||||
<span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>
|
||||
);
|
||||
<span class="prelude-val">None</span>
|
||||
}
|
||||
})
|
||||
.<span class="ident">flatten</span>()
|
||||
.<span class="ident">collect</span>();
|
||||
.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="comment">// Get the set of attributes you can see for this entry</span>
|
||||
<span class="comment">// this is within your related acp scope.</span>
|
||||
<span class="kw">let</span> <span class="ident">allowed_attrs</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">related_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">filter_map</span>(<span class="op">|</span>(<span class="ident">acs</span>, <span class="ident">f_res</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">e</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
<span class="macro">security_access!</span>(
|
||||
<span class="ident">target</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acs</span> <span class="op">=</span> <span class="op">%</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>,
|
||||
<span class="string">"target entry matches acs"</span>,
|
||||
);
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"target entry {:?} matches acs {}"</span>,
|
||||
<span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>
|
||||
);
|
||||
<span class="comment">// add search_attrs to allowed iterator</span>
|
||||
<span class="prelude-val">Some</span>(
|
||||
<span class="ident">acs</span>.<span class="ident">attrs</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">as_str</span>())
|
||||
.<span class="ident">filter</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> {
|
||||
<span class="ident">req_attrs</span>.<span class="ident">as_ref</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">r_attrs</span><span class="op">|</span> <span class="ident">r_attrs</span>.<span class="ident">contains</span>(<span class="ident">s</span>)).<span class="ident">unwrap_or</span>(<span class="bool-val">true</span>)
|
||||
}),
|
||||
)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">trace!</span>(
|
||||
<span class="ident">target</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acs</span> <span class="op">=</span> <span class="op">%</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>,
|
||||
<span class="string">"target entry DOES NOT match acs"</span>,
|
||||
);
|
||||
<span class="macro">ltrace!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"target entry {:?} DOES NOT match acs {}"</span>,
|
||||
<span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">name</span>
|
||||
);
|
||||
<span class="prelude-val">None</span>
|
||||
}
|
||||
})
|
||||
.<span class="ident">flatten</span>()
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
<span class="comment">// Remove all others that are present on the entry.</span>
|
||||
<span class="macro">security_access!</span>(
|
||||
<span class="ident">requested</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">req_attrs</span>,
|
||||
<span class="ident">allowed</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">allowed_attrs</span>,
|
||||
<span class="string">"attributes"</span>
|
||||
);
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"requested attributes --> {:?} allowed attributes --> {:?}"</span>,
|
||||
<span class="ident">req_attrs</span>,
|
||||
<span class="ident">allowed_attrs</span>
|
||||
);
|
||||
<span class="comment">// Remove all others that are present on the entry.</span>
|
||||
<span class="macro">security_access!</span>(
|
||||
<span class="ident">requested</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">req_attrs</span>,
|
||||
<span class="ident">allowed</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">allowed_attrs</span>,
|
||||
<span class="string">"attributes"</span>
|
||||
);
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"requested attributes --> {:?} allowed attributes --> {:?}"</span>,
|
||||
<span class="ident">req_attrs</span>,
|
||||
<span class="ident">allowed_attrs</span>
|
||||
);
|
||||
|
||||
<span class="comment">// Now purge the attrs that are NOT allowed.</span>
|
||||
<span class="macro">spanned!</span>(<span class="string">"access::search_filter_entry_attributes<reduce_attributes>"</span>, {
|
||||
<span class="macro">lperf_trace_segment!</span>(<span class="ident">audit</span>, <span class="string">"access::search_filter_entry_attributes<reduce_attributes>"</span>, <span class="op">|</span><span class="op">|</span> {
|
||||
<span class="ident">e</span>.<span class="ident">reduce_attributes</span>(<span class="kw-2">&</span><span class="ident">allowed_attrs</span>)
|
||||
})
|
||||
<span class="comment">// Now purge the attrs that are NOT allowed.</span>
|
||||
<span class="macro">spanned!</span>(<span class="string">"access::search_filter_entry_attributes<reduce_attributes>"</span>, {
|
||||
<span class="macro">lperf_trace_segment!</span>(<span class="ident">audit</span>, <span class="string">"access::search_filter_entry_attributes<reduce_attributes>"</span>, <span class="op">|</span><span class="op">|</span> {
|
||||
<span class="ident">e</span>.<span class="ident">reduce_attributes</span>(<span class="kw-2">&</span><span class="ident">allowed_attrs</span>)
|
||||
})
|
||||
})
|
||||
.<span class="ident">collect</span>()
|
||||
})
|
||||
.<span class="ident">collect</span>()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
@ -3406,16 +3337,11 @@
|
|||
<span class="kw">let</span> <span class="ident">acp_resolve_filter_cache</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_acp_resolve_filter_cache</span>();
|
||||
|
||||
<span class="comment">// Pre-check if the no-no purge class is present</span>
|
||||
<span class="kw">let</span> <span class="ident">disallow</span> <span class="op">=</span> <span class="ident">me</span>.<span class="ident">modlist</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">m</span><span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">acc</span> {
|
||||
<span class="ident">acc</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="kw">match</span> <span class="ident">m</span> {
|
||||
<span class="ident">Modify::Purged</span>(<span class="ident">a</span>) <span class="op">=</span><span class="op">></span> <span class="ident">a</span> <span class="op">=</span><span class="op">=</span> <span class="string">"class"</span>,
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">false</span>,
|
||||
}
|
||||
}
|
||||
});
|
||||
<span class="kw">let</span> <span class="ident">disallow</span> <span class="op">=</span> <span class="ident">me</span>
|
||||
.<span class="ident">modlist</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">any</span>(<span class="op">|</span><span class="ident">m</span><span class="op">|</span> <span class="macro">matches!</span>(<span class="ident">m</span>, <span class="ident">Modify::Purged</span>(<span class="ident">a</span>) <span class="kw">if</span> <span class="ident">a</span> <span class="op">=</span><span class="op">=</span> <span class="string">"class"</span>));
|
||||
|
||||
<span class="kw">if</span> <span class="ident">disallow</span> {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"Disallowing purge class in modification"</span>);
|
||||
<span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="bool-val">false</span>);
|
||||
|
@ -3440,9 +3366,7 @@
|
|||
<span class="ident">e</span>
|
||||
})
|
||||
.<span class="ident">ok</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">f_res</span><span class="op">|</span>
|
||||
(<span class="ident">acs</span>, <span class="ident">f_res</span>)
|
||||
)
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">f_res</span><span class="op">|</span> (<span class="ident">acs</span>, <span class="ident">f_res</span>))
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">None</span>
|
||||
}
|
||||
|
@ -3518,62 +3442,53 @@
|
|||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"Requested remove set: {:?}"</span>, <span class="ident">requested_rem</span>);
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"Requested class set: {:?}"</span>, <span class="ident">requested_classes</span>);
|
||||
|
||||
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">entries</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">true</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="ident">acc</span> {
|
||||
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">entries</span>.<span class="ident">iter</span>().<span class="ident">all</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="comment">// For this entry, find the acp's that apply to it from the</span>
|
||||
<span class="comment">// set that apply to the entry that is performing the operation</span>
|
||||
<span class="kw">let</span> <span class="ident">scoped_acp</span>: <span class="ident">Vec</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">AccessControlModify</span><span class="op">></span> <span class="op">=</span> <span class="ident">related_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">filter_map</span>(<span class="op">|</span>(<span class="ident">acm</span>, <span class="ident">f_res</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">e</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
<span class="prelude-val">Some</span>(<span class="kw-2">*</span><span class="ident">acm</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">None</span>
|
||||
}
|
||||
})
|
||||
.<span class="ident">collect</span>();
|
||||
<span class="comment">// Build the sets of classes, pres and rem we are allowed to modify, extend</span>
|
||||
<span class="comment">// or use based on the set of matched acps.</span>
|
||||
<span class="kw">let</span> <span class="ident">allowed_pres</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">scoped_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">flat_map</span>(<span class="op">|</span><span class="ident">acp</span><span class="op">|</span> <span class="ident">acp</span>.<span class="ident">presattrs</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">as_str</span>()))
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
<span class="kw">let</span> <span class="ident">allowed_rem</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">scoped_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">flat_map</span>(<span class="op">|</span><span class="ident">acp</span><span class="op">|</span> <span class="ident">acp</span>.<span class="ident">remattrs</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">as_str</span>()))
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
<span class="kw">let</span> <span class="ident">allowed_classes</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">scoped_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">flat_map</span>(<span class="op">|</span><span class="ident">acp</span><span class="op">|</span> <span class="ident">acp</span>.<span class="ident">classes</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">as_str</span>()))
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
<span class="comment">// Now check all the subsets are true. Remember, purge class</span>
|
||||
<span class="comment">// is already checked above.</span>
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="ident">requested_pres</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_pres</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"requested_pres is not a subset of allowed"</span>);
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"{:?} !⊆ {:?}"</span>, <span class="ident">requested_pres</span>, <span class="ident">allowed_pres</span>);
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="op">!</span><span class="ident">requested_rem</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_rem</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"requested_rem is not a subset of allowed"</span>);
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"{:?} !⊆ {:?}"</span>, <span class="ident">requested_rem</span>, <span class="ident">allowed_rem</span>);
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="op">!</span><span class="ident">requested_classes</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_classes</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"requested_classes is not a subset of allowed"</span>);
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"{:?} !⊆ {:?}"</span>, <span class="ident">requested_classes</span>, <span class="ident">allowed_classes</span>);
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="comment">// For this entry, find the acp's that apply to it from the</span>
|
||||
<span class="comment">// set that apply to the entry that is performing the operation</span>
|
||||
<span class="kw">let</span> <span class="ident">scoped_acp</span>: <span class="ident">Vec</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">AccessControlModify</span><span class="op">></span> <span class="op">=</span> <span class="ident">related_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">filter_map</span>(<span class="op">|</span>(<span class="ident">acm</span>, <span class="ident">f_res</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">e</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
<span class="prelude-val">Some</span>(<span class="kw-2">*</span><span class="ident">acm</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">None</span>
|
||||
}
|
||||
})
|
||||
.<span class="ident">collect</span>();
|
||||
<span class="comment">// Build the sets of classes, pres and rem we are allowed to modify, extend</span>
|
||||
<span class="comment">// or use based on the set of matched acps.</span>
|
||||
<span class="kw">let</span> <span class="ident">allowed_pres</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">scoped_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">flat_map</span>(<span class="op">|</span><span class="ident">acp</span><span class="op">|</span> <span class="ident">acp</span>.<span class="ident">presattrs</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">as_str</span>()))
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
<span class="kw">let</span> <span class="ident">allowed_rem</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">scoped_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">flat_map</span>(<span class="op">|</span><span class="ident">acp</span><span class="op">|</span> <span class="ident">acp</span>.<span class="ident">remattrs</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">as_str</span>()))
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
<span class="kw">let</span> <span class="ident">allowed_classes</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">scoped_acp</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">flat_map</span>(<span class="op">|</span><span class="ident">acp</span><span class="op">|</span> <span class="ident">acp</span>.<span class="ident">classes</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">as_str</span>()))
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
<span class="comment">// Now check all the subsets are true. Remember, purge class</span>
|
||||
<span class="comment">// is already checked above.</span>
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="ident">requested_pres</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_pres</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"requested_pres is not a subset of allowed"</span>);
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"{:?} !⊆ {:?}"</span>, <span class="ident">requested_pres</span>, <span class="ident">allowed_pres</span>);
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="op">!</span><span class="ident">requested_rem</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_rem</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"requested_rem is not a subset of allowed"</span>);
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"{:?} !⊆ {:?}"</span>, <span class="ident">requested_rem</span>, <span class="ident">allowed_rem</span>);
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="op">!</span><span class="ident">requested_classes</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_classes</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"requested_classes is not a subset of allowed"</span>);
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"{:?} !⊆ {:?}"</span>,
|
||||
<span class="ident">requested_classes</span>,
|
||||
<span class="ident">allowed_classes</span>
|
||||
);
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"passed pres, rem, classes check."</span>);
|
||||
<span class="bool-val">true</span>
|
||||
}
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"passed pres, rem, classes check."</span>);
|
||||
<span class="bool-val">true</span>
|
||||
} <span class="comment">// if acc == false</span>
|
||||
});
|
||||
<span class="kw">if</span> <span class="ident">r</span> {
|
||||
|
@ -3611,27 +3526,26 @@
|
|||
<span class="kw">let</span> <span class="ident">related_acp</span>: <span class="ident">Vec</span><span class="op"><</span>(<span class="kw-2">&</span><span class="ident">AccessControlCreate</span>, <span class="kw">_</span>)<span class="op">></span> <span class="op">=</span> <span class="ident">create_state</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">filter_map</span>(<span class="op">|</span><span class="ident">acs</span><span class="op">|</span> {
|
||||
<span class="kw">match</span> (<span class="kw-2">&</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">receiver</span>).<span class="ident">resolve</span>(<span class="kw-2">&</span><span class="ident">ce</span>.<span class="ident">ident</span>, <span class="prelude-val">None</span>, <span class="prelude-val">Some</span>(<span class="ident">acp_resolve_filter_cache</span>)) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">f_res</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">rec_entry</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
(<span class="kw-2">&</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">targetscope</span>)
|
||||
.<span class="ident">resolve</span>(<span class="kw-2">&</span><span class="ident">ce</span>.<span class="ident">ident</span>, <span class="prelude-val">None</span>, <span class="prelude-val">Some</span>(<span class="ident">acp_resolve_filter_cache</span>))
|
||||
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="macro">ladmin_error!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"A internal filter/event was passed for resolution!?!? {:?}"</span>,
|
||||
<span class="ident">e</span>
|
||||
);
|
||||
<span class="ident">e</span>
|
||||
})
|
||||
.<span class="ident">ok</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">f_res</span><span class="op">|</span>
|
||||
(<span class="ident">acs</span>, <span class="ident">f_res</span>)
|
||||
)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">None</span>
|
||||
}
|
||||
}
|
||||
<span class="kw">match</span> <span class="ident">acs</span>
|
||||
.<span class="ident">acp</span>
|
||||
.<span class="ident">receiver</span>
|
||||
.<span class="ident">resolve</span>(<span class="kw-2">&</span><span class="ident">ce</span>.<span class="ident">ident</span>, <span class="prelude-val">None</span>, <span class="prelude-val">Some</span>(<span class="ident">acp_resolve_filter_cache</span>))
|
||||
{
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">f_res</span>) <span class="kw">if</span> <span class="ident">rec_entry</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) <span class="op">=</span><span class="op">></span> <span class="ident">acs</span>
|
||||
.<span class="ident">acp</span>
|
||||
.<span class="ident">targetscope</span>
|
||||
.<span class="ident">resolve</span>(<span class="kw-2">&</span><span class="ident">ce</span>.<span class="ident">ident</span>, <span class="prelude-val">None</span>, <span class="prelude-val">Some</span>(<span class="ident">acp_resolve_filter_cache</span>))
|
||||
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="macro">ladmin_error!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"A internal filter/event was passed for resolution!?!? {:?}"</span>,
|
||||
<span class="ident">e</span>
|
||||
);
|
||||
<span class="ident">e</span>
|
||||
})
|
||||
.<span class="ident">ok</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">f_res</span><span class="op">|</span> (<span class="ident">acs</span>, <span class="ident">f_res</span>)),
|
||||
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">None</span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="macro">ladmin_error!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
|
@ -3647,93 +3561,67 @@
|
|||
<span class="comment">// lsecurity_access!(audit, "Related acc -> {:?}", related_acp);</span>
|
||||
|
||||
<span class="comment">// For each entry</span>
|
||||
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">entries</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">true</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="ident">acc</span> {
|
||||
<span class="comment">// We have already failed, move on.</span>
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="comment">// Build the set of requested classes and attrs here.</span>
|
||||
<span class="kw">let</span> <span class="ident">create_attrs</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">e</span>.<span class="ident">get_ava_names</span>().<span class="ident">collect</span>();
|
||||
<span class="comment">// If this is empty, we make an empty set, which is fine because</span>
|
||||
<span class="comment">// the empty class set despite matching is_subset, will have the</span>
|
||||
<span class="comment">// following effect:</span>
|
||||
<span class="comment">// * there is no class on entry, so schema will fail</span>
|
||||
<span class="comment">// * plugin-base will add object to give a class, but excess</span>
|
||||
<span class="comment">// attrs will cause fail (could this be a weakness?)</span>
|
||||
<span class="comment">// * class is a "may", so this could be empty in the rules, so</span>
|
||||
<span class="comment">// if the accr is empty this would not be a true subset,</span>
|
||||
<span class="comment">// so this would "fail", but any content in the accr would</span>
|
||||
<span class="comment">// have to be validated.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// I still think if this is None, we should just fail here ...</span>
|
||||
<span class="comment">// because it shouldn't be possible to match.</span>
|
||||
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">entries</span>.<span class="ident">iter</span>().<span class="ident">all</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="comment">// Build the set of requested classes and attrs here.</span>
|
||||
<span class="kw">let</span> <span class="ident">create_attrs</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="ident">e</span>.<span class="ident">get_ava_names</span>().<span class="ident">collect</span>();
|
||||
<span class="comment">// If this is empty, we make an empty set, which is fine because</span>
|
||||
<span class="comment">// the empty class set despite matching is_subset, will have the</span>
|
||||
<span class="comment">// following effect:</span>
|
||||
<span class="comment">// * there is no class on entry, so schema will fail</span>
|
||||
<span class="comment">// * plugin-base will add object to give a class, but excess</span>
|
||||
<span class="comment">// attrs will cause fail (could this be a weakness?)</span>
|
||||
<span class="comment">// * class is a "may", so this could be empty in the rules, so</span>
|
||||
<span class="comment">// if the accr is empty this would not be a true subset,</span>
|
||||
<span class="comment">// so this would "fail", but any content in the accr would</span>
|
||||
<span class="comment">// have to be validated.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// I still think if this is None, we should just fail here ...</span>
|
||||
<span class="comment">// because it shouldn't be possible to match.</span>
|
||||
|
||||
<span class="kw">let</span> <span class="ident">create_classes</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">e</span>.<span class="ident">get_ava_as_str</span>(<span class="string">"class"</span>) {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">s</span>) <span class="op">=</span><span class="op">></span> <span class="ident">s</span>.<span class="ident">collect</span>(),
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"Class set failed to build - corrupted entry?"</span>);
|
||||
<span class="kw">let</span> <span class="ident">create_classes</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">e</span>.<span class="ident">get_ava_as_str</span>(<span class="string">"class"</span>) {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">s</span>) <span class="op">=</span><span class="op">></span> <span class="ident">s</span>.<span class="ident">collect</span>(),
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"Class set failed to build - corrupted entry?"</span>);
|
||||
<span class="kw">return</span> <span class="bool-val">false</span>;
|
||||
}
|
||||
};
|
||||
|
||||
<span class="ident">related_acp</span>.<span class="ident">iter</span>().<span class="ident">any</span>(<span class="op">|</span>(<span class="ident">accr</span>, <span class="ident">f_res</span>)<span class="op">|</span> {
|
||||
<span class="comment">// Check to see if allowed.</span>
|
||||
<span class="kw">if</span> <span class="ident">e</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"entry {:?} matches acs {:?}"</span>, <span class="ident">e</span>, <span class="ident">accr</span>);
|
||||
<span class="comment">// It matches, so now we have to check attrs and classes.</span>
|
||||
<span class="comment">// Remember, we have to match ALL requested attrs</span>
|
||||
<span class="comment">// and classes to pass!</span>
|
||||
<span class="kw">let</span> <span class="ident">allowed_attrs</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span>
|
||||
<span class="ident">accr</span>.<span class="ident">attrs</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">as_str</span>()).<span class="ident">collect</span>();
|
||||
<span class="kw">let</span> <span class="ident">allowed_classes</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span>
|
||||
<span class="ident">accr</span>.<span class="ident">classes</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">as_str</span>()).<span class="ident">collect</span>();
|
||||
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="ident">create_attrs</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_attrs</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"create_attrs is not a subset of allowed"</span>);
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"{:?} !⊆ {:?}"</span>, <span class="ident">create_attrs</span>, <span class="ident">allowed_attrs</span>);
|
||||
<span class="kw">return</span> <span class="bool-val">false</span>;
|
||||
}
|
||||
};
|
||||
|
||||
<span class="ident">related_acp</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">r_acc</span>, (<span class="ident">accr</span>, <span class="ident">f_res</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">r_acc</span> {
|
||||
<span class="comment">// Already allowed, continue.</span>
|
||||
<span class="ident">r_acc</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="comment">// Check to see if allowed.</span>
|
||||
<span class="kw">if</span> <span class="ident">e</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"entry {:?} matches acs {:?}"</span>, <span class="ident">e</span>, <span class="ident">accr</span>);
|
||||
<span class="comment">// It matches, so now we have to check attrs and classes.</span>
|
||||
<span class="comment">// Remember, we have to match ALL requested attrs</span>
|
||||
<span class="comment">// and classes to pass!</span>
|
||||
<span class="kw">let</span> <span class="ident">allowed_attrs</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span>
|
||||
<span class="ident">accr</span>.<span class="ident">attrs</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">as_str</span>()).<span class="ident">collect</span>();
|
||||
<span class="kw">let</span> <span class="ident">allowed_classes</span>: <span class="ident">BTreeSet</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span>
|
||||
<span class="ident">accr</span>.<span class="ident">classes</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">as_str</span>()).<span class="ident">collect</span>();
|
||||
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="ident">create_attrs</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_attrs</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"create_attrs is not a subset of allowed"</span>
|
||||
);
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"{:?} !⊆ {:?}"</span>,
|
||||
<span class="ident">create_attrs</span>,
|
||||
<span class="ident">allowed_attrs</span>
|
||||
);
|
||||
<span class="kw">return</span> <span class="bool-val">false</span>;
|
||||
}
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="ident">create_classes</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_classes</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"create_classes is not a subset of allowed"</span>
|
||||
);
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"{:?} !⊆ {:?}"</span>,
|
||||
<span class="ident">create_classes</span>,
|
||||
<span class="ident">allowed_classes</span>
|
||||
);
|
||||
<span class="kw">return</span> <span class="bool-val">false</span>;
|
||||
}
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"passed"</span>);
|
||||
|
||||
<span class="bool-val">true</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">ltrace!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"entry {:?} DOES NOT match acs {}"</span>,
|
||||
<span class="ident">e</span>,
|
||||
<span class="ident">accr</span>.<span class="ident">acp</span>.<span class="ident">name</span>
|
||||
);
|
||||
<span class="comment">// Does not match, fail this rule.</span>
|
||||
<span class="bool-val">false</span>
|
||||
}
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="ident">create_classes</span>.<span class="ident">is_subset</span>(<span class="kw-2">&</span><span class="ident">allowed_classes</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"create_classes is not a subset of allowed"</span>);
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"{:?} !⊆ {:?}"</span>,
|
||||
<span class="ident">create_classes</span>,
|
||||
<span class="ident">allowed_classes</span>
|
||||
);
|
||||
<span class="kw">return</span> <span class="bool-val">false</span>;
|
||||
}
|
||||
})
|
||||
}
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"passed"</span>);
|
||||
|
||||
<span class="bool-val">true</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">ltrace!</span>(<span class="ident">audit</span>, <span class="string">"entry {:?} DOES NOT match acs {}"</span>, <span class="ident">e</span>, <span class="ident">accr</span>.<span class="ident">acp</span>.<span class="ident">name</span>);
|
||||
<span class="comment">// Does not match, fail this rule.</span>
|
||||
<span class="bool-val">false</span>
|
||||
}
|
||||
})
|
||||
<span class="comment">// Find the set of related acps for this entry.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// For each "created" entry.</span>
|
||||
|
@ -3778,10 +3666,10 @@
|
|||
<span class="kw">let</span> <span class="ident">related_acp</span>: <span class="ident">Vec</span><span class="op"><</span>(<span class="kw-2">&</span><span class="ident">AccessControlDelete</span>, <span class="kw">_</span>)<span class="op">></span> <span class="op">=</span> <span class="ident">delete_state</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">filter_map</span>(<span class="op">|</span><span class="ident">acs</span><span class="op">|</span> {
|
||||
<span class="kw">match</span> (<span class="kw-2">&</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">receiver</span>).<span class="ident">resolve</span>(<span class="kw-2">&</span><span class="ident">de</span>.<span class="ident">ident</span>, <span class="prelude-val">None</span>, <span class="prelude-val">Some</span>(<span class="ident">acp_resolve_filter_cache</span>)) {
|
||||
<span class="kw">match</span> <span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">receiver</span>.<span class="ident">resolve</span>(<span class="kw-2">&</span><span class="ident">de</span>.<span class="ident">ident</span>, <span class="prelude-val">None</span>, <span class="prelude-val">Some</span>(<span class="ident">acp_resolve_filter_cache</span>)) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">f_res</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">rec_entry</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
(<span class="kw-2">&</span><span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">targetscope</span>)
|
||||
<span class="ident">acs</span>.<span class="ident">acp</span>.<span class="ident">targetscope</span>
|
||||
.<span class="ident">resolve</span>(<span class="kw-2">&</span><span class="ident">de</span>.<span class="ident">ident</span>, <span class="prelude-val">None</span>, <span class="prelude-val">Some</span>(<span class="ident">acp_resolve_filter_cache</span>))
|
||||
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="macro">ladmin_error!</span>(
|
||||
|
@ -3818,37 +3706,29 @@
|
|||
*/</span>
|
||||
|
||||
<span class="comment">// For each entry</span>
|
||||
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">entries</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">true</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="ident">acc</span> {
|
||||
<span class="comment">// Any false, denies the whole operation.</span>
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">related_acp</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">r_acc</span>, (<span class="ident">acd</span>, <span class="ident">f_res</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">r_acc</span> {
|
||||
<span class="comment">// If something allowed us to delete, skip doing silly work.</span>
|
||||
<span class="ident">r_acc</span>
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">e</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"entry {:?} matches acs {}"</span>,
|
||||
<span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acd</span>.<span class="ident">acp</span>.<span class="ident">name</span>
|
||||
);
|
||||
<span class="comment">// It matches, so we can delete this!</span>
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"passed"</span>);
|
||||
<span class="bool-val">true</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">ltrace!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"entry {:?} DOES NOT match acs {}"</span>,
|
||||
<span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acd</span>.<span class="ident">acp</span>.<span class="ident">name</span>
|
||||
);
|
||||
<span class="comment">// Does not match, fail.</span>
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="comment">// else</span>
|
||||
}) <span class="comment">// fold related_acp</span>
|
||||
} <span class="comment">// if/else</span>
|
||||
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">entries</span>.<span class="ident">iter</span>().<span class="ident">all</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="ident">related_acp</span>.<span class="ident">iter</span>().<span class="ident">any</span>(<span class="op">|</span>(<span class="ident">acd</span>, <span class="ident">f_res</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">e</span>.<span class="ident">entry_match_no_index</span>(<span class="kw-2">&</span><span class="ident">f_res</span>) {
|
||||
<span class="macro">lsecurity_access!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"entry {:?} matches acs {}"</span>,
|
||||
<span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acd</span>.<span class="ident">acp</span>.<span class="ident">name</span>
|
||||
);
|
||||
<span class="comment">// It matches, so we can delete this!</span>
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"passed"</span>);
|
||||
<span class="bool-val">true</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">ltrace!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"entry {:?} DOES NOT match acs {}"</span>,
|
||||
<span class="ident">e</span>.<span class="ident">get_uuid</span>(),
|
||||
<span class="ident">acd</span>.<span class="ident">acp</span>.<span class="ident">name</span>
|
||||
);
|
||||
<span class="comment">// Does not match, fail.</span>
|
||||
<span class="bool-val">false</span>
|
||||
} <span class="comment">// else</span>
|
||||
}) <span class="comment">// any related_acp</span>
|
||||
});
|
||||
<span class="kw">if</span> <span class="ident">r</span> {
|
||||
<span class="macro">lsecurity_access!</span>(<span class="ident">audit</span>, <span class="string">"allowed ✅"</span>);
|
||||
|
|
|
@ -1267,37 +1267,6 @@
|
|||
<span id="1265">1265</span>
|
||||
<span id="1266">1266</span>
|
||||
<span id="1267">1267</span>
|
||||
<span id="1268">1268</span>
|
||||
<span id="1269">1269</span>
|
||||
<span id="1270">1270</span>
|
||||
<span id="1271">1271</span>
|
||||
<span id="1272">1272</span>
|
||||
<span id="1273">1273</span>
|
||||
<span id="1274">1274</span>
|
||||
<span id="1275">1275</span>
|
||||
<span id="1276">1276</span>
|
||||
<span id="1277">1277</span>
|
||||
<span id="1278">1278</span>
|
||||
<span id="1279">1279</span>
|
||||
<span id="1280">1280</span>
|
||||
<span id="1281">1281</span>
|
||||
<span id="1282">1282</span>
|
||||
<span id="1283">1283</span>
|
||||
<span id="1284">1284</span>
|
||||
<span id="1285">1285</span>
|
||||
<span id="1286">1286</span>
|
||||
<span id="1287">1287</span>
|
||||
<span id="1288">1288</span>
|
||||
<span id="1289">1289</span>
|
||||
<span id="1290">1290</span>
|
||||
<span id="1291">1291</span>
|
||||
<span id="1292">1292</span>
|
||||
<span id="1293">1293</span>
|
||||
<span id="1294">1294</span>
|
||||
<span id="1295">1295</span>
|
||||
<span id="1296">1296</span>
|
||||
<span id="1297">1297</span>
|
||||
<span id="1298">1298</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="kw">use</span> <span class="ident">tokio::sync::mpsc::UnboundedSender</span> <span class="kw">as</span> <span class="ident">Sender</span>;
|
||||
<span class="kw">use</span> <span class="ident">tracing</span>::{<span class="ident">error</span>, <span class="ident">info</span>, <span class="ident">instrument</span>, <span class="ident">trace</span>};
|
||||
|
@ -1423,30 +1392,21 @@
|
|||
})<span class="question-mark">?</span>;
|
||||
|
||||
<span class="comment">// Make an event from the request</span>
|
||||
<span class="comment">// TODO: Refactor this in another PR to use `map_err` and `?`</span>
|
||||
<span class="kw">let</span> <span class="ident">search</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">SearchEvent::from_message</span>(
|
||||
<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>,
|
||||
<span class="ident">ident</span>,
|
||||
<span class="kw-2">&</span><span class="ident">req</span>,
|
||||
<span class="kw-2">&</span><span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>,
|
||||
) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) <span class="op">=</span><span class="op">></span> <span class="ident">s</span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="macro">admin_error!</span>(<span class="question-mark">?</span><span class="ident">e</span>, <span class="string">"Failed to begin search"</span>);
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"Failed to begin search: {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>);
|
||||
}
|
||||
};
|
||||
<span class="kw">let</span> <span class="ident">search</span> <span class="op">=</span>
|
||||
<span class="ident">SearchEvent::from_message</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="ident">ident</span>, <span class="kw-2">&</span><span class="ident">req</span>, <span class="kw-2">&</span><span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>)
|
||||
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="macro">admin_error!</span>(<span class="question-mark">?</span><span class="ident">e</span>, <span class="string">"Failed to begin search"</span>);
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"Failed to begin search: {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="ident">e</span>
|
||||
})<span class="question-mark">?</span>;
|
||||
|
||||
<span class="macro">trace!</span>(<span class="question-mark">?</span><span class="ident">search</span>, <span class="string">"Begin event"</span>);
|
||||
<span class="macro">ltrace!</span>(<span class="ident">audit</span>, <span class="string">"Begin event {:?}"</span>, <span class="ident">search</span>);
|
||||
|
||||
<span class="comment">// TODO: Refactor this in another PR to use `?`</span>
|
||||
<span class="kw">match</span> <span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>.<span class="ident">search_ext</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">search</span>) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">entries</span>) <span class="op">=</span><span class="op">></span> <span class="ident">SearchResult::new</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>, <span class="kw-2">&</span><span class="ident">entries</span>)
|
||||
.<span class="ident">map</span>(<span class="ident">SearchResult::response</span>),
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">e</span>),
|
||||
}
|
||||
<span class="kw">let</span> <span class="ident">entries</span> <span class="op">=</span> <span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>.<span class="ident">search_ext</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">search</span>)<span class="question-mark">?</span>;
|
||||
|
||||
<span class="ident">SearchResult::new</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>, <span class="kw-2">&</span><span class="ident">entries</span>)
|
||||
.<span class="ident">map</span>(<span class="ident">SearchResult::response</span>)
|
||||
})
|
||||
});
|
||||
<span class="comment">// At the end of the event we send it for logging.</span>
|
||||
|
@ -1688,48 +1648,26 @@
|
|||
<span class="ident">e</span>
|
||||
})<span class="question-mark">?</span>;
|
||||
|
||||
<span class="comment">// TODO: Refactor this in another PR to use `?`</span>
|
||||
<span class="kw">let</span> <span class="ident">srch</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">SearchEvent::from_whoami_request</span>(
|
||||
<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>,
|
||||
<span class="ident">ident</span>,
|
||||
<span class="kw-2">&</span><span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>,
|
||||
) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) <span class="op">=</span><span class="op">></span> <span class="ident">s</span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="macro">admin_error!</span>(<span class="question-mark">?</span><span class="ident">e</span>, <span class="string">"Failed to begin whoami"</span>);
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"Failed to begin whoami: {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>);
|
||||
}
|
||||
};
|
||||
<span class="kw">let</span> <span class="ident">srch</span> <span class="op">=</span>
|
||||
<span class="ident">SearchEvent::from_whoami_request</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="ident">ident</span>, <span class="kw-2">&</span><span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>)
|
||||
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="macro">admin_error!</span>(<span class="question-mark">?</span><span class="ident">e</span>, <span class="string">"Failed to begin whoami"</span>);
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"Failed to begin whoami: {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="ident">e</span>
|
||||
})<span class="question-mark">?</span>;
|
||||
|
||||
<span class="macro">trace!</span>(<span class="ident">search</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">srch</span>, <span class="string">"Begin event"</span>);
|
||||
<span class="macro">ltrace!</span>(<span class="ident">audit</span>, <span class="string">"Begin event {:?}"</span>, <span class="ident">srch</span>);
|
||||
|
||||
<span class="comment">// TODO: Refactor this in another PR to use `?`</span>
|
||||
<span class="kw">match</span> <span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>.<span class="ident">search_ext</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">srch</span>) {
|
||||
<span class="prelude-val">Ok</span>(<span class="kw-2">mut</span> <span class="ident">entries</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="comment">// assert there is only one ...</span>
|
||||
<span class="kw">match</span> <span class="ident">entries</span>.<span class="ident">len</span>() {
|
||||
<span class="number">0</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::NoMatchingEntries</span>),
|
||||
<span class="number">1</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">e</span> <span class="op">=</span> <span class="ident">entries</span>.<span class="ident">pop</span>().<span class="ident">expect</span>(<span class="string">"Entry length mismatch!!!"</span>);
|
||||
<span class="comment">// Now convert to a response, and return</span>
|
||||
<span class="ident">WhoamiResult::new</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>, <span class="kw-2">&</span><span class="ident">e</span>, <span class="ident">uat</span>)
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">ok_wr</span><span class="op">|</span> <span class="ident">ok_wr</span>.<span class="ident">response</span>())
|
||||
}
|
||||
<span class="comment">// Somehow we matched multiple, which should be impossible.</span>
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::InvalidState</span>),
|
||||
}
|
||||
<span class="comment">// TODO: Refactor this in another PR use use the following</span>
|
||||
<span class="comment">// entries.pop() {</span>
|
||||
<span class="comment">// Some(e) if entries.is_empty() => // whoami stuff...</span>
|
||||
<span class="comment">// Some(_) => Err(OperationError::InvalidState) // matched multiple</span>
|
||||
<span class="comment">// _ => Err(OperationError::NoMatchingEntries),</span>
|
||||
<span class="comment">// }</span>
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">entries</span> <span class="op">=</span> <span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>.<span class="ident">search_ext</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">srch</span>)<span class="question-mark">?</span>;
|
||||
|
||||
<span class="kw">match</span> <span class="ident">entries</span>.<span class="ident">pop</span>() {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">e</span>) <span class="kw">if</span> <span class="ident">entries</span>.<span class="ident">is_empty</span>() <span class="op">=</span><span class="op">></span> {
|
||||
<span class="ident">WhoamiResult::new</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">idms_prox_read</span>.<span class="ident">qs_read</span>, <span class="kw-2">&</span><span class="ident">e</span>, <span class="ident">uat</span>)
|
||||
.<span class="ident">map</span>(<span class="ident">WhoamiResult::response</span>)
|
||||
}
|
||||
<span class="comment">// Something else went wrong ...</span>
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">e</span>),
|
||||
<span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::InvalidState</span>), <span class="comment">// Somehow matched multiple entries...</span>
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::NoMatchingEntries</span>),
|
||||
}
|
||||
})
|
||||
});
|
||||
|
|
|
@ -1541,6 +1541,8 @@
|
|||
<span id="1539">1539</span>
|
||||
<span id="1540">1540</span>
|
||||
<span id="1541">1541</span>
|
||||
<span id="1542">1542</span>
|
||||
<span id="1543">1543</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::audit::AuditScope</span>;
|
||||
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::be</span>::{<span class="ident">BackendConfig</span>, <span class="ident">IdList</span>, <span class="ident">IdRawEntry</span>, <span class="ident">IdxKey</span>, <span class="ident">IdxSlope</span>};
|
||||
|
@ -1565,11 +1567,13 @@
|
|||
<span class="kw">const</span> <span class="ident">DBV_ID2ENTRY</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"id2entry"</span>;
|
||||
<span class="kw">const</span> <span class="ident">DBV_INDEXV</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"indexv"</span>;
|
||||
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::needless_pass_by_value</span>)]</span> <span class="comment">// needs to accept value from `map_err`</span>
|
||||
<span class="kw">fn</span> <span class="ident">sqlite_error</span>(<span class="ident">e</span>: <span class="ident">rusqlite::Error</span>) <span class="op">-</span><span class="op">></span> <span class="ident">OperationError</span> {
|
||||
<span class="macro">admin_error!</span>(<span class="question-mark">?</span><span class="ident">e</span>, <span class="string">"SQLite Error"</span>);
|
||||
<span class="ident">OperationError::SqliteError</span>
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::needless_pass_by_value</span>)]</span> <span class="comment">// needs to accept value from `map_err`</span>
|
||||
<span class="kw">fn</span> <span class="ident">serde_cbor_error</span>(<span class="ident">e</span>: <span class="ident">serde_cbor::Error</span>) <span class="op">-</span><span class="op">></span> <span class="ident">OperationError</span> {
|
||||
<span class="macro">admin_error!</span>(<span class="question-mark">?</span><span class="ident">e</span>, <span class="string">"Serde CBOR Error"</span>);
|
||||
<span class="ident">OperationError::SerdeCborError</span>
|
||||
|
|
|
@ -927,9 +927,6 @@
|
|||
<span id="925">925</span>
|
||||
<span id="926">926</span>
|
||||
<span id="927">927</span>
|
||||
<span id="928">928</span>
|
||||
<span id="929">929</span>
|
||||
<span id="930">930</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::be::dbvalue::DbBackupCodeV1</span>;
|
||||
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::be::dbvalue</span>::{<span class="ident">DbCredTypeV1</span>, <span class="ident">DbCredV1</span>, <span class="ident">DbPasswordV1</span>, <span class="ident">DbWebauthnV1</span>};
|
||||
|
@ -1274,25 +1271,22 @@ pub enum Policy {
|
|||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">None</span>,
|
||||
};
|
||||
|
||||
<span class="kw">let</span> <span class="ident">v_webauthn</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">webauthn</span> {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">dbw</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Some</span>(
|
||||
<span class="ident">dbw</span>.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">wc</span><span class="op">|</span> {
|
||||
(
|
||||
<span class="ident">wc</span>.<span class="ident">label</span>,
|
||||
<span class="ident">WebauthnCredential</span> {
|
||||
<span class="ident">cred_id</span>: <span class="ident">wc</span>.<span class="ident">id</span>,
|
||||
<span class="ident">cred</span>: <span class="ident">wc</span>.<span class="ident">cred</span>,
|
||||
<span class="ident">counter</span>: <span class="ident">wc</span>.<span class="ident">counter</span>,
|
||||
<span class="ident">verified</span>: <span class="ident">wc</span>.<span class="ident">verified</span>,
|
||||
<span class="ident">registration_policy</span>: <span class="ident">wc</span>.<span class="ident">registration_policy</span>,
|
||||
},
|
||||
)
|
||||
})
|
||||
.<span class="ident">collect</span>(),
|
||||
),
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">None</span>,
|
||||
};
|
||||
<span class="kw">let</span> <span class="ident">v_webauthn</span> <span class="op">=</span> <span class="ident">webauthn</span>.<span class="ident">map</span>(<span class="op">|</span><span class="ident">dbw</span><span class="op">|</span> {
|
||||
<span class="ident">dbw</span>.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">wc</span><span class="op">|</span> {
|
||||
(
|
||||
<span class="ident">wc</span>.<span class="ident">label</span>,
|
||||
<span class="ident">WebauthnCredential</span> {
|
||||
<span class="ident">cred_id</span>: <span class="ident">wc</span>.<span class="ident">id</span>,
|
||||
<span class="ident">cred</span>: <span class="ident">wc</span>.<span class="ident">cred</span>,
|
||||
<span class="ident">counter</span>: <span class="ident">wc</span>.<span class="ident">counter</span>,
|
||||
<span class="ident">verified</span>: <span class="ident">wc</span>.<span class="ident">verified</span>,
|
||||
<span class="ident">registration_policy</span>: <span class="ident">wc</span>.<span class="ident">registration_policy</span>,
|
||||
},
|
||||
)
|
||||
})
|
||||
.<span class="ident">collect</span>()
|
||||
});
|
||||
|
||||
<span class="kw">let</span> <span class="ident">v_backup_code</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">backup_code</span> {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">dbb</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Some</span>(<span class="ident">BackupCodes::try_from</span>(<span class="ident">dbb</span>)<span class="question-mark">?</span>),
|
||||
|
@ -1477,11 +1471,11 @@ pub enum Policy {
|
|||
}
|
||||
<span class="ident">CredentialType::PasswordMfa</span>(<span class="kw">_</span>, <span class="kw">_</span>, <span class="ident">map</span>, <span class="kw">_</span>) <span class="op">|</span> <span class="ident">CredentialType::Webauthn</span>(<span class="ident">map</span>) <span class="op">=</span><span class="op">></span> <span class="ident">map</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">fold</span>(<span class="prelude-val">None</span>, <span class="op">|</span><span class="ident">acc</span>, (<span class="ident">k</span>, <span class="ident">v</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">acc</span>.<span class="ident">is_none</span>() <span class="op">&&</span> <span class="kw-2">&</span><span class="ident">v</span>.<span class="ident">cred_id</span> <span class="op">=</span><span class="op">=</span> <span class="ident">cid</span> <span class="op">&&</span> <span class="ident">v</span>.<span class="ident">counter</span> <span class="op"><</span> <span class="ident">counter</span> {
|
||||
.<span class="ident">find_map</span>(<span class="op">|</span>(<span class="ident">k</span>, <span class="ident">v</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="kw-2">&</span><span class="ident">v</span>.<span class="ident">cred_id</span> <span class="op">=</span><span class="op">=</span> <span class="ident">cid</span> <span class="op">&&</span> <span class="ident">v</span>.<span class="ident">counter</span> <span class="op"><</span> <span class="ident">counter</span> {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">k</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">acc</span>
|
||||
<span class="prelude-val">None</span>
|
||||
}
|
||||
})
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">label</span><span class="op">|</span> {
|
||||
|
@ -1774,13 +1768,13 @@ pub enum Policy {
|
|||
<span class="kw">match</span> <span class="kw-2">&</span><span class="self">self</span>.<span class="ident">type_</span> {
|
||||
<span class="ident">CredentialType::PasswordMfa</span>(<span class="kw">_</span>, <span class="kw">_</span>, <span class="kw">_</span>, <span class="ident">opt_bc</span>) <span class="op">=</span><span class="op">></span> <span class="ident">opt_bc</span>
|
||||
.<span class="ident">as_ref</span>()
|
||||
.<span class="ident">ok_or</span>(<span class="ident">OperationError::InvalidAccountState</span>(<span class="ident">String::from</span>(
|
||||
<span class="string">"No backup codes are available for this account"</span>,
|
||||
)))
|
||||
.<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">bc</span><span class="op">|</span> {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">BackupCodesView</span> {
|
||||
<span class="ident">backup_codes</span>: <span class="ident">bc</span>.<span class="ident">code_set</span>.<span class="ident">clone</span>().<span class="ident">into_iter</span>().<span class="ident">collect</span>(),
|
||||
})
|
||||
.<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
|
||||
<span class="ident">OperationError::InvalidAccountState</span>(
|
||||
<span class="string">"No backup codes are available for this account"</span>.<span class="ident">to_string</span>(),
|
||||
)
|
||||
})
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">bc</span><span class="op">|</span> <span class="ident">BackupCodesView</span> {
|
||||
<span class="ident">backup_codes</span>: <span class="ident">bc</span>.<span class="ident">code_set</span>.<span class="ident">clone</span>().<span class="ident">into_iter</span>().<span class="ident">collect</span>(),
|
||||
}),
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::InvalidAccountState</span>(
|
||||
<span class="string">"Non-MFA credential type"</span>.<span class="ident">to_string</span>(),
|
||||
|
|
|
@ -3191,7 +3191,7 @@
|
|||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> {
|
||||
<span class="comment">// This should NOT fail - if it does, it means our schema is</span>
|
||||
<span class="comment">// in an invalid state!</span>
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">schema_attributes</span>.<span class="ident">get</span>(<span class="ident">s</span>).<span class="ident">ok_or</span>(<span class="ident">SchemaError::Corrupted</span>)<span class="question-mark">?</span>)
|
||||
<span class="ident">schema_attributes</span>.<span class="ident">get</span>(<span class="ident">s</span>).<span class="ident">ok_or</span>(<span class="ident">SchemaError::Corrupted</span>)
|
||||
})
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
|
|
|
@ -2263,20 +2263,6 @@
|
|||
<span id="2261">2261</span>
|
||||
<span id="2262">2262</span>
|
||||
<span id="2263">2263</span>
|
||||
<span id="2264">2264</span>
|
||||
<span id="2265">2265</span>
|
||||
<span id="2266">2266</span>
|
||||
<span id="2267">2267</span>
|
||||
<span id="2268">2268</span>
|
||||
<span id="2269">2269</span>
|
||||
<span id="2270">2270</span>
|
||||
<span id="2271">2271</span>
|
||||
<span id="2272">2272</span>
|
||||
<span id="2273">2273</span>
|
||||
<span id="2274">2274</span>
|
||||
<span id="2275">2275</span>
|
||||
<span id="2276">2276</span>
|
||||
<span id="2277">2277</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="doccomment">//! This module contains the logic to conduct an authentication of an account.</span>
|
||||
<span class="doccomment">//! Generally this has to process an authentication attempt, and validate each</span>
|
||||
|
@ -3237,12 +3223,7 @@
|
|||
);
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="ident">AuthState::Choose</span>(<span class="ident">auth_mechs</span>) <span class="op">=</span> <span class="ident">state</span> {
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="bool-val">true</span> <span class="op">=</span><span class="op">=</span> <span class="ident">auth_mechs</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">x</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">x</span> {
|
||||
<span class="ident">AuthMech::Anonymous</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
})
|
||||
);
|
||||
<span class="macro">assert!</span>(<span class="ident">auth_mechs</span>.<span class="ident">iter</span>().<span class="ident">any</span>(<span class="op">|</span><span class="ident">x</span><span class="op">|</span> <span class="macro">matches!</span>(<span class="ident">x</span>, <span class="ident">AuthMech::Anonymous</span>)));
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">panic!</span>(<span class="string">"Invalid auth state"</span>)
|
||||
}
|
||||
|
@ -3253,12 +3234,9 @@
|
|||
.<span class="ident">expect</span>(<span class="string">"Failed to select anonymous mech."</span>);
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="ident">AuthState::Continue</span>(<span class="ident">auth_mechs</span>) <span class="op">=</span> <span class="ident">state</span> {
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="bool-val">true</span> <span class="op">=</span><span class="op">=</span> <span class="ident">auth_mechs</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">x</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">x</span> {
|
||||
<span class="ident">AuthAllowed::Anonymous</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
})
|
||||
);
|
||||
<span class="macro">assert!</span>(<span class="ident">auth_mechs</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">any</span>(<span class="op">|</span><span class="ident">x</span><span class="op">|</span> <span class="macro">matches!</span>(<span class="ident">x</span>, <span class="ident">AuthAllowed::Anonymous</span>)));
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">panic!</span>(<span class="string">"Invalid auth state"</span>)
|
||||
}
|
||||
|
@ -3279,12 +3257,7 @@
|
|||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">session</span> <span class="op">=</span> <span class="ident">session</span>.<span class="ident">unwrap</span>();
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="ident">AuthState::Choose</span>(<span class="ident">auth_mechs</span>) <span class="op">=</span> <span class="ident">state</span> {
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="bool-val">true</span> <span class="op">=</span><span class="op">=</span> <span class="ident">auth_mechs</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">x</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">x</span> {
|
||||
<span class="ident">AuthMech::Password</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
})
|
||||
);
|
||||
<span class="macro">assert!</span>(<span class="ident">auth_mechs</span>.<span class="ident">iter</span>().<span class="ident">any</span>(<span class="op">|</span><span class="ident">x</span><span class="op">|</span> <span class="macro">matches!</span>(<span class="ident">x</span>, <span class="ident">AuthMech::Password</span>)));
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">panic!</span>();
|
||||
}
|
||||
|
@ -3294,12 +3267,9 @@
|
|||
.<span class="ident">expect</span>(<span class="string">"Failed to select anonymous mech."</span>);
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="ident">AuthState::Continue</span>(<span class="ident">auth_mechs</span>) <span class="op">=</span> <span class="ident">state</span> {
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="bool-val">true</span> <span class="op">=</span><span class="op">=</span> <span class="ident">auth_mechs</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">x</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">x</span> {
|
||||
<span class="ident">AuthAllowed::Password</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
})
|
||||
);
|
||||
<span class="macro">assert!</span>(<span class="ident">auth_mechs</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">any</span>(<span class="op">|</span><span class="ident">x</span><span class="op">|</span> <span class="macro">matches!</span>(<span class="ident">x</span>, <span class="ident">AuthAllowed::Password</span>)));
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">panic!</span>(<span class="string">"Invalid auth state"</span>)
|
||||
}
|
||||
|
@ -3427,12 +3397,9 @@
|
|||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">session</span> <span class="op">=</span> <span class="ident">session</span>.<span class="ident">expect</span>(<span class="string">"Session was unable to be created."</span>);
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="ident">AuthState::Choose</span>(<span class="ident">auth_mechs</span>) <span class="op">=</span> <span class="ident">state</span> {
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="bool-val">true</span> <span class="op">=</span><span class="op">=</span> <span class="ident">auth_mechs</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">x</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">x</span> {
|
||||
<span class="ident">AuthMech::PasswordMfa</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
})
|
||||
);
|
||||
<span class="macro">assert!</span>(<span class="ident">auth_mechs</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">any</span>(<span class="op">|</span><span class="ident">x</span><span class="op">|</span> <span class="macro">matches!</span>(<span class="ident">x</span>, <span class="ident">AuthMech::PasswordMfa</span>)))
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">panic!</span>();
|
||||
}
|
||||
|
@ -3451,10 +3418,20 @@
|
|||
<span class="ident">rchal</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">chal</span>.<span class="ident">clone</span>());
|
||||
<span class="bool-val">true</span>
|
||||
}
|
||||
<span class="comment">// Why does this also return `true`? If we hit this but not</span>
|
||||
<span class="comment">// Webauthn, then we will panic when unwrapping `rchal` later...</span>
|
||||
<span class="ident">AuthAllowed::Totp</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
})
|
||||
);
|
||||
|
||||
<span class="comment">// I feel like this is what we should be doing</span>
|
||||
<span class="comment">// assuming there will only be one `AuthAllowed::Webauthn`.</span>
|
||||
<span class="comment">// rchal = auth_mechs.iter().find_map(|x| match x {</span>
|
||||
<span class="comment">// AuthAllowed::Webauthn(chal) => Some(chal),</span>
|
||||
<span class="comment">// _ => None,</span>
|
||||
<span class="comment">// });</span>
|
||||
<span class="comment">// assert!(rchal.is_some());</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">panic!</span>(<span class="string">"Invalid auth state"</span>)
|
||||
}
|
||||
|
@ -3721,12 +3698,7 @@
|
|||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">session</span> <span class="op">=</span> <span class="ident">session</span>.<span class="ident">unwrap</span>();
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="ident">AuthState::Choose</span>(<span class="ident">auth_mechs</span>) <span class="op">=</span> <span class="ident">state</span> {
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="bool-val">true</span> <span class="op">=</span><span class="op">=</span> <span class="ident">auth_mechs</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">x</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">x</span> {
|
||||
<span class="ident">AuthMech::Webauthn</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
})
|
||||
);
|
||||
<span class="macro">assert!</span>(<span class="ident">auth_mechs</span>.<span class="ident">iter</span>().<span class="ident">any</span>(<span class="op">|</span><span class="ident">x</span><span class="op">|</span> <span class="macro">matches!</span>(<span class="ident">x</span>, <span class="ident">AuthMech::Webauthn</span>)));
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">panic!</span>();
|
||||
}
|
||||
|
|
|
@ -120,7 +120,6 @@
|
|||
<span id="118">118</span>
|
||||
<span id="119">119</span>
|
||||
<span id="120">120</span>
|
||||
<span id="121">121</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::entry</span>::{<span class="ident">Entry</span>, <span class="ident">EntryCommitted</span>, <span class="ident">EntryReduced</span>, <span class="ident">EntrySealed</span>};
|
||||
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::prelude</span>::<span class="kw-2">*</span>;
|
||||
|
@ -146,7 +145,7 @@
|
|||
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">au</span>:<span class="ident">expr</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">value</span>:<span class="ident">expr</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">qs</span>:<span class="ident">expr</span>) <span class="op">=</span><span class="op">></span> {{
|
||||
<span class="kw">let</span> <span class="ident">name</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">value</span>
|
||||
.<span class="ident">get_ava_single_str</span>(<span class="string">"name"</span>)
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">to_string</span>()) <span class="comment">// TODO: Refactor in another PR</span>
|
||||
.<span class="ident">map</span>(<span class="ident">str::to_string</span>)
|
||||
.<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
|
||||
<span class="ident">OperationError::InvalidAccountState</span>(<span class="string">"Missing attribute: name"</span>.<span class="ident">to_string</span>())
|
||||
})<span class="question-mark">?</span>;
|
||||
|
@ -155,7 +154,6 @@
|
|||
|
||||
<span class="kw">let</span> <span class="ident">upg</span> <span class="op">=</span> <span class="ident">Group</span> { <span class="ident">name</span>, <span class="ident">uuid</span> };
|
||||
|
||||
<span class="comment">// TODO: Refactor to use `map` and `unwrap_or_else`</span>
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">groups</span>: <span class="ident">Vec</span><span class="op"><</span><span class="ident">Group</span><span class="op">></span> <span class="op">=</span> <span class="kw">match</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">value</span>.<span class="ident">get_ava_as_refuuid</span>(<span class="string">"memberof"</span>) {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">riter</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="comment">// given a list of uuid, make a filter: even if this is empty, the be will</span>
|
||||
|
|
|
@ -426,31 +426,6 @@
|
|||
<span id="424">424</span>
|
||||
<span id="425">425</span>
|
||||
<span id="426">426</span>
|
||||
<span id="427">427</span>
|
||||
<span id="428">428</span>
|
||||
<span id="429">429</span>
|
||||
<span id="430">430</span>
|
||||
<span id="431">431</span>
|
||||
<span id="432">432</span>
|
||||
<span id="433">433</span>
|
||||
<span id="434">434</span>
|
||||
<span id="435">435</span>
|
||||
<span id="436">436</span>
|
||||
<span id="437">437</span>
|
||||
<span id="438">438</span>
|
||||
<span id="439">439</span>
|
||||
<span id="440">440</span>
|
||||
<span id="441">441</span>
|
||||
<span id="442">442</span>
|
||||
<span id="443">443</span>
|
||||
<span id="444">444</span>
|
||||
<span id="445">445</span>
|
||||
<span id="446">446</span>
|
||||
<span id="447">447</span>
|
||||
<span id="448">448</span>
|
||||
<span id="449">449</span>
|
||||
<span id="450">450</span>
|
||||
<span id="451">451</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="comment">// System protected objects. Items matching specific requirements</span>
|
||||
<span class="comment">// may only have certain modifications performed.</span>
|
||||
|
@ -514,20 +489,17 @@
|
|||
<span class="kw">return</span> <span class="prelude-val">Ok</span>(());
|
||||
}
|
||||
|
||||
<span class="ident">cand</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="prelude-val">Ok</span>(()), <span class="op">|</span><span class="ident">acc</span>, <span class="ident">cand</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">acc</span> {
|
||||
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_DOMAIN_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM_CONFIG</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_TOMBSTONE</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_RECYCLED</span>)
|
||||
{
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">acc</span>
|
||||
}
|
||||
<span class="ident">cand</span>.<span class="ident">iter</span>().<span class="ident">try_fold</span>((), <span class="op">|</span>(), <span class="ident">cand</span><span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_DOMAIN_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM_CONFIG</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_TOMBSTONE</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_RECYCLED</span>)
|
||||
{
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -547,55 +519,42 @@
|
|||
<span class="kw">return</span> <span class="prelude-val">Ok</span>(());
|
||||
}
|
||||
<span class="comment">// Prevent adding class: system, domain_info, tombstone, or recycled.</span>
|
||||
<span class="ident">me</span>.<span class="ident">modlist</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="prelude-val">Ok</span>(()), <span class="op">|</span><span class="ident">acc</span>, <span class="ident">m</span><span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">acc</span>.<span class="ident">is_err</span>() {
|
||||
<span class="ident">acc</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="kw">match</span> <span class="ident">m</span> {
|
||||
<span class="ident">Modify::Present</span>(<span class="ident">a</span>, <span class="ident">v</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="comment">// TODO: Can we avoid this clone?</span>
|
||||
<span class="kw">if</span> <span class="ident">a</span> <span class="op">=</span><span class="op">=</span> <span class="string">"class"</span>
|
||||
<span class="op">&&</span> (<span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_SYSTEM</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_DOMAIN_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_SYSTEM_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_SYSTEM_CONFIG</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_TOMBSTONE</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_RECYCLED</span>))
|
||||
{
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
}
|
||||
}
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Ok</span>(()),
|
||||
<span class="ident">me</span>.<span class="ident">modlist</span>.<span class="ident">iter</span>().<span class="ident">try_fold</span>((), <span class="op">|</span>(), <span class="ident">m</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">m</span> {
|
||||
<span class="ident">Modify::Present</span>(<span class="ident">a</span>, <span class="ident">v</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="comment">// TODO: Can we avoid this clone?</span>
|
||||
<span class="kw">if</span> <span class="ident">a</span> <span class="op">=</span><span class="op">=</span> <span class="string">"class"</span>
|
||||
<span class="op">&&</span> (<span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_SYSTEM</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_DOMAIN_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_SYSTEM_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_SYSTEM_CONFIG</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_TOMBSTONE</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">v</span> <span class="op">=</span><span class="op">=</span> <span class="kw-2">&</span>(<span class="kw-2">*</span><span class="ident">VCLASS_RECYCLED</span>))
|
||||
{
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
}
|
||||
}
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Ok</span>(()),
|
||||
})<span class="question-mark">?</span>;
|
||||
|
||||
<span class="comment">// HARD block mods on tombstone or recycle. We soft block on the rest as they may</span>
|
||||
<span class="comment">// have some allowed attrs.</span>
|
||||
<span class="ident">cand</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="prelude-val">Ok</span>(()), <span class="op">|</span><span class="ident">acc</span>, <span class="ident">cand</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">acc</span> {
|
||||
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_TOMBSTONE</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_RECYCLED</span>)
|
||||
{
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">acc</span>
|
||||
}
|
||||
<span class="ident">cand</span>.<span class="ident">iter</span>().<span class="ident">try_fold</span>((), <span class="op">|</span>(), <span class="ident">cand</span><span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_TOMBSTONE</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_RECYCLED</span>)
|
||||
{
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
}
|
||||
})<span class="question-mark">?</span>;
|
||||
|
||||
<span class="comment">// if class: system, check the mods are "allowed"</span>
|
||||
<span class="kw">let</span> <span class="ident">system_pres</span> <span class="op">=</span> <span class="ident">cand</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="bool-val">false</span>, <span class="op">|</span><span class="ident">acc</span>, <span class="ident">c</span><span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">acc</span> {
|
||||
<span class="ident">acc</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="comment">// We don't need to check for domain info here because domain_info has a class</span>
|
||||
<span class="comment">// system also. We just need to block it from being created.</span>
|
||||
<span class="ident">c</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM</span>)
|
||||
}
|
||||
<span class="kw">let</span> <span class="ident">system_pres</span> <span class="op">=</span> <span class="ident">cand</span>.<span class="ident">iter</span>().<span class="ident">any</span>(<span class="op">|</span><span class="ident">c</span><span class="op">|</span> {
|
||||
<span class="comment">// We don't need to check for domain info here because domain_info has a class</span>
|
||||
<span class="comment">// system also. We just need to block it from being created.</span>
|
||||
<span class="ident">c</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM</span>)
|
||||
});
|
||||
|
||||
<span class="macro">ltrace!</span>(<span class="ident">au</span>, <span class="string">"class: system -> {}"</span>, <span class="ident">system_pres</span>);
|
||||
|
@ -605,20 +564,14 @@
|
|||
}
|
||||
|
||||
<span class="comment">// Something altered is system, check if it's allowed.</span>
|
||||
<span class="ident">me</span>.<span class="ident">modlist</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="prelude-val">Ok</span>(()), <span class="op">|</span><span class="ident">acc</span>, <span class="ident">m</span><span class="op">|</span> {
|
||||
<span class="ident">me</span>.<span class="ident">modlist</span>.<span class="ident">iter</span>().<span class="ident">try_fold</span>((), <span class="op">|</span>(), <span class="ident">m</span><span class="op">|</span> {
|
||||
<span class="comment">// Already hit an error, move on.</span>
|
||||
<span class="kw">if</span> <span class="ident">acc</span>.<span class="ident">is_err</span>() {
|
||||
<span class="ident">acc</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="kw">let</span> <span class="ident">a</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">m</span> {
|
||||
<span class="ident">Modify::Present</span>(<span class="ident">a</span>, <span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="ident">a</span>,
|
||||
<span class="ident">Modify::Removed</span>(<span class="ident">a</span>, <span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="ident">a</span>,
|
||||
<span class="ident">Modify::Purged</span>(<span class="ident">a</span>) <span class="op">=</span><span class="op">></span> <span class="ident">a</span>,
|
||||
};
|
||||
<span class="kw">match</span> <span class="ident">ALLOWED_ATTRS</span>.<span class="ident">get</span>(<span class="ident">a</span>.<span class="ident">as_str</span>()) {
|
||||
<span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Ok</span>(()),
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>),
|
||||
}
|
||||
<span class="kw">let</span> <span class="ident">a</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">m</span> {
|
||||
<span class="ident">Modify::Present</span>(<span class="ident">a</span>, <span class="kw">_</span>) <span class="op">|</span> <span class="ident">Modify::Removed</span>(<span class="ident">a</span>, <span class="kw">_</span>) <span class="op">|</span> <span class="ident">Modify::Purged</span>(<span class="ident">a</span>) <span class="op">=</span><span class="op">></span> <span class="ident">a</span>,
|
||||
};
|
||||
<span class="kw">match</span> <span class="ident">ALLOWED_ATTRS</span>.<span class="ident">get</span>(<span class="ident">a</span>.<span class="ident">as_str</span>()) {
|
||||
<span class="prelude-val">Some</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Ok</span>(()),
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -638,20 +591,17 @@
|
|||
<span class="kw">return</span> <span class="prelude-val">Ok</span>(());
|
||||
}
|
||||
|
||||
<span class="ident">cand</span>.<span class="ident">iter</span>().<span class="ident">fold</span>(<span class="prelude-val">Ok</span>(()), <span class="op">|</span><span class="ident">acc</span>, <span class="ident">cand</span><span class="op">|</span> <span class="kw">match</span> <span class="ident">acc</span> {
|
||||
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="ident">acc</span>,
|
||||
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_DOMAIN_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM_CONFIG</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_TOMBSTONE</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_RECYCLED</span>)
|
||||
{
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">acc</span>
|
||||
}
|
||||
<span class="ident">cand</span>.<span class="ident">iter</span>().<span class="ident">try_fold</span>((), <span class="op">|</span>(), <span class="ident">cand</span><span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_DOMAIN_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM_INFO</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_SYSTEM_CONFIG</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_TOMBSTONE</span>)
|
||||
<span class="op">|</span><span class="op">|</span> <span class="ident">cand</span>.<span class="ident">attribute_equality</span>(<span class="string">"class"</span>, <span class="kw-2">&</span><span class="ident">PVCLASS_RECYCLED</span>)
|
||||
{
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::SystemProtectedObject</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -396,10 +396,6 @@
|
|||
<span id="394">394</span>
|
||||
<span id="395">395</span>
|
||||
<span id="396">396</span>
|
||||
<span id="397">397</span>
|
||||
<span id="398">398</span>
|
||||
<span id="399">399</span>
|
||||
<span id="400">400</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="comment">// Generate and manage spn's for all entries in the domain. Also deals with</span>
|
||||
<span class="comment">// the infrequent - but possible - case where a domain is renamed.</span>
|
||||
|
@ -542,20 +538,16 @@
|
|||
<span class="comment">// trigger the spn regen ... which is expensive. Future</span>
|
||||
<span class="comment">// TODO #157: will be improvements to modify on large txns.</span>
|
||||
|
||||
<span class="kw">let</span> <span class="ident">domain_name_changed</span> <span class="op">=</span>
|
||||
<span class="ident">cand</span>.<span class="ident">iter</span>()
|
||||
.<span class="ident">zip</span>(<span class="ident">pre_cand</span>.<span class="ident">iter</span>())
|
||||
.<span class="ident">fold</span>(<span class="prelude-val">None</span>, <span class="op">|</span><span class="ident">acc</span>, (<span class="ident">post</span>, <span class="ident">pre</span>)<span class="op">|</span> {
|
||||
<span class="kw">if</span> <span class="ident">acc</span>.<span class="ident">is_some</span>() {
|
||||
<span class="ident">acc</span>
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">post</span>.<span class="ident">attribute_equality</span>(<span class="string">"uuid"</span>, <span class="kw-2">&</span><span class="ident">PV_UUID_DOMAIN_INFO</span>)
|
||||
<span class="op">&&</span> <span class="ident">post</span>.<span class="ident">get_ava_single</span>(<span class="string">"domain_name"</span>) <span class="op">!</span><span class="op">=</span> <span class="ident">pre</span>.<span class="ident">get_ava_single</span>(<span class="string">"domain_name"</span>)
|
||||
{
|
||||
<span class="ident">post</span>.<span class="ident">get_ava_single</span>(<span class="string">"domain_name"</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">acc</span>
|
||||
}
|
||||
});
|
||||
<span class="kw">let</span> <span class="ident">domain_name_changed</span> <span class="op">=</span> <span class="ident">cand</span>.<span class="ident">iter</span>().<span class="ident">zip</span>(<span class="ident">pre_cand</span>.<span class="ident">iter</span>()).<span class="ident">find_map</span>(<span class="op">|</span>(<span class="ident">post</span>, <span class="ident">pre</span>)<span class="op">|</span> {
|
||||
<span class="kw">let</span> <span class="ident">domain_name</span> <span class="op">=</span> <span class="ident">post</span>.<span class="ident">get_ava_single</span>(<span class="string">"domain_name"</span>);
|
||||
<span class="kw">if</span> <span class="ident">post</span>.<span class="ident">attribute_equality</span>(<span class="string">"uuid"</span>, <span class="kw-2">&</span><span class="ident">PV_UUID_DOMAIN_INFO</span>)
|
||||
<span class="op">&&</span> <span class="ident">domain_name</span> <span class="op">!</span><span class="op">=</span> <span class="ident">pre</span>.<span class="ident">get_ava_single</span>(<span class="string">"domain_name"</span>)
|
||||
{
|
||||
<span class="ident">domain_name</span>
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">None</span>
|
||||
}
|
||||
});
|
||||
|
||||
<span class="kw">let</span> <span class="ident">domain_name</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">domain_name_changed</span> {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">s</span>) <span class="op">=</span><span class="op">></span> <span class="ident">s</span>,
|
||||
|
|
|
@ -4227,56 +4227,6 @@
|
|||
<span id="4225">4225</span>
|
||||
<span id="4226">4226</span>
|
||||
<span id="4227">4227</span>
|
||||
<span id="4228">4228</span>
|
||||
<span id="4229">4229</span>
|
||||
<span id="4230">4230</span>
|
||||
<span id="4231">4231</span>
|
||||
<span id="4232">4232</span>
|
||||
<span id="4233">4233</span>
|
||||
<span id="4234">4234</span>
|
||||
<span id="4235">4235</span>
|
||||
<span id="4236">4236</span>
|
||||
<span id="4237">4237</span>
|
||||
<span id="4238">4238</span>
|
||||
<span id="4239">4239</span>
|
||||
<span id="4240">4240</span>
|
||||
<span id="4241">4241</span>
|
||||
<span id="4242">4242</span>
|
||||
<span id="4243">4243</span>
|
||||
<span id="4244">4244</span>
|
||||
<span id="4245">4245</span>
|
||||
<span id="4246">4246</span>
|
||||
<span id="4247">4247</span>
|
||||
<span id="4248">4248</span>
|
||||
<span id="4249">4249</span>
|
||||
<span id="4250">4250</span>
|
||||
<span id="4251">4251</span>
|
||||
<span id="4252">4252</span>
|
||||
<span id="4253">4253</span>
|
||||
<span id="4254">4254</span>
|
||||
<span id="4255">4255</span>
|
||||
<span id="4256">4256</span>
|
||||
<span id="4257">4257</span>
|
||||
<span id="4258">4258</span>
|
||||
<span id="4259">4259</span>
|
||||
<span id="4260">4260</span>
|
||||
<span id="4261">4261</span>
|
||||
<span id="4262">4262</span>
|
||||
<span id="4263">4263</span>
|
||||
<span id="4264">4264</span>
|
||||
<span id="4265">4265</span>
|
||||
<span id="4266">4266</span>
|
||||
<span id="4267">4267</span>
|
||||
<span id="4268">4268</span>
|
||||
<span id="4269">4269</span>
|
||||
<span id="4270">4270</span>
|
||||
<span id="4271">4271</span>
|
||||
<span id="4272">4272</span>
|
||||
<span id="4273">4273</span>
|
||||
<span id="4274">4274</span>
|
||||
<span id="4275">4275</span>
|
||||
<span id="4276">4276</span>
|
||||
<span id="4277">4277</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="doccomment">//! `server` contains the query server, which is the main high level construction</span>
|
||||
<span class="doccomment">//! to coordinate queries and operations in the server.</span>
|
||||
|
@ -4731,23 +4681,10 @@
|
|||
})<span class="question-mark">?</span>;
|
||||
<span class="kw">let</span> <span class="ident">se</span> <span class="op">=</span> <span class="ident">SearchEvent::new_internal</span>(<span class="ident">f_valid</span>);
|
||||
|
||||
<span class="comment">// TODO: Refactor to use this</span>
|
||||
<span class="comment">// let mut vs = self.search(audit, &se)?;</span>
|
||||
<span class="comment">// match vs.pop() {</span>
|
||||
<span class="comment">// Some(entry) if vs.is_empty() => Ok(entry),</span>
|
||||
<span class="comment">// _ => Err(OperationError::NoMatchingEntries),</span>
|
||||
<span class="comment">// }</span>
|
||||
<span class="kw">let</span> <span class="ident">res</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">search</span>(<span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">se</span>);
|
||||
<span class="kw">match</span> <span class="ident">res</span> {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">vs</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">vs</span>.<span class="ident">len</span>() <span class="op">></span> <span class="number">1</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::NoMatchingEntries</span>);
|
||||
}
|
||||
<span class="ident">vs</span>.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">next</span>()
|
||||
.<span class="ident">ok_or</span>(<span class="ident">OperationError::NoMatchingEntries</span>)
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">e</span>),
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">vs</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">search</span>(<span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">se</span>)<span class="question-mark">?</span>;
|
||||
<span class="kw">match</span> <span class="ident">vs</span>.<span class="ident">pop</span>() {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">entry</span>) <span class="kw">if</span> <span class="ident">vs</span>.<span class="ident">is_empty</span>() <span class="op">=</span><span class="op">></span> <span class="prelude-val">Ok</span>(<span class="ident">entry</span>),
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::NoMatchingEntries</span>),
|
||||
}
|
||||
})
|
||||
})
|
||||
|
@ -4764,23 +4701,11 @@
|
|||
<span class="macro">lperf_segment!</span>(<span class="ident">audit</span>, <span class="string">"server::internal_search_ext_uuid"</span>, <span class="op">|</span><span class="op">|</span> {
|
||||
<span class="kw">let</span> <span class="ident">filter_intent</span> <span class="op">=</span> <span class="macro">filter_all!</span>(<span class="ident">f_eq</span>(<span class="string">"uuid"</span>, <span class="ident">PartialValue::new_uuid</span>(<span class="kw-2">*</span><span class="ident">uuid</span>)));
|
||||
<span class="kw">let</span> <span class="ident">filter</span> <span class="op">=</span> <span class="macro">filter!</span>(<span class="ident">f_eq</span>(<span class="string">"uuid"</span>, <span class="ident">PartialValue::new_uuid</span>(<span class="kw-2">*</span><span class="ident">uuid</span>)));
|
||||
<span class="kw">let</span> <span class="ident">res</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">impersonate_search_ext</span>(<span class="ident">audit</span>, <span class="ident">filter</span>, <span class="ident">filter_intent</span>, <span class="ident">event</span>);
|
||||
<span class="comment">// TODO: Refactor to use this</span>
|
||||
<span class="comment">// let mut vs = self.impersonate_search_ext(audit, filter, filter_intent, event)?;</span>
|
||||
<span class="comment">// match vs.pop() {</span>
|
||||
<span class="comment">// Some(entry) if vs.is_empty() => Ok(entry),</span>
|
||||
<span class="comment">// _ => Err(OperationError::NoMatchingEntries),</span>
|
||||
<span class="comment">// }</span>
|
||||
<span class="kw">match</span> <span class="ident">res</span> {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">vs</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">vs</span>.<span class="ident">len</span>() <span class="op">></span> <span class="number">1</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::NoMatchingEntries</span>);
|
||||
}
|
||||
<span class="ident">vs</span>.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">next</span>()
|
||||
.<span class="ident">ok_or</span>(<span class="ident">OperationError::NoMatchingEntries</span>)
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">e</span>),
|
||||
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">vs</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">impersonate_search_ext</span>(<span class="ident">audit</span>, <span class="ident">filter</span>, <span class="ident">filter_intent</span>, <span class="ident">event</span>)<span class="question-mark">?</span>;
|
||||
<span class="kw">match</span> <span class="ident">vs</span>.<span class="ident">pop</span>() {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">entry</span>) <span class="kw">if</span> <span class="ident">vs</span>.<span class="ident">is_empty</span>() <span class="op">=</span><span class="op">></span> <span class="prelude-val">Ok</span>(<span class="ident">entry</span>),
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::NoMatchingEntries</span>),
|
||||
}
|
||||
})
|
||||
})
|
||||
|
@ -4797,23 +4722,11 @@
|
|||
<span class="macro">lperf_segment!</span>(<span class="ident">audit</span>, <span class="string">"server::internal_search_uuid"</span>, <span class="op">|</span><span class="op">|</span> {
|
||||
<span class="kw">let</span> <span class="ident">filter_intent</span> <span class="op">=</span> <span class="macro">filter_all!</span>(<span class="ident">f_eq</span>(<span class="string">"uuid"</span>, <span class="ident">PartialValue::new_uuid</span>(<span class="kw-2">*</span><span class="ident">uuid</span>)));
|
||||
<span class="kw">let</span> <span class="ident">filter</span> <span class="op">=</span> <span class="macro">filter!</span>(<span class="ident">f_eq</span>(<span class="string">"uuid"</span>, <span class="ident">PartialValue::new_uuid</span>(<span class="kw-2">*</span><span class="ident">uuid</span>)));
|
||||
<span class="kw">let</span> <span class="ident">res</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">impersonate_search</span>(<span class="ident">audit</span>, <span class="ident">filter</span>, <span class="ident">filter_intent</span>, <span class="ident">event</span>);
|
||||
<span class="comment">// TODO: Refactor to use this</span>
|
||||
<span class="comment">// let mut vs = self.impersonate_search(audit, filter, filter_intent, event)?;</span>
|
||||
<span class="comment">// match vs.pop() {</span>
|
||||
<span class="comment">// Some(entry) if vs.is_empty() => Ok(entry),</span>
|
||||
<span class="comment">// _ => Err(OperationError::NoMatchingEntries),</span>
|
||||
<span class="comment">// }</span>
|
||||
<span class="kw">match</span> <span class="ident">res</span> {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">vs</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">vs</span>.<span class="ident">len</span>() <span class="op">></span> <span class="number">1</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::NoMatchingEntries</span>);
|
||||
}
|
||||
<span class="ident">vs</span>.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">next</span>()
|
||||
.<span class="ident">ok_or</span>(<span class="ident">OperationError::NoMatchingEntries</span>)
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">e</span>),
|
||||
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">vs</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">impersonate_search</span>(<span class="ident">audit</span>, <span class="ident">filter</span>, <span class="ident">filter_intent</span>, <span class="ident">event</span>)<span class="question-mark">?</span>;
|
||||
<span class="kw">match</span> <span class="ident">vs</span>.<span class="ident">pop</span>() {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">entry</span>) <span class="kw">if</span> <span class="ident">vs</span>.<span class="ident">is_empty</span>() <span class="op">=</span><span class="op">></span> <span class="prelude-val">Ok</span>(<span class="ident">entry</span>),
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::NoMatchingEntries</span>),
|
||||
}
|
||||
})
|
||||
})
|
||||
|
@ -5047,7 +4960,7 @@
|
|||
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">value</span>.<span class="ident">is_sshkey</span>() {
|
||||
<span class="ident">value</span>
|
||||
.<span class="ident">get_sshkey</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">to_string</span>()) <span class="comment">// TODO: Refactor in another PR</span>
|
||||
.<span class="ident">map</span>(<span class="ident">str::to_string</span>)
|
||||
.<span class="ident">ok_or</span>(<span class="ident">OperationError::InvalidValueState</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="comment">// Not? Okay, do the to string.</span>
|
||||
|
@ -5062,7 +4975,7 @@
|
|||
<span class="self">self</span>.<span class="ident">internal_search_uuid</span>(<span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">UUID_DOMAIN_INFO</span>)
|
||||
.<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="ident">e</span>.<span class="ident">get_ava_single_str</span>(<span class="string">"domain_name"</span>)
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">to_string</span>()) <span class="comment">// TODO: Refactor in another PR</span>
|
||||
.<span class="ident">map</span>(<span class="ident">str::to_string</span>)
|
||||
.<span class="ident">ok_or</span>(<span class="ident">OperationError::InvalidEntryState</span>)
|
||||
})
|
||||
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
|
@ -5084,7 +4997,7 @@
|
|||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">badlist_hashset</span> <span class="op">=</span> <span class="ident">HashSet::with_capacity</span>(<span class="ident">badlist_entry</span>.<span class="ident">len</span>());
|
||||
<span class="ident">badlist_entry</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">filter_map</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">e</span>.<span class="ident">as_string</span>()) <span class="comment">// TODO: Refactor in another PR</span>
|
||||
.<span class="ident">filter_map</span>(<span class="ident">Value::as_string</span>)
|
||||
.<span class="ident">cloned</span>()
|
||||
.<span class="ident">for_each</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> {
|
||||
<span class="ident">badlist_hashset</span>.<span class="ident">insert</span>(<span class="ident">s</span>);
|
||||
|
@ -5585,18 +5498,17 @@
|
|||
}
|
||||
|
||||
<span class="comment">// Now, delete only what you can see</span>
|
||||
<span class="kw">let</span> <span class="ident">pre_candidates</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">impersonate_search_valid</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="ident">de</span>.<span class="ident">filter</span>.<span class="ident">clone</span>(),
|
||||
<span class="ident">de</span>.<span class="ident">filter_orig</span>.<span class="ident">clone</span>(),
|
||||
<span class="kw-2">&</span><span class="ident">de</span>.<span class="ident">ident</span>,
|
||||
) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">results</span>) <span class="op">=</span><span class="op">></span> <span class="ident">results</span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">let</span> <span class="ident">pre_candidates</span> <span class="op">=</span> <span class="self">self</span>
|
||||
.<span class="ident">impersonate_search_valid</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="ident">de</span>.<span class="ident">filter</span>.<span class="ident">clone</span>(),
|
||||
<span class="ident">de</span>.<span class="ident">filter_orig</span>.<span class="ident">clone</span>(),
|
||||
<span class="kw-2">&</span><span class="ident">de</span>.<span class="ident">ident</span>,
|
||||
)
|
||||
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"delete: error in pre-candidate selection {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>);
|
||||
}
|
||||
};
|
||||
<span class="ident">e</span>
|
||||
})<span class="question-mark">?</span>;
|
||||
|
||||
<span class="comment">// Apply access controls to reduce the set if required.</span>
|
||||
<span class="comment">// delete_allow_operation</span>
|
||||
|
@ -5647,7 +5559,7 @@
|
|||
<span class="ident">OperationError::SchemaViolation</span>(<span class="ident">e</span>)
|
||||
})
|
||||
<span class="comment">// seal if it worked.</span>
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">r</span><span class="op">|</span> <span class="ident">r</span>.<span class="ident">seal</span>())
|
||||
.<span class="ident">map</span>(<span class="ident">Entry::seal</span>)
|
||||
})
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
|
@ -5720,16 +5632,13 @@
|
|||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"Unable to generate search cid {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="ident">e</span>
|
||||
})<span class="question-mark">?</span>;
|
||||
<span class="kw">let</span> <span class="ident">ts</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">internal_search</span>(
|
||||
<span class="kw">let</span> <span class="ident">ts</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">internal_search</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="macro">filter_all!</span>(<span class="macro">f_and!</span>([
|
||||
<span class="ident">f_eq</span>(<span class="string">"class"</span>, <span class="ident">PVCLASS_TOMBSTONE</span>.<span class="ident">clone</span>()),
|
||||
<span class="ident">f_lt</span>(<span class="string">"last_modified_cid"</span>, <span class="ident">PartialValue::new_cid</span>(<span class="ident">cid</span>)),
|
||||
])),
|
||||
) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">r</span>) <span class="op">=</span><span class="op">></span> <span class="ident">r</span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>),
|
||||
};
|
||||
)<span class="question-mark">?</span>;
|
||||
|
||||
<span class="kw">if</span> <span class="ident">ts</span>.<span class="ident">is_empty</span>() {
|
||||
<span class="macro">ladmin_info!</span>(<span class="ident">audit</span>, <span class="string">"No Tombstones present - purge operation success"</span>);
|
||||
|
@ -5757,16 +5666,13 @@
|
|||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"Unable to generate search cid {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="ident">e</span>
|
||||
})<span class="question-mark">?</span>;
|
||||
<span class="kw">let</span> <span class="ident">rc</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">internal_search</span>(
|
||||
<span class="kw">let</span> <span class="ident">rc</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">internal_search</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="macro">filter_all!</span>(<span class="macro">f_and!</span>([
|
||||
<span class="ident">f_eq</span>(<span class="string">"class"</span>, <span class="ident">PVCLASS_RECYCLED</span>.<span class="ident">clone</span>()),
|
||||
<span class="ident">f_lt</span>(<span class="string">"last_modified_cid"</span>, <span class="ident">PartialValue::new_cid</span>(<span class="ident">cid</span>)),
|
||||
])),
|
||||
) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">r</span>) <span class="op">=</span><span class="op">></span> <span class="ident">r</span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>),
|
||||
};
|
||||
)<span class="question-mark">?</span>;
|
||||
|
||||
<span class="kw">if</span> <span class="ident">rc</span>.<span class="ident">is_empty</span>() {
|
||||
<span class="macro">ladmin_info!</span>(<span class="ident">audit</span>, <span class="string">"No recycled present - purge operation success"</span>);
|
||||
|
@ -5784,7 +5690,7 @@
|
|||
<span class="ident">OperationError::SchemaViolation</span>(<span class="ident">e</span>)
|
||||
})
|
||||
<span class="comment">// seal if it worked.</span>
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">r</span><span class="op">|</span> <span class="ident">r</span>.<span class="ident">seal</span>())
|
||||
.<span class="ident">map</span>(<span class="ident">Entry::seal</span>)
|
||||
})
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
|
@ -5840,12 +5746,12 @@
|
|||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">dm_mods</span>: <span class="ident">HashMap</span><span class="op"><</span><span class="ident">Uuid</span>, <span class="ident">ModifyList</span><span class="op"><</span><span class="ident">ModifyInvalid</span><span class="op">></span><span class="op">></span> <span class="op">=</span>
|
||||
<span class="ident">HashMap::with_capacity</span>(<span class="ident">revive_cands</span>.<span class="ident">len</span>());
|
||||
|
||||
<span class="ident">revive_cands</span>.<span class="ident">into_iter</span>().<span class="ident">for_each</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="kw">for</span> <span class="ident">e</span> <span class="kw">in</span> <span class="ident">revive_cands</span> {
|
||||
<span class="comment">// Get this entries uuid.</span>
|
||||
<span class="kw">let</span> <span class="ident">u</span>: <span class="ident">Uuid</span> <span class="op">=</span> <span class="kw-2">*</span><span class="ident">e</span>.<span class="ident">get_uuid</span>();
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">riter</span>) <span class="op">=</span> <span class="ident">e</span>.<span class="ident">get_ava_as_refuuid</span>(<span class="string">"directmemberof"</span>) {
|
||||
<span class="ident">riter</span>.<span class="ident">for_each</span>(<span class="op">|</span><span class="ident">g_uuid</span><span class="op">|</span> {
|
||||
<span class="kw">for</span> <span class="ident">g_uuid</span> <span class="kw">in</span> <span class="ident">riter</span> {
|
||||
<span class="ident">dm_mods</span>
|
||||
.<span class="ident">entry</span>(<span class="kw-2">*</span><span class="ident">g_uuid</span>)
|
||||
.<span class="ident">and_modify</span>(<span class="op">|</span><span class="ident">mlist</span><span class="op">|</span> {
|
||||
|
@ -5862,9 +5768,9 @@
|
|||
);
|
||||
<span class="ident">ModifyList::new_list</span>(<span class="macro">vec!</span>[<span class="ident">m</span>])
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<span class="comment">// Now impersonate the modify</span>
|
||||
<span class="self">self</span>.<span class="ident">impersonate_modify_valid</span>(
|
||||
|
@ -5876,13 +5782,13 @@
|
|||
)<span class="question-mark">?</span>;
|
||||
<span class="comment">// If and only if that succeeds, apply the direct membership modifications</span>
|
||||
<span class="comment">// if possible.</span>
|
||||
<span class="kw">let</span> <span class="ident">r</span>: <span class="prelude-ty">Result</span><span class="op"><</span><span class="kw">_</span>, <span class="kw">_</span><span class="op">></span> <span class="op">=</span> <span class="ident">dm_mods</span>.<span class="ident">into_iter</span>().<span class="ident">try_for_each</span>(<span class="op">|</span>(<span class="ident">g</span>, <span class="ident">mods</span>)<span class="op">|</span> {
|
||||
<span class="kw">for</span> (<span class="ident">g</span>, <span class="ident">mods</span>) <span class="kw">in</span> <span class="ident">dm_mods</span> {
|
||||
<span class="comment">// I think the filter/filter_all shouldn't matter here because the only</span>
|
||||
<span class="comment">// valid direct memberships should be still valid/live references.</span>
|
||||
<span class="kw">let</span> <span class="ident">f</span> <span class="op">=</span> <span class="macro">filter_all!</span>(<span class="ident">f_eq</span>(<span class="string">"uuid"</span>, <span class="ident">PartialValue::new_uuid</span>(<span class="ident">g</span>)));
|
||||
<span class="self">self</span>.<span class="ident">internal_modify</span>(<span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">f</span>, <span class="kw-2">&</span><span class="ident">mods</span>)
|
||||
});
|
||||
<span class="ident">r</span>
|
||||
<span class="self">self</span>.<span class="ident">internal_modify</span>(<span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">f</span>, <span class="kw-2">&</span><span class="ident">mods</span>)<span class="question-mark">?</span>;
|
||||
}
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -5920,19 +5826,18 @@
|
|||
<span class="comment">// This is now done in the event transform</span>
|
||||
|
||||
<span class="comment">// This also checks access controls due to use of the impersonation.</span>
|
||||
<span class="kw">let</span> <span class="ident">pre_candidates</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">impersonate_search_valid</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="ident">me</span>.<span class="ident">filter</span>.<span class="ident">clone</span>(),
|
||||
<span class="ident">me</span>.<span class="ident">filter_orig</span>.<span class="ident">clone</span>(),
|
||||
<span class="kw-2">&</span><span class="ident">me</span>.<span class="ident">ident</span>,
|
||||
) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">results</span>) <span class="op">=</span><span class="op">></span> <span class="ident">results</span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">let</span> <span class="ident">pre_candidates</span> <span class="op">=</span> <span class="self">self</span>
|
||||
.<span class="ident">impersonate_search_valid</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="ident">me</span>.<span class="ident">filter</span>.<span class="ident">clone</span>(),
|
||||
<span class="ident">me</span>.<span class="ident">filter_orig</span>.<span class="ident">clone</span>(),
|
||||
<span class="kw-2">&</span><span class="ident">me</span>.<span class="ident">ident</span>,
|
||||
)
|
||||
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
|
||||
<span class="macro">admin_error!</span>(<span class="string">"modify: error in pre-candidate selection {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"modify: error in pre-candidate selection {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>);
|
||||
}
|
||||
};
|
||||
<span class="ident">e</span>
|
||||
})<span class="question-mark">?</span>;
|
||||
|
||||
<span class="kw">if</span> <span class="ident">pre_candidates</span>.<span class="ident">is_empty</span>() {
|
||||
<span class="kw">if</span> <span class="ident">me</span>.<span class="ident">ident</span>.<span class="ident">is_internal</span>() {
|
||||
|
@ -6185,7 +6090,7 @@
|
|||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"Schema Violation {:?}"</span>, <span class="ident">e</span>);
|
||||
<span class="ident">OperationError::SchemaViolation</span>(<span class="ident">e</span>)
|
||||
})
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">e</span>.<span class="ident">seal</span>())
|
||||
.<span class="ident">map</span>(<span class="ident">Entry::seal</span>)
|
||||
})
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
|
@ -6288,12 +6193,12 @@
|
|||
<span class="ident">candidates</span>.<span class="ident">iter_mut</span>().<span class="ident">for_each</span>(<span class="op">|</span><span class="ident">er</span><span class="op">|</span> {
|
||||
<span class="kw">let</span> <span class="ident">opt_names</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">BTreeSet</span><span class="op"><</span><span class="kw">_</span><span class="op">></span><span class="op">></span> <span class="op">=</span> <span class="ident">er</span>.<span class="ident">pop_ava</span>(<span class="string">"name"</span>).<span class="ident">map</span>(<span class="op">|</span><span class="ident">vs</span><span class="op">|</span> {
|
||||
<span class="ident">vs</span>.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">filter_map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">migrate_iutf8_iname</span>())
|
||||
.<span class="ident">filter_map</span>(<span class="ident">Value::migrate_iutf8_iname</span>)
|
||||
.<span class="ident">collect</span>()
|
||||
});
|
||||
<span class="kw">let</span> <span class="ident">opt_dnames</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">BTreeSet</span><span class="op"><</span><span class="kw">_</span><span class="op">></span><span class="op">></span> <span class="op">=</span> <span class="ident">er</span>.<span class="ident">pop_ava</span>(<span class="string">"domain_name"</span>).<span class="ident">map</span>(<span class="op">|</span><span class="ident">vs</span><span class="op">|</span> {
|
||||
<span class="ident">vs</span>.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">filter_map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">migrate_iutf8_iname</span>())
|
||||
.<span class="ident">filter_map</span>(<span class="ident">Value::migrate_iutf8_iname</span>)
|
||||
.<span class="ident">collect</span>()
|
||||
});
|
||||
|
||||
|
@ -6310,7 +6215,7 @@
|
|||
<span class="comment">// Schema check all.</span>
|
||||
<span class="kw">let</span> <span class="ident">res</span>: <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">Entry</span><span class="op"><</span><span class="ident">EntrySealed</span>, <span class="ident">EntryCommitted</span><span class="op">></span><span class="op">></span>, <span class="ident">SchemaError</span><span class="op">></span> <span class="op">=</span> <span class="ident">candidates</span>
|
||||
.<span class="ident">into_iter</span>()
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">e</span>.<span class="ident">validate</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">schema</span>).<span class="ident">map</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">e</span>.<span class="ident">seal</span>()))
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">e</span>.<span class="ident">validate</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">schema</span>).<span class="ident">map</span>(<span class="ident">Entry::seal</span>))
|
||||
.<span class="ident">collect</span>();
|
||||
|
||||
<span class="kw">let</span> <span class="ident">norm_cand</span>: <span class="ident">Vec</span><span class="op"><</span><span class="ident">Entry</span><span class="op"><</span><span class="kw">_</span>, <span class="kw">_</span><span class="op">></span><span class="op">></span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">res</span> {
|
||||
|
@ -6507,35 +6412,29 @@
|
|||
|
||||
<span class="macro">ltrace!</span>(<span class="ident">audit</span>, <span class="string">"internal_migrate_or_create search {:?}"</span>, <span class="ident">filt</span>);
|
||||
|
||||
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">internal_search</span>(<span class="ident">audit</span>, <span class="ident">filt</span>.<span class="ident">clone</span>()) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">results</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">results</span>.<span class="ident">is_empty</span>() {
|
||||
<span class="comment">// It does not exist. Create it.</span>
|
||||
<span class="self">self</span>.<span class="ident">internal_create</span>(<span class="ident">audit</span>, <span class="macro">vec!</span>[<span class="ident">e</span>])
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">results</span>.<span class="ident">len</span>() <span class="op">=</span><span class="op">=</span> <span class="number">1</span> {
|
||||
<span class="comment">// If the thing is subset, pass</span>
|
||||
<span class="kw">match</span> <span class="ident">e</span>.<span class="ident">gen_modlist_assert</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">schema</span>) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">modlist</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="comment">// Apply to &results[0]</span>
|
||||
<span class="macro">ltrace!</span>(<span class="ident">audit</span>, <span class="string">"Generated modlist -> {:?}"</span>, <span class="ident">modlist</span>);
|
||||
<span class="self">self</span>.<span class="ident">internal_modify</span>(<span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">filt</span>, <span class="kw-2">&</span><span class="ident">modlist</span>)
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::SchemaViolation</span>(<span class="ident">e</span>)),
|
||||
}
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">ladmin_error!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"Invalid Result Set - Expected One Entry for {:?} - {:?}"</span>,
|
||||
<span class="ident">filt</span>,
|
||||
<span class="ident">results</span>
|
||||
);
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::InvalidDbState</span>)
|
||||
<span class="kw">let</span> <span class="ident">results</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">internal_search</span>(<span class="ident">audit</span>, <span class="ident">filt</span>.<span class="ident">clone</span>())<span class="question-mark">?</span>;
|
||||
|
||||
<span class="kw">if</span> <span class="ident">results</span>.<span class="ident">is_empty</span>() {
|
||||
<span class="comment">// It does not exist. Create it.</span>
|
||||
<span class="self">self</span>.<span class="ident">internal_create</span>(<span class="ident">audit</span>, <span class="macro">vec!</span>[<span class="ident">e</span>])
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">results</span>.<span class="ident">len</span>() <span class="op">=</span><span class="op">=</span> <span class="number">1</span> {
|
||||
<span class="comment">// If the thing is subset, pass</span>
|
||||
<span class="kw">match</span> <span class="ident">e</span>.<span class="ident">gen_modlist_assert</span>(<span class="kw-2">&</span><span class="self">self</span>.<span class="ident">schema</span>) {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">modlist</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="comment">// Apply to &results[0]</span>
|
||||
<span class="macro">ltrace!</span>(<span class="ident">audit</span>, <span class="string">"Generated modlist -> {:?}"</span>, <span class="ident">modlist</span>);
|
||||
<span class="self">self</span>.<span class="ident">internal_modify</span>(<span class="ident">audit</span>, <span class="kw-2">&</span><span class="ident">filt</span>, <span class="kw-2">&</span><span class="ident">modlist</span>)
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">OperationError::SchemaViolation</span>(<span class="ident">e</span>)),
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="comment">// An error occured. pass it back up.</span>
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>)
|
||||
}
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">ladmin_error!</span>(
|
||||
<span class="ident">audit</span>,
|
||||
<span class="string">"Invalid Result Set - Expected One Entry for {:?} - {:?}"</span>,
|
||||
<span class="ident">filt</span>,
|
||||
<span class="ident">results</span>
|
||||
);
|
||||
<span class="prelude-val">Err</span>(<span class="ident">OperationError::InvalidDbState</span>)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6620,6 +6519,7 @@
|
|||
} <span class="kw">else</span> {
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"initialise_schema_core -> Error {:?}"</span>, <span class="ident">r</span>);
|
||||
}
|
||||
<span class="comment">// why do we have error handling if it's always supposed to be `Ok`?</span>
|
||||
<span class="macro">debug_assert!</span>(<span class="ident">r</span>.<span class="ident">is_ok</span>());
|
||||
<span class="ident">r</span>
|
||||
}
|
||||
|
@ -6660,19 +6560,19 @@
|
|||
<span class="ident">JSON_SCHEMA_ATTR_NSUNIQUEID</span>,
|
||||
];
|
||||
|
||||
<span class="kw">let</span> <span class="ident">r</span>: <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span>()<span class="op">></span>, <span class="kw">_</span><span class="op">></span> <span class="op">=</span> <span class="ident">idm_schema</span>
|
||||
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">idm_schema</span>
|
||||
.<span class="ident">iter</span>()
|
||||
<span class="comment">// Each item individually logs it's result</span>
|
||||
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">e_str</span><span class="op">|</span> <span class="self">self</span>.<span class="ident">internal_migrate_or_create_str</span>(<span class="ident">audit</span>, <span class="ident">e_str</span>))
|
||||
.<span class="ident">collect</span>();
|
||||
.<span class="ident">try_for_each</span>(<span class="op">|</span><span class="ident">e_str</span><span class="op">|</span> <span class="self">self</span>.<span class="ident">internal_migrate_or_create_str</span>(<span class="ident">audit</span>, <span class="ident">e_str</span>));
|
||||
|
||||
<span class="kw">if</span> <span class="ident">r</span>.<span class="ident">is_ok</span>() {
|
||||
<span class="macro">ladmin_info!</span>(<span class="ident">audit</span>, <span class="string">"initialise_schema_idm -> Ok!"</span>);
|
||||
} <span class="kw">else</span> {
|
||||
<span class="macro">ladmin_error!</span>(<span class="ident">audit</span>, <span class="string">"initialise_schema_idm -> Error {:?}"</span>, <span class="ident">r</span>);
|
||||
}
|
||||
<span class="macro">debug_assert!</span>(<span class="ident">r</span>.<span class="ident">is_ok</span>());
|
||||
<span class="macro">debug_assert!</span>(<span class="ident">r</span>.<span class="ident">is_ok</span>()); <span class="comment">// why return a result if we assert it's `Ok`?</span>
|
||||
|
||||
<span class="ident">r</span>.<span class="ident">map</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> ())
|
||||
<span class="ident">r</span>
|
||||
}
|
||||
|
||||
<span class="comment">// This function is idempotent</span>
|
||||
|
|
|
@ -321,6 +321,10 @@
|
|||
<span id="319">319</span>
|
||||
<span id="320">320</span>
|
||||
<span id="321">321</span>
|
||||
<span id="322">322</span>
|
||||
<span id="323">323</span>
|
||||
<span id="324">324</span>
|
||||
<span id="325">325</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="kw">use</span> <span class="kw">super</span><span class="ident">::subscriber</span>::{<span class="ident">TreeEvent</span>, <span class="ident">TreeProcessed</span>, <span class="ident">TreeSpanProcessed</span>};
|
||||
<span class="kw">use</span> <span class="kw">super</span><span class="ident">::EventTag</span>;
|
||||
|
@ -435,6 +439,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">uuid</span> <span class="op">=</span> <span class="ident">span</span>
|
||||
.<span class="ident">uuid</span>
|
||||
.<span class="ident">as_deref</span>()
|
||||
|
@ -459,6 +464,7 @@
|
|||
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">writer</span> <span class="op">=</span> <span class="macro">vec!</span>[];
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">spans</span> <span class="op">=</span> <span class="macro">vec!</span>[];
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="ident">fmt_rec</span>(<span class="kw-2">&</span><span class="ident">processed_logs</span>, <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">spans</span>, <span class="prelude-val">None</span>, <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">writer</span>).<span class="ident">expect</span>(<span class="string">"Write failed"</span>);
|
||||
<span class="ident">writer</span>
|
||||
}
|
||||
|
@ -519,6 +525,7 @@
|
|||
<span class="macro">writeln!</span>(<span class="ident">writer</span>)
|
||||
}
|
||||
<span class="ident">TreeProcessed::Span</span>(<span class="ident">span</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">uuid</span> <span class="op">=</span> <span class="ident">span</span>
|
||||
.<span class="ident">uuid</span>
|
||||
.<span class="ident">as_deref</span>()
|
||||
|
@ -611,6 +618,7 @@
|
|||
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">writer</span> <span class="op">=</span> <span class="macro">vec!</span>[];
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">indent</span> <span class="op">=</span> <span class="macro">vec!</span>[];
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="ident">fmt_rec</span>(<span class="kw-2">&</span><span class="ident">processed_logs</span>, <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">indent</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">writer</span>).<span class="ident">expect</span>(<span class="string">"Write failed"</span>);
|
||||
<span class="ident">writer</span>
|
||||
}
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
<span id="30">30</span>
|
||||
<span id="31">31</span>
|
||||
<span id="32">32</span>
|
||||
<span id="33">33</span>
|
||||
<span id="34">34</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="kw">use</span> <span class="kw">super</span><span class="ident">::TreePreProcessed</span>;
|
||||
<span class="kw">use</span> <span class="ident">tokio::sync::mpsc::UnboundedSender</span>;
|
||||
|
@ -54,6 +56,7 @@
|
|||
|
||||
<span class="kw">impl</span> <span class="ident">Processor</span> <span class="kw">for</span> <span class="ident">ExportProcessor</span> {
|
||||
<span class="kw">fn</span> <span class="ident">process</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">preprocessed</span>: <span class="ident">TreePreProcessed</span>) {
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="self">self</span>.<span class="ident">sender</span>
|
||||
.<span class="ident">send</span>(<span class="ident">preprocessed</span>)
|
||||
.<span class="ident">expect</span>(<span class="string">"Processing channel has been closed, cannot log events."</span>);
|
||||
|
@ -62,6 +65,7 @@
|
|||
|
||||
<span class="kw">impl</span> <span class="ident">Processor</span> <span class="kw">for</span> <span class="ident">TestProcessor</span> {
|
||||
<span class="kw">fn</span> <span class="ident">process</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">preprocessed</span>: <span class="ident">TreePreProcessed</span>) {
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="ident">preprocessed</span>.<span class="ident">process</span>().<span class="ident">expect</span>(<span class="string">"Failed to write logs"</span>);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -526,6 +526,21 @@
|
|||
<span id="524">524</span>
|
||||
<span id="525">525</span>
|
||||
<span id="526">526</span>
|
||||
<span id="527">527</span>
|
||||
<span id="528">528</span>
|
||||
<span id="529">529</span>
|
||||
<span id="530">530</span>
|
||||
<span id="531">531</span>
|
||||
<span id="532">532</span>
|
||||
<span id="533">533</span>
|
||||
<span id="534">534</span>
|
||||
<span id="535">535</span>
|
||||
<span id="536">536</span>
|
||||
<span id="537">537</span>
|
||||
<span id="538">538</span>
|
||||
<span id="539">539</span>
|
||||
<span id="540">540</span>
|
||||
<span id="541">541</span>
|
||||
</pre><pre class="rust">
|
||||
<span class="kw">use</span> <span class="ident">std::any::TypeId</span>;
|
||||
<span class="kw">use</span> <span class="ident">std::convert::TryFrom</span>;
|
||||
|
@ -634,6 +649,7 @@
|
|||
<span class="kw">let</span> <span class="ident">subscriber</span> <span class="op">=</span> <span class="ident">TreeSubscriber::new_with</span>(<span class="ident">fmt</span>, <span class="ident">log_tx</span>);
|
||||
<span class="kw">let</span> <span class="ident">logger</span> <span class="op">=</span> <span class="kw">async</span> <span class="kw">move</span> {
|
||||
<span class="kw">while</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">processor</span>) <span class="op">=</span> <span class="ident">log_rx</span>.<span class="ident">recv</span>().<span class="kw">await</span> {
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="ident">processor</span>.<span class="ident">process</span>().<span class="ident">expect</span>(<span class="string">"Failed to write logs"</span>);
|
||||
}
|
||||
};
|
||||
|
@ -659,6 +675,7 @@
|
|||
<span class="kw">let</span> <span class="ident">current</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">inner</span>.<span class="ident">current_span</span>();
|
||||
<span class="comment">// If there's no current span, we short-circuit.</span>
|
||||
<span class="kw">let</span> <span class="ident">id</span> <span class="op">=</span> <span class="ident">current</span>.<span class="ident">id</span>()<span class="question-mark">?</span>;
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">span</span> <span class="op">=</span> <span class="self">self</span>
|
||||
.<span class="ident">inner</span>
|
||||
.<span class="ident">span</span>(<span class="ident">id</span>)
|
||||
|
@ -667,12 +684,14 @@
|
|||
<span class="ident">span</span>.<span class="ident">scope</span>().<span class="ident">into_iter</span>().<span class="ident">find_map</span>(<span class="op">|</span><span class="ident">span</span><span class="op">|</span> {
|
||||
<span class="kw">let</span> <span class="ident">extensions</span> <span class="op">=</span> <span class="ident">span</span>.<span class="ident">extensions</span>();
|
||||
<span class="comment">// If `uuid` is `None`, then we keep searching.</span>
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">uuid</span> <span class="op">=</span> <span class="ident">extensions</span>
|
||||
.<span class="ident">get</span>::<span class="op"><</span><span class="ident">TreeSpan</span><span class="op">></span>()
|
||||
.<span class="ident">expect</span>(<span class="string">"Span buffer not found, this is a bug"</span>)
|
||||
.<span class="ident">uuid</span>
|
||||
.<span class="ident">as_ref</span>()<span class="question-mark">?</span>;
|
||||
<span class="comment">// TODO: make spans store UUID's as a u128 or 2 u64's</span>
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="prelude-val">Some</span>(<span class="ident">Uuid::parse_str</span>(<span class="ident">uuid</span>.<span class="ident">as_str</span>()).<span class="ident">expect</span>(<span class="string">"Unable to parse UUID, this is a bug"</span>))
|
||||
})
|
||||
}
|
||||
|
@ -733,6 +752,7 @@
|
|||
<span class="kw">fn</span> <span class="ident">log_to_parent</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">logs</span>: <span class="ident">Tree</span>, <span class="ident">parent</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">SpanRef</span><span class="op"><</span><span class="ident">Registry</span><span class="op">></span><span class="op">></span>) {
|
||||
<span class="kw">match</span> <span class="ident">parent</span> {
|
||||
<span class="comment">// The parent exists- write to them</span>
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="prelude-val">Some</span>(<span class="ident">span</span>) <span class="op">=</span><span class="op">></span> <span class="ident">span</span>
|
||||
.<span class="ident">extensions_mut</span>()
|
||||
.<span class="ident">get_mut</span>::<span class="op"><</span><span class="ident">TreeSpan</span><span class="op">></span>()
|
||||
|
@ -749,6 +769,7 @@
|
|||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">P</span>: <span class="ident">Processor</span><span class="op">></span> <span class="ident">Layer</span><span class="op"><</span><span class="ident">Registry</span><span class="op">></span> <span class="kw">for</span> <span class="ident">TreeLayer</span><span class="op"><</span><span class="ident">P</span><span class="op">></span> {
|
||||
<span class="kw">fn</span> <span class="ident">new_span</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">attrs</span>: <span class="kw-2">&</span><span class="ident">Attributes</span>, <span class="ident">id</span>: <span class="kw-2">&</span><span class="ident">Id</span>, <span class="ident">ctx</span>: <span class="ident">Context</span><span class="op"><</span><span class="ident">Registry</span><span class="op">></span>) {
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">span</span> <span class="op">=</span> <span class="ident">ctx</span>.<span class="ident">span</span>(<span class="ident">id</span>).<span class="ident">expect</span>(<span class="string">"Span not found, this is a bug"</span>);
|
||||
|
||||
<span class="kw">let</span> <span class="ident">name</span> <span class="op">=</span> <span class="ident">attrs</span>.<span class="ident">metadata</span>().<span class="ident">name</span>();
|
||||
|
@ -790,6 +811,7 @@
|
|||
<span class="kw">if</span> <span class="ident">immediate</span> {
|
||||
<span class="kw">use</span> <span class="kw">super</span><span class="ident">::formatter::format_immediate_event</span>;
|
||||
<span class="kw">let</span> <span class="ident">maybe_scope</span> <span class="op">=</span> <span class="ident">ctx</span>.<span class="ident">event_scope</span>(<span class="ident">event</span>).<span class="ident">map</span>(<span class="ident">Scope::from_root</span>);
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">formatted_event</span> <span class="op">=</span> <span class="ident">format_immediate_event</span>(<span class="kw-2">&</span><span class="ident">tree_event</span>, <span class="ident">maybe_scope</span>)
|
||||
.<span class="ident">expect</span>(<span class="string">"Formatting immediate event failed"</span>);
|
||||
<span class="macro">eprintln!</span>(<span class="string">"{}"</span>, <span class="ident">formatted_event</span>);
|
||||
|
@ -799,6 +821,7 @@
|
|||
}
|
||||
|
||||
<span class="kw">fn</span> <span class="ident">on_enter</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">id</span>: <span class="kw-2">&</span><span class="ident">Id</span>, <span class="ident">ctx</span>: <span class="ident">Context</span><span class="op"><</span><span class="ident">Registry</span><span class="op">></span>) {
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="ident">ctx</span>.<span class="ident">span</span>(<span class="ident">id</span>)
|
||||
.<span class="ident">expect</span>(<span class="string">"Span not found, this is a bug"</span>)
|
||||
.<span class="ident">extensions_mut</span>()
|
||||
|
@ -808,6 +831,7 @@
|
|||
}
|
||||
|
||||
<span class="kw">fn</span> <span class="ident">on_exit</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">id</span>: <span class="kw-2">&</span><span class="ident">Id</span>, <span class="ident">ctx</span>: <span class="ident">Context</span><span class="op"><</span><span class="ident">Registry</span><span class="op">></span>) {
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="ident">ctx</span>.<span class="ident">span</span>(<span class="ident">id</span>)
|
||||
.<span class="ident">expect</span>(<span class="string">"Span not found, this is a bug"</span>)
|
||||
.<span class="ident">extensions_mut</span>()
|
||||
|
@ -817,14 +841,17 @@
|
|||
}
|
||||
|
||||
<span class="kw">fn</span> <span class="ident">on_close</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">id</span>: <span class="ident">Id</span>, <span class="ident">ctx</span>: <span class="ident">Context</span><span class="op"><</span><span class="ident">Registry</span><span class="op">></span>) {
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">span</span> <span class="op">=</span> <span class="ident">ctx</span>.<span class="ident">span</span>(<span class="kw-2">&</span><span class="ident">id</span>).<span class="ident">expect</span>(<span class="string">"Span not found, this is a bug"</span>);
|
||||
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">extensions</span> <span class="op">=</span> <span class="ident">span</span>.<span class="ident">extensions_mut</span>();
|
||||
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">span_buf</span> <span class="op">=</span> <span class="ident">extensions</span>
|
||||
.<span class="ident">remove</span>::<span class="op"><</span><span class="ident">TreeSpan</span><span class="op">></span>()
|
||||
.<span class="ident">expect</span>(<span class="string">"Span buffer not found, this is a bug"</span>);
|
||||
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="kw">let</span> <span class="ident">duration</span> <span class="op">=</span> <span class="ident">extensions</span>
|
||||
.<span class="ident">remove</span>::<span class="op"><</span><span class="ident">Timer</span><span class="op">></span>()
|
||||
.<span class="ident">expect</span>(<span class="string">"Timer not found, this is a bug"</span>)
|
||||
|
@ -850,9 +877,9 @@
|
|||
|
||||
<span class="kw">impl</span> <span class="ident">Visit</span> <span class="kw">for</span> <span class="ident">Visitor</span> {
|
||||
<span class="kw">fn</span> <span class="ident">record_u64</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">field</span>: <span class="kw-2">&</span><span class="ident">Field</span>, <span class="ident">value</span>: <span class="ident">u64</span>) {
|
||||
<span class="kw">if</span> <span class="ident">field</span>.<span class="ident">name</span>() <span class="op">=</span><span class="op">=</span> <span class="string">"event_tag"</span> {
|
||||
<span class="kw">if</span> <span class="ident">field</span>.<span class="ident">name</span>() <span class="op">=</span><span class="op">=</span> <span class="string">"event_tag_id"</span> {
|
||||
<span class="kw">let</span> <span class="ident">tag</span> <span class="op">=</span> <span class="ident">EventTag::try_from</span>(<span class="ident">value</span>).<span class="ident">unwrap_or_else</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> {
|
||||
<span class="macro">panic!</span>(<span class="string">"Invalid `event_tag`: {}, this is a bug"</span>, <span class="ident">value</span>)
|
||||
<span class="macro">panic!</span>(<span class="string">"Invalid `event_tag_id`: {}, this is a bug"</span>, <span class="ident">value</span>)
|
||||
});
|
||||
<span class="self">self</span>.<span class="ident">tag</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">tag</span>);
|
||||
} <span class="kw">else</span> {
|
||||
|
@ -871,6 +898,7 @@
|
|||
<span class="kw">fn</span> <span class="ident">record_debug</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">field</span>: <span class="kw-2">&</span><span class="ident">Field</span>, <span class="ident">value</span>: <span class="kw-2">&</span><span class="kw">dyn</span> <span class="ident">fmt::Debug</span>) {
|
||||
<span class="kw">if</span> <span class="ident">field</span>.<span class="ident">name</span>() <span class="op">=</span><span class="op">=</span> <span class="string">"message"</span> {
|
||||
<span class="kw">use</span> <span class="ident">fmt::Write</span>;
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="macro">write!</span>(<span class="self">self</span>.<span class="ident">message</span>, <span class="string">"{:?}"</span>, <span class="ident">value</span>).<span class="ident">expect</span>(<span class="string">"Write failed"</span>);
|
||||
} <span class="kw">else</span> {
|
||||
<span class="self">self</span>.<span class="ident">values</span>.<span class="ident">push</span>((<span class="ident">field</span>.<span class="ident">name</span>(), <span class="macro">format!</span>(<span class="string">"{:?}"</span>, <span class="ident">value</span>)));
|
||||
|
@ -1020,6 +1048,7 @@
|
|||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">operation_id</span>() <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">Uuid</span><span class="op">></span> {
|
||||
<span class="ident">tracing::dispatcher::get_default</span>(<span class="op">|</span><span class="ident">dispatch</span><span class="op">|</span> {
|
||||
<span class="comment">// Try to find the release subscriber</span>
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="ident">dispatch</span>
|
||||
.<span class="ident">downcast_ref</span>::<span class="op"><</span><span class="ident">TreeSubscriber</span><span class="op"><</span><span class="ident">ExportProcessor</span><span class="op">></span><span class="op">></span>()
|
||||
.<span class="ident">map</span>(<span class="ident">TreeSubscriber</span>::<span class="op"><</span><span class="ident">ExportProcessor</span><span class="op">></span><span class="ident">::thread_operation_id</span>)
|
||||
|
@ -1035,6 +1064,7 @@
|
|||
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">main_init</span>() <span class="op">-</span><span class="op">></span> <span class="ident">JoinHandle</span><span class="op"><</span>()<span class="op">></span> {
|
||||
<span class="kw">let</span> (<span class="ident">subscriber</span>, <span class="ident">logger</span>) <span class="op">=</span> <span class="ident">TreeSubscriber::pretty</span>();
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::expect_used</span>)]</span>
|
||||
<span class="ident">tracing::subscriber::set_global_default</span>(<span class="ident">subscriber</span>)
|
||||
.<span class="ident">expect</span>(<span class="string">"🚨🚨🚨 Global subscriber already set, this is a bug 🚨🚨🚨"</span>);
|
||||
<span class="ident">tokio::spawn</span>(<span class="ident">logger</span>)
|
||||
|
|
Loading…
Reference in a new issue