package main import ( "crypto/openpgp" "epoint/logic" "fmt" "log" "net/http" "os" ) const ( port = ":8080" rootdir = "teststore" seckey = "./key.sec" ) var serverkey *openpgp.Entity // todo: http header limit: 64K, body limit: 64K // getPubkey(db, fpr) (pk, err) // putPubkey(db, fpr, pk) (err) // getDraft(db, id) (draft, err) // putDraft(db, id, draft) (err) // getCert(db, id) (cert, err) // putCert(db, id, cert) (err) // getCertBySerial(db, fpr, sn) (cert, err) // getCertByFpr(db, fpr) (cert, err) // todo: update cert (inc serial..) // Dummy initialization of serverkey func initkey() (err error) { f, err := os.Open(seckey) if err != nil { return } keys, err := openpgp.ReadKeyRing(f) if err != nil { f.Close() return } err = f.Close() if err != nil { return } serverkey = keys[0] err = os.MkdirAll(rootdir, 0755) if err != nil { return } f, err = os.Create(rootdir + "/serverkey") if err != nil { return } err = serverkey.Serialize(f) if err != nil { return } // TODO: make sure pubkey is replicated and available err = f.Sync() if err != nil { return } err = f.Close() return } func defaultHandler(w http.ResponseWriter, r *http.Request) { log.Printf("%s %s %s\n", r.RemoteAddr, r.Method, r.URL.Raw) fmt.Fprintf(w, "not implemented: %s %s\n", r.Method, r.URL.Raw) } func submitHandler(w http.ResponseWriter, r *http.Request) { log.Printf("%s %s %s\n", r.RemoteAddr, r.Method, r.URL.Raw) draft := r.FormValue("draft") debit := r.FormValue("debit") if len(draft) > 0 { cert, err := logic.EvalDraft([]byte(draft), serverkey) if err != nil { log.Printf("eval draft fail: %s", err) fmt.Fprintf(w, "eval draft fail: %s\n", err) } else { w.Write(cert) } } else if len(debit) > 0 { cert, err := logic.EvalDebitCert([]byte(debit), serverkey) if err != nil { log.Printf("eval debit fail: %s", err) fmt.Fprintf(w, "eval debit fail: %s\n", err) } else { w.Write(cert) } } else { fmt.Fprintf(w, "expected draft or debit param, got: %s %s\n", r.Method, r.URL.Raw) } } func main() { err := initkey() if err != nil { log.Fatal(err) } err = logic.Init() if err != nil { log.Fatal(err) } http.HandleFunc("/", defaultHandler) // queries http.HandleFunc("/serverkey", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, rootdir+"/serverkey") }) // http.HandleFunc("/status", defaultHandler) // http.HandleFunc("/pubkey", defaultHandler) // http.HandleFunc("/daft", defaultHandler) // http.HandleFunc("/cert", defaultHandler) // actions // withdraw, draw, deposit, process, clear http.HandleFunc("/submit", submitHandler) log.Printf("start service, server id: %X\n", serverkey.PrimaryKey.Fingerprint) log.Fatal(http.ListenAndServe(port, nil)) }