diff options
Diffstat (limited to 'internal/federation/dereferencing/account.go')
-rw-r--r-- | internal/federation/dereferencing/account.go | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 3abf628d1..b0118380d 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -18,6 +18,7 @@ package dereferencing import ( + "cmp" "context" "errors" "net/url" @@ -509,10 +510,16 @@ func (d *Dereferencer) enrichAccount( } if account.Username != "" { - // A username was provided so we can attempt a webfinger, this ensures up-to-date accountdomain info. - accDomain, accURI, err := d.fingerRemoteAccount(ctx, tsport, account.Username, account.Domain) - switch { + // A username was provided so we can attempt to webfinger, + // this ensures up-to-date account domain, and handles some + // edge cases where servers don't provide a preferred_username. + accUsername, accDomain, accURI, err := d.fingerRemoteAccount(ctx, + tsport, + account.Username, + account.Domain, + ) + switch { case err != nil && account.URI == "": // This is a new account (to us) with username@domain // but failed webfinger, nothing more we can do. @@ -554,6 +561,9 @@ func (d *Dereferencer) enrichAccount( account.URI = accURI.String() account.Domain = accDomain uri = accURI + + // Specifically only update username if not already set. + account.Username = cmp.Or(account.Username, accUsername) } } @@ -609,7 +619,7 @@ func (d *Dereferencer) enrichAccount( if err != nil { // ResolveAccountable will set gtserror.WrongType // on the returned error, so we don't need to do it here. - err = gtserror.Newf("error resolving accountable %s: %w", uri, err) + err := gtserror.Newf("error resolving accountable %s: %w", uri, err) return nil, nil, err } @@ -656,15 +666,18 @@ func (d *Dereferencer) enrichAccount( latestAcc, err := d.converter.ASRepresentationToAccount(ctx, apubAcc, account.Domain, + account.Username, ) if err != nil { // ASRepresentationToAccount will set Malformed on the // returned error, so we don't need to do it here. - err = gtserror.Newf("error converting %s to gts model: %w", uri, err) + err := gtserror.Newf("error converting %s to gts model: %w", uri, err) return nil, nil, err } if account.Username == "" { + var accUsername string + // Assume the host from the // ActivityPub representation. id := ap.GetJSONLDId(apubAcc) @@ -685,7 +698,7 @@ func (d *Dereferencer) enrichAccount( // https://example.org/@someone@somewhere.else and we've been redirected // from example.org to somewhere.else: we want to take somewhere.else // as the accountDomain then, not the example.org we were redirected from. - latestAcc.Domain, _, err = d.fingerRemoteAccount(ctx, + accUsername, latestAcc.Domain, _, err = d.fingerRemoteAccount(ctx, tsport, latestAcc.Username, accHost, @@ -698,6 +711,9 @@ func (d *Dereferencer) enrichAccount( latestAcc.Username, accHost, err, ) } + + // Specifically only update username if not already set. + latestAcc.Username = cmp.Or(latestAcc.Username, accUsername) } if latestAcc.Domain == "" { @@ -706,23 +722,20 @@ func (d *Dereferencer) enrichAccount( return nil, nil, gtserror.Newf("empty domain for %s", uri) } - // Ensure the final parsed account URI or URL matches + // Ensure the final parsed account URI matches // the input URI we fetched (or received) it as. - matches, err := util.URIMatches( + if matches, err := util.URIMatches( uri, append( ap.GetURL(apubAcc), // account URL(s) ap.GetJSONLDId(apubAcc), // account URI )..., - ) - if err != nil { + ); err != nil { return nil, nil, gtserror.Newf( "error checking dereferenced account uri %s: %w", latestAcc.URI, err, ) - } - - if !matches { + } else if !matches { return nil, nil, gtserror.Newf( "dereferenced account uri %s does not match %s", latestAcc.URI, uri.String(), |