fix: user acct not respecting domain (#2088)

This commit is contained in:
patak 2023-05-10 14:19:50 +02:00 committed by GitHub
parent f28c90498b
commit 29f6a73de1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 5 deletions

View file

@ -43,7 +43,7 @@ export function fetchAccountById(id?: string | null): Promise<mastodon.v1.Accoun
const cached = cache.get(key) const cached = cache.get(key)
if (cached) if (cached)
return cached return cached
const domain = currentInstance.value ? getInstanceDomain(currentInstance.value) : null const domain = getInstanceDomainFromServer(server)
const promise = useMastoClient().v1.accounts.fetch(id) const promise = useMastoClient().v1.accounts.fetch(id)
.then((r) => { .then((r) => {
if (r.acct && !r.acct.includes('@') && domain) if (r.acct && !r.acct.includes('@') && domain)
@ -59,12 +59,12 @@ export function fetchAccountById(id?: string | null): Promise<mastodon.v1.Accoun
export async function fetchAccountByHandle(acct: string): Promise<mastodon.v1.Account> { export async function fetchAccountByHandle(acct: string): Promise<mastodon.v1.Account> {
const server = currentServer.value const server = currentServer.value
const userId = currentUser.value?.account.id const userId = currentUser.value?.account.id
const userAcct = acct.endsWith(`@${server}`) ? acct.slice(0, -server.length - 1) : acct const domain = getInstanceDomainFromServer(server)
const userAcct = (domain && acct.endsWith(`@${domain}`)) ? acct.slice(0, -domain.length - 1) : acct
const key = `${server}:${userId}:account:${userAcct}` const key = `${server}:${userId}:account:${userAcct}`
const cached = cache.get(key) const cached = cache.get(key)
if (cached) if (cached)
return cached return cached
const domain = currentInstance.value ? getInstanceDomain(currentInstance.value) : undefined
async function lookupAccount() { async function lookupAccount() {
const client = useMastoClient() const client = useMastoClient()

View file

@ -209,8 +209,10 @@ export async function fetchAccountInfo(client: mastodon.Client, server: string)
fetchPrefs(), fetchPrefs(),
]) ])
if (!account.acct.includes('@')) if (!account.acct.includes('@')) {
account.acct = `${account.acct}@${server}` const webDomain = getInstanceDomainFromServer(server)
account.acct = `${account.acct}@${webDomain}`
}
// TODO: lazy load preferences // TODO: lazy load preferences
accountPreferencesMap.set(account.acct, preferences) accountPreferencesMap.set(account.acct, preferences)
@ -219,6 +221,12 @@ export async function fetchAccountInfo(client: mastodon.Client, server: string)
return account return account
} }
export function getInstanceDomainFromServer(server: string) {
const instance = getInstanceCache(server)
const webDomain = instance ? getInstanceDomain(instance) : server
return webDomain
}
export async function refreshAccountInfo() { export async function refreshAccountInfo() {
const account = await fetchAccountInfo(useMastoClient(), currentServer.value) const account = await fetchAccountInfo(useMastoClient(), currentServer.value)
currentUser.value!.account = account currentUser.value!.account = account
@ -340,10 +348,28 @@ export function useUserLocalStorage<T extends object>(key: string, initial: () =
const scope = effectScope(true) const scope = effectScope(true)
const value = scope.run(() => { const value = scope.run(() => {
const all = useLocalStorage<Record<string, T>>(key, {}, { deep: true }) const all = useLocalStorage<Record<string, T>>(key, {}, { deep: true })
return computed(() => { return computed(() => {
const id = currentUser.value?.account.id const id = currentUser.value?.account.id
? currentUser.value.account.acct ? currentUser.value.account.acct
: '[anonymous]' : '[anonymous]'
// Backward compatibility, respect webDomain in acct
// In previous versions, acct was username@server instead of username@webDomain
// for example: elk@m.webtoo.ls instead of elk@webtoo.ls
if (!all.value[id]) {
const [username, webDomain] = id.split('@')
const server = currentServer.value
if (webDomain && server && server !== webDomain) {
const oldId = `${username}@${server}`
const outdatedSettings = all.value[oldId]
if (outdatedSettings) {
const newAllValue = { ...all.value, [id]: outdatedSettings }
delete newAllValue[oldId]
all.value = newAllValue
}
}
}
all.value[id] = Object.assign(initial(), all.value[id] || {}) all.value[id] = Object.assign(initial(), all.value[id] || {})
return all.value[id] return all.value[id]
}) })