url blacklist

This commit is contained in:
Aleksandr Dubovikov 2024-09-30 17:00:52 +02:00
parent dd3fd3d3d3
commit d8d6df3166
2 changed files with 23 additions and 0 deletions

View file

@ -12,6 +12,7 @@ import (
"net/url" "net/url"
"os" "os"
"path/filepath" "path/filepath"
"regexp"
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
@ -37,6 +38,7 @@ var (
ErrorFileTooLarge = errors.New("file too large") ErrorFileTooLarge = errors.New("file too large")
ErrorTimeoutThumbnailGenerator = errors.New("timeout waiting for thumbnail generator") ErrorTimeoutThumbnailGenerator = errors.New("timeout waiting for thumbnail generator")
ErrNoMetadataFound = errors.New("no metadata found") ErrNoMetadataFound = errors.New("no metadata found")
ErrorBlackListed = errors.New("url is blacklisted")
) )
func makeUrlPreviewHandler( func makeUrlPreviewHandler(
@ -48,6 +50,7 @@ func makeUrlPreviewHandler(
activeUrlPreviewRequests := &types.ActiveUrlPreviewRequests{Url: map[string]*types.UrlPreviewResult{}} activeUrlPreviewRequests := &types.ActiveUrlPreviewRequests{Url: map[string]*types.UrlPreviewResult{}}
urlPreviewCache := &types.UrlPreviewCache{Records: map[string]*types.UrlPreviewCacheRecord{}} urlPreviewCache := &types.UrlPreviewCache{Records: map[string]*types.UrlPreviewCacheRecord{}}
urlBlackList := createUrlBlackList(cfg)
go func() { go func() {
for { for {
@ -83,6 +86,14 @@ func makeUrlPreviewHandler(
return *r return *r
} }
// Check if the url is in the blacklist
for _, pattern := range urlBlackList {
if pattern.MatchString(pUrl) {
logger.WithField("pattern", pattern.String()).Warn("the url is blacklisted")
return util.ErrorResponse(ErrorBlackListed)
}
}
// Get url preview from cache // Get url preview from cache
if cacheRecord, ok := urlPreviewCache.Records[pUrl]; ok { if cacheRecord, ok := urlPreviewCache.Records[pUrl]; ok {
if cacheRecord.Error != nil { if cacheRecord.Error != nil {
@ -625,3 +636,12 @@ func getMetaFieldsFromHTML(resp *http.Response) map[string]string {
} }
return ogValues return ogValues
} }
func createUrlBlackList(cfg *config.MediaAPI) []*regexp.Regexp {
blackList := make([]*regexp.Regexp, len(cfg.UrlPreviewBlacklist))
for i, pattern := range cfg.UrlPreviewBlacklist {
blackList[i] = regexp.MustCompile(pattern)
}
return blackList
}

View file

@ -31,6 +31,9 @@ type MediaAPI struct {
// A list of thumbnail sizes to be pre-generated for downloaded remote / uploaded content // A list of thumbnail sizes to be pre-generated for downloaded remote / uploaded content
ThumbnailSizes []ThumbnailSize `yaml:"thumbnail_sizes"` ThumbnailSizes []ThumbnailSize `yaml:"thumbnail_sizes"`
// Black list of urls
UrlPreviewBlacklist []string `yaml:"url_preview_blacklist"`
// The time in seconds to cache URL previews for // The time in seconds to cache URL previews for
UrlPreviewCacheTime int `yaml:"url_preview_cache_time"` UrlPreviewCacheTime int `yaml:"url_preview_cache_time"`