Generator.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package mod
  2. import (
  3. "fmt"
  4. "os"
  5. "bufio"
  6. "container/list"
  7. "math/rand"
  8. "time"
  9. "unicode"
  10. "strings"
  11. )
  12. func caricaFile(file_da_leggere string) *os.File {
  13. /*
  14. lettura file.
  15. nel caso di errore, ritorna nil
  16. */
  17. f,err := os.Open(file_da_leggere)
  18. if err != nil {
  19. fmt.Println("Errore apertura files",err)
  20. return nil
  21. }
  22. // fmt.Println("Valore tornato:",f)
  23. return f
  24. }
  25. func scansioneFile(result *os.File) *list.List {
  26. /*
  27. effettua la lettura del file attraverso
  28. un apposito buffer.
  29. */
  30. l := list.New()
  31. fs := bufio.NewScanner(result)
  32. for fs.Scan() {
  33. /*
  34. l è una lista che viene
  35. alimentata leggendo il file di testo bufferizzato
  36. */
  37. l.PushBack(fs.Text())
  38. }
  39. if err := fs.Err(); err != nil {
  40. fmt.Println("Errore finale:",err)
  41. return nil
  42. }
  43. return l
  44. }
  45. func returnRandom(l int) int {
  46. /*
  47. ritorna un numero random da 0 a l
  48. ogni volta resetta il contatore
  49. */
  50. r1 := rand.NewSource(time.Now().UnixNano())
  51. s1 := rand.New(r1)
  52. return s1.Intn(l)+1
  53. }
  54. func returnStringCharUp(stringa string) string {
  55. /*
  56. prende una stringa e cambia lo stato di un carattere (da lower a upper e viceversa)
  57. */
  58. lunghezza := len(stringa)
  59. random := returnRandom(lunghezza) -1
  60. s := []byte(stringa)
  61. if unicode.IsUpper(rune(s[random])) {
  62. s[random]=byte(unicode.ToLower(rune(s[random])))
  63. } else {
  64. s[random]=byte(unicode.ToUpper(rune(s[random])))
  65. }
  66. return string(s)
  67. }
  68. func returnStringToLower(stringa string) string {
  69. // ritorna la stringa passata in lower.mode
  70. return strings.ToLower(stringa)
  71. }
  72. func Run(filedaleggere string) string {
  73. result := caricaFile(filedaleggere)
  74. if result == nil {
  75. fmt.Printf("Errore di lettura file '%s', esco.\n",filedaleggere)
  76. os.Exit(98)
  77. }
  78. // effettua la scnasione del file e ne legge il contenuto
  79. l := scansioneFile(result)
  80. if l == nil {
  81. fmt.Println("Errore di lettura, esco.")
  82. return ""
  83. }
  84. defer result.Close()
  85. // estrae un valore a caso da 0 alla lunghezza del file.
  86. position := returnRandom(l.Len())
  87. counter := 0
  88. risultato1 := " "
  89. /*
  90. estrae una riga dal file in base a 'position'
  91. */
  92. for e := l.Front(); e != nil; e = e.Next() {
  93. if position == counter {
  94. risultato1 = fmt.Sprintf("%s",e.Value)
  95. }
  96. counter++
  97. }
  98. risultato1 = returnStringToLower(risultato1)
  99. risultato1 = returnStringCharUp(risultato1)
  100. /* estrae un simbolo */
  101. var simboli string = "\"'!?,.;:#%"
  102. simbolo1 := simboli[returnRandom(len(simboli))-1]
  103. simbolo2 := simboli[returnRandom(len(simboli))-1]
  104. elementi := []int{returnRandom(9),returnRandom(9),returnRandom(9),returnRandom(9)}
  105. stringa := fmt.Sprintf("%d%d%c%s%c%d%d",elementi[0],elementi[1],simbolo1,risultato1,simbolo2,elementi[2],elementi[3])
  106. fmt.Printf("Password: %s\n",stringa)
  107. return stringa
  108. }