More robust domain

This commit is contained in:
Melroy van den Berg 2025-04-24 22:09:37 +02:00
parent 6393d94db3
commit 9203ac81b7
No known key found for this signature in database
GPG key ID: 71D11FF23454B9D7

View file

@ -6,6 +6,7 @@ import (
"io" "io"
"net/http" "net/http"
"net/url" "net/url"
"regexp"
"strings" "strings"
"time" "time"
) )
@ -32,39 +33,40 @@ func ResolveInput(input string) (string, error) {
// Resolve takes a URL or handle and resolves it to a formatted result // Resolve takes a URL or handle and resolves it to a formatted result
func (r *Resolver) Resolve(input string) (string, error) { func (r *Resolver) Resolve(input string) (string, error) {
// Check if input looks like a URL // Always prepend https:// if missing and not a handle
if strings.HasPrefix(input, "http://") || strings.HasPrefix(input, "https://") { inputNorm := input
fmt.Println("Detected URL, attempting direct resolution") if !strings.HasPrefix(input, "http://") && !strings.HasPrefix(input, "https://") && !strings.Contains(input, "@") {
// Special case: if input is just a root domain (no path or only "/"), use nodeinfo fallback inputNorm = "https://" + input
parsedURL, err := url.Parse(input) }
if err == nil && (parsedURL.Path == "" || parsedURL.Path == "/") {
raw, nodeinfo, _, err := r.ResolveObjectOrNodeInfo(input) parsedURL, err := url.Parse(inputNorm)
if err == nil && parsedURL.Host != "" && (parsedURL.Path == "" || parsedURL.Path == "/") && parsedURL.RawQuery == "" && parsedURL.Fragment == "" {
// Looks like a root domain (with or without scheme), fetch nodeinfo
raw, nodeinfo, _, err := r.ResolveObjectOrNodeInfo(parsedURL.String())
if err != nil { if err != nil {
return "", err return "", err
} }
// Format using the formatter (in helpers.go)
formatted, ferr := FormatHelperResult(raw, nodeinfo) formatted, ferr := FormatHelperResult(raw, nodeinfo)
if ferr != nil { if ferr != nil {
return string(raw), nil return string(raw), nil
} }
return formatted, nil return formatted, nil
} }
// If not a root domain, proceed with other checks
if strings.HasPrefix(input, "http://") || strings.HasPrefix(input, "https://") {
fmt.Println("Detected URL, attempting direct resolution")
return r.resolveURL(input) return r.resolveURL(input)
} }
// Check if input looks like a Fediverse handle (@username@domain.tld)
if strings.Contains(input, "@") { if strings.Contains(input, "@") {
// Handle format should be either @username@domain.tld or username@domain.tld
// and should not contain any slashes or other URL-like characters
if !strings.Contains(input, "/") && !strings.Contains(input, ":") { if !strings.Contains(input, "/") && !strings.Contains(input, ":") {
if strings.HasPrefix(input, "@") { if strings.HasPrefix(input, "@") {
// Format: @username@domain.tld
if strings.Count(input, "@") == 2 { if strings.Count(input, "@") == 2 {
fmt.Println("Detected Fediverse handle, using WebFinger resolution") fmt.Println("Detected Fediverse handle, using WebFinger resolution")
return r.resolveHandle(input) return r.resolveHandle(input)
} }
} else { } else {
// Format: username@domain.tld
if strings.Count(input, "@") == 1 { if strings.Count(input, "@") == 1 {
fmt.Println("Detected Fediverse handle, using WebFinger resolution") fmt.Println("Detected Fediverse handle, using WebFinger resolution")
return r.resolveHandle(input) return r.resolveHandle(input)
@ -73,7 +75,6 @@ func (r *Resolver) Resolve(input string) (string, error) {
} }
} }
// If we're not sure, try to treat it as a URL
fmt.Println("Input format unclear, attempting URL resolution") fmt.Println("Input format unclear, attempting URL resolution")
return r.resolveURL(input) return r.resolveURL(input)
} }
@ -292,3 +293,12 @@ func (r *Resolver) fetchActivityPubObject(objectURL string) (string, error) {
// Use our signature-first approach by default // Use our signature-first approach by default
return r.fetchActivityPubObjectWithSignature(objectURL) return r.fetchActivityPubObjectWithSignature(objectURL)
} }
// isBareDomain returns true if input is a domain or domain/ (no scheme, no @, no path beyond optional trailing slash, allows port)
var bareDomainRe = regexp.MustCompile(`^[a-zA-Z0-9.-]+(:[0-9]+)?/?$`)
func isBareDomain(input string) bool {
if strings.Contains(input, "@") || strings.Contains(input, "://") {
return false
}
return bareDomainRe.MatchString(input)
}