aboutsummaryrefslogtreecommitdiffstats
path: root/adenosine-pds
diff options
context:
space:
mode:
Diffstat (limited to 'adenosine-pds')
-rw-r--r--adenosine-pds/src/db.rs26
-rw-r--r--adenosine-pds/src/lib.rs32
2 files changed, 44 insertions, 14 deletions
diff --git a/adenosine-pds/src/db.rs b/adenosine-pds/src/db.rs
index 051588d..b94689a 100644
--- a/adenosine-pds/src/db.rs
+++ b/adenosine-pds/src/db.rs
@@ -138,6 +138,32 @@ impl AtpDatabase {
Ok(did_maybe.map(|v| Did::from_str(&v).expect("valid DID in database")))
}
+ /// Looks up local account handle associated with a DID
+ ///
+ /// TODO: remote lookups, and/or local cache of external DIDs
+ pub fn resolve_did(&mut self, did: &Did) -> Result<Option<String>> {
+ let mut stmt = self
+ .conn
+ .prepare_cached("SELECT handle FROM account WHERE did = $1")?;
+ let handle_maybe: Option<String> = stmt
+ .query_row(params!(did.to_string()), |row| row.get(0))
+ .optional()?;
+ Ok(handle_maybe)
+ }
+
+ /// Looks up local DID associated with handle
+ ///
+ /// TODO: remote lookups, and/or local cache of external DIDs
+ pub fn resolve_handle(&mut self, handle: &str) -> Result<Option<Did>> {
+ let mut stmt = self
+ .conn
+ .prepare_cached("SELECT did FROM account WHERE handle = $1")?;
+ let did_maybe: Option<String> = stmt
+ .query_row(params!(handle), |row| row.get(0))
+ .optional()?;
+ Ok(did_maybe.map(|v| Did::from_str(&v).expect("valid DID in database")))
+ }
+
pub fn delete_session(&mut self, jwt: &str) -> Result<bool> {
let mut stmt = self
.conn
diff --git a/adenosine-pds/src/lib.rs b/adenosine-pds/src/lib.rs
index 738a061..7b517f2 100644
--- a/adenosine-pds/src/lib.rs
+++ b/adenosine-pds/src/lib.rs
@@ -383,21 +383,25 @@ fn xrpc_get_handler(
}
Ok(json!({ "records": record_list }))
}
- "com.atproto.repo.describe" => {
- let did = Did::from_str(&xrpc_required_param(request, "user")?)?;
- // TODO: resolve handle?
- let handle = did.to_string();
+ "com.atproto.session.get" => {
let mut srv = srv.lock().expect("service mutex");
- let did_doc = srv.atp_db.get_did_doc(&did)?;
- let collections: Vec<String> = srv.repo.collections(&did)?;
- let desc = RepoDescribe {
- name: handle,
- did: did.to_string(),
- didDoc: did_doc,
- collections: collections,
- nameIsCorrect: true,
- };
- Ok(json!(desc))
+ let auth_did = &xrpc_check_auth_header(&mut srv, request, None)?;
+ let handle = srv
+ .atp_db
+ .resolve_did(auth_did)?
+ .expect("registered account has handle");
+ Ok(json!({"did": auth_did.to_string(), "handle": handle}))
+ }
+ "com.atproto.handle.resolve" => {
+ let handle = xrpc_required_param(request, "handle")?;
+ let mut srv = srv.lock().expect("service mutex");
+ match srv.atp_db.resolve_handle(&handle)? {
+ Some(did) => Ok(json!({"did": did.to_string()})),
+ None => Err(XrpcError::NotFound(format!(
+ "could not resolve handle internally: {}",
+ handle
+ )))?,
+ }
}
// =========== app.bsky methods
"app.bsky.actor.getProfile" => {