util.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package base64Captcha
  2. import (
  3. "crypto/rand"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. )
  9. //parseDigitsToString parse randomDigits to normal string
  10. func parseDigitsToString(bytes []byte) string {
  11. stringB := make([]byte, len(bytes))
  12. for idx, by := range bytes {
  13. stringB[idx] = by + '0'
  14. }
  15. return string(stringB)
  16. }
  17. func stringToFakeByte(content string) []byte {
  18. digits := make([]byte, len(content))
  19. for idx, cc := range content {
  20. digits[idx] = byte(cc - '0')
  21. }
  22. return digits
  23. }
  24. // randomDigits returns a byte slice of the given length containing
  25. // pseudorandom numbers in range 0-9. The slice can be used as a captcha
  26. // solution.
  27. func randomDigits(length int) []byte {
  28. return randomBytesMod(length, 10)
  29. }
  30. // randomBytes returns a byte slice of the given length read from CSPRNG.
  31. func randomBytes(length int) (b []byte) {
  32. b = make([]byte, length)
  33. if _, err := io.ReadFull(rand.Reader, b); err != nil {
  34. panic("captcha: error reading random source: " + err.Error())
  35. }
  36. return
  37. }
  38. // randomBytesMod returns a byte slice of the given length, where each byte is
  39. // a random number modulo mod.
  40. func randomBytesMod(length int, mod byte) (b []byte) {
  41. if length == 0 {
  42. return nil
  43. }
  44. if mod == 0 {
  45. panic("captcha: bad mod argument for randomBytesMod")
  46. }
  47. maxrb := 255 - byte(256%int(mod))
  48. b = make([]byte, length)
  49. i := 0
  50. for {
  51. r := randomBytes(length + (length / 4))
  52. for _, c := range r {
  53. if c > maxrb {
  54. // Skip this number to avoid modulo bias.
  55. continue
  56. }
  57. b[i] = c % mod
  58. i++
  59. if i == length {
  60. return
  61. }
  62. }
  63. }
  64. }
  65. func itemWriteFile(cap Item, outputDir, fileName, fileExt string) error {
  66. filePath := filepath.Join(outputDir, fileName+"."+fileExt)
  67. if !pathExists(outputDir) {
  68. _ = os.MkdirAll(outputDir, os.ModePerm)
  69. }
  70. file, err := os.Create(filePath)
  71. if err != nil {
  72. fmt.Printf("%s is invalid path.error:%v", filePath, err)
  73. return err
  74. }
  75. defer file.Close()
  76. _, err = cap.WriteTo(file)
  77. return err
  78. }
  79. func pathExists(path string) bool {
  80. _, err := os.Stat(path)
  81. if err == nil {
  82. return true
  83. }
  84. if os.IsNotExist(err) {
  85. return false
  86. }
  87. return false
  88. }