Generator.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package mod
  2. import (
  3. "fmt"
  4. "os"
  5. "bufio"
  6. "container/list"
  7. "math/rand"
  8. "time"
  9. "unicode"
  10. "strings"
  11. "strconv"
  12. )
  13. func caricaFile(file_da_leggere string) *os.File {
  14. /*
  15. lettura file.
  16. nel caso di errore, ritorna nil
  17. */
  18. f,err := os.Open(file_da_leggere)
  19. if err != nil {
  20. fmt.Println("Errore apertura files",err)
  21. return nil
  22. }
  23. // fmt.Println("Valore tornato:",f)
  24. return f
  25. }
  26. func scansioneFile(result *os.File) *list.List {
  27. /*
  28. effettua la lettura del file attraverso
  29. un apposito buffer.
  30. */
  31. l := list.New()
  32. fs := bufio.NewScanner(result)
  33. for fs.Scan() {
  34. /*
  35. l è una lista che viene
  36. alimentata leggendo il file di testo bufferizzato
  37. */
  38. l.PushBack(fs.Text())
  39. }
  40. if err := fs.Err(); err != nil {
  41. fmt.Println("Errore finale:",err)
  42. return nil
  43. }
  44. return l
  45. }
  46. func returnRandom(l int) int {
  47. /*
  48. ritorna un numero random da 0 a l
  49. ogni volta resetta il contatore
  50. */
  51. r1 := rand.NewSource(time.Now().UnixNano())
  52. s1 := rand.New(r1)
  53. return s1.Intn(l)+1
  54. }
  55. func returnStringCharUp(stringa string) string {
  56. /*
  57. prende una stringa e cambia lo stato di un carattere (da lower a upper e viceversa)
  58. */
  59. lunghezza := len(stringa)
  60. random := returnRandom(lunghezza) -1
  61. s := []byte(stringa)
  62. if unicode.IsUpper(rune(s[random])) {
  63. s[random]=byte(unicode.ToLower(rune(s[random])))
  64. } else {
  65. s[random]=byte(unicode.ToUpper(rune(s[random])))
  66. }
  67. return string(s)
  68. }
  69. func returnStringToLower(stringa string) string {
  70. /*
  71. ritorna la stringa passata in lower.mode
  72. */
  73. return strings.ToLower(stringa)
  74. }
  75. func estraeDaFile(filedaleggere string) string {
  76. /*
  77. effettua la lettura vera e propria del file
  78. */
  79. result := caricaFile(filedaleggere)
  80. if result == nil {
  81. fmt.Printf("Errore di lettura file '%s', esco.\n",filedaleggere)
  82. os.Exit(98)
  83. }
  84. /*
  85. effettua la scansione e il caricamento in memoria
  86. */
  87. l := scansioneFile(result)
  88. if l == nil {
  89. fmt.Println("Errore di lettura, esco.")
  90. return ""
  91. }
  92. defer result.Close()
  93. // estrae un valore a caso da 0 alla lunghezza del file.
  94. position := returnRandom(l.Len())
  95. counter := 0
  96. risultato1 := " "
  97. /*
  98. estrae una riga dal file in base a 'position'
  99. */
  100. for e := l.Front(); e != nil; e = e.Next() {
  101. if position == counter {
  102. risultato1 = fmt.Sprintf("%s",e.Value)
  103. }
  104. counter++
  105. }
  106. return risultato1
  107. }
  108. func RunNumber(lunghezza int) string {
  109. /*
  110. ritorna il numero di elementi indicati racchiusi in una string
  111. */
  112. risultato := ""
  113. for i:=0;i<lunghezza;i++ {
  114. risultato = risultato + strconv.Itoa(returnRandom(9))
  115. }
  116. return risultato
  117. }
  118. func Run(filedaleggere string) string {
  119. /*
  120. vengono effettuati diversi passaggi:
  121. lettura del file
  122. passaggio della frase estratta a tutto minuscolo
  123. scelta random di una lettera da far diventare maiuscola
  124. estrazione di simboli
  125. esrazione di numeri
  126. */
  127. risultato1 := estraeDaFile(filedaleggere)
  128. risultato1 = returnStringToLower(risultato1)
  129. risultato1 = returnStringCharUp(risultato1)
  130. /* estrae un simbolo */
  131. var simboli string = "\"'!?,.;:#%"
  132. simbolo1 := simboli[returnRandom(len(simboli))-1]
  133. simbolo2 := simboli[returnRandom(len(simboli))-1]
  134. elementi := []int{returnRandom(9),returnRandom(9),returnRandom(9),returnRandom(9)}
  135. stringa := fmt.Sprintf("%d%d%c%s%c%d%d",elementi[0],elementi[1],simbolo1,risultato1,simbolo2,elementi[2],elementi[3])
  136. fmt.Printf("Password: %s\n",stringa)
  137. return stringa
  138. }