This commit is contained in:
Firstyear 2021-10-26 03:18:11 +00:00
parent 0675d7fabe
commit c8466b3602
34 changed files with 949 additions and 174 deletions

View file

@ -191,7 +191,7 @@ Does the resource server support PKCE S256 or not?</p>
<p>For an authorisation to proceed, the resource server will request a list of scopes, which are
unique to that resource server. For example, when a user wishes to login to the admin panel
of the resource server, it may request the &quot;admin&quot; scope from kanidm for authorisation. But when
a user wants to login, it may only request &quot;acces&quot; as a scope from kanidm.</p>
a user wants to login, it may only request &quot;access&quot; as a scope from kanidm.</p>
<p>As each resource server may have it's own scopes and understanding of these, Kanidm isolates
scopes to each resource server connected to Kanidm. Kanidm has two methods of granting scopes to accounts (users).</p>
<p>The first are implicit scopes. These are scopes granted to all accounts that Kanidm holds.</p>

View file

@ -1143,7 +1143,7 @@ Does the resource server support PKCE S256 or not?</p>
<p>For an authorisation to proceed, the resource server will request a list of scopes, which are
unique to that resource server. For example, when a user wishes to login to the admin panel
of the resource server, it may request the &quot;admin&quot; scope from kanidm for authorisation. But when
a user wants to login, it may only request &quot;acces&quot; as a scope from kanidm.</p>
a user wants to login, it may only request &quot;access&quot; as a scope from kanidm.</p>
<p>As each resource server may have it's own scopes and understanding of these, Kanidm isolates
scopes to each resource server connected to Kanidm. Kanidm has two methods of granting scopes to accounts (users).</p>
<p>The first are implicit scopes. These are scopes granted to all accounts that Kanidm holds.</p>

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

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

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
<!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 `server` mod in crate `kanidm`."><meta name="keywords" content="rust, rustlang, rust-lang, server"><title>kanidm::idm::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="alternate icon" type="image/png" href="../../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../../favicon.svg"><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">&#9776;</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 width="18" height="18" alt="Pick another theme!" src="../../../brush.svg"></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 width="18" height="18" alt="Change settings" src="../../../wheel.svg"></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 href="../index.html">idm</a>::<wbr><a class="mod" href="#">server</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../../../clipboard.svg" width="19" height="18" alt="Copy item path"></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">&#x2212;</span>]</a></span><a class="srclink" href="../../../src/kanidm/idm/server.rs.html#1-3852" title="goto source code">[src]</a></span></h1><h2 id="structs" class="section-header"><a href="#structs">Structs</a></h2>
<!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 `server` mod in crate `kanidm`."><meta name="keywords" content="rust, rustlang, rust-lang, server"><title>kanidm::idm::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="alternate icon" type="image/png" href="../../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../../favicon.svg"><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">&#9776;</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 width="18" height="18" alt="Pick another theme!" src="../../../brush.svg"></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 width="18" height="18" alt="Change settings" src="../../../wheel.svg"></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 href="../index.html">idm</a>::<wbr><a class="mod" href="#">server</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../../../clipboard.svg" width="19" height="18" alt="Copy item path"></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">&#x2212;</span>]</a></span><a class="srclink" href="../../../src/kanidm/idm/server.rs.html#1-3877" title="goto source code">[src]</a></span></h1><h2 id="structs" class="section-header"><a href="#structs">Structs</a></h2>
<div class="item-table"><div class="item-left module-item"><a class="struct" href="struct.IdmServer.html" title="kanidm::idm::server::IdmServer struct">IdmServer</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.IdmServerAuthTransaction.html" title="kanidm::idm::server::IdmServerAuthTransaction struct">IdmServerAuthTransaction</a></div><div class="item-right docblock-short"><p>Contains methods that require writes, but in the context of writing to the idm in memory structures (maybe the query server too). This is things like authentication.</p>
</div><div class="item-left module-item"><a class="struct" href="struct.IdmServerDelayed.html" title="kanidm::idm::server::IdmServerDelayed struct">IdmServerDelayed</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.IdmServerProxyReadTransaction.html" title="kanidm::idm::server::IdmServerProxyReadTransaction struct">IdmServerProxyReadTransaction</a></div><div class="item-right docblock-short"><p>This contains read-only methods, like getting users, groups and other structured content.</p>
</div><div class="item-left module-item"><a class="struct" href="struct.IdmServerProxyWriteTransaction.html" title="kanidm::idm::server::IdmServerProxyWriteTransaction struct">IdmServerProxyWriteTransaction</a></div><div class="item-right docblock-short"></div></div><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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
<!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="List of all items in this crate"><meta name="keywords" content="rust, rustlang, rust-lang"><title>List of all items in this crate</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="alternate icon" type="image/png" href="../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../favicon.svg"><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">&#9776;</div><a href='../kanidm_proto/index.html'><div class='logo-container rust-logo'><img src='../rust-logo.png' alt='logo'></div></a><h2 class="location">Crate kanidm_proto</h2><div class="block version"><p>Version 1.1.0-alpha.6</p></div><a id="all-types" href="index.html"><p>Back to index</p></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="18" height="18" alt="Pick another theme!" src="../brush.svg"></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 width="18" height="18" alt="Change settings" src="../wheel.svg"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">List of all items</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">&#x2212;</span>]</a></span>
</span>
</h1><h3 id="Structs">Structs</h3><ul class="structs docblock"><li><a href="oauth2/struct.AccessTokenRequest.html">oauth2::AccessTokenRequest</a></li><li><a href="oauth2/struct.AccessTokenResponse.html">oauth2::AccessTokenResponse</a></li><li><a href="oauth2/struct.AuthorisationRequest.html">oauth2::AuthorisationRequest</a></li><li><a href="oauth2/struct.ConsentRequest.html">oauth2::ConsentRequest</a></li><li><a href="oauth2/struct.ErrorResponse.html">oauth2::ErrorResponse</a></li><li><a href="v1/struct.AccountUnixExtend.html">v1::AccountUnixExtend</a></li><li><a href="v1/struct.AuthRequest.html">v1::AuthRequest</a></li><li><a href="v1/struct.AuthResponse.html">v1::AuthResponse</a></li><li><a href="v1/struct.BackupCodesView.html">v1::BackupCodesView</a></li><li><a href="v1/struct.Claim.html">v1::Claim</a></li><li><a href="v1/struct.CreateRequest.html">v1::CreateRequest</a></li><li><a href="v1/struct.CredentialDetail.html">v1::CredentialDetail</a></li><li><a href="v1/struct.CredentialStatus.html">v1::CredentialStatus</a></li><li><a href="v1/struct.DeleteRequest.html">v1::DeleteRequest</a></li><li><a href="v1/struct.Entry.html">v1::Entry</a></li><li><a href="v1/struct.Group.html">v1::Group</a></li><li><a href="v1/struct.GroupUnixExtend.html">v1::GroupUnixExtend</a></li><li><a href="v1/struct.ModifyList.html">v1::ModifyList</a></li><li><a href="v1/struct.ModifyRequest.html">v1::ModifyRequest</a></li><li><a href="v1/struct.RadiusAuthToken.html">v1::RadiusAuthToken</a></li><li><a href="v1/struct.SearchRequest.html">v1::SearchRequest</a></li><li><a href="v1/struct.SearchResponse.html">v1::SearchResponse</a></li><li><a href="v1/struct.SingleStringRequest.html">v1::SingleStringRequest</a></li><li><a href="v1/struct.TotpSecret.html">v1::TotpSecret</a></li><li><a href="v1/struct.UnixGroupToken.html">v1::UnixGroupToken</a></li><li><a href="v1/struct.UnixUserToken.html">v1::UnixUserToken</a></li><li><a href="v1/struct.UserAuthToken.html">v1::UserAuthToken</a></li><li><a href="v1/struct.WhoamiResponse.html">v1::WhoamiResponse</a></li></ul><h3 id="Enums">Enums</h3><ul class="enums docblock"><li><a href="oauth2/enum.CodeChallengeMethod.html">oauth2::CodeChallengeMethod</a></li><li><a href="v1/enum.AuthAllowed.html">v1::AuthAllowed</a></li><li><a href="v1/enum.AuthCredential.html">v1::AuthCredential</a></li><li><a href="v1/enum.AuthMech.html">v1::AuthMech</a></li><li><a href="v1/enum.AuthState.html">v1::AuthState</a></li><li><a href="v1/enum.AuthStep.html">v1::AuthStep</a></li><li><a href="v1/enum.AuthType.html">v1::AuthType</a></li><li><a href="v1/enum.ConsistencyError.html">v1::ConsistencyError</a></li><li><a href="v1/enum.CredentialDetailType.html">v1::CredentialDetailType</a></li><li><a href="v1/enum.Filter.html">v1::Filter</a></li><li><a href="v1/enum.Modify.html">v1::Modify</a></li><li><a href="v1/enum.OperationError.html">v1::OperationError</a></li><li><a href="v1/enum.PluginError.html">v1::PluginError</a></li><li><a href="v1/enum.SchemaError.html">v1::SchemaError</a></li><li><a href="v1/enum.SetCredentialRequest.html">v1::SetCredentialRequest</a></li><li><a href="v1/enum.SetCredentialResponse.html">v1::SetCredentialResponse</a></li><li><a href="v1/enum.TotpAlgo.html">v1::TotpAlgo</a></li></ul></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../" data-current-crate="kanidm_proto" data-search-index-js="../search-index.js" data-search-js="../search.js"></div>
</h1><h3 id="Structs">Structs</h3><ul class="structs docblock"><li><a href="oauth2/struct.AccessTokenIntrospectRequest.html">oauth2::AccessTokenIntrospectRequest</a></li><li><a href="oauth2/struct.AccessTokenIntrospectResponse.html">oauth2::AccessTokenIntrospectResponse</a></li><li><a href="oauth2/struct.AccessTokenRequest.html">oauth2::AccessTokenRequest</a></li><li><a href="oauth2/struct.AccessTokenResponse.html">oauth2::AccessTokenResponse</a></li><li><a href="oauth2/struct.AuthorisationRequest.html">oauth2::AuthorisationRequest</a></li><li><a href="oauth2/struct.ConsentRequest.html">oauth2::ConsentRequest</a></li><li><a href="oauth2/struct.ErrorResponse.html">oauth2::ErrorResponse</a></li><li><a href="v1/struct.AccountUnixExtend.html">v1::AccountUnixExtend</a></li><li><a href="v1/struct.AuthRequest.html">v1::AuthRequest</a></li><li><a href="v1/struct.AuthResponse.html">v1::AuthResponse</a></li><li><a href="v1/struct.BackupCodesView.html">v1::BackupCodesView</a></li><li><a href="v1/struct.Claim.html">v1::Claim</a></li><li><a href="v1/struct.CreateRequest.html">v1::CreateRequest</a></li><li><a href="v1/struct.CredentialDetail.html">v1::CredentialDetail</a></li><li><a href="v1/struct.CredentialStatus.html">v1::CredentialStatus</a></li><li><a href="v1/struct.DeleteRequest.html">v1::DeleteRequest</a></li><li><a href="v1/struct.Entry.html">v1::Entry</a></li><li><a href="v1/struct.Group.html">v1::Group</a></li><li><a href="v1/struct.GroupUnixExtend.html">v1::GroupUnixExtend</a></li><li><a href="v1/struct.ModifyList.html">v1::ModifyList</a></li><li><a href="v1/struct.ModifyRequest.html">v1::ModifyRequest</a></li><li><a href="v1/struct.RadiusAuthToken.html">v1::RadiusAuthToken</a></li><li><a href="v1/struct.SearchRequest.html">v1::SearchRequest</a></li><li><a href="v1/struct.SearchResponse.html">v1::SearchResponse</a></li><li><a href="v1/struct.SingleStringRequest.html">v1::SingleStringRequest</a></li><li><a href="v1/struct.TotpSecret.html">v1::TotpSecret</a></li><li><a href="v1/struct.UnixGroupToken.html">v1::UnixGroupToken</a></li><li><a href="v1/struct.UnixUserToken.html">v1::UnixUserToken</a></li><li><a href="v1/struct.UserAuthToken.html">v1::UserAuthToken</a></li><li><a href="v1/struct.WhoamiResponse.html">v1::WhoamiResponse</a></li></ul><h3 id="Enums">Enums</h3><ul class="enums docblock"><li><a href="oauth2/enum.CodeChallengeMethod.html">oauth2::CodeChallengeMethod</a></li><li><a href="v1/enum.AuthAllowed.html">v1::AuthAllowed</a></li><li><a href="v1/enum.AuthCredential.html">v1::AuthCredential</a></li><li><a href="v1/enum.AuthMech.html">v1::AuthMech</a></li><li><a href="v1/enum.AuthState.html">v1::AuthState</a></li><li><a href="v1/enum.AuthStep.html">v1::AuthStep</a></li><li><a href="v1/enum.AuthType.html">v1::AuthType</a></li><li><a href="v1/enum.ConsistencyError.html">v1::ConsistencyError</a></li><li><a href="v1/enum.CredentialDetailType.html">v1::CredentialDetailType</a></li><li><a href="v1/enum.Filter.html">v1::Filter</a></li><li><a href="v1/enum.Modify.html">v1::Modify</a></li><li><a href="v1/enum.OperationError.html">v1::OperationError</a></li><li><a href="v1/enum.PluginError.html">v1::PluginError</a></li><li><a href="v1/enum.SchemaError.html">v1::SchemaError</a></li><li><a href="v1/enum.SetCredentialRequest.html">v1::SetCredentialRequest</a></li><li><a href="v1/enum.SetCredentialResponse.html">v1::SetCredentialResponse</a></li><li><a href="v1/enum.TotpAlgo.html">v1::TotpAlgo</a></li></ul></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../" data-current-crate="kanidm_proto" data-search-index-js="../search-index.js" data-search-js="../search.js"></div>
<script src="../main.js"></script>
</body></html>

