registry/internal/validators/utils.go
Avish Porwal 8d28eedf29
Check for localhost in remote url (#355)
Add check for localhost in remote url.

https://github.com/modelcontextprotocol/registry/discussions/274#discussioncomment-14124511

## Motivation and Context
We don't want authors to publish server with remote url set as
localhost.

## How Has This Been Tested?
It has been tested using UTs.

## Types of changes
<!-- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Documentation update

---------

Co-authored-by: Avish Porwal <avishporwal@microsoft.com>
Co-authored-by: Adam Jones <domdomegg+git@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-09-05 01:20:07 +01:00

50 lines
1.2 KiB
Go

package validators
import (
"net/url"
"regexp"
"strings"
)
var (
// Regular expressions for validating repository URLs
// These regex patterns ensure the URL is in the format of a valid GitHub or GitLab repository
// For example: // - GitHub: https://github.com/user/repo
githubURLRegex = regexp.MustCompile(`^https?://(www\.)?github\.com/[\w.-]+/[\w.-]+/?$`)
gitlabURLRegex = regexp.MustCompile(`^https?://(www\.)?gitlab\.com/[\w.-]+/[\w.-]+/?$`)
)
// IsValidRepositoryURL checks if the given URL is valid for the specified repository source
func IsValidRepositoryURL(source RepositorySource, url string) bool {
switch source {
case SourceGitHub:
return githubURLRegex.MatchString(url)
case SourceGitLab:
return gitlabURLRegex.MatchString(url)
}
return false
}
// HasNoSpaces checks if a string contains no spaces
func HasNoSpaces(s string) bool {
return !strings.Contains(s, " ")
}
// IsValidURL checks if a URL is in valid format
func IsValidURL(rawURL string) bool {
// Parse the URL
u, err := url.Parse(rawURL)
if err != nil {
return false
}
// Check if scheme is present (http or https)
if u.Scheme != "http" && u.Scheme != "https" {
return false
}
if u.Host == "" || u.Hostname() == "localhost" {
return false
}
return true
}