76 lines
1.7 KiB
Rust
76 lines
1.7 KiB
Rust
use conduwuit::{Err, Result, utils};
|
|
use conduwuit_macros::admin_command;
|
|
use futures::StreamExt;
|
|
use service::registration_tokens::TokenExpires;
|
|
|
|
#[admin_command]
|
|
pub(super) async fn issue_token(&self, expires: super::TokenExpires) -> Result {
|
|
let expires = {
|
|
if expires.immortal {
|
|
None
|
|
} else if let Some(max_uses) = expires.max_uses {
|
|
Some(TokenExpires::AfterUses(max_uses))
|
|
} else if expires.once {
|
|
Some(TokenExpires::AfterUses(1))
|
|
} else if let Some(max_age) = expires
|
|
.max_age
|
|
.as_deref()
|
|
.map(|max_age| utils::time::timepoint_from_now(utils::time::parse_duration(max_age)?))
|
|
.transpose()?
|
|
{
|
|
Some(TokenExpires::AfterTime(max_age))
|
|
} else {
|
|
unreachable!();
|
|
}
|
|
};
|
|
|
|
let (token, info) = self
|
|
.services
|
|
.registration_tokens
|
|
.issue_token(self.sender_or_service_user().into(), expires);
|
|
|
|
self.write_str(&format!(
|
|
"New registration token issued: `{token}`. {}.",
|
|
if let Some(expires) = info.expires {
|
|
format!("{expires}")
|
|
} else {
|
|
"Never expires".to_owned()
|
|
}
|
|
))
|
|
.await
|
|
}
|
|
|
|
#[admin_command]
|
|
pub(super) async fn revoke_token(&self, token: String) -> Result {
|
|
let Some(token) = self
|
|
.services
|
|
.registration_tokens
|
|
.validate_token(token)
|
|
.await
|
|
else {
|
|
return Err!("This token does not exist or has already expired.");
|
|
};
|
|
|
|
self.services.registration_tokens.revoke_token(token)?;
|
|
|
|
self.write_str("Token revoked successfully.").await
|
|
}
|
|
|
|
#[admin_command]
|
|
pub(super) async fn list_tokens(&self) -> Result {
|
|
let tokens: Vec<_> = self
|
|
.services
|
|
.registration_tokens
|
|
.iterate_tokens()
|
|
.collect()
|
|
.await;
|
|
|
|
self.write_str(&format!("Found {} registration tokens:\n", tokens.len()))
|
|
.await?;
|
|
|
|
for token in tokens {
|
|
self.write_str(&format!("- {token}\n")).await?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|