View file

@ -1,5 +1,5 @@
<!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 `oauth2` mod in crate `kanidm_proto`."><meta name="keywords" content="rust, rustlang, rust-lang, oauth2"><title>kanidm_proto::oauth2 - 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="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"><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">&#9776;</div><a href='../../kanidm_proto/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Module oauth2</h2><div class="sidebar-elems"><div class="block items"><ul><li><a href="#structs">Structs</a></li><li><a href="#enums">Enums</a></li></ul></div><div id="sidebar-vars" data-name="oauth2" 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 width="18" height="18" alt="Pick another theme!" src="../../brush.svg"></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 width="18" height="18" alt="Change settings" src="../../wheel.svg"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Module <a href="../index.html">kanidm_proto</a>::<wbr><a class="mod" href="#">oauth2</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item path"></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">&#x2212;</span>]</a></span><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#1-88" title="goto source code">[src]</a></span></h1><h2 id="structs" class="section-header"><a href="#structs">Structs</a></h2>
<div class="item-table"><div class="item-left module-item"><a class="struct" href="struct.AccessTokenRequest.html" title="kanidm_proto::oauth2::AccessTokenRequest struct">AccessTokenRequest</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.AccessTokenResponse.html" title="kanidm_proto::oauth2::AccessTokenResponse struct">AccessTokenResponse</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.AuthorisationRequest.html" title="kanidm_proto::oauth2::AuthorisationRequest struct">AuthorisationRequest</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.ConsentRequest.html" title="kanidm_proto::oauth2::ConsentRequest struct">ConsentRequest</a></div><div class="item-right docblock-short"><p>We ask our user to consent to this Authorisation Request with the
<!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 `oauth2` mod in crate `kanidm_proto`."><meta name="keywords" content="rust, rustlang, rust-lang, oauth2"><title>kanidm_proto::oauth2 - 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="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"><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">&#9776;</div><a href='../../kanidm_proto/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Module oauth2</h2><div class="sidebar-elems"><div class="block items"><ul><li><a href="#structs">Structs</a></li><li><a href="#enums">Enums</a></li></ul></div><div id="sidebar-vars" data-name="oauth2" 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 width="18" height="18" alt="Pick another theme!" src="../../brush.svg"></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 width="18" height="18" alt="Change settings" src="../../wheel.svg"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Module <a href="../index.html">kanidm_proto</a>::<wbr><a class="mod" href="#">oauth2</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item path"></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">&#x2212;</span>]</a></span><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#1-143" title="goto source code">[src]</a></span></h1><h2 id="structs" class="section-header"><a href="#structs">Structs</a></h2>
<div class="item-table"><div class="item-left module-item"><a class="struct" href="struct.AccessTokenIntrospectRequest.html" title="kanidm_proto::oauth2::AccessTokenIntrospectRequest struct">AccessTokenIntrospectRequest</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.AccessTokenIntrospectResponse.html" title="kanidm_proto::oauth2::AccessTokenIntrospectResponse struct">AccessTokenIntrospectResponse</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.AccessTokenRequest.html" title="kanidm_proto::oauth2::AccessTokenRequest struct">AccessTokenRequest</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.AccessTokenResponse.html" title="kanidm_proto::oauth2::AccessTokenResponse struct">AccessTokenResponse</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.AuthorisationRequest.html" title="kanidm_proto::oauth2::AuthorisationRequest struct">AuthorisationRequest</a></div><div class="item-right docblock-short"></div><div class="item-left module-item"><a class="struct" href="struct.ConsentRequest.html" title="kanidm_proto::oauth2::ConsentRequest struct">ConsentRequest</a></div><div class="item-right docblock-short"><p>We ask our user to consent to this Authorisation Request with the
following data.</p>
</div><div class="item-left module-item"><a class="struct" href="struct.ErrorResponse.html" title="kanidm_proto::oauth2::ErrorResponse struct">ErrorResponse</a></div><div class="item-right docblock-short"></div></div><h2 id="enums" class="section-header"><a href="#enums">Enums</a></h2>
<div class="item-table"><div class="item-left module-item"><a class="enum" href="enum.CodeChallengeMethod.html" title="kanidm_proto::oauth2::CodeChallengeMethod enum">CodeChallengeMethod</a></div><div class="item-right docblock-short"></div></div></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="kanidm_proto" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div>

View file

