From 8e6ace2fe2db7aa3bd4fb09eae5ca8d8c26f112a Mon Sep 17 00:00:00 2001 From: Tyler <26290074+tylersayshi@users.noreply.github.com> Date: Wed, 3 Jun 2026 15:16:48 -0700 Subject: [PATCH] fix: derive lexicon DNS authority from all-but-last NSID segment Permission-set expansion resolved the lexicon's DNS authority using a fixed `parts[..2]`, which only works for three-segment NSIDs. For a four-segment NSID such as community.lexicon.bookmarks.authManageBookmarks this dropped a segment and queried _lexicon.lexicon.community instead of _lexicon.bookmarks.lexicon.community, failing with "DNS resolution failed: ... no record found". The authority is every NSID segment except the last (the name), reversed. Use parts[..parts.len() - 1] to match the spec and the existing extract_namespace_authority helper, and update the DNS authority test with three/four-segment and bookmarks regression cases. --- crates/tranquil-scopes/src/permission_set.rs | 37 +++++++++----------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/crates/tranquil-scopes/src/permission_set.rs b/crates/tranquil-scopes/src/permission_set.rs index 4c99c56..6f981d9 100644 --- a/crates/tranquil-scopes/src/permission_set.rs +++ b/crates/tranquil-scopes/src/permission_set.rs @@ -171,7 +171,7 @@ async fn fetch_lexicon_via_atproto(nsid: &str) -> Result String { + let parts: Vec<&str> = nsid.split('.').collect(); + parts[..parts.len() - 1] + .iter() + .rev() + .cloned() + .collect::>() + .join(".") + } + #[test] fn test_nsid_authority_extraction_for_dns() { - let nsid = "io.atcr.authFullApp"; - let parts: Vec<&str> = nsid.split('.').collect(); - let authority = parts[..2] - .iter() - .rev() - .cloned() - .collect::>() - .join("."); - assert_eq!(authority, "atcr.io"); - - let nsid2 = "app.bsky.feed.post"; - let parts2: Vec<&str> = nsid2.split('.').collect(); - let authority2 = parts2[..2] - .iter() - .rev() - .cloned() - .collect::>() - .join("."); - assert_eq!(authority2, "bsky.app"); + assert_eq!(dns_authority("io.atcr.authFullApp"), "atcr.io"); + assert_eq!(dns_authority("app.bsky.feed.post"), "feed.bsky.app"); + assert_eq!( + dns_authority("community.lexicon.bookmarks.authManageBookmarks"), + "bookmarks.lexicon.community" + ); } }