Skip to content

Commit 06cf5df

Browse files
authored
chore: Updating to atproto-* 0.11.0 (#45)
Signed-off-by: Nick Gerakines <12125+ngerakines@users.noreply.github.com>
1 parent 5586667 commit 06cf5df

20 files changed

+322
-226
lines changed

Cargo.lock

Lines changed: 13 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "aip"
33
version = "0.1.0"
44
edition = "2024"
5-
rust-version = "1.87"
5+
rust-version = "1.89"
66

77
[[bin]]
88
name = "aip"
@@ -18,11 +18,12 @@ path = "src/lib.rs"
1818

1919
[dependencies]
2020
axum = { version = "0.8" }
21-
atproto-client = { version = "0.9.6" }
22-
atproto-identity = { version = "0.9.6", features = ["zeroize"] }
23-
atproto-oauth = { version = "0.9.6", features = ["zeroize"] }
24-
atproto-oauth-axum = { version = "0.9.6", features = ["zeroize"] }
25-
atproto-xrpcs = { version = "0.9.6" }
21+
22+
atproto-identity = { version = "0.11.0", features = ["lru", "zeroize", "hickory-dns"] }
23+
atproto-oauth = { version = "0.11.0", features = ["lru", "zeroize", "hickory-dns"] }
24+
atproto-oauth-axum = { version = "0.11.0", features = ["zeroize"] }
25+
atproto-client = { version = "0.11.0" }
26+
atproto-xrpcs = { version = "0.11.0", features = ["hickory-dns"] }
2627

2728
axum-template = { version = "3.0", features = ["minijinja"] }
2829
minijinja = { version = "2.7", features = ["builtins"] }

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build stage
2-
FROM rust:1.87-slim AS builder
2+
FROM rust:1.89-slim AS builder
33

44
# Install required system dependencies for building
55
RUN apt-get update && apt-get install -y \

src/bin/aip.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use aip::{
2020
};
2121
use anyhow::Result;
2222
use atproto_identity::{
23-
resolve::{IdentityResolver, InnerIdentityResolver, create_resolver},
23+
resolve::{HickoryDnsResolver, InnerIdentityResolver, SharedIdentityResolver},
2424
storage::DidDocumentStorage,
2525
storage_lru::LruDidDocumentStorage,
2626
};
@@ -122,10 +122,12 @@ async fn main() -> Result<()> {
122122
};
123123

124124
// Initialize the DNS resolver
125-
let dns_resolver = create_resolver(config.dns_nameservers.as_ref());
125+
let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(
126+
config.dns_nameservers.as_ref(),
127+
));
126128

