url.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package mediaproxy // import "miniflux.app/v2/internal/mediaproxy"
  4. import (
  5. "crypto/hmac"
  6. "crypto/sha256"
  7. "encoding/base64"
  8. "log/slog"
  9. "net/url"
  10. "github.com/gorilla/mux"
  11. "miniflux.app/v2/internal/config"
  12. "miniflux.app/v2/internal/http/route"
  13. )
  14. func ProxifyRelativeURL(router *mux.Router, mediaURL string) string {
  15. if mediaURL == "" {
  16. return ""
  17. }
  18. if customProxyURL := config.Opts.MediaCustomProxyURL(); customProxyURL != "" {
  19. return proxifyURLWithCustomProxy(mediaURL, customProxyURL)
  20. }
  21. mac := hmac.New(sha256.New, config.Opts.MediaProxyPrivateKey())
  22. mac.Write([]byte(mediaURL))
  23. digest := mac.Sum(nil)
  24. return route.Path(router, "proxy", "encodedDigest", base64.URLEncoding.EncodeToString(digest), "encodedURL", base64.URLEncoding.EncodeToString([]byte(mediaURL)))
  25. }
  26. func ProxifyAbsoluteURL(router *mux.Router, mediaURL string) string {
  27. if mediaURL == "" {
  28. return ""
  29. }
  30. if customProxyURL := config.Opts.MediaCustomProxyURL(); customProxyURL != "" {
  31. return proxifyURLWithCustomProxy(mediaURL, customProxyURL)
  32. }
  33. // Note that the proxyified URL is relative to the root URL.
  34. proxifiedUrl := ProxifyRelativeURL(router, mediaURL)
  35. absoluteURL, err := url.JoinPath(config.Opts.RootURL(), proxifiedUrl)
  36. if err != nil {
  37. return mediaURL
  38. }
  39. return absoluteURL
  40. }
  41. func proxifyURLWithCustomProxy(mediaURL, customProxyURL string) string {
  42. if customProxyURL == "" {
  43. return mediaURL
  44. }
  45. absoluteURL, err := url.JoinPath(customProxyURL, base64.URLEncoding.EncodeToString([]byte(mediaURL)))
  46. if err != nil {
  47. slog.Error("Incorrect custom media proxy URL",
  48. slog.String("custom_proxy_url", customProxyURL),
  49. slog.Any("error", err),
  50. )
  51. return mediaURL
  52. }
  53. return absoluteURL
  54. }