From 2fee9546f83e11b9ee76e9b6b37af2702561eddc Mon Sep 17 00:00:00 2001 From: Stephen McQuay Date: Tue, 26 Feb 2013 22:30:23 -0800 Subject: [PATCH] pulled out sqlite3 for json --- README.rst | 2 +- db.go | 46 ++++++++++++++++++++++++++++++++-------------- handlers.go | 12 ++++++------ init_db.sql | 1 - main.go | 24 ++++-------------------- 5 files changed, 43 insertions(+), 42 deletions(-) delete mode 100644 init_db.sql diff --git a/README.rst b/README.rst index 253d663..5cafebe 100644 --- a/README.rst +++ b/README.rst @@ -37,6 +37,6 @@ Dependencies Bootstrap DB ============ -$ sqlite3 db.sqlite < init_db.sql +$ echo "[]" > passwds.json .. _bootstrap: http://twitter.github.com/bootstrap/assets/bootstrap.zip diff --git a/db.go b/db.go index 119f5c9..b9d4545 100644 --- a/db.go +++ b/db.go @@ -2,26 +2,44 @@ package main import ( "code.google.com/p/go.crypto/bcrypt" - "github.com/kuroneko/gosqlite3" + "encoding/json" + "io/ioutil" "log" - "sync" ) -var dbMutex sync.Mutex - -func check_password(attempt string) (result bool) { - db, err := sqlite3.Open(*db_file) - defer db.Close() +func get_passes(filename string) (cur_passes []string, err error) { + b, err := ioutil.ReadFile(filename) + if err != nil { + log.Fatal(err) + } + err = json.Unmarshal(b, &cur_passes) + if err != nil { + log.Fatal(err) + } + return +} + +func add_password(filename, new_pw string) (err error) { + cur_passes, err := get_passes(filename) + if err != nil { + log.Fatal(err) + } + hpass, err := bcrypt.GenerateFromPassword( + []byte(*add_pw), bcrypt.DefaultCost) + cur_passes = append(cur_passes, string(hpass)) + b, err := json.Marshal(cur_passes) + err = ioutil.WriteFile(filename, b, 0644) + if err != nil { + log.Fatal(err) + } + return +} + +func check_password(filename, attempt string) (result bool) { + hashes, err := get_passes(filename) if err != nil { log.Fatal(err) } - // this feels ultra hokey ... I guess I could take it from 2N to N by |= ... - hashes := []string{} - cmd := "SELECT hash FROM passes;" - db.Execute(cmd, func(s *sqlite3.Statement, values ...interface{}) { - cur_hash := values[0].(string) - hashes = append(hashes, cur_hash) - }) for _, hash := range hashes { err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(attempt)) if err == nil { diff --git a/handlers.go b/handlers.go index f4c153b..4d0ebfe 100644 --- a/handlers.go +++ b/handlers.go @@ -15,12 +15,12 @@ func homeHandler(w http.ResponseWriter, req *http.Request) { func loginHandler(w http.ResponseWriter, req *http.Request) { pwAttempt := req.FormValue("passwd") - if check_password(pwAttempt) { - session, _ := store.Get(req, "creds") - session.Values["logged in"] = true - session.Save(req, w) + if check_password(*passes_file, pwAttempt) { + session, _ := store.Get(req, "creds") + session.Values["logged in"] = true + session.Save(req, w) http.Redirect(w, req, "/", http.StatusSeeOther) - return - } + return + } T("login.html").Execute(w, map[string]interface{}{}) } diff --git a/init_db.sql b/init_db.sql deleted file mode 100644 index 4f73906..0000000 --- a/init_db.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE TABLE passes (id INTEGER PRIMARY KEY AUTOINCREMENT, hash STRING); diff --git a/main.go b/main.go index 92864a1..199b49b 100644 --- a/main.go +++ b/main.go @@ -1,11 +1,9 @@ package main import ( - "code.google.com/p/go.crypto/bcrypt" "flag" "fmt" "github.com/gorilla/sessions" - "github.com/kuroneko/gosqlite3" "html/template" "log" "net/http" @@ -13,35 +11,21 @@ import ( var addr = flag.String("addr", ":8000", "address I'll listen on.") var static_files = flag.String("static", "./static", "location of static files") -var db_file = flag.String("db", "./db.sqlite", "the database") +var passes_file = flag.String("passes", "passwds.json", "the password database") var template_dir = flag.String("templates", "templates", "template dir") var add_pw = flag.String("passwd", "", "add this pass to the db") var check_pw = flag.String("checkpw", "", "check if this pw is in db") var store = sessions.NewCookieStore([]byte("hello world")) var templates *template.Template -var db *sqlite3.Database func main() { flag.Parse() if *add_pw != "" { - hpass, err := bcrypt.GenerateFromPassword([]byte(*add_pw), bcrypt.DefaultCost) - if err != nil { - log.Fatal(err) - } - db, err = sqlite3.Open(*db_file) - defer db.Close() - if err != nil { - log.Fatal(err) - } - cmd := fmt.Sprintf("INSERT INTO passes ('id', 'hash') VALUES (null, '%v')", - string(hpass)) - _, err = db.Execute(cmd) - if err != nil { - log.Fatal(err) - } + add_password(*passes_file, *add_pw) } else if *check_pw != "" { - fmt.Printf("valid password: %v\n", check_password(*check_pw)) + fmt.Printf("valid password: %v\n", + check_password(*passes_file, *check_pw)) } else { http.HandleFunc("/", homeHandler) http.HandleFunc("/login", loginHandler)