Generator.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. /*
  70. ritorna la stringa passata in lower.mode
  71. */
  72. return strings.ToLower(stringa)
  73. }
  74. func Run(filedaleggere string) string {
  75. /*
  76. procede alla lettura del file indicato che e' sempre necessario
  77. */
  78. result := caricaFile(filedaleggere)
  79. if result == nil {
  80. fmt.Printf("Errore di lettura file '%s', esco.\n",filedaleggere)
  81. os.Exit(98)
  82. }
  83. // effettua la scasione del file e ne legge il contenuto
  84. l := scansioneFile(result)
  85. if l == nil {
  86. fmt.Println("Errore di lettura, esco.")
  87. return ""
  88. }
  89. defer result.Close()
  90. // estrae un valore a caso da 0 alla lunghezza del file.
  91. position := returnRandom(l.Len())
  92. counter := 0
  93. risultato1 := " "
  94. /*
  95. estrae una riga dal file in base a 'position'
  96. */
  97. for e := l.Front(); e != nil; e = e.Next() {
  98. if position == counter {
  99. risultato1 = fmt.Sprintf("%s",e.Value)
  100. }
  101. counter++
  102. }
  103. risultato1 = returnStringToLower(risultato1)
  104. risultato1 = returnStringCharUp(risultato1)
  105. /* estrae un simbolo */
  106. var simboli string = "\"'!?,.;:#%"
  107. simbolo1 := simboli[returnRandom(len(simboli))-1]
  108. simbolo2 := simboli[returnRandom(len(simboli))-1]
  109. elementi := []int{returnRandom(9),returnRandom(9),returnRandom(9),returnRandom(9)}
  110. stringa := fmt.Sprintf("%d%d%c%s%c%d%d",elementi[0],elementi[1],simbolo1,risultato1,simbolo2,elementi[2],elementi[3])
  111. fmt.Printf("Password: %s\n",stringa)
  112. return stringa
  113. }