atproto pds in zig pds.zat.dev
pds atproto
25

Configure Feed

Select the types of activity you want to include in your feed.

Hide unavailable passkey login path

zzstoatzz (May 27, 2026, 12:40 PM -0500) d3aac10a 31e6a28b

+12 -1
+12 -1
src/atproto/oauth.zig
··· 147 147 return oauthError(request, .bad_request, "invalid_scope", "Failed to summarize requested permission set"); 148 148 }; 149 149 const issuer = config.publicUrl(); 150 + const passkey_html = try passkeyLoginHtml(allocator, oauth_request.login_hint); 150 151 const html = try std.fmt.allocPrint(allocator, 151 152 \\<!doctype html> 152 153 \\<html lang="en"> ··· 220 221 \\<input type="hidden" name="request_uri" value="{s}{s}"> 221 222 \\<label for="username">account</label> 222 223 \\<input id="username" name="username" autocomplete="username" placeholder="bufo.uk" value="{s}" autofocus> 223 - \\<button id="passkey-login" type="button">continue with passkey</button> 224 + \\{s} 224 225 \\<details class="password-fallback"> 225 226 \\<summary>use password instead</summary> 226 227 \\<div class="password-inner"> ··· 257 258 request_uri_prefix, 258 259 oauth_request.request_id, 259 260 try htmlEscape(allocator, oauth_request.login_hint orelse ""), 261 + passkey_html, 260 262 try htmlEscape(allocator, issuer), 261 263 }); 262 264 try respondHtml(request, .ok, html); 265 + } 266 + 267 + fn passkeyLoginHtml(allocator: std.mem.Allocator, login_hint: ?[]const u8) ![]const u8 { 268 + if (login_hint) |identifier| { 269 + const account = (try store.findAccount(allocator, identifier)) orelse return ""; 270 + const passkeys = try store.listPasskeys(allocator, account.did); 271 + if (passkeys.len == 0) return ""; 272 + } 273 + return allocator.dupe(u8, "<button id=\"passkey-login\" type=\"button\">continue with passkey</button>"); 263 274 } 264 275 265 276 pub fn authorizePost(request: *http.Server.Request) !void {