@ -1 +1 @@
initSidebarItems({"enum":[["CodeChallengeMethod",""]],"struct":[["AccessTokenRequest",""],["AccessTokenResponse",""],["AuthorisationRequest",""],["ConsentRequest","We ask our user to consent to this Authorisation Request with the following data."],["ErrorResponse",""]]});
initSidebarItems({"enum":[["CodeChallengeMethod",""]],"struct":[["AccessTokenIntrospectRequest",""],["AccessTokenIntrospectResponse",""],["AccessTokenRequest",""],["AccessTokenResponse",""],["AuthorisationRequest",""],["ConsentRequest","We ask our user to consent to this Authorisation Request with the following data."],["ErrorResponse",""]]});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,10 +1,10 @@
<!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 `ErrorResponse` struct in crate `kanidm_proto`."><meta name="keywords" content="rust, rustlang, rust-lang, ErrorResponse"><title>ErrorResponse in kanidm_proto::oauth2 - 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="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc struct"><!--[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">&#9776;</div><a href='../../kanidm_proto/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Struct ErrorResponse</h2><div class="sidebar-elems"><div class="block items"><h3 class="sidebar-title"><a href="#fields">Fields</a></h3><div class="sidebar-links"><a href="#structfield.error">error</a><a href="#structfield.error_description">error_description</a><a href="#structfield.error_uri">error_uri</a></div><h3 class="sidebar-title"><a href="#trait-implementations">Trait Implementations</a></h3><div class="sidebar-links"><a href="#impl-Debug">Debug</a><a href="#impl-Deserialize%3C%27de%3E">Deserialize&lt;&#39;de&gt;</a><a href="#impl-Serialize">Serialize</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&lt;T&gt;</a><a href="#impl-BorrowMut%3CT%3E">BorrowMut&lt;T&gt;</a><a href="#impl-DeserializeOwned">DeserializeOwned</a><a href="#impl-From%3CT%3E">From&lt;T&gt;</a><a href="#impl-Into%3CU%3E">Into&lt;U&gt;</a><a href="#impl-TryFrom%3CU%3E">TryFrom&lt;U&gt;</a><a href="#impl-TryInto%3CU%3E">TryInto&lt;U&gt;</a><a href="#impl-VZip%3CV%3E">VZip&lt;V&gt;</a></div></div><h2 class="location">Other items in<br><a href="../index.html">kanidm_proto</a>::<wbr><a href="index.html">oauth2</a></h2><div id="sidebar-vars" data-name="ErrorResponse" data-ty="struct" 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 width="18" height="18" alt="Pick another theme!" src="../../brush.svg"></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 width="18" height="18" alt="Change settings" src="../../wheel.svg"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Struct <a href="../index.html">kanidm_proto</a>::<wbr><a href="index.html">oauth2</a>::<wbr><a class="struct" href="#">ErrorResponse</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item path"></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">&#x2212;</span>]</a></span><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#82-88" title="goto source code">[src]</a></span></h1><div class="docblock type-decl"><pre class="rust struct"><code>pub struct ErrorResponse {
<!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 `ErrorResponse` struct in crate `kanidm_proto`."><meta name="keywords" content="rust, rustlang, rust-lang, ErrorResponse"><title>ErrorResponse in kanidm_proto::oauth2 - 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="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc struct"><!--[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">&#9776;</div><a href='../../kanidm_proto/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a><h2 class="location">Struct ErrorResponse</h2><div class="sidebar-elems"><div class="block items"><h3 class="sidebar-title"><a href="#fields">Fields</a></h3><div class="sidebar-links"><a href="#structfield.error">error</a><a href="#structfield.error_description">error_description</a><a href="#structfield.error_uri">error_uri</a></div><h3 class="sidebar-title"><a href="#trait-implementations">Trait Implementations</a></h3><div class="sidebar-links"><a href="#impl-Debug">Debug</a><a href="#impl-Deserialize%3C%27de%3E">Deserialize&lt;&#39;de&gt;</a><a href="#impl-Serialize">Serialize</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&lt;T&gt;</a><a href="#impl-BorrowMut%3CT%3E">BorrowMut&lt;T&gt;</a><a href="#impl-DeserializeOwned">DeserializeOwned</a><a href="#impl-From%3CT%3E">From&lt;T&gt;</a><a href="#impl-Into%3CU%3E">Into&lt;U&gt;</a><a href="#impl-TryFrom%3CU%3E">TryFrom&lt;U&gt;</a><a href="#impl-TryInto%3CU%3E">TryInto&lt;U&gt;</a><a href="#impl-VZip%3CV%3E">VZip&lt;V&gt;</a></div></div><h2 class="location">Other items in<br><a href="../index.html">kanidm_proto</a>::<wbr><a href="index.html">oauth2</a></h2><div id="sidebar-vars" data-name="ErrorResponse" data-ty="struct" 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 width="18" height="18" alt="Pick another theme!" src="../../brush.svg"></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 width="18" height="18" alt="Change settings" src="../../wheel.svg"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Struct <a href="../index.html">kanidm_proto</a>::<wbr><a href="index.html">oauth2</a>::<wbr><a class="struct" href="#">ErrorResponse</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item path"></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">&#x2212;</span>]</a></span><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#137-143" title="goto source code">[src]</a></span></h1><div class="docblock type-decl"><pre class="rust struct"><code>pub struct ErrorResponse {
pub error: <a class="struct" href="https://doc.rust-lang.org/1.56.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>,
pub error_description: <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.56.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;,
pub error_uri: <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://docs.rs/url/2.2.2/url/struct.Url.html" title="struct url::Url">Url</a>&gt;,
}</code></pre></div><h2 id="fields" class="fields small-section-header">Fields<a href="#fields" class="anchor"></a></h2><span id="structfield.error" class="structfield small-section-header"><a href="#structfield.error" class="anchor field"></a><code>error: <a class="struct" href="https://doc.rust-lang.org/1.56.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></code></span><span id="structfield.error_description" class="structfield small-section-header"><a href="#structfield.error_description" class="anchor field"></a><code>error_description: <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.56.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</code></span><span id="structfield.error_uri" class="structfield small-section-header"><a href="#structfield.error_uri" class="anchor field"></a><code>error_uri: <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://docs.rs/url/2.2.2/url/struct.Url.html" title="struct url::Url">Url</a>&gt;</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" open><summary><div id="impl-Debug" class="impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#81" title="goto source code">[src]</a></div><a href="#impl-Debug" class="anchor"></a><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.fmt" class="method trait-impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#81" title="goto source code">[src]</a></div><a href="#method.fmt" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.56.0/core/fmt/trait.Debug.html#tymethod.fmt" class="fnname">fmt</a>(&amp;self, f: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.56.0/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>&lt;'_&gt;) -&gt; <a class="type" href="https://doc.rust-lang.org/1.56.0/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></h4></div></summary><div class='docblock'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/1.56.0/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl-Deserialize%3C%27de%3E" class="impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#81" title="goto source code">[src]</a></div><a href="#impl-Deserialize%3C%27de%3E" class="anchor"></a><h3 class="code-header in-band">impl&lt;'de&gt; <a class="trait" href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserialize.html" title="trait serde::de::Deserialize">Deserialize</a>&lt;'de&gt; for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.deserialize" class="method trait-impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#81" title="goto source code">[src]</a></div><a href="#method.deserialize" class="anchor"></a><h4 class="code-header">fn <a href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserialize.html#tymethod.deserialize" class="fnname">deserialize</a>&lt;__D&gt;(__deserializer: __D) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;Self, __D::<a class="type" href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserializer.html#associatedtype.Error" title="type serde::de::Deserializer::Error">Error</a>&gt; <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;__D: <a class="trait" href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a>&lt;'de&gt;,&nbsp;</span></h4></div></summary><div class='docblock'><p>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl-Serialize" class="impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#81" title="goto source code">[src]</a></div><a href="#impl-Serialize" class="anchor"></a><h3 class="code-header in-band">impl <a class="trait" href="https://docs.rs/serde/1.0.130/serde/ser/trait.Serialize.html" title="trait serde::ser::Serialize">Serialize</a> for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.serialize" class="method trait-impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#81" title="goto source code">[src]</a></div><a href="#method.serialize" class="anchor"></a><h4 class="code-header">fn <a href="https://docs.rs/serde/1.0.130/serde/ser/trait.Serialize.html#tymethod.serialize" class="fnname">serialize</a>&lt;__S&gt;(&amp;self, __serializer: __S) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;__S::<a class="type" href="https://docs.rs/serde/1.0.130/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.130/serde/ser/trait.Serializer.html#associatedtype.Error" title="type serde::ser::Serializer::Error">Error</a>&gt; <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;__S: <a class="trait" href="https://docs.rs/serde/1.0.130/serde/ser/trait.Serializer.html" title="trait serde::ser::Serializer">Serializer</a>,&nbsp;</span></h4></div></summary><div class='docblock'><p>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde/1.0.130/serde/ser/trait.Serialize.html#tymethod.serialize">Read more</a></p>
}</code></pre></div><h2 id="fields" class="fields small-section-header">Fields<a href="#fields" class="anchor"></a></h2><span id="structfield.error" class="structfield small-section-header"><a href="#structfield.error" class="anchor field"></a><code>error: <a class="struct" href="https://doc.rust-lang.org/1.56.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></code></span><span id="structfield.error_description" class="structfield small-section-header"><a href="#structfield.error_description" class="anchor field"></a><code>error_description: <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.56.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</code></span><span id="structfield.error_uri" class="structfield small-section-header"><a href="#structfield.error_uri" class="anchor field"></a><code>error_uri: <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://docs.rs/url/2.2.2/url/struct.Url.html" title="struct url::Url">Url</a>&gt;</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" open><summary><div id="impl-Debug" class="impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#136" title="goto source code">[src]</a></div><a href="#impl-Debug" class="anchor"></a><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.fmt" class="method trait-impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#136" title="goto source code">[src]</a></div><a href="#method.fmt" class="anchor"></a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.56.0/core/fmt/trait.Debug.html#tymethod.fmt" class="fnname">fmt</a>(&amp;self, f: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.56.0/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>&lt;'_&gt;) -&gt; <a class="type" href="https://doc.rust-lang.org/1.56.0/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></h4></div></summary><div class='docblock'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/1.56.0/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl-Deserialize%3C%27de%3E" class="impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#136" title="goto source code">[src]</a></div><a href="#impl-Deserialize%3C%27de%3E" class="anchor"></a><h3 class="code-header in-band">impl&lt;'de&gt; <a class="trait" href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserialize.html" title="trait serde::de::Deserialize">Deserialize</a>&lt;'de&gt; for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.deserialize" class="method trait-impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#136" title="goto source code">[src]</a></div><a href="#method.deserialize" class="anchor"></a><h4 class="code-header">fn <a href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserialize.html#tymethod.deserialize" class="fnname">deserialize</a>&lt;__D&gt;(__deserializer: __D) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;Self, __D::<a class="type" href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserializer.html#associatedtype.Error" title="type serde::de::Deserializer::Error">Error</a>&gt; <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;__D: <a class="trait" href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a>&lt;'de&gt;,&nbsp;</span></h4></div></summary><div class='docblock'><p>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.130/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl-Serialize" class="impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#136" title="goto source code">[src]</a></div><a href="#impl-Serialize" class="anchor"></a><h3 class="code-header in-band">impl <a class="trait" href="https://docs.rs/serde/1.0.130/serde/ser/trait.Serialize.html" title="trait serde::ser::Serialize">Serialize</a> for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.serialize" class="method trait-impl has-srclink"><div class="rightside"><a class="srclink" href="../../src/kanidm_proto/oauth2.rs.html#136" title="goto source code">[src]</a></div><a href="#method.serialize" class="anchor"></a><h4 class="code-header">fn <a href="https://docs.rs/serde/1.0.130/serde/ser/trait.Serialize.html#tymethod.serialize" class="fnname">serialize</a>&lt;__S&gt;(&amp;self, __serializer: __S) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.56.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;__S::<a class="type" href="https://docs.rs/serde/1.0.130/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.130/serde/ser/trait.Serializer.html#associatedtype.Error" title="type serde::ser::Serializer::Error">Error</a>&gt; <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;__S: <a class="trait" href="https://docs.rs/serde/1.0.130/serde/ser/trait.Serializer.html" title="trait serde::ser::Serializer">Serializer</a>,&nbsp;</span></h4></div></summary><div class='docblock'><p>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde/1.0.130/serde/ser/trait.Serialize.html#tymethod.serialize">Read more</a></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"><div class="rightside"></div><a href="#impl-RefUnwindSafe" class="anchor"></a><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div><div id="impl-Send" class="impl has-srclink"><div class="rightside"></div><a href="#impl-Send" class="anchor"></a><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div><div id="impl-Sync" class="impl has-srclink"><div class="rightside"></div><a href="#impl-Sync" class="anchor"></a><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div><div id="impl-Unpin" class="impl has-srclink"><div class="rightside"></div><a href="#impl-Unpin" class="anchor"></a><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></div><div id="impl-UnwindSafe" class="impl has-srclink"><div class="rightside"></div><a href="#impl-UnwindSafe" class="anchor"></a><h3 class="code-header in-band">impl <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a> for <a class="struct" href="struct.ErrorResponse.html" title="struct kanidm_proto::oauth2::ErrorResponse">ErrorResponse</a></h3></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" open><summary><div id="impl-Any" class="impl has-srclink"><div class="rightside"><a class="srclink" href="https://doc.rust-lang.org/1.56.0/src/core/any.rs.html#132-136" title="goto source code">[src]</a></div><a href="#impl-Any" class="anchor"></a><h3 class="code-header in-band">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.56.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></h3></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"><div class="rightside"><a class="srclink" href="https://doc.rust-lang.org/1.56.0/src/core/any.rs.html#133" title="goto source code">[src]</a></div><a href="#method.type_id" class="anchor"></a><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.56.0/core/any/trait.Any.html#tymethod.type_id" class="fnname">type_id</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.56.0/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></h4></div></summary><div class='docblock'><p>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/1.56.0/core/any/trait.Any.html#tymethod.type_id">Read more</a></p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl-Borrow%3CT%3E" class="impl has-srclink"><div class="rightside"><a class="srclink" href="https://doc.rust-lang.org/1.56.0/src/core/borrow.rs.html#208-213" title="goto source code">[src]</a></div><a href="#impl-Borrow%3CT%3E" class="anchor"></a><h3 class="code-header in-band">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;T&gt; for T <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: ?<a class="trait" href="https://doc.rust-lang.org/1.56.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></h3></div></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><div id="method.borrow" class="method trait-impl has-srclink"><div class="rightside"><a class="srclink" href="https://doc.rust-lang.org/1.56.0/src/core/borrow.rs.html#210" title="goto source code">[src]</a></div><a href="#method.borrow" class="anchor"></a><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.56.0/core/borrow/trait.Borrow.html#tymethod.borrow" class="fnname">borrow</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.56.0/std/primitive.reference.html">&amp;</a>T</h4></div></summary><div class='docblock'><p>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.56.0/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></p>
</div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><div id="impl-BorrowMut%3CT%3E" class="impl has-srclink"><div class="rightside"><a class="srclink" href="https://doc.rust-lang.org/1.56.0/src/core/borrow.rs.html#216-220" title="goto source code">[src]</a></div><a href="#impl-BorrowMut%3CT%3E" class="anchor"></a><h3 class="code-header in-band">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.56.0/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;T&gt; for T <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;T: ?<a class="trait" href="https://doc.rust-lang.org/1.56.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></h3></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"><div class="rightside"><a class="srclink" href="https://doc.rust-lang.org/1.56.0/src/core/borrow.rs.html#217" title="goto source code">[src]</a></div><a href="#method.borrow_mut" class="anchor"></a><h4 class="code-header">pub fn <a href="https://doc.rust-lang.org/1.56.0/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut" class="fnname">borrow_mut</a>(&amp;mut self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.56.0/std/primitive.reference.html">&amp;mut </a>T</h4></div></summary><div class='docblock'><p>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.56.0/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></p>

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
<!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="Settings of Rustdoc"><meta name="keywords" content="rust, rustlang, rust-lang"><title>Rustdoc settings</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 ><link rel="stylesheet" type="text/css" href="./settings.css" ><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="alternate icon" type="image/png" href="./favicon-16x16.png"><link rel="alternate icon" type="image/png" href="./favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="./favicon.svg"><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">&#9776;</div><a href='./kanidm_unixd_status/index.html'><div class='logo-container rust-logo'><img src='./rust-logo.png' alt='logo'></div></a><h2 class="location">Settings</h2><div class="sidebar-elems"></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="18" height="18" alt="Pick another theme!" src="./brush.svg"></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 width="18" height="18" alt="Change settings" src="./wheel.svg"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Rustdoc settings</span></h1><div class="settings"><div class="setting-line"><div class="title">Theme preferences</div><div class="sub-settings"><div class="setting-line"><label class="toggle"><input type="checkbox" id="use-system-theme" checked><span class="slider"></span></label><div>Use system theme</div></div><div class="setting-line"><div>Preferred dark theme</div><label class="select-wrapper"><select id="preferred-dark-theme" autocomplete="off"><option value="light" >light</option><option value="dark" selected>dark</option><option value="ayu" >ayu</option></select><img src="./down-arrow.svg" alt="Select item"></label></div><div class="setting-line"><div>Preferred light theme</div><label class="select-wrapper"><select id="preferred-light-theme" autocomplete="off"><option value="light" selected>light</option><option value="dark" >dark</option><option value="ayu" >ayu</option></select><img src="./down-arrow.svg" alt="Select item"></label></div></div>
</div><div class="setting-line"><label class="toggle"><input type="checkbox" id="auto-hide-large-items" checked><span class="slider"></span></label><div>Auto-hide item contents for large items.</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="auto-hide-method-docs" ><span class="slider"></span></label><div>Auto-hide item methods' documentation</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="auto-hide-trait-implementations" ><span class="slider"></span></label><div>Auto-hide trait implementation documentation</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="go-to-only-result" ><span class="slider"></span></label><div>Directly go to item in search if there is only one result</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="line-numbers" ><span class="slider"></span></label><div>Show line numbers on code examples</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="disable-shortcuts" ><span class="slider"></span></label><div>Disable keyboard shortcuts</div></div></div><script src="./settings.js"></script></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="./" data-current-crate="kanidm_unixd_status" data-search-index-js="./search-index.js" data-search-js="./search.js"></div>
<!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="Settings of Rustdoc"><meta name="keywords" content="rust, rustlang, rust-lang"><title>Rustdoc settings</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 ><link rel="stylesheet" type="text/css" href="./settings.css" ><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="alternate icon" type="image/png" href="./favicon-16x16.png"><link rel="alternate icon" type="image/png" href="./favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="./favicon.svg"><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">&#9776;</div><a href='./nss_kanidm/index.html'><div class='logo-container rust-logo'><img src='./rust-logo.png' alt='logo'></div></a><h2 class="location">Settings</h2><div class="sidebar-elems"></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="18" height="18" alt="Pick another theme!" src="./brush.svg"></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 width="18" height="18" alt="Change settings" src="./wheel.svg"></a></div></form></nav><section id="main" class="content"><h1 class="fqn"><span class="in-band">Rustdoc settings</span></h1><div class="settings"><div class="setting-line"><div class="title">Theme preferences</div><div class="sub-settings"><div class="setting-line"><label class="toggle"><input type="checkbox" id="use-system-theme" checked><span class="slider"></span></label><div>Use system theme</div></div><div class="setting-line"><div>Preferred dark theme</div><label class="select-wrapper"><select id="preferred-dark-theme" autocomplete="off"><option value="light" >light</option><option value="dark" selected>dark</option><option value="ayu" >ayu</option></select><img src="./down-arrow.svg" alt="Select item"></label></div><div class="setting-line"><div>Preferred light theme</div><label class="select-wrapper"><select id="preferred-light-theme" autocomplete="off"><option value="light" selected>light</option><option value="dark" >dark</option><option value="ayu" >ayu</option></select><img src="./down-arrow.svg" alt="Select item"></label></div></div>
</div><div class="setting-line"><label class="toggle"><input type="checkbox" id="auto-hide-large-items" checked><span class="slider"></span></label><div>Auto-hide item contents for large items.</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="auto-hide-method-docs" ><span class="slider"></span></label><div>Auto-hide item methods' documentation</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="auto-hide-trait-implementations" ><span class="slider"></span></label><div>Auto-hide trait implementation documentation</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="go-to-only-result" ><span class="slider"></span></label><div>Directly go to item in search if there is only one result</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="line-numbers" ><span class="slider"></span></label><div>Show line numbers on code examples</div></div><div class="setting-line"><label class="toggle"><input type="checkbox" id="disable-shortcuts" ><span class="slider"></span></label><div>Disable keyboard shortcuts</div></div></div><script src="./settings.js"></script></section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="./" data-current-crate="nss_kanidm" data-search-index-js="./search-index.js" data-search-js="./search.js"></div>
<script src="./main.js"></script>
</body></html>

View file

@ -1113,6 +1113,27 @@
<span id="1113">1113</span>
<span id="1114">1114</span>
<span id="1115">1115</span>
<span id="1116">1116</span>
<span id="1117">1117</span>
<span id="1118">1118</span>
<span id="1119">1119</span>
<span id="1120">1120</span>
<span id="1121">1121</span>
<span id="1122">1122</span>
<span id="1123">1123</span>
<span id="1124">1124</span>
<span id="1125">1125</span>
<span id="1126">1126</span>
<span id="1127">1127</span>
<span id="1128">1128</span>
<span id="1129">1129</span>
<span id="1130">1130</span>
<span id="1131">1131</span>
<span id="1132">1132</span>
<span id="1133">1133</span>
<span id="1134">1134</span>
<span id="1135">1135</span>
<span id="1136">1136</span>
</pre><pre class="rust"><code><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>};
<span class="kw">use</span> <span class="ident">chrono</span>::{<span class="ident">DateTime</span>, <span class="ident">SecondsFormat</span>, <span class="ident">Utc</span>};
@ -1133,8 +1154,8 @@
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::filter</span>::{<span class="ident">Filter</span>, <span class="ident">FilterInvalid</span>};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::idm::oauth2</span>::{
<span class="ident">AccessTokenRequest</span>, <span class="ident">AccessTokenResponse</span>, <span class="ident">AuthorisationRequest</span>, <span class="ident">AuthorisePermitSuccess</span>,
<span class="ident">ConsentRequest</span>, <span class="ident">Oauth2Error</span>,
<span class="ident">AccessTokenIntrospectRequest</span>, <span class="ident">AccessTokenIntrospectResponse</span>, <span class="ident">AccessTokenRequest</span>,
<span class="ident">AccessTokenResponse</span>, <span class="ident">AuthorisationRequest</span>, <span class="ident">AuthorisePermitSuccess</span>, <span class="ident">ConsentRequest</span>, <span class="ident">Oauth2Error</span>,
};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::idm::server</span>::{<span class="ident">IdmServer</span>, <span class="ident">IdmServerTransaction</span>};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::ldap</span>::{<span class="ident">LdapBoundToken</span>, <span class="ident">LdapResponseState</span>, <span class="ident">LdapServer</span>};
@ -2168,6 +2189,27 @@
<span class="ident">res</span>
}
<span class="attribute">#[<span class="ident">instrument</span>(
<span class="ident">level</span> <span class="op">=</span> <span class="string">&quot;trace&quot;</span>,
<span class="ident">name</span> <span class="op">=</span> <span class="string">&quot;oauth2_token_introspect&quot;</span>,
<span class="ident">skip</span>(<span class="self">self</span>, <span class="ident">client_authz</span>, <span class="ident">intr_req</span>, <span class="ident">eventid</span>)
<span class="ident">fields</span>(<span class="ident">uuid</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">eventid</span>)
)]</span>
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">handle_oauth2_token_introspect</span>(
<span class="kw-2">&amp;</span><span class="self">self</span>,
<span class="ident">client_authz</span>: <span class="ident">String</span>,
<span class="ident">intr_req</span>: <span class="ident">AccessTokenIntrospectRequest</span>,
<span class="ident">eventid</span>: <span class="ident">Uuid</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">AccessTokenIntrospectResponse</span>, <span class="ident">Oauth2Error</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">ct</span> <span class="op">=</span> <span class="ident">duration_from_epoch_now</span>();
<span class="kw">let</span> <span class="ident">idms_prox_read</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">idms</span>.<span class="ident">proxy_read_async</span>().<span class="kw">await</span>;
<span class="kw">let</span> <span class="ident">res</span> <span class="op">=</span> <span class="macro">spanned!</span>(<span class="string">&quot;actors::v1_read::handle&lt;Oauth2TokenIntrospect&gt;&quot;</span>, {
<span class="comment">// Now we can send to the idm server for introspection checking.</span>
<span class="ident">idms_prox_read</span>.<span class="ident">check_oauth2_token_introspect</span>(<span class="kw-2">&amp;</span><span class="ident">client_authz</span>, <span class="kw-2">&amp;</span><span class="ident">intr_req</span>, <span class="ident">ct</span>)
});
<span class="ident">res</span>
}
<span class="attribute">#[<span class="ident">instrument</span>(
<span class="ident">level</span> <span class="op">=</span> <span class="string">&quot;trace&quot;</span>,
<span class="ident">name</span> <span class="op">=</span> <span class="string">&quot;auth_valid&quot;</span>,