127129
// Initialize the identity resolver
128-
let identity_resolver = IdentityResolver(Arc::new(InnerIdentityResolver {
130+
let identity_resolver = SharedIdentityResolver(Arc::new(InnerIdentityResolver {
129131
dns_resolver,
130132
http_client: http_client.clone(),
131133
plc_hostname: config.plc_hostname.clone(),

src/config.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Environment-based configuration types for AIP server runtime settings.
22
33
use anyhow::Result;
4-
use atproto_identity::key::{KeyData, KeyType, generate_key, identify_key};
4+
use atproto_identity::key::{KeyData, identify_key};
55
use std::time::Duration;
66

77
use crate::errors::ConfigError;
@@ -329,13 +329,15 @@ impl TryFrom<Option<String>> for PrivateKeys {
329329
match value {
330330
None => {
331331
// Generate a new P-256 private key if no keys are provided
332-
let key = generate_key(KeyType::P256Private)?;
333-
Ok(Self(vec![key]))
332+
// let key = generate_key(KeyType::P256Private)?;
333+
// Ok(Self(vec![key]))
334+
unreachable!()
334335
}
335336
Some(value) if value.is_empty() => {
336337
// Generate a new P-256 private key if no keys are provided
337-
let key = generate_key(KeyType::P256Private)?;
338-
Ok(Self(vec![key]))
338+
// let key = generate_key(KeyType::P256Private)?;
339+
// Ok(Self(vec![key]))
340+
unreachable!()
339341
}
340342
Some(value) => {
341343
// Parse semicolon-separated list of KeyData DID strings
@@ -347,8 +349,9 @@ impl TryFrom<Option<String>> for PrivateKeys {
347349

348350
if keys.is_empty() {
349351
// Generate a new P-256 private key if parsing resulted in empty list
350-
let key = generate_key(KeyType::P256Private)?;
351-
Ok(Self(vec![key]))
352+
// let key = generate_key(KeyType::P256Private)?;
353+
// Ok(Self(vec![key]))
354+
unreachable!()
352355
} else {
353356
Ok(Self(keys))
354357
}

src/http/context.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
//! Application state and request context management.
22
33
use atproto_identity::{
4-
axum::state::DidDocumentStorageExtractor,
54
key::{KeyData, KeyProvider},
6-
resolve::IdentityResolver,
5+
resolve::SharedIdentityResolver,
76
storage::DidDocumentStorage,
87
};
98
use atproto_oauth::storage::OAuthRequestStorage;
@@ -41,7 +40,7 @@ pub struct AppState {
4140
/// Template engine for rendering HTML responses.
4241
pub template_env: AppEngine,
4342
/// Identity resolver for ATProtocol DIDs
44-
pub identity_resolver: IdentityResolver,
43+
pub identity_resolver: SharedIdentityResolver,
4544
/// Key provider for OAuth signing keys
4645
pub key_provider: Arc<dyn KeyProvider + Send + Sync>,
4746
/// OAuth request storage for ATProtocol flows
@@ -69,10 +68,8 @@ impl FromRef<AppState> for Arc<dyn DPoPNonceProvider> {
6968
}
7069
}
7170

72-
impl FromRef<AppState> for DidDocumentStorageExtractor {
71+
impl FromRef<AppState> for Arc<dyn DidDocumentStorage> {
7372
fn from_ref(app_state: &AppState) -> Self {
74-
atproto_identity::axum::state::DidDocumentStorageExtractor(
75-
app_state.document_storage.clone(),
76-
)
73+
app_state.document_storage.clone()
7774
}
7875
}

src/http/handler_index.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ mod tests {
2424
use crate::oauth::DPoPNonceGenerator;
2525
use crate::storage::SimpleKeyProvider;
2626
use crate::storage::inmemory::MemoryOAuthStorage;
27-
use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage};
27+
use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage};
2828
use atproto_oauth::storage_lru::LruOAuthRequestStorage;
2929
use std::{num::NonZeroUsize, sync::Arc};
3030

@@ -33,8 +33,8 @@ mod tests {
3333

3434
let http_client = reqwest::Client::new();
3535
let dns_nameservers = vec![];
36-
let dns_resolver = create_resolver(&dns_nameservers);
37-
let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new(
36+
let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers));
37+
let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new(
3838
atproto_identity::resolve::InnerIdentityResolver {
3939
http_client: http_client.clone(),
4040
dns_resolver,

src/http/handler_oauth.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ mod tests {
117117
use crate::oauth::DPoPNonceGenerator;
118118
use crate::storage::SimpleKeyProvider;
119119
use crate::storage::inmemory::MemoryOAuthStorage;
120-
use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage};
120+
use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage};
121121
use atproto_oauth::storage_lru::LruOAuthRequestStorage;
122122
use std::{num::NonZeroUsize, sync::Arc};
123123

@@ -126,8 +126,8 @@ mod tests {
126126

127127
let http_client = reqwest::Client::new();
128128
let dns_nameservers = vec![];
129-
let dns_resolver = create_resolver(&dns_nameservers);
130-
let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new(
129+
let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers));
130+
let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new(
131131
atproto_identity::resolve::InnerIdentityResolver {
132132
http_client: http_client.clone(),
133133
dns_resolver,

src/http/handler_par.rs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub(super) struct PushedAuthorizationRequest {
3838

3939
// ATProtocol-specific parameter (legacy, prefer login_hint)
4040
pub subject: Option<String>,
41-
41+
4242
/// JWT client assertion for private_key_jwt authentication (RFC 7523)
4343
pub client_assertion: Option<String>,
4444
/// Client assertion type for private_key_jwt authentication
@@ -284,11 +284,13 @@ fn extract_client_auth_from_headers(headers: &HeaderMap) -> Option<ClientAuthent
284284
}
285285

286286
/// Extract client authentication from PAR request form data
287-
fn extract_client_auth_from_request(request: &PushedAuthorizationRequest) -> Option<ClientAuthentication> {
287+
fn extract_client_auth_from_request(
288+
request: &PushedAuthorizationRequest,
289+
) -> Option<ClientAuthentication> {
288290
// Check for JWT client assertion first (private_key_jwt)
289-
if let (Some(client_assertion), Some(client_assertion_type)) =
290-
(&request.client_assertion, &request.client_assertion_type) {
291-
291+
if let (Some(client_assertion), Some(client_assertion_type)) =
292+
(&request.client_assertion, &request.client_assertion_type)
293+
{
292294
// Validate the assertion type
293295
if client_assertion_type == "urn:ietf:params:oauth:client-assertion-type:jwt-bearer" {
294296
return Some(ClientAuthentication {
@@ -299,7 +301,7 @@ fn extract_client_auth_from_request(request: &PushedAuthorizationRequest) -> Opt
299301
});
300302
}
301303
}
302-
304+
303305
// PAR typically uses client credentials from headers, not form data
304306
// But we'll support client_id from the form
305307
Some(ClientAuthentication {
@@ -339,28 +341,33 @@ fn authenticate_client(
339341
ClientAuthMethod::PrivateKeyJwt => {
340342
// Require JWT client assertion
341343
if let Some(client_assertion) = client_auth.client_assertion.as_ref() {
342-
// Construct token endpoint URL for audience validation
344+
// Construct token endpoint URL for audience validation
343345
// Note: PAR uses token endpoint as audience per RFC 9126
344346
let token_endpoint = format!("{}/oauth/token", issuer);
345-
347+
346348
// Validate the JWT client assertion
347349
let par_endpoint = format!("{}/oauth/par", issuer);
348-
match validate_client_assertion(client_assertion, client, &token_endpoint, Some(&par_endpoint)) {
350+
match validate_client_assertion(
351+
client_assertion,
352+
client,
353+
&token_endpoint,
354+
Some(&par_endpoint),
355+
) {
349356
Ok(validated_client_id) => {
350357
// Ensure the validated client_id matches the expected client
351358
if validated_client_id == client.client_id {
352359
Ok(())
353360
} else {
354361
Err(OAuthError::InvalidClient(
355-
"JWT client_id does not match expected client".to_string()
362+
"JWT client_id does not match expected client".to_string(),
356363
))
357364
}
358365
}
359366
Err(e) => Err(e),
360367
}
361368
} else {
362369
Err(OAuthError::InvalidClient(
363-
"Missing client_assertion for private_key_jwt authentication".to_string()
370+
"Missing client_assertion for private_key_jwt authentication".to_string(),
364371
))
365372
}
366373
}

src/http/handler_userinfo.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ mod tests {
118118
use crate::oauth::DPoPNonceGenerator;
119119
use crate::storage::SimpleKeyProvider;
120120
use crate::storage::inmemory::MemoryOAuthStorage;
121-
use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage};
121+
use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage};
122122
use atproto_oauth::storage_lru::LruOAuthRequestStorage;
123123
use std::{num::NonZeroUsize, sync::Arc};
124124

@@ -127,8 +127,8 @@ mod tests {
127127

128128
let http_client = reqwest::Client::new();
129129
let dns_nameservers = vec![];
130-
let dns_resolver = create_resolver(&dns_nameservers);
131-
let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new(
130+
let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers));
131+
let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new(
132132
atproto_identity::resolve::InnerIdentityResolver {
133133
http_client: http_client.clone(),
134134
dns_resolver,

0 commit comments

Comments
 (0)