pub struct CredentialStore<S: SecretsStore> { /* private fields */ }Expand description
Credential store for API key authentication.
Wraps a SecretsStore implementation and stores credentials as encrypted
JSON blobs keyed by API key name under the credentials scope.
Implementations§
Source§impl<S: SecretsStore> CredentialStore<S>
impl<S: SecretsStore> CredentialStore<S>
Sourcepub fn new(store: S) -> Self
pub fn new(store: S) -> Self
Create a new credential store backed by the provided secrets store.
Sourcepub fn store(&self) -> &S
pub fn store(&self) -> &S
Borrow the underlying secrets store.
Useful for constructing sibling typed stores (e.g.
crate::RegistryCredentialStore / crate::GitCredentialStore) that
share the same concrete backing store without re-opening it. When S is
an Arc<_> (the common case), call .clone() on the returned reference
for a cheap refcount bump.
Sourcepub async fn validate(
&self,
api_key: &str,
api_secret: &str,
) -> Result<Option<Vec<String>>>
pub async fn validate( &self, api_key: &str, api_secret: &str, ) -> Result<Option<Vec<String>>>
Validate an API key and secret pair.
Returns Some(roles) if the credentials are valid, None if invalid.
§Arguments
api_key- The API key (used as the secret name in the store)api_secret- The password/secret to verify against the stored hash
§Errors
Returns a SecretsError if there is a storage or decryption error
(NOT for invalid credentials – that returns Ok(None)).
Sourcepub async fn create_api_key(
&self,
api_key: &str,
password: &str,
roles: &[&str],
) -> Result<()>
pub async fn create_api_key( &self, api_key: &str, password: &str, roles: &[&str], ) -> Result<()>
Create a new API key credential.
The password is hashed with Argon2id before storage. If a credential with the same key already exists, it will be overwritten.
§Arguments
api_key- The API key identifierpassword- The password/secret to hash and storeroles- Roles assigned to this credential
§Errors
Returns a SecretsError if hashing or storage fails.
Sourcepub async fn delete_api_key(&self, api_key: &str) -> Result<()>
pub async fn delete_api_key(&self, api_key: &str) -> Result<()>
Sourcepub async fn exists(&self, api_key: &str) -> Result<bool>
pub async fn exists(&self, api_key: &str) -> Result<bool>
Check if an API key credential exists.
§Errors
Returns a SecretsError if there is a storage or decryption error.
Sourcepub async fn set_roles(&self, api_key: &str, roles: &[&str]) -> Result<()>
pub async fn set_roles(&self, api_key: &str, roles: &[&str]) -> Result<()>
Overwrite the roles array on an existing credential, preserving the password hash. Use this to keep credential roles in sync with the authoritative user-store role when an admin changes a user’s role.
§Arguments
api_key- The API key whose roles should be updatedroles- The new role list (replaces existing)
§Errors
Returns SecretsError::NotFound if the credential doesn’t exist, or a
SecretsError if the storage or (de)serialisation fails.
Sourcepub async fn ensure_admin(&self, api_key: &str, password: &str) -> Result<bool>
pub async fn ensure_admin(&self, api_key: &str, password: &str) -> Result<bool>
Ensure a default admin credential exists.
If no credential with the given api_key exists, one is created with
the provided password and ["admin"] role. Returns the password that
was set (either the provided one or the existing one if already present).
§Arguments
api_key- The admin API key name (e.g. “admin”)password- The password to use if the credential doesn’t exist
§Returns
true if a new credential was created, false if one already existed.
§Errors
Returns a SecretsError if hashing or storage fails during creation.
Trait Implementations§
Auto Trait Implementations§
impl<S> Freeze for CredentialStore<S>where
S: Freeze,
impl<S> RefUnwindSafe for CredentialStore<S>where
S: RefUnwindSafe,
impl<S> Send for CredentialStore<S>
impl<S> Sync for CredentialStore<S>
impl<S> Unpin for CredentialStore<S>where
S: Unpin,
impl<S> UnsafeUnpin for CredentialStore<S>where
S: UnsafeUnpin,
impl<S> UnwindSafe for CredentialStore<S>where
S: UnwindSafe,
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more