proxy.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package proxy // import "miniflux.app/v2/internal/proxy"
  4. import (
  5. "crypto/hmac"
  6. "crypto/sha256"
  7. "encoding/base64"
  8. "net/url"
  9. "path"
  10. "miniflux.app/v2/internal/http/route"
  11. "github.com/gorilla/mux"
  12. "miniflux.app/v2/internal/config"
  13. )
  14. // ProxifyURL generates a relative URL for a proxified resource.
  15. func ProxifyURL(router *mux.Router, link string) string {
  16. if link != "" {
  17. proxyImageUrl := config.Opts.ProxyUrl()
  18. if proxyImageUrl == "" {
  19. mac := hmac.New(sha256.New, config.Opts.ProxyPrivateKey())
  20. mac.Write([]byte(link))
  21. digest := mac.Sum(nil)
  22. return route.Path(router, "proxy", "encodedDigest", base64.URLEncoding.EncodeToString(digest), "encodedURL", base64.URLEncoding.EncodeToString([]byte(link)))
  23. }
  24. proxyUrl, err := url.Parse(proxyImageUrl)
  25. if err != nil {
  26. return ""
  27. }
  28. proxyUrl.Path = path.Join(proxyUrl.Path, base64.URLEncoding.EncodeToString([]byte(link)))
  29. return proxyUrl.String()
  30. }
  31. return ""
  32. }
  33. // AbsoluteProxifyURL generates an absolute URL for a proxified resource.
  34. func AbsoluteProxifyURL(router *mux.Router, host, link string) string {
  35. if link != "" {
  36. proxyImageUrl := config.Opts.ProxyUrl()
  37. if proxyImageUrl == "" {
  38. mac := hmac.New(sha256.New, config.Opts.ProxyPrivateKey())
  39. mac.Write([]byte(link))
  40. digest := mac.Sum(nil)
  41. path := route.Path(router, "proxy", "encodedDigest", base64.URLEncoding.EncodeToString(digest), "encodedURL", base64.URLEncoding.EncodeToString([]byte(link)))
  42. if config.Opts.HTTPS {
  43. return "https://" + host + path
  44. } else {
  45. return "http://" + host + path
  46. }
  47. }
  48. proxyUrl, err := url.Parse(proxyImageUrl)
  49. if err != nil {
  50. return ""
  51. }
  52. proxyUrl.Path = path.Join(proxyUrl.Path, base64.URLEncoding.EncodeToString([]byte(link)))
  53. return proxyUrl.String()
  54. }
  55. return ""
  56. }