utils.nim 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # SPDX-License-Identifier: AGPL-3.0-only
  2. import strutils, strformat, sequtils, uri, tables, base64
  3. import nimcrypto, regex
  4. var
  5. hmacKey {.threadvar.}: string
  6. base64Media = false
  7. const
  8. https* = "https://"
  9. twimg* = "pbs.twimg.com/"
  10. badJpgExts = @["1500x500", "jpgn", "jpg:", "jpg_", "_jpg"]
  11. badPngExts = @["pngn", "png:", "png_", "_png"]
  12. twitterDomains = @[
  13. "twitter.com",
  14. "pic.twitter.com",
  15. "twimg.com",
  16. "abs.twimg.com",
  17. "pbs.twimg.com",
  18. "video.twimg.com"
  19. ]
  20. proc setHmacKey*(key: string) =
  21. hmacKey = key
  22. proc setProxyEncoding*(state: bool) =
  23. base64Media = state
  24. proc getHmac*(data: string): string =
  25. ($hmac(sha256, hmacKey, data))[0 .. 12]
  26. proc getVidUrl*(link: string): string =
  27. if link.len == 0: return
  28. let sig = getHmac(link)
  29. if base64Media:
  30. &"/video/enc/{sig}/{encode(link, safe=true)}"
  31. else:
  32. &"/video/{sig}/{encodeUrl(link)}"
  33. proc getPicUrl*(link: string): string =
  34. if base64Media:
  35. &"/pic/enc/{encode(link, safe=true)}"
  36. else:
  37. &"/pic/{encodeUrl(link)}"
  38. proc cleanFilename*(filename: string): string =
  39. const reg = re"[^A-Za-z0-9._-]"
  40. result = filename.replace(reg, "_")
  41. if badJpgExts.anyIt(it in result):
  42. result &= ".jpg"
  43. elif badPngExts.anyIt(it in result):
  44. result &= ".png"
  45. proc filterParams*(params: Table): seq[(string, string)] =
  46. const filter = ["name", "id", "list", "referer", "scroll"]
  47. toSeq(params.pairs()).filterIt(it[0] notin filter and it[1].len > 0)
  48. proc isTwitterUrl*(uri: Uri): bool =
  49. uri.hostname in twitterDomains
  50. proc isTwitterUrl*(url: string): bool =
  51. parseUri(url).hostname in twitterDomains