Spaces:
Runtime error
Runtime error
| package common | |
| import ( | |
| "fmt" | |
| "net/url" | |
| "strings" | |
| "github.com/QuantumNous/new-api/constant" | |
| ) | |
| // ValidateRedirectURL validates that a redirect URL is safe to use. | |
| // It checks that: | |
| // - The URL is properly formatted | |
| // - The scheme is either http or https | |
| // - The domain is in the trusted domains list (exact match or subdomain) | |
| // | |
| // Returns nil if the URL is valid and trusted, otherwise returns an error | |
| // describing why the validation failed. | |
| func ValidateRedirectURL(rawURL string) error { | |
| // Parse the URL | |
| parsedURL, err := url.Parse(rawURL) | |
| if err != nil { | |
| return fmt.Errorf("invalid URL format: %s", err.Error()) | |
| } | |
| if parsedURL.Scheme != "http" && parsedURL.Scheme != "https" { | |
| return fmt.Errorf("invalid URL scheme: only http and https are allowed") | |
| } | |
| domain := strings.ToLower(parsedURL.Hostname()) | |
| for _, trustedDomain := range constant.TrustedRedirectDomains { | |
| if domain == trustedDomain || strings.HasSuffix(domain, "."+trustedDomain) { | |
| return nil | |
| } | |
| } | |
| return fmt.Errorf("domain %s is not in the trusted domains list", domain) | |
| } | |