diff --git a/util/linkpreview/linkpreview.go b/util/linkpreview/linkpreview.go index 01019d2ae..3b3436b4c 100644 --- a/util/linkpreview/linkpreview.go +++ b/util/linkpreview/linkpreview.go @@ -126,11 +126,11 @@ func (l *linkPreview) makeNonHtml(fetchUrl string, resp *http.Response) (i model } else { i.Type = model.LinkPreview_Unknown } - pUrl, e := uri.ValidateAndParseURI(fetchUrl) + pURL, e := uri.ValidateAndParseURI(fetchUrl) if e == nil { - pUrl.Path = "favicon.ico" - pUrl.RawQuery = "" - i.FaviconUrl = pUrl.String() + pURL.Path = "favicon.ico" + pURL.RawQuery = "" + i.FaviconUrl = pURL.String() } return } diff --git a/util/uri/uri.go b/util/uri/uri.go index 853b38476..20550274f 100644 --- a/util/uri/uri.go +++ b/util/uri/uri.go @@ -18,8 +18,8 @@ var ( winFilepathPrefixRegex = regexp.MustCompile(`^[a-zA-Z]:[\\\/]`) // errors - urlEmptyError = fmt.Errorf("url is empty") - filepathNotSupportedError = fmt.Errorf("filepath not supported") + errUrlEmpty = fmt.Errorf("url is empty") + errFilepathNotSupported = fmt.Errorf("filepath not supported") ) func ValidateURI(uri string) error { @@ -38,16 +38,20 @@ func ValidateURI(uri string) error { } func ParseURI(uri string) *url.URL { - u, _ := url.Parse(uri) + u, err := url.Parse(uri) + if err != nil { + // do nothing as validation is implemented in ValidateAndParseURI + } return u } func NormalizeURI(uri string) string { - if noPrefixEmailRegexp.MatchString(uri) { + switch { + case noPrefixEmailRegexp.MatchString(uri): return "mailto:" + uri - } else if noPrefixTelRegexp.MatchString(uri) { + case noPrefixTelRegexp.MatchString(uri): return "tel:" + uri - } else if noPrefixHttpRegex.MatchString(uri) { + case noPrefixHttpRegex.MatchString(uri): return "http://" + uri } return uri @@ -56,12 +60,15 @@ func NormalizeURI(uri string) string { func ValidateAndParseURI(uri string) (*url.URL, error) { uri = strings.TrimSpace(uri) - if len(uri) == 0 { - return nil, urlEmptyError - } else if winFilepathPrefixRegex.MatchString(uri) { - return nil, filepathNotSupportedError - } else if strings.HasPrefix(uri, string(os.PathSeparator)) || strings.HasPrefix(uri, ".") { - return nil, filepathNotSupportedError + switch { + case len(uri) == 0: + return nil, errUrlEmpty + case winFilepathPrefixRegex.MatchString(uri): + return nil, errFilepathNotSupported + case strings.HasPrefix(uri, string(os.PathSeparator)): + return nil, errFilepathNotSupported + case strings.HasPrefix(uri, "."): + return nil, errFilepathNotSupported } u, err := url.Parse(uri) diff --git a/util/uri/uri_test.go b/util/uri/uri_test.go index 77086e5f0..9c693ce53 100644 --- a/util/uri/uri_test.go +++ b/util/uri/uri_test.go @@ -9,56 +9,56 @@ import ( func TestURI_NormalizeURI(t *testing.T) { t.Run("should process mailto uri", func(t *testing.T) { uri := "john@doe.com" - processedUri := NormalizeURI(uri) - assert.Equal(t, "mailto:"+uri, processedUri) + processedURI := NormalizeURI(uri) + assert.Equal(t, "mailto:"+uri, processedURI) }) t.Run("should process tel uri", func(t *testing.T) { uri := "+491234567" - processedUri := NormalizeURI(uri) - assert.Equal(t, "tel:"+uri, processedUri) + processedURI := NormalizeURI(uri) + assert.Equal(t, "tel:"+uri, processedURI) }) t.Run("should process url", func(t *testing.T) { uri := "website.com" - processedUri := NormalizeURI(uri) - assert.Equal(t, "http://"+uri, processedUri) + processedURI := NormalizeURI(uri) + assert.Equal(t, "http://"+uri, processedURI) }) t.Run("should process url with additional content 1", func(t *testing.T) { uri := "website.com/123/456" - processedUri := NormalizeURI(uri) - assert.Equal(t, "http://"+uri, processedUri) + processedURI := NormalizeURI(uri) + assert.Equal(t, "http://"+uri, processedURI) }) t.Run("should process url with additional content 2", func(t *testing.T) { uri := "website.com?content=11" - processedUri := NormalizeURI(uri) - assert.Equal(t, "http://"+uri, processedUri) + processedURI := NormalizeURI(uri) + assert.Equal(t, "http://"+uri, processedURI) }) t.Run("should process url with additional content and numbers", func(t *testing.T) { uri := "webs1te.com/123/456" - processedUri := NormalizeURI(uri) - assert.Equal(t, "http://"+uri, processedUri) + processedURI := NormalizeURI(uri) + assert.Equal(t, "http://"+uri, processedURI) }) t.Run("should not modify url with http://", func(t *testing.T) { uri := "http://website.com" - processedUri := NormalizeURI(uri) - assert.Equal(t, uri, processedUri) + processedURI := NormalizeURI(uri) + assert.Equal(t, uri, processedURI) }) t.Run("should not modify url with https://", func(t *testing.T) { uri := "https://website.com" - processedUri := NormalizeURI(uri) - assert.Equal(t, uri, processedUri) + processedURI := NormalizeURI(uri) + assert.Equal(t, uri, processedURI) }) t.Run("should not modify non url/tel/mailto uri", func(t *testing.T) { uri := "type:content" - processedUri := NormalizeURI(uri) - assert.Equal(t, uri, processedUri) + processedURI := NormalizeURI(uri) + assert.Equal(t, uri, processedURI) }) } @@ -67,28 +67,28 @@ func TestURI_ValidateURI(t *testing.T) { uri := "" err := ValidateURI(uri) assert.Error(t, err) - assert.Equal(t, err, urlEmptyError) + assert.Equal(t, err, errUrlEmpty) }) t.Run("should return error on win filepath", func(t *testing.T) { uri := "D://folder//file.txt" err := ValidateURI(uri) assert.Error(t, err) - assert.Equal(t, err, filepathNotSupportedError) + assert.Equal(t, err, errFilepathNotSupported) }) t.Run("should return error on unix abs filepath", func(t *testing.T) { uri := "/folder/file.txt" err := ValidateURI(uri) assert.Error(t, err) - assert.Equal(t, err, filepathNotSupportedError) + assert.Equal(t, err, errFilepathNotSupported) }) t.Run("should return error on unix rel filepath", func(t *testing.T) { uri := "../folder/file.txt" err := ValidateURI(uri) assert.Error(t, err) - assert.Equal(t, err, filepathNotSupportedError) + assert.Equal(t, err, errFilepathNotSupported) }) t.Run("should not return error if url is surrounded by whitespaces", func(t *testing.T) {