diff options
| author | Bryan Newbold <bnewbold@robocracy.org> | 2022-11-10 19:05:16 -0800 | 
|---|---|---|
| committer | Bryan Newbold <bnewbold@robocracy.org> | 2022-11-10 19:05:16 -0800 | 
| commit | f9ca910036cf9020c9fc36b57194d285a0396f9d (patch) | |
| tree | 352ff752a2f8357148bae6811037826b1d7439dc /adenosine-pds | |
| parent | 9bc88f57634af46d38ab811000ee9aa805ed82f6 (diff) | |
| download | adenosine-f9ca910036cf9020c9fc36b57194d285a0396f9d.tar.gz adenosine-f9ca910036cf9020c9fc36b57194d285a0396f9d.zip | |
pds: implement homepage and did.json lookups
Diffstat (limited to 'adenosine-pds')
| -rw-r--r-- | adenosine-pds/src/lib.rs | 47 | 
1 files changed, 42 insertions, 5 deletions
| diff --git a/adenosine-pds/src/lib.rs b/adenosine-pds/src/lib.rs index 9a4aa8a..2f2c114 100644 --- a/adenosine-pds/src/lib.rs +++ b/adenosine-pds/src/lib.rs @@ -183,12 +183,16 @@ impl AtpService {                  router!(request,                      // ============= Web Interface                      (GET) ["/"] => { -                        let host = request.header("Host").unwrap_or("localhost"); -                        if Some(host.to_string()) == config.registration_domain { -                            web_wrap(account_view_handler(&srv, &host, request)) +                        if let Some(ref handle) = config.homepage_handle { +                            web_wrap(account_view_handler(&srv, handle, request))                          } else { -                            let view = GenericHomeView { domain: host.to_string() }; -                            Response::html(view.render().unwrap()) +                            web_wrap(home_view_handler(&srv, request)) +                        } +                    }, +                    (GET) ["/.well-known/did.json"] => { +                        match did_doc_view_handler(&srv, request) { +                            Ok(resp) => resp, +                            Err(e) => web_wrap(Err(e)),                          }                      },                      (GET) ["/about"] => { @@ -675,6 +679,39 @@ fn xrpc_post_handler(      }  } +fn home_view_handler(srv: &Mutex<AtpService>, request: &Request) -> Result<String> { +    let host = request.header("Host").unwrap_or("localhost"); + +    // check if the hostname resolves to a DID (account) +    let did: Option<Did> = { +        // this mutex lock should drop at the end of this block +        let mut srv = srv.lock().or(Err(XrpcError::MutexPoisoned))?; +        srv.atp_db.resolve_handle(host)? +    }; +    if did.is_some() { +        account_view_handler(&srv, &host, request) +    } else { +        let view = GenericHomeView { +            domain: host.to_string(), +        }; +        Ok(view.render()?) +    } +} + +fn did_doc_view_handler(srv: &Mutex<AtpService>, request: &Request) -> Result<Response> { +    let host = request.header("Host").unwrap_or("localhost"); +    let mut srv = srv.lock().or(Err(XrpcError::MutexPoisoned))?; +    if let Some(did) = srv.atp_db.resolve_handle(host)? { +        if did.to_string().starts_with("did:web:") { +            let did_doc = srv.atp_db.get_did_doc(&did)?; +            return Ok(Response::json(&did_doc)); +        } +    }; +    Err(XrpcError::NotFound( +        "no did:web: account registered at this domain".to_string(), +    ))? +} +  // TODO: did, collection, tid have already been parsed by this point  fn account_view_handler(      srv: &Mutex<AtpService>, | 
