diff --git a/internal/ogtags/cache.go b/internal/ogtags/cache.go index 40b7444..838d016 100644 --- a/internal/ogtags/cache.go +++ b/internal/ogtags/cache.go @@ -5,7 +5,9 @@ import ( "errors" "log/slog" "net/url" + "strings" "syscall" + "time" ) // GetOGTags is the main function that retrieves Open Graph tags for a URL @@ -45,6 +47,18 @@ func (c *OGTagCache) GetOGTags(ctx context.Context, url *url.URL, originalHost s // Store in cache c.cache.Set(ctx, cacheKey, ogTags, c.ogTimeToLive) + for k, v := range ogTags { + switch { + case strings.HasSuffix(k, "image"), strings.HasSuffix(k, "audio"), strings.HasSuffix(k, "secure_url"), strings.HasSuffix(k, "video"): + v, _ = strings.CutPrefix(v, "http://") + v, _ = strings.CutPrefix(v, "https://") + slog.Debug("setting ogtags allow for", "url", k) + if err := c.cache.Underlying.Set(ctx, "ogtags:allow:"+v, []byte(k), time.Hour); err != nil { + slog.Debug("can't set ogtag allow cache", "err", err) + } + } + } + return ogTags, nil } diff --git a/internal/ogtags/cache_test.go b/internal/ogtags/cache_test.go index 7efd497..08bf4e3 100644 --- a/internal/ogtags/cache_test.go +++ b/internal/ogtags/cache_test.go @@ -1,6 +1,7 @@ package ogtags import ( + "errors" "net/http" "net/http/httptest" "net/url" @@ -9,6 +10,7 @@ import ( "time" "github.com/TecharoHQ/anubis/lib/policy/config" + "github.com/TecharoHQ/anubis/lib/store" "github.com/TecharoHQ/anubis/lib/store/memory" ) @@ -166,8 +168,13 @@ func TestGetOGTags(t *testing.T) { if !ok || initialValue != cachedValue { t.Errorf("Cache does not line up: expected %s: %s, got: %s", key, initialValue, cachedValue) } - } + + t.Run("ensure image is cached as allow", func(t *testing.T) { + if _, err := cache.cache.Underlying.Get(t.Context(), "ogtags:allow:example.com/image.jpg"); errors.Is(err, store.ErrNotFound) { + t.Fatal("ogtags allow caching for example.com/image.jpg did not work") + } + }) } // TestGetOGTagsWithHostConsideration tests the behavior of the cache with and without host consideration and for multiple hosts in a theoretical setup.