feat: Implement oauth service and client registration

This commit is contained in:
Ginger committed 2026-06-16 12:50:43 -04:00
1 parent 0932c929c3
commit 7631250278
10 files changed
+358 -2

No files matched your search

+72
View File
@@ -0,0 +1,72 @@
use std::sync::Arc;
use base64::Engine;
use conduwuit::{Result, utils::hash::sha256};
use database::{Deserialized, Json, Map};
use crate::{Dep, config, oauth::client_metadata::ClientMetadata};
pub mod client_metadata;
pub struct Service {
services: Services,
db: Data,
}
struct Data {
clientid_clientmetadata: Arc<Map>,
}
struct Services {
config: Dep<config::Service>,
}
impl crate::Service for Service {
fn build(args: crate::Args<'_>) -> Result<Arc<Self>> {
Ok(Arc::new(Self {
services: Services {
config: args.depend::<config::Service>("config"),
},
db: Data {
clientid_clientmetadata: args.db["clientid_clientmetadata"].clone(),
},
}))
}
fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
}
impl Service {
pub async fn register_client(
&self,
metadata: &ClientMetadata,
) -> Result<String, &'static str> {
metadata.validate()?;
let client_id = base64::prelude::BASE64_STANDARD
.encode(sha256::hash(serde_json::to_string(metadata).unwrap().as_bytes()));
if self
.db
.clientid_clientmetadata
.exists(&client_id)
.await
.is_err()
{
self.db
.clientid_clientmetadata
.raw_put(&client_id, Json(metadata.clone()));
}
Ok(client_id)
}
async fn get_client_registration(&self, client_id: &str) -> Option<ClientMetadata> {
self.db
.clientid_clientmetadata
.get(client_id)
.await
.deserialized()
.ok()
}
}