View file

@ -616,8 +616,6 @@
<span id="616">616</span>
<span id="617">617</span>
<span id="618">618</span>
<span id="619">619</span>
<span id="620">620</span>
</pre><pre class="rust"><code><span class="kw">mod</span> <span class="ident">oauth2</span>;
<span class="kw">mod</span> <span class="ident">v1</span>;
@ -1019,11 +1017,9 @@
.<span class="ident">post</span>(<span class="ident">oauth2_authorise_permit_post</span>)
.<span class="ident">get</span>(<span class="ident">oauth2_authorise_permit_get</span>);
<span class="ident">oauth2_process</span>.<span class="ident">at</span>(<span class="string">&quot;/token&quot;</span>).<span class="ident">post</span>(<span class="ident">oauth2_token_post</span>);
<span class="comment">/*
oauth2_process
.at(&quot;/token/introspect&quot;)
.get(oauth2_token_introspect_get);
*/</span>
<span class="ident">oauth2_process</span>
.<span class="ident">at</span>(<span class="string">&quot;/token/introspect&quot;</span>)
.<span class="ident">post</span>(<span class="ident">oauth2_token_introspect_post</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">raw_route</span> <span class="op">=</span> <span class="ident">appserver</span>.<span class="ident">at</span>(<span class="string">&quot;/v1/raw&quot;</span>);
<span class="ident">raw_route</span>.<span class="ident">at</span>(<span class="string">&quot;/create&quot;</span>).<span class="ident">post</span>(<span class="ident">create</span>);

View file

@ -405,10 +405,75 @@
<span id="405">405</span>
<span id="406">406</span>
<span id="407">407</span>
<span id="408">408</span>
<span id="409">409</span>
<span id="410">410</span>
<span id="411">411</span>
<span id="412">412</span>
<span id="413">413</span>
<span id="414">414</span>
<span id="415">415</span>
<span id="416">416</span>
<span id="417">417</span>
<span id="418">418</span>
<span id="419">419</span>
<span id="420">420</span>
<span id="421">421</span>
<span id="422">422</span>
<span id="423">423</span>
<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>
<span id="452">452</span>
<span id="453">453</span>
<span id="454">454</span>
<span id="455">455</span>
<span id="456">456</span>
<span id="457">457</span>
<span id="458">458</span>
<span id="459">459</span>
<span id="460">460</span>
<span id="461">461</span>
<span id="462">462</span>
<span id="463">463</span>
<span id="464">464</span>
<span id="465">465</span>
<span id="466">466</span>
<span id="467">467</span>
<span id="468">468</span>
<span id="469">469</span>
<span id="470">470</span>
<span id="471">471</span>
</pre><pre class="rust"><code><span class="kw">use</span> <span class="ident"><span class="kw">super</span>::v1</span>::{<span class="ident">json_rest_event_get</span>, <span class="ident">json_rest_event_post</span>};
<span class="kw">use</span> <span class="kw">super</span>::{<span class="ident">to_tide_response</span>, <span class="ident">AppState</span>, <span class="ident">RequestExtensions</span>};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::idm::oauth2</span>::{
<span class="ident">AccessTokenRequest</span>, <span class="ident">AuthorisationRequest</span>, <span class="ident">AuthorisePermitSuccess</span>, <span class="ident">ErrorResponse</span>, <span class="ident">Oauth2Error</span>,
<span class="ident">AccessTokenIntrospectRequest</span>, <span class="ident">AccessTokenRequest</span>, <span class="ident">AuthorisationRequest</span>, <span class="ident">AuthorisePermitSuccess</span>,
<span class="ident">ErrorResponse</span>, <span class="ident">Oauth2Error</span>,
};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::prelude</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="ident">kanidm_proto::v1::Entry</span> <span class="kw">as</span> <span class="ident">ProtoEntry</span>;
@ -808,10 +873,73 @@
<span class="prelude-val">Ok</span>(<span class="ident">res</span>)
}
<span class="comment">/*
pub async fn oauth2_token_introspect_get(req: tide::Request&lt;AppState&gt;) -&gt; tide::Result {
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">oauth2_token_introspect_post</span>(<span class="kw-2">mut</span> <span class="ident">req</span>: <span class="ident">tide::Request</span><span class="op">&lt;</span><span class="ident">AppState</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">tide::Result</span> {
<span class="comment">// This is called directly by the resource server, where we then issue</span>
<span class="comment">// information about this token to the caller.</span>
<span class="kw">let</span> (<span class="ident">eventid</span>, <span class="ident">hvalue</span>) <span class="op">=</span> <span class="ident">req</span>.<span class="ident">new_eventid</span>();
<span class="kw">let</span> <span class="ident">client_authz</span> <span class="op">=</span> <span class="ident">req</span>
.<span class="ident">header</span>(<span class="string">&quot;authorization&quot;</span>)
.<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">hv</span><span class="op">|</span> <span class="ident">hv</span>.<span class="ident">get</span>(<span class="number">0</span>))
.<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">h</span><span class="op">|</span> <span class="ident">h</span>.<span class="ident">as_str</span>().<span class="ident">strip_prefix</span>(<span class="string">&quot;Basic &quot;</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="macro">error!</span>(<span class="string">&quot;Basic Authentication Not Provided&quot;</span>);
<span class="ident">tide::Error::from_str</span>(
<span class="ident">tide::StatusCode::Unauthorized</span>,
<span class="string">&quot;Invalid Basic Authorisation&quot;</span>,
)
})<span class="question-mark">?</span>;
<span class="comment">// Get the introspection request, could we accept json or form? Prob needs content type here.</span>
<span class="kw">let</span> <span class="ident">intr_req</span>: <span class="ident">AccessTokenIntrospectRequest</span> <span class="op">=</span> <span class="ident">req</span>.<span class="ident">body_form</span>().<span class="kw">await</span>.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
<span class="macro">request_error!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">tide::Error::from_str</span>(
<span class="ident">tide::StatusCode::BadRequest</span>,
<span class="string">&quot;Invalid Oauth2 AccessTokenIntrospectRequest&quot;</span>,
)
})<span class="question-mark">?</span>;
<span class="macro">request_trace!</span>(<span class="string">&quot;Introspect Request - {:?}&quot;</span>, <span class="ident">intr_req</span>);
<span class="kw">let</span> <span class="ident">res</span> <span class="op">=</span> <span class="ident">req</span>
.<span class="ident">state</span>()
.<span class="ident">qe_r_ref</span>
.<span class="ident">handle_oauth2_token_introspect</span>(<span class="ident">client_authz</span>, <span class="ident">intr_req</span>, <span class="ident">eventid</span>)
.<span class="kw">await</span>;
<span class="kw">match</span> <span class="ident">res</span> {
<span class="prelude-val">Ok</span>(<span class="ident">atr</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">res</span> <span class="op">=</span> <span class="ident">tide::Response::new</span>(<span class="number">200</span>);
<span class="ident">tide::Body::from_json</span>(<span class="kw-2">&amp;</span><span class="ident">atr</span>).<span class="ident">map</span>(<span class="op">|</span><span class="ident">b</span><span class="op">|</span> {
<span class="ident">res</span>.<span class="ident">set_body</span>(<span class="ident">b</span>);
<span class="ident">res</span>
})
}
<span class="prelude-val">Err</span>(<span class="ident">Oauth2Error::AuthenticationRequired</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="comment">// This will trigger our ui to auth and retry.</span>
<span class="prelude-val">Ok</span>(<span class="ident">tide::Response::new</span>(<span class="ident">tide::StatusCode::Unauthorized</span>))
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="comment">// https://datatracker.ietf.org/doc/html/rfc6749#section-5.2</span>
<span class="kw">let</span> <span class="ident">err</span> <span class="op">=</span> <span class="ident">ErrorResponse</span> {
<span class="ident">error</span>: <span class="ident">e</span>.<span class="ident">to_string</span>(),
<span class="ident">error_description</span>: <span class="prelude-val">None</span>,
<span class="ident">error_uri</span>: <span class="prelude-val">None</span>,
};
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">res</span> <span class="op">=</span> <span class="ident">tide::Response::new</span>(<span class="number">400</span>);
<span class="ident">tide::Body::from_json</span>(<span class="kw-2">&amp;</span><span class="ident">err</span>).<span class="ident">map</span>(<span class="op">|</span><span class="ident">b</span><span class="op">|</span> {
<span class="ident">res</span>.<span class="ident">set_body</span>(<span class="ident">b</span>);
<span class="ident">res</span>
})
}
}
.<span class="ident">map</span>(<span class="op">|</span><span class="kw-2">mut</span> <span class="ident">res</span><span class="op">|</span> {
<span class="ident">res</span>.<span class="ident">insert_header</span>(<span class="string">&quot;X-KANIDM-OPID&quot;</span>, <span class="ident">hvalue</span>);
<span class="ident">res</span>
})
}
*/</span>
</code></pre></div>
</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><script src="../../../../source-script.js"></script><script src="../../../../source-files.js"></script>

