allowances/db.go

89 lines
1.6 KiB
Go
Raw Normal View History

package allowances
2013-02-21 00:19:21 -08:00
import (
2013-02-26 22:30:23 -08:00
"encoding/json"
"io/ioutil"
2013-02-21 00:19:21 -08:00
"log"
"os"
2013-03-04 21:56:39 -08:00
"sync"
2013-02-21 00:19:21 -08:00
"golang.org/x/crypto/bcrypt"
)
2013-03-04 21:56:39 -08:00
func GetHashes(filename string) (Passes, bool, error) {
r := []string{}
exists := false
if !Exists(filename) {
return r, exists, nil
}
exists = true
f, err := os.Open(filename)
2013-02-26 22:30:23 -08:00
if err != nil {
return nil, exists, err
2013-02-26 22:30:23 -08:00
}
err = json.NewDecoder(f).Decode(&r)
2013-02-26 22:30:23 -08:00
if err != nil {
return nil, exists, err
2013-02-26 22:30:23 -08:00
}
return r, exists, nil
2013-02-26 22:30:23 -08:00
}
func AddPassword(filename, pw string) error {
curPasses, _, err := GetHashes(filename)
2013-02-26 22:30:23 -08:00
if err != nil {
return err
2013-02-26 22:30:23 -08:00
}
hpass, err := bcrypt.GenerateFromPassword(
[]byte(pw), bcrypt.DefaultCost)
curPasses = append(curPasses, string(hpass))
f, err := os.Create(filename)
2013-02-26 22:30:23 -08:00
if err != nil {
return err
2013-02-26 22:30:23 -08:00
}
if err := json.NewEncoder(f).Encode(curPasses); err != nil {
return err
}
return nil
2013-02-26 22:30:23 -08:00
}
2013-02-21 00:19:21 -08:00
type Passes []string
func (p Passes) Check(attempt string) (bool, error) {
// TODO: parallelize
for _, hash := range p {
2013-02-21 00:36:32 -08:00
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(attempt))
2013-02-21 00:19:21 -08:00
if err == nil {
return true, err
2013-02-21 00:19:21 -08:00
}
}
return false, nil
2013-02-21 00:19:21 -08:00
}
2013-03-04 21:56:39 -08:00
var dbMutex = sync.RWMutex{}
2013-03-08 22:28:24 -08:00
func loadChildren(filename string) (children map[string]int) {
2013-03-06 12:31:30 -08:00
dbMutex.RLock()
defer dbMutex.RUnlock()
2013-03-04 21:56:39 -08:00
b, err := ioutil.ReadFile(filename)
if err != nil {
log.Fatal(err)
}
err = json.Unmarshal(b, &children)
if err != nil {
log.Fatal(err)
}
return
}
2013-03-08 22:28:24 -08:00
func dumpChildren(filename string, children map[string]int) {
dbMutex.Lock()
defer dbMutex.Unlock()
b, err := json.Marshal(children)
2013-03-08 22:28:24 -08:00
err = ioutil.WriteFile(filename, b, 0644)
if err != nil {
log.Fatal("serious issue writing children db file", err)
}
return
}