Further refactor file reading.

このコミットが含まれているのは:
Christian Heller 2016-02-12 11:59:48 +01:00
コミット d6c3ebf566
1個のファイルの変更41行の追加47行の削除

88
main.go
ファイルの表示

@ -135,6 +135,21 @@ func tokensFromLine(scanner *bufio.Scanner, nTokensExpected int) []string {
return tokens
}
func getFromFileEntryFor(path, token string,
numberTokensExpected int) ([]string, error) {
file := openFile(path)
defer file.Close()
scanner := bufio.NewScanner(bufio.NewReader(file))
tokens := tokensFromLine(scanner, numberTokensExpected)
for 0 != len(tokens) {
if 0 == strings.Compare(tokens[0], token) {
return tokens[1:], nil
}
tokens = tokensFromLine(scanner, 3)
}
return []string{}, errors.New("")
}
func execTemplate(w http.ResponseWriter, file string, input string) {
type data struct{ Msg string }
err := templ.ExecuteTemplate(w, file, data{Msg: input})
@ -154,31 +169,24 @@ func onlyLegalRunes(str string) bool {
func checkDelay(w http.ResponseWriter, ip string) (int, error) {
var err error
fileIpDelays := openFile(ipDelaysPath)
defer fileIpDelays.Close()
scanner := bufio.NewScanner(bufio.NewReader(fileIpDelays))
tokens := tokensFromLine(scanner, 3)
delay := -1
var openTime int
for 3 == len(tokens) {
if 0 == strings.Compare(tokens[0], ip) {
openTime, err = strconv.Atoi(tokens[1])
if err != nil {
log.Fatal("Can't parse IP delays file", err)
}
delay, err = strconv.Atoi(tokens[2])
if err != nil {
log.Fatal("Can't parse IP delays file", err)
}
if int(time.Now().Unix()) < openTime {
execTemplate(w, "error.html",
"This IP must wait a while for its "+
"next login attempt.")
err = errors.New("")
}
break
delay := -1
tokens, errGet := getFromFileEntryFor(ipDelaysPath, ip, 3)
if errGet == nil {
openTime, err = strconv.Atoi(tokens[0])
if err != nil {
log.Fatal("Can't parse IP delays file", err)
}
delay, err = strconv.Atoi(tokens[1])
if err != nil {
log.Fatal("Can't parse IP delays file", err)
}
if int(time.Now().Unix()) < openTime {
execTemplate(w, "error.html",
"This IP must wait a while for its "+
"next login attempt.")
err = errors.New("")
}
tokens = tokensFromLine(scanner, 3)
}
return delay, err
}
@ -195,21 +203,13 @@ func login(w http.ResponseWriter, r *http.Request) (string, error) {
name := r.FormValue("name")
pw := r.FormValue("password")
loginValid := false
fileLogins := openFile(loginsPath)
defer fileLogins.Close()
scanner := bufio.NewScanner(bufio.NewReader(fileLogins))
tokens := tokensFromLine(scanner, 3)
for 0 != len(tokens) {
if 0 == strings.Compare(tokens[0], name) &&
nil == bcrypt.CompareHashAndPassword([]byte(tokens[1]),
[]byte(pw)) {
loginValid = true
if 0 <= delay {
removeLineStartingWith(ipDelaysPath, ip)
}
break
tokens, err := getFromFileEntryFor(loginsPath, name, 3)
if err == nil && nil == bcrypt.CompareHashAndPassword([]byte(tokens[0]),
[]byte(pw)) {
loginValid = true
if 0 <= delay {
removeLineStartingWith(ipDelaysPath, ip)
}
tokens = tokensFromLine(scanner, 3)
}
if !loginValid {
newLine := delay == -1
@ -245,16 +245,10 @@ func accountLine(w http.ResponseWriter, r *http.Request,
return "", errors.New("")
}
if checkDupl {
fileRead := openFile(loginsPath)
defer fileRead.Close()
scanner := bufio.NewScanner(bufio.NewReader(fileRead))
tokens := tokensFromLine(scanner, 3)
for 0 != len(tokens) {
if 0 == strings.Compare(name, tokens[0]) {
execTemplate(w, "error.html", "Username taken.")
return "", errors.New("")
}
tokens = tokensFromLine(scanner, 3)
_, err := getFromFileEntryFor(loginsPath, name, 3)
if err == nil {
execTemplate(w, "error.html", "Username taken.")
return "", errors.New("")
}
}
hash, err := bcrypt.GenerateFromPassword([]byte(pw), bcrypt.DefaultCost)