View file

@ -1103,6 +1103,206 @@
<span id="1103">1103</span>
<span id="1104">1104</span>
<span id="1105">1105</span>
<span id="1106">1106</span>
<span id="1107">1107</span>
<span id="1108">1108</span>
<span id="1109">1109</span>
<span id="1110">1110</span>
<span id="1111">1111</span>
<span id="1112">1112</span>
<span id="1113">1113</span>
<span id="1114">1114</span>
<span id="1115">1115</span>
<span id="1116">1116</span>
<span id="1117">1117</span>
<span id="1118">1118</span>
<span id="1119">1119</span>
<span id="1120">1120</span>
<span id="1121">1121</span>
<span id="1122">1122</span>
<span id="1123">1123</span>
<span id="1124">1124</span>
<span id="1125">1125</span>
<span id="1126">1126</span>
<span id="1127">1127</span>
<span id="1128">1128</span>
<span id="1129">1129</span>
<span id="1130">1130</span>
<span id="1131">1131</span>
<span id="1132">1132</span>
<span id="1133">1133</span>
<span id="1134">1134</span>
<span id="1135">1135</span>
<span id="1136">1136</span>
<span id="1137">1137</span>
<span id="1138">1138</span>
<span id="1139">1139</span>
<span id="1140">1140</span>
<span id="1141">1141</span>
<span id="1142">1142</span>
<span id="1143">1143</span>
<span id="1144">1144</span>
<span id="1145">1145</span>
<span id="1146">1146</span>
<span id="1147">1147</span>
<span id="1148">1148</span>
<span id="1149">1149</span>
<span id="1150">1150</span>
<span id="1151">1151</span>
<span id="1152">1152</span>
<span id="1153">1153</span>
<span id="1154">1154</span>
<span id="1155">1155</span>
<span id="1156">1156</span>
<span id="1157">1157</span>
<span id="1158">1158</span>
<span id="1159">1159</span>
<span id="1160">1160</span>
<span id="1161">1161</span>
<span id="1162">1162</span>
<span id="1163">1163</span>
<span id="1164">1164</span>
<span id="1165">1165</span>
<span id="1166">1166</span>
<span id="1167">1167</span>
<span id="1168">1168</span>
<span id="1169">1169</span>
<span id="1170">1170</span>
<span id="1171">1171</span>
<span id="1172">1172</span>
<span id="1173">1173</span>
<span id="1174">1174</span>
<span id="1175">1175</span>
<span id="1176">1176</span>
<span id="1177">1177</span>
<span id="1178">1178</span>
<span id="1179">1179</span>
<span id="1180">1180</span>
<span id="1181">1181</span>
<span id="1182">1182</span>
<span id="1183">1183</span>
<span id="1184">1184</span>
<span id="1185">1185</span>
<span id="1186">1186</span>
<span id="1187">1187</span>
<span id="1188">1188</span>
<span id="1189">1189</span>
<span id="1190">1190</span>
<span id="1191">1191</span>
<span id="1192">1192</span>
<span id="1193">1193</span>
<span id="1194">1194</span>
<span id="1195">1195</span>
<span id="1196">1196</span>
<span id="1197">1197</span>
<span id="1198">1198</span>
<span id="1199">1199</span>
<span id="1200">1200</span>
<span id="1201">1201</span>
<span id="1202">1202</span>
<span id="1203">1203</span>
<span id="1204">1204</span>
<span id="1205">1205</span>
<span id="1206">1206</span>
<span id="1207">1207</span>
<span id="1208">1208</span>
<span id="1209">1209</span>
<span id="1210">1210</span>
<span id="1211">1211</span>
<span id="1212">1212</span>
<span id="1213">1213</span>
<span id="1214">1214</span>
<span id="1215">1215</span>
<span id="1216">1216</span>
<span id="1217">1217</span>
<span id="1218">1218</span>
<span id="1219">1219</span>
<span id="1220">1220</span>
<span id="1221">1221</span>
<span id="1222">1222</span>
<span id="1223">1223</span>
<span id="1224">1224</span>
<span id="1225">1225</span>
<span id="1226">1226</span>
<span id="1227">1227</span>
<span id="1228">1228</span>
<span id="1229">1229</span>
<span id="1230">1230</span>
<span id="1231">1231</span>
<span id="1232">1232</span>
<span id="1233">1233</span>
<span id="1234">1234</span>
<span id="1235">1235</span>
<span id="1236">1236</span>
<span id="1237">1237</span>
<span id="1238">1238</span>
<span id="1239">1239</span>
<span id="1240">1240</span>
<span id="1241">1241</span>
<span id="1242">1242</span>
<span id="1243">1243</span>
<span id="1244">1244</span>
<span id="1245">1245</span>
<span id="1246">1246</span>
<span id="1247">1247</span>
<span id="1248">1248</span>
<span id="1249">1249</span>
<span id="1250">1250</span>
<span id="1251">1251</span>
<span id="1252">1252</span>
<span id="1253">1253</span>
<span id="1254">1254</span>
<span id="1255">1255</span>
<span id="1256">1256</span>
<span id="1257">1257</span>
<span id="1258">1258</span>
<span id="1259">1259</span>
<span id="1260">1260</span>
<span id="1261">1261</span>
<span id="1262">1262</span>
<span id="1263">1263</span>
<span id="1264">1264</span>
<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>
<span id="1299">1299</span>
<span id="1300">1300</span>
<span id="1301">1301</span>
<span id="1302">1302</span>
<span id="1303">1303</span>
<span id="1304">1304</span>
<span id="1305">1305</span>
</pre><pre class="rust"><code><span class="doccomment">//! Oauth2 resource server configurations</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! This contains the in memory and loaded set of active oauth2 resource server</span>
@ -1111,6 +1311,7 @@
<span class="doccomment">//!</span>
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::identity::IdentityId</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::idm::server</span>::{<span class="ident">IdmServerProxyReadTransaction</span>, <span class="ident">IdmServerTransaction</span>};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::prelude</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="ident">concread::cowcell</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="ident">fernet::Fernet</span>;
@ -1118,6 +1319,7 @@
<span class="kw">use</span> <span class="ident">kanidm_proto::v1::UserAuthToken</span>;
<span class="kw">use</span> <span class="ident">openssl::sha</span>;
<span class="kw">use</span> <span class="ident">std::collections</span>::{<span class="ident">BTreeMap</span>, <span class="ident">BTreeSet</span>};
<span class="kw">use</span> <span class="ident">std::fmt</span>;
<span class="kw">use</span> <span class="ident">std::sync::Arc</span>;
<span class="kw">use</span> <span class="ident">time::OffsetDateTime</span>;
<span class="kw">use</span> <span class="ident">tracing::trace</span>;
@ -1125,8 +1327,8 @@
<span class="kw">use</span> <span class="ident">webauthn_rs::base64_data::Base64UrlSafeData</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">kanidm_proto::oauth2</span>::{
<span class="ident">AccessTokenRequest</span>, <span class="ident">AccessTokenResponse</span>, <span class="ident">AuthorisationRequest</span>, <span class="ident">CodeChallengeMethod</span>,
<span class="ident">ConsentRequest</span>, <span class="ident">ErrorResponse</span>,
<span class="ident">AccessTokenIntrospectRequest</span>, <span class="ident">AccessTokenIntrospectResponse</span>, <span class="ident">AccessTokenRequest</span>,
<span class="ident">AccessTokenResponse</span>, <span class="ident">AuthorisationRequest</span>, <span class="ident">CodeChallengeMethod</span>, <span class="ident">ConsentRequest</span>, <span class="ident">ErrorResponse</span>,
};
<span class="kw">use</span> <span class="ident">std::convert::TryFrom</span>;
@ -1187,8 +1389,6 @@
<span class="kw">pub</span> <span class="ident">scopes</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
}
<span class="comment">// consent token?</span>
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Serialize</span>, <span class="ident">Deserialize</span>, <span class="ident">Debug</span>)]</span>
<span class="kw">struct</span> <span class="ident">TokenExchangeCode</span> {
<span class="comment">// We don&#39;t need the client_id here, because it&#39;s signed with an RS specific</span>
@ -1202,6 +1402,32 @@
<span class="kw">pub</span> <span class="ident">scopes</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Serialize</span>, <span class="ident">Deserialize</span>, <span class="ident">Debug</span>)]</span>
<span class="kw">enum</span> <span class="ident">Oauth2TokenType</span> {
<span class="ident">Access</span>,
<span class="ident">Refresh</span>,
}
<span class="kw">impl</span> <span class="ident">fmt::Display</span> <span class="kw">for</span> <span class="ident">Oauth2TokenType</span> {
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">fmt::Formatter</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">fmt::Result</span> {
<span class="kw">match</span> <span class="self">self</span> {
<span class="ident">Oauth2TokenType::Access</span> <span class="op">=</span><span class="op">&gt;</span> <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">&quot;access_token&quot;</span>),
<span class="ident">Oauth2TokenType::Refresh</span> <span class="op">=</span><span class="op">&gt;</span> <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">&quot;refresh_token&quot;</span>),
}
}
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Serialize</span>, <span class="ident">Deserialize</span>, <span class="ident">Debug</span>)]</span>
<span class="kw">struct</span> <span class="ident">Oauth2UserToken</span> {
<span class="kw">pub</span> <span class="ident">toktype</span>: <span class="ident">Oauth2TokenType</span>,
<span class="kw">pub</span> <span class="ident">uat</span>: <span class="ident">UserAuthToken</span>,
<span class="kw">pub</span> <span class="ident">scopes</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
<span class="comment">// Oauth2 exp is seperate to uat expiry</span>
<span class="kw">pub</span> <span class="ident">exp</span>: <span class="ident">i64</span>,
<span class="kw">pub</span> <span class="ident">iat</span>: <span class="ident">i64</span>,
<span class="kw">pub</span> <span class="ident">nbf</span>: <span class="ident">i64</span>,
}
<span class="comment">// consentPermitResponse</span>
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
@ -1581,34 +1807,10 @@
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Oauth2Error::InvalidRequest</span>);
}
<span class="comment">// Check the client_authz</span>
<span class="kw">let</span> <span class="ident">authz</span> <span class="op">=</span> <span class="ident">base64::decode</span>(<span class="kw-2">&amp;</span><span class="ident">client_authz</span>)
.<span class="ident">map_err</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> {
<span class="macro">admin_error!</span>(<span class="string">&quot;Basic authz invalid base64&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})
.<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">data</span><span class="op">|</span> {
<span class="ident">String::from_utf8</span>(<span class="ident">data</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> {
<span class="macro">admin_error!</span>(<span class="string">&quot;Basic authz invalid utf8&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})
})<span class="question-mark">?</span>;
<span class="comment">// Get the first :, it should be our delim.</span>
<span class="comment">//</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">split_iter</span> <span class="op">=</span> <span class="ident">authz</span>.<span class="ident">split</span>(<span class="string">&#39;:&#39;</span>);
<span class="kw">let</span> <span class="ident">client_id</span> <span class="op">=</span> <span class="ident">split_iter</span>.<span class="ident">next</span>().<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
<span class="macro">admin_error!</span>(<span class="string">&quot;Basic authz invalid format (corrupt input?)&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})<span class="question-mark">?</span>;
<span class="kw">let</span> <span class="ident">secret</span> <span class="op">=</span> <span class="ident">split_iter</span>.<span class="ident">next</span>().<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
<span class="macro">admin_error!</span>(<span class="string">&quot;Basic authz invalid format (missing &#39;:&#39; seperator?)&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})<span class="question-mark">?</span>;
<span class="kw">let</span> (<span class="ident">client_id</span>, <span class="ident">secret</span>) <span class="op">=</span> <span class="ident">parse_basic_authz</span>(<span class="ident">client_authz</span>)<span class="question-mark">?</span>;
<span class="comment">// Get the o2rs for the handle.</span>
<span class="kw">let</span> <span class="ident">o2rs</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">inner</span>.<span class="ident">rs_set</span>.<span class="ident">get</span>(<span class="ident">client_id</span>).<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
<span class="kw">let</span> <span class="ident">o2rs</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">inner</span>.<span class="ident">rs_set</span>.<span class="ident">get</span>(<span class="kw-2">&amp;</span><span class="ident">client_id</span>).<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
<span class="macro">admin_warn!</span>(<span class="string">&quot;Invalid oauth2 client_id&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})<span class="question-mark">?</span>;
@ -1673,8 +1875,20 @@
<span class="prelude-val">Some</span>(<span class="ident">code_xchg</span>.<span class="ident">scopes</span>.<span class="ident">join</span>(<span class="string">&quot; &quot;</span>))
};
<span class="kw">let</span> <span class="ident">iat</span> <span class="op">=</span> <span class="ident">ct</span>.<span class="ident">as_secs</span>() <span class="kw">as</span> <span class="ident">i64</span>;
<span class="kw">let</span> <span class="ident">o2uat</span> <span class="op">=</span> <span class="ident">Oauth2UserToken</span> {
<span class="ident">toktype</span>: <span class="ident">Oauth2TokenType::Access</span>,
<span class="ident">uat</span>: <span class="ident">code_xchg</span>.<span class="ident">uat</span>,
<span class="ident">scopes</span>: <span class="ident">code_xchg</span>.<span class="ident">scopes</span>,
<span class="ident">iat</span>,
<span class="ident">nbf</span>: <span class="ident">iat</span>,
<span class="comment">// TODO: Make configurable!</span>
<span class="ident">exp</span>: <span class="ident">iat</span> <span class="op">+</span> <span class="number">480</span>,
};
<span class="comment">// If we are type == Uat, then we re-use the same encryption material here.</span>
<span class="kw">let</span> <span class="ident">access_token_data</span> <span class="op">=</span> <span class="ident">serde_json::to_vec</span>(<span class="kw-2">&amp;</span><span class="ident">code_xchg</span>.<span class="ident">uat</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
<span class="kw">let</span> <span class="ident">access_token_data</span> <span class="op">=</span> <span class="ident">serde_json::to_vec</span>(<span class="kw-2">&amp;</span><span class="ident">o2uat</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="ident">err</span> <span class="op">=</span> <span class="question-mark">?</span><span class="ident">e</span>, <span class="string">&quot;Unable to encode uat data&quot;</span>);
<span class="ident">Oauth2Error::ServerError</span>(<span class="ident">OperationError::SerdeJsonError</span>)
})<span class="question-mark">?</span>;
@ -1693,6 +1907,110 @@
<span class="ident">scope</span>,
})
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">check_oauth2_token_introspect</span>(
<span class="kw-2">&amp;</span><span class="self">self</span>,
<span class="ident">idms</span>: <span class="kw-2">&amp;</span><span class="ident">IdmServerProxyReadTransaction</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>,
<span class="ident">client_authz</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>,
<span class="ident">intr_req</span>: <span class="kw-2">&amp;</span><span class="ident">AccessTokenIntrospectRequest</span>,
<span class="ident">ct</span>: <span class="ident">Duration</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">AccessTokenIntrospectResponse</span>, <span class="ident">Oauth2Error</span><span class="op">&gt;</span> {
<span class="kw">let</span> (<span class="ident">client_id</span>, <span class="ident">secret</span>) <span class="op">=</span> <span class="ident">parse_basic_authz</span>(<span class="ident">client_authz</span>)<span class="question-mark">?</span>;
<span class="comment">// Get the o2rs for the handle.</span>
<span class="kw">let</span> <span class="ident">o2rs</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">inner</span>.<span class="ident">rs_set</span>.<span class="ident">get</span>(<span class="kw-2">&amp;</span><span class="ident">client_id</span>).<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
<span class="macro">admin_warn!</span>(<span class="string">&quot;Invalid oauth2 client_id&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})<span class="question-mark">?</span>;
<span class="comment">// check the secret.</span>
<span class="kw">if</span> <span class="ident">o2rs</span>.<span class="ident">authz_secret</span> <span class="op">!</span><span class="op">=</span> <span class="ident">secret</span> {
<span class="macro">security_info!</span>(<span class="string">&quot;Invalid oauth2 client_id secret&quot;</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Oauth2Error::AuthenticationRequired</span>);
}
<span class="comment">// We are authenticated! Yay! Now we can actually check things ...</span>
<span class="comment">// In these cases instead of error, we need to return Active:false</span>
<span class="comment">// Check the Token is correctly signed.</span>
<span class="kw">let</span> <span class="ident">access_token</span>: <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">Oauth2UserToken</span>, <span class="kw">_</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">o2rs</span>
.<span class="ident">token_fernet</span>
.<span class="ident">decrypt_at_time</span>(<span class="kw-2">&amp;</span><span class="ident">intr_req</span>.<span class="ident">token</span>, <span class="prelude-val">None</span>, <span class="ident">ct</span>.<span class="ident">as_secs</span>())
.<span class="ident">map_err</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> {
<span class="macro">admin_error!</span>(<span class="string">&quot;Failed to decrypt access token introspect request&quot;</span>);
<span class="ident">Oauth2Error::InvalidRequest</span>
})
.<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">data</span><span class="op">|</span> {
<span class="ident">serde_json::from_slice</span>(<span class="kw-2">&amp;</span><span class="ident">data</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">&quot;Failed to deserialise access token - {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">Oauth2Error::InvalidRequest</span>
})
});
<span class="kw">let</span> <span class="ident">access_token</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">access_token</span> {
<span class="prelude-val">Ok</span>(<span class="ident">a</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">a</span>,
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">AccessTokenIntrospectResponse::inactive</span>()),
};
<span class="kw">let</span> <span class="ident">valid</span> <span class="op">=</span> <span class="ident">idms</span>
.<span class="ident">check_uat_valid</span>(<span class="kw-2">&amp;</span><span class="ident">access_token</span>.<span class="ident">uat</span>, <span class="ident">ct</span>)
.<span class="ident">map_err</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="macro">admin_error!</span>(<span class="string">&quot;Account is not valid&quot;</span>));
<span class="kw">match</span> <span class="ident">valid</span> {
<span class="prelude-val">Ok</span>(<span class="bool-val">true</span>) <span class="op">=</span><span class="op">&gt;</span> {}
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">AccessTokenIntrospectResponse::inactive</span>()),
};
<span class="kw">let</span> <span class="ident">scope</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">access_token</span>.<span class="ident">scopes</span>.<span class="ident">is_empty</span>() {
<span class="prelude-val">None</span>
} <span class="kw">else</span> {
<span class="prelude-val">Some</span>(<span class="ident">access_token</span>.<span class="ident">scopes</span>.<span class="ident">join</span>(<span class="string">&quot; &quot;</span>))
};
<span class="prelude-val">Ok</span>(<span class="ident">AccessTokenIntrospectResponse</span> {
<span class="ident">active</span>: <span class="bool-val">true</span>,
<span class="ident">scope</span>,
<span class="ident">client_id</span>: <span class="prelude-val">Some</span>(<span class="ident">client_id</span>),
<span class="ident">username</span>: <span class="prelude-val">Some</span>(<span class="ident">access_token</span>.<span class="ident">uat</span>.<span class="ident">spn</span>.<span class="ident">clone</span>()),
<span class="ident">token_type</span>: <span class="prelude-val">Some</span>(<span class="ident">access_token</span>.<span class="ident">toktype</span>.<span class="ident">to_string</span>()),
<span class="ident">exp</span>: <span class="prelude-val">Some</span>(<span class="ident">access_token</span>.<span class="ident">exp</span>),
<span class="ident">iat</span>: <span class="prelude-val">Some</span>(<span class="ident">access_token</span>.<span class="ident">iat</span>),
<span class="ident">nbf</span>: <span class="prelude-val">Some</span>(<span class="ident">access_token</span>.<span class="ident">nbf</span>),
<span class="ident">sub</span>: <span class="prelude-val">Some</span>(<span class="ident">access_token</span>.<span class="ident">uat</span>.<span class="ident">uuid</span>.<span class="ident">to_string</span>()),
<span class="ident">aud</span>: <span class="prelude-val">None</span>,
<span class="ident">iss</span>: <span class="prelude-val">None</span>,
<span class="ident">jti</span>: <span class="prelude-val">None</span>,
})
}
}
<span class="kw">fn</span> <span class="ident">parse_basic_authz</span>(<span class="ident">client_authz</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(<span class="ident">String</span>, <span class="ident">String</span>), <span class="ident">Oauth2Error</span><span class="op">&gt;</span> {
<span class="comment">// Check the client_authz</span>
<span class="kw">let</span> <span class="ident">authz</span> <span class="op">=</span> <span class="ident">base64::decode</span>(<span class="kw-2">&amp;</span><span class="ident">client_authz</span>)
.<span class="ident">map_err</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> {
<span class="macro">admin_error!</span>(<span class="string">&quot;Basic authz invalid base64&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})
.<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">data</span><span class="op">|</span> {
<span class="ident">String::from_utf8</span>(<span class="ident">data</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> {
<span class="macro">admin_error!</span>(<span class="string">&quot;Basic authz invalid utf8&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})
})<span class="question-mark">?</span>;
<span class="comment">// Get the first :, it should be our delim.</span>
<span class="comment">//</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">split_iter</span> <span class="op">=</span> <span class="ident">authz</span>.<span class="ident">split</span>(<span class="string">&#39;:&#39;</span>);
<span class="kw">let</span> <span class="ident">client_id</span> <span class="op">=</span> <span class="ident">split_iter</span>.<span class="ident">next</span>().<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
<span class="macro">admin_error!</span>(<span class="string">&quot;Basic authz invalid format (corrupt input?)&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})<span class="question-mark">?</span>;
<span class="kw">let</span> <span class="ident">secret</span> <span class="op">=</span> <span class="ident">split_iter</span>.<span class="ident">next</span>().<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> {
<span class="macro">admin_error!</span>(<span class="string">&quot;Basic authz invalid format (missing &#39;:&#39; seperator?)&quot;</span>);
<span class="ident">Oauth2Error::AuthenticationRequired</span>
})<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>((<span class="ident">client_id</span>.<span class="ident">to_string</span>(), <span class="ident">secret</span>.<span class="ident">to_string</span>()))
}
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
@ -1702,6 +2020,9 @@
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::idm::server</span>::{<span class="ident">IdmServer</span>, <span class="ident">IdmServerTransaction</span>};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::prelude</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::event::ModifyEvent</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::modify</span>::{<span class="ident">Modify</span>, <span class="ident">ModifyList</span>};
<span class="kw">use</span> <span class="ident">kanidm_proto::oauth2</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="ident">kanidm_proto::v1</span>::{<span class="ident">AuthType</span>, <span class="ident">UserAuthToken</span>};
<span class="kw">use</span> <span class="ident">webauthn_rs::base64_data::Base64UrlSafeData</span>;
@ -2207,6 +2528,85 @@
);
})
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_idm_oauth2_token_introspect</span>() {
<span class="macro">run_idm_test!</span>(<span class="op">|</span><span class="ident">_qs</span>: <span class="kw-2">&amp;</span><span class="ident">QueryServer</span>,
<span class="ident">idms</span>: <span class="kw-2">&amp;</span><span class="ident">IdmServer</span>,
<span class="ident">_idms_delayed</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">IdmServerDelayed</span><span class="op">|</span> {
<span class="kw">let</span> <span class="ident">ct</span> <span class="op">=</span> <span class="ident">Duration::from_secs</span>(<span class="ident">TEST_CURRENT_TIME</span>);
<span class="kw">let</span> (<span class="ident">secret</span>, <span class="ident">uat</span>, <span class="ident">ident</span>) <span class="op">=</span> <span class="ident">setup_oauth2_resource_server</span>(<span class="ident">idms</span>, <span class="ident">ct</span>);
<span class="kw">let</span> <span class="ident">client_authz</span> <span class="op">=</span> <span class="ident">base64::encode</span>(<span class="macro">format!</span>(<span class="string">&quot;test_resource_server:{}&quot;</span>, <span class="ident">secret</span>));
<span class="kw">let</span> <span class="ident">idms_prox_read</span> <span class="op">=</span> <span class="ident">idms</span>.<span class="ident">proxy_read</span>();
<span class="comment">// == Setup the authorisation request</span>
<span class="kw">let</span> (<span class="ident">code_verifier</span>, <span class="ident">code_challenge</span>) <span class="op">=</span> <span class="macro">create_code_verifier!</span>(<span class="string">&quot;Whar Garble&quot;</span>);
<span class="kw">let</span> <span class="ident">consent_request</span> <span class="op">=</span>
<span class="macro">good_authorisation_request!</span>(<span class="ident">idms_prox_read</span>, <span class="kw-2">&amp;</span><span class="ident">ident</span>, <span class="kw-2">&amp;</span><span class="ident">uat</span>, <span class="ident">ct</span>, <span class="ident">code_challenge</span>);
<span class="comment">// == Manually submit the consent token to the permit for the permit_success</span>
<span class="kw">let</span> <span class="ident">permit_success</span> <span class="op">=</span> <span class="ident">idms_prox_read</span>
.<span class="ident">check_oauth2_authorise_permit</span>(<span class="kw-2">&amp;</span><span class="ident">ident</span>, <span class="kw-2">&amp;</span><span class="ident">uat</span>, <span class="kw-2">&amp;</span><span class="ident">consent_request</span>.<span class="ident">consent_token</span>, <span class="ident">ct</span>)
.<span class="ident">expect</span>(<span class="string">&quot;Failed to perform oauth2 permit&quot;</span>);
<span class="kw">let</span> <span class="ident">token_req</span> <span class="op">=</span> <span class="ident">AccessTokenRequest</span> {
<span class="ident">grant_type</span>: <span class="string">&quot;authorization_code&quot;</span>.<span class="ident">to_string</span>(),
<span class="ident">code</span>: <span class="ident">permit_success</span>.<span class="ident">code</span>.<span class="ident">clone</span>(),
<span class="ident">redirect_uri</span>: <span class="ident">Url::parse</span>(<span class="string">&quot;https://demo.example.com/oauth2/result&quot;</span>).<span class="ident">unwrap</span>(),
<span class="ident">client_id</span>: <span class="prelude-val">None</span>,
<span class="ident">code_verifier</span>,
};
<span class="kw">let</span> <span class="ident">oauth2_token</span> <span class="op">=</span> <span class="ident">idms_prox_read</span>
.<span class="ident">check_oauth2_token_exchange</span>(<span class="kw-2">&amp;</span><span class="ident">client_authz</span>, <span class="kw-2">&amp;</span><span class="ident">token_req</span>, <span class="ident">ct</span>)
.<span class="ident">expect</span>(<span class="string">&quot;Unable to exchange for oauth2 token&quot;</span>);
<span class="comment">// Okay, now we have the token, we can check it works with introspect.</span>
<span class="kw">let</span> <span class="ident">intr_request</span> <span class="op">=</span> <span class="ident">AccessTokenIntrospectRequest</span> {
<span class="ident">token</span>: <span class="ident">oauth2_token</span>.<span class="ident">access_token</span>.<span class="ident">clone</span>(),
<span class="ident">token_type_hint</span>: <span class="prelude-val">None</span>,
};
<span class="kw">let</span> <span class="ident">intr_response</span> <span class="op">=</span> <span class="ident">idms_prox_read</span>
.<span class="ident">check_oauth2_token_introspect</span>(<span class="kw-2">&amp;</span><span class="ident">client_authz</span>, <span class="kw-2">&amp;</span><span class="ident">intr_request</span>, <span class="ident">ct</span>)
.<span class="ident">expect</span>(<span class="string">&quot;Failed to inspect token&quot;</span>);
<span class="macro">assert!</span>(<span class="ident">intr_response</span>.<span class="ident">active</span>);
<span class="macro">assert!</span>(<span class="ident">intr_response</span>.<span class="ident">scope</span>.<span class="ident">as_deref</span>() <span class="op">=</span><span class="op">=</span> <span class="prelude-val">Some</span>(<span class="string">&quot;test&quot;</span>));
<span class="macro">assert!</span>(<span class="ident">intr_response</span>.<span class="ident">client_id</span>.<span class="ident">as_deref</span>() <span class="op">=</span><span class="op">=</span> <span class="prelude-val">Some</span>(<span class="string">&quot;test_resource_server&quot;</span>));
<span class="macro">assert!</span>(<span class="ident">intr_response</span>.<span class="ident">username</span>.<span class="ident">as_deref</span>() <span class="op">=</span><span class="op">=</span> <span class="prelude-val">Some</span>(<span class="string">&quot;admin@example.com&quot;</span>));
<span class="macro">assert!</span>(<span class="ident">intr_response</span>.<span class="ident">token_type</span>.<span class="ident">as_deref</span>() <span class="op">=</span><span class="op">=</span> <span class="prelude-val">Some</span>(<span class="string">&quot;access_token&quot;</span>));
<span class="macro">assert!</span>(<span class="ident">intr_response</span>.<span class="ident">iat</span> <span class="op">=</span><span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">ct</span>.<span class="ident">as_secs</span>() <span class="kw">as</span> <span class="ident">i64</span>));
<span class="macro">assert!</span>(<span class="ident">intr_response</span>.<span class="ident">nbf</span> <span class="op">=</span><span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">ct</span>.<span class="ident">as_secs</span>() <span class="kw">as</span> <span class="ident">i64</span>));
<span class="ident">drop</span>(<span class="ident">idms_prox_read</span>);
<span class="comment">// start a write,</span>
<span class="kw">let</span> <span class="ident">idms_prox_write</span> <span class="op">=</span> <span class="ident">idms</span>.<span class="ident">proxy_write</span>(<span class="ident">ct</span>);
<span class="comment">// Expire the account, should cause introspect to return inactive.</span>
<span class="kw">let</span> <span class="ident">v_expire</span> <span class="op">=</span> <span class="ident">Value::new_datetime_epoch</span>(<span class="ident">Duration::from_secs</span>(<span class="ident">TEST_CURRENT_TIME</span> <span class="op">-</span> <span class="number">1</span>));
<span class="kw">let</span> <span class="ident">me_inv_m</span> <span class="op">=</span> <span class="kw">unsafe</span> {
<span class="ident">ModifyEvent::new_internal_invalid</span>(
<span class="macro">filter!</span>(<span class="ident">f_eq</span>(<span class="string">&quot;name&quot;</span>, <span class="ident">PartialValue::new_iname</span>(<span class="string">&quot;admin&quot;</span>))),
<span class="ident">ModifyList::new_list</span>(<span class="macro">vec!</span>[<span class="ident">Modify::Present</span>(
<span class="ident">AttrString::from</span>(<span class="string">&quot;account_expire&quot;</span>),
<span class="ident">v_expire</span>,
)]),
)
};
<span class="comment">// go!</span>
<span class="macro">assert!</span>(<span class="ident">idms_prox_write</span>.<span class="ident">qs_write</span>.<span class="ident">modify</span>(<span class="kw-2">&amp;</span><span class="ident">me_inv_m</span>).<span class="ident">is_ok</span>());
<span class="macro">assert!</span>(<span class="ident">idms_prox_write</span>.<span class="ident">commit</span>().<span class="ident">is_ok</span>());
<span class="comment">// start a new read</span>
<span class="comment">// check again.</span>
<span class="kw">let</span> <span class="ident">idms_prox_read</span> <span class="op">=</span> <span class="ident">idms</span>.<span class="ident">proxy_read</span>();
<span class="kw">let</span> <span class="ident">intr_response</span> <span class="op">=</span> <span class="ident">idms_prox_read</span>
.<span class="ident">check_oauth2_token_introspect</span>(<span class="kw-2">&amp;</span><span class="ident">client_authz</span>, <span class="kw-2">&amp;</span><span class="ident">intr_request</span>, <span class="ident">ct</span>)
.<span class="ident">expect</span>(<span class="string">&quot;Failed to inspect token&quot;</span>);
<span class="macro">assert!</span>(<span class="op">!</span><span class="ident">intr_response</span>.<span class="ident">active</span>);
})
}
}
</code></pre></div>
</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>

View file

@ -3850,6 +3850,31 @@
<span id="3850">3850</span>
<span id="3851">3851</span>
<span id="3852">3852</span>
<span id="3853">3853</span>
<span id="3854">3854</span>
<span id="3855">3855</span>
<span id="3856">3856</span>
<span id="3857">3857</span>
<span id="3858">3858</span>
<span id="3859">3859</span>
<span id="3860">3860</span>
<span id="3861">3861</span>
<span id="3862">3862</span>
<span id="3863">3863</span>
<span id="3864">3864</span>
<span id="3865">3865</span>
<span id="3866">3866</span>
<span id="3867">3867</span>
<span id="3868">3868</span>
<span id="3869">3869</span>
<span id="3870">3870</span>
<span id="3871">3871</span>
<span id="3872">3872</span>
<span id="3873">3873</span>
<span id="3874">3874</span>
<span id="3875">3875</span>
<span id="3876">3876</span>
<span id="3877">3877</span>
</pre><pre class="rust"><code><span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::credential::policy::CryptoPolicy</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::credential::softlock::CredSoftLock</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::credential::webauthn::WebauthnDomainConfig</span>;
@ -3867,8 +3892,9 @@
};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::idm::mfareg</span>::{<span class="ident">MfaRegCred</span>, <span class="ident">MfaRegNext</span>, <span class="ident">MfaRegSession</span>};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::idm::oauth2</span>::{
<span class="ident">AccessTokenRequest</span>, <span class="ident">AccessTokenResponse</span>, <span class="ident">AuthorisationRequest</span>, <span class="ident">AuthorisePermitSuccess</span>,
<span class="ident">ConsentRequest</span>, <span class="ident">Oauth2Error</span>, <span class="ident">Oauth2ResourceServers</span>, <span class="ident">Oauth2ResourceServersReadTransaction</span>,
<span class="ident">AccessTokenIntrospectRequest</span>, <span class="ident">AccessTokenIntrospectResponse</span>, <span class="ident">AccessTokenRequest</span>,
<span class="ident">AccessTokenResponse</span>, <span class="ident">AuthorisationRequest</span>, <span class="ident">AuthorisePermitSuccess</span>, <span class="ident">ConsentRequest</span>, <span class="ident">Oauth2Error</span>,
<span class="ident">Oauth2ResourceServers</span>, <span class="ident">Oauth2ResourceServersReadTransaction</span>,
<span class="ident">Oauth2ResourceServersWriteTransaction</span>,
};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::idm::radius::RadiusAccount</span>;
@ -4198,7 +4224,6 @@
<span class="kw">fn</span> <span class="ident">get_uat_bundy_txn</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="kw-2">&amp;</span><span class="ident">HS512</span>;
<span class="comment">// ! TRACING INTEGRATED</span>
<span class="kw">fn</span> <span class="ident">validate_and_parse_uat</span>(
<span class="kw-2">&amp;</span><span class="self">self</span>,
<span class="ident">token</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">str</span><span class="op">&gt;</span>,
@ -4225,7 +4250,22 @@
}
}
<span class="comment">// ! TRACING INTEGRATED</span>
<span class="kw">fn</span> <span class="ident">check_uat_valid</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">uat</span>: <span class="kw-2">&amp;</span><span class="ident">UserAuthToken</span>, <span class="ident">ct</span>: <span class="ident">Duration</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">bool</span>, <span class="ident">OperationError</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">entry</span> <span class="op">=</span> <span class="self">self</span>
.<span class="ident">get_qs_txn</span>()
.<span class="ident">internal_search_uuid</span>(<span class="kw-2">&amp;</span><span class="ident">uat</span>.<span class="ident">uuid</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">&quot;from_ro_uat failed&quot;</span>);
<span class="ident">e</span>
})<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(<span class="ident">Account::check_within_valid_time</span>(
<span class="ident">ct</span>,
<span class="ident">entry</span>.<span class="ident">get_ava_single_datetime</span>(<span class="string">&quot;account_valid_from&quot;</span>).<span class="ident">as_ref</span>(),
<span class="ident">entry</span>.<span class="ident">get_ava_single_datetime</span>(<span class="string">&quot;account_expire&quot;</span>).<span class="ident">as_ref</span>(),
))
}
<span class="kw">fn</span> <span class="ident">process_uat_to_identity</span>(
<span class="kw-2">&amp;</span><span class="self">self</span>,
<span class="ident">uat</span>: <span class="kw-2">&amp;</span><span class="ident">UserAuthToken</span>,
@ -4928,6 +4968,16 @@
<span class="self">self</span>.<span class="ident">oauth2rs</span>
.<span class="ident">check_oauth2_token_exchange</span>(<span class="ident">client_authz</span>, <span class="ident">token_req</span>, <span class="ident">ct</span>)
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">check_oauth2_token_introspect</span>(
<span class="kw-2">&amp;</span><span class="self">self</span>,
<span class="ident">client_authz</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>,
<span class="ident">intr_req</span>: <span class="kw-2">&amp;</span><span class="ident">AccessTokenIntrospectRequest</span>,
<span class="ident">ct</span>: <span class="ident">Duration</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">AccessTokenIntrospectResponse</span>, <span class="ident">Oauth2Error</span><span class="op">&gt;</span> {
<span class="self">self</span>.<span class="ident">oauth2rs</span>
.<span class="ident">check_oauth2_token_introspect</span>(<span class="self">self</span>, <span class="ident">client_authz</span>, <span class="ident">intr_req</span>, <span class="ident">ct</span>)
}
}
<span class="kw">impl</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span> <span class="ident">IdmServerTransaction</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">IdmServerProxyWriteTransaction</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span> {

View file

@ -1,91 +1,146 @@
<!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="Source of the Rust file `kanidm_proto&#x2F;src&#x2F;oauth2.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>oauth2.rs - source</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="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[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">&#9776;</div><a href='../../kanidm_proto/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="18" height="18" alt="Pick another theme!" src="../../brush.svg"></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 width="18" height="18" alt="Change settings" src="../../wheel.svg"></a></div></form></nav><section id="main" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<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>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<span id="70">70</span>
<span id="71">71</span>
<span id="72">72</span>
<span id="73">73</span>
<span id="74">74</span>
<span id="75">75</span>
<span id="76">76</span>
<span id="77">77</span>
<span id="78">78</span>
<span id="79">79</span>
<span id="80">80</span>
<span id="81">81</span>
<span id="82">82</span>
<span id="83">83</span>
<span id="84">84</span>
<span id="85">85</span>
<span id="86">86</span>
<span id="87">87</span>
<span id="88">88</span>
<!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="Source of the Rust file `kanidm_proto&#x2F;src&#x2F;oauth2.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>oauth2.rs - source</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="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[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">&#9776;</div><a href='../../kanidm_proto/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="18" height="18" alt="Pick another theme!" src="../../brush.svg"></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 width="18" height="18" alt="Change settings" src="../../wheel.svg"></a></div></form></nav><section id="main" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<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>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
</pre><pre class="rust"><code><span class="kw">use</span> <span class="ident">url::Url</span>;
<span class="kw">use</span> <span class="ident">webauthn_rs::base64_data::Base64UrlSafeData</span>;
@ -166,6 +221,61 @@
<span class="kw">pub</span> <span class="ident">scope</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Serialize</span>, <span class="ident">Deserialize</span>, <span class="ident">Debug</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">AccessTokenIntrospectRequest</span> {
<span class="kw">pub</span> <span class="ident">token</span>: <span class="ident">String</span>,
<span class="doccomment">/// Generally not needed. See:</span>
<span class="doccomment">/// &lt;https://datatracker.ietf.org/doc/html/rfc7009#section-4.1.2&gt;</span>
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">token_type_hint</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Serialize</span>, <span class="ident">Deserialize</span>, <span class="ident">Debug</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">AccessTokenIntrospectResponse</span> {
<span class="kw">pub</span> <span class="ident">active</span>: <span class="ident">bool</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">scope</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">client_id</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">username</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">token_type</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">exp</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">i64</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">iat</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">i64</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">nbf</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">i64</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">sub</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">aud</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">iss</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
<span class="attribute">#[<span class="ident">serde</span>(<span class="ident">skip_serializing_if</span> <span class="op">=</span> <span class="string">&quot;Option::is_none&quot;</span>)]</span>
<span class="kw">pub</span> <span class="ident">jti</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>,
}
<span class="kw">impl</span> <span class="ident">AccessTokenIntrospectResponse</span> {
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">inactive</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="self">Self</span> {
<span class="ident">AccessTokenIntrospectResponse</span> {
<span class="ident">active</span>: <span class="bool-val">false</span>,
<span class="ident">scope</span>: <span class="prelude-val">None</span>,
<span class="ident">client_id</span>: <span class="prelude-val">None</span>,
<span class="ident">username</span>: <span class="prelude-val">None</span>,
<span class="ident">token_type</span>: <span class="prelude-val">None</span>,
<span class="ident">exp</span>: <span class="prelude-val">None</span>,
<span class="ident">iat</span>: <span class="prelude-val">None</span>,
<span class="ident">nbf</span>: <span class="prelude-val">None</span>,
<span class="ident">sub</span>: <span class="prelude-val">None</span>,
<span class="ident">aud</span>: <span class="prelude-val">None</span>,
<span class="ident">iss</span>: <span class="prelude-val">None</span>,
<span class="ident">jti</span>: <span class="prelude-val">None</span>,
}
}
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Serialize</span>, <span class="ident">Deserialize</span>, <span class="ident">Debug</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">ErrorResponse</span> {
<span class="kw">pub</span> <span class="ident">error</span>: <span class="ident">String</span>,

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long