accounts: return a blank account for verify_credentials if it isn't resolved

This commit is contained in:
Alex Gleason 2023-09-11 09:08:15 -05:00
parent 1b2f4d9a54
commit 31114b6094
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
3 changed files with 21 additions and 8 deletions

View File

@ -5,7 +5,7 @@ import * as mixer from '@/mixer.ts';
import { getAuthor, getFollowedPubkeys, getFollows, syncUser } from '@/queries.ts'; import { getAuthor, getFollowedPubkeys, getFollows, syncUser } from '@/queries.ts';
import { booleanParamSchema, fileSchema } from '@/schema.ts'; import { booleanParamSchema, fileSchema } from '@/schema.ts';
import { jsonMetaContentSchema } from '@/schemas/nostr.ts'; import { jsonMetaContentSchema } from '@/schemas/nostr.ts';
import { toAccount, toRelationship, toStatus } from '@/transformers/nostr-to-mastoapi.ts'; import { accountFromPubkey, toAccount, toRelationship, toStatus } from '@/transformers/nostr-to-mastoapi.ts';
import { isFollowing, lookupAccount, nostrNow, Time } from '@/utils.ts'; import { isFollowing, lookupAccount, nostrNow, Time } from '@/utils.ts';
import { paginated, paginationSchema, parseBody } from '@/utils/web.ts'; import { paginated, paginationSchema, parseBody } from '@/utils/web.ts';
import { createEvent } from '@/utils/web.ts'; import { createEvent } from '@/utils/web.ts';
@ -60,9 +60,9 @@ const verifyCredentialsController: AppController = async (c) => {
const event = await getAuthor(pubkey); const event = await getAuthor(pubkey);
if (event) { if (event) {
return c.json(await toAccount(event, { withSource: true })); return c.json(await toAccount(event, { withSource: true }));
} else {
return c.json(await accountFromPubkey(pubkey, { withSource: true }));
} }
return c.json({ error: 'Could not find user.' }, 404);
}; };
const accountController: AppController = async (c) => { const accountController: AppController = async (c) => {

View File

@ -24,6 +24,7 @@ export {
nip13, nip13,
nip19, nip19,
nip21, nip21,
type UnsignedEvent,
verifySignature, verifySignature,
} from 'npm:nostr-tools@^1.14.0'; } from 'npm:nostr-tools@^1.14.0';
export { findReplyTag } from 'https://gitlab.com/soapbox-pub/mostr/-/raw/c67064aee5ade5e01597c6d23e22e53c628ef0e2/src/nostr/tags.ts'; export { findReplyTag } from 'https://gitlab.com/soapbox-pub/mostr/-/raw/c67064aee5ade5e01597c6d23e22e53c628ef0e2/src/nostr/tags.ts';

View File

@ -2,12 +2,12 @@ import { isCWTag } from 'https://gitlab.com/soapbox-pub/mostr/-/raw/c67064aee5ad
import { Conf } from '@/config.ts'; import { Conf } from '@/config.ts';
import * as eventsDB from '@/db/events.ts'; import * as eventsDB from '@/db/events.ts';
import { type Event, findReplyTag, lodash, nip19, sanitizeHtml, TTLCache, unfurl } from '@/deps.ts'; import { type Event, findReplyTag, lodash, nip19, sanitizeHtml, TTLCache, unfurl, type UnsignedEvent } from '@/deps.ts';
import { getMediaLinks, parseNoteContent } from '@/note.ts'; import { getMediaLinks, parseNoteContent } from '@/note.ts';
import { getAuthor, getFollowedPubkeys, getFollows } from '@/queries.ts'; import { getAuthor, getFollowedPubkeys, getFollows } from '@/queries.ts';
import { emojiTagSchema, filteredArray } from '@/schema.ts'; import { emojiTagSchema, filteredArray } from '@/schema.ts';
import { jsonMediaDataSchema, jsonMetaContentSchema } from '@/schemas/nostr.ts'; import { jsonMediaDataSchema, jsonMetaContentSchema } from '@/schemas/nostr.ts';
import { isFollowing, type Nip05, nostrDate, parseNip05, Time } from '@/utils.ts'; import { isFollowing, type Nip05, nostrDate, nostrNow, parseNip05, Time } from '@/utils.ts';
import { verifyNip05Cached } from '@/utils/nip05.ts'; import { verifyNip05Cached } from '@/utils/nip05.ts';
import { findUser } from '@/db/users.ts'; import { findUser } from '@/db/users.ts';
import { DittoAttachment, renderAttachment } from '@/views/attachment.ts'; import { DittoAttachment, renderAttachment } from '@/views/attachment.ts';
@ -19,7 +19,7 @@ interface ToAccountOpts {
withSource?: boolean; withSource?: boolean;
} }
async function toAccount(event: Event<0>, opts: ToAccountOpts = {}) { async function toAccount(event: UnsignedEvent<0>, opts: ToAccountOpts = {}) {
const { withSource = false } = opts; const { withSource = false } = opts;
const { pubkey } = event; const { pubkey } = event;
@ -75,6 +75,18 @@ async function toAccount(event: Event<0>, opts: ToAccountOpts = {}) {
}; };
} }
function accountFromPubkey(pubkey: string, opts: ToAccountOpts = {}) {
const event: UnsignedEvent<0> = {
kind: 0,
pubkey,
content: '',
tags: [],
created_at: nostrNow(),
};
return toAccount(event, opts);
}
async function parseAndVerifyNip05(nip05: string | undefined, pubkey: string): Promise<Nip05 | undefined> { async function parseAndVerifyNip05(nip05: string | undefined, pubkey: string): Promise<Nip05 | undefined> {
if (nip05 && await verifyNip05Cached(nip05, pubkey)) { if (nip05 && await verifyNip05Cached(nip05, pubkey)) {
return parseNip05(nip05); return parseNip05(nip05);
@ -257,7 +269,7 @@ function unfurlCardCached(url: string): Promise<PreviewCard | null> {
return card; return card;
} }
function toEmojis(event: Event) { function toEmojis(event: UnsignedEvent) {
const emojiTags = event.tags.filter((tag) => tag[0] === 'emoji'); const emojiTags = event.tags.filter((tag) => tag[0] === 'emoji');
return filteredArray(emojiTagSchema).parse(emojiTags) return filteredArray(emojiTagSchema).parse(emojiTags)
@ -310,4 +322,4 @@ async function toNotificationMention(event: Event<1>, viewerPubkey?: string) {
}; };
} }
export { toAccount, toNotification, toRelationship, toStatus }; export { accountFromPubkey, toAccount, toNotification, toRelationship, toStatus };