proxy.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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. return ""
  18. }
  19. if proxyImageUrl := config.Opts.ProxyUrl(); proxyImageUrl != "" {
  20. proxyUrl, err := url.Parse(proxyImageUrl)
  21. if err != nil {
  22. return ""
  23. }
  24. proxyUrl.Path = path.Join(proxyUrl.Path, base64.URLEncoding.EncodeToString([]byte(link)))
  25. return proxyUrl.String()
  26. }
  27. mac := hmac.New(sha256.New, config.Opts.ProxyPrivateKey())
  28. mac.Write([]byte(link))
  29. digest := mac.Sum(nil)
  30. return route.Path(router, "proxy", "encodedDigest", base64.URLEncoding.EncodeToString(digest), "encodedURL", base64.URLEncoding.EncodeToString([]byte(link)))
  31. }
  32. // AbsoluteProxifyURL generates an absolute URL for a proxified resource.
  33. func AbsoluteProxifyURL(router *mux.Router, host, link string) string {
  34. proxifiedUrl := ProxifyURL(router, link)
  35. if config.Opts.ProxyUrl() == "" {
  36. return proxifiedUrl
  37. }
  38. if config.Opts.HTTPS {
  39. return "https://" + host + proxifiedUrl
  40. }
  41. return "http://" + host + proxifiedUrl
  42. }