utils.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package main
  2. import (
  3. "crypto/rand"
  4. "fmt"
  5. "path/filepath"
  6. "regexp"
  7. "strconv"
  8. "strings"
  9. )
  10. var (
  11. regexpSpaces = regexp.MustCompile(`[\s]+`)
  12. )
  13. // inArray checks if a string is present in a list of strings.
  14. func inArray(val string, vals []string) (ok bool) {
  15. for _, v := range vals {
  16. if v == val {
  17. return true
  18. }
  19. }
  20. return false
  21. }
  22. // makeFilename sanitizes a filename (user supplied upload filenames).
  23. func makeFilename(fName string) string {
  24. name := strings.TrimSpace(fName)
  25. if name == "" {
  26. name, _ = generateRandomString(10)
  27. }
  28. // replace whitespace with "-"
  29. name = regexpSpaces.ReplaceAllString(name, "-")
  30. return filepath.Base(name)
  31. }
  32. // makeMsgTpl takes a page title, heading, and message and returns
  33. // a msgTpl that can be rendered as an HTML view. This is used for
  34. // rendering arbitrary HTML views with error and success messages.
  35. func makeMsgTpl(pageTitle, heading, msg string) msgTpl {
  36. if heading == "" {
  37. heading = pageTitle
  38. }
  39. err := msgTpl{}
  40. err.Title = pageTitle
  41. err.MessageTitle = heading
  42. err.Message = msg
  43. return err
  44. }
  45. // parseStringIDs takes a slice of numeric string IDs and
  46. // parses each number into an int64 and returns a slice of the
  47. // resultant values.
  48. func parseStringIDs(s []string) ([]int, error) {
  49. vals := make([]int, 0, len(s))
  50. for _, v := range s {
  51. i, err := strconv.Atoi(v)
  52. if err != nil {
  53. return nil, err
  54. }
  55. if i < 1 {
  56. return nil, fmt.Errorf("%d is not a valid ID", i)
  57. }
  58. vals = append(vals, i)
  59. }
  60. return vals, nil
  61. }
  62. // generateRandomString generates a cryptographically random, alphanumeric string of length n.
  63. func generateRandomString(n int) (string, error) {
  64. const dictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  65. var bytes = make([]byte, n)
  66. if _, err := rand.Read(bytes); err != nil {
  67. return "", err
  68. }
  69. for k, v := range bytes {
  70. bytes[k] = dictionary[v%byte(len(dictionary))]
  71. }
  72. return string(bytes), nil
  73. }
  74. // strHasLen checks if the given string has a length within min-max.
  75. func strHasLen(str string, min, max int) bool {
  76. return len(str) >= min && len(str) <= max
  77. }
  78. // strSliceContains checks if a string is present in the string slice.
  79. func strSliceContains(str string, sl []string) bool {
  80. for _, s := range sl {
  81. if s == str {
  82. return true
  83. }
  84. }
  85. return false
  86. }