X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=epoint-server.go;h=786c70ce5fef47c2953b30dfe8e1ba975a875a24;hb=293e53e15524518b254091a155c5d04f4305816d;hp=8ceef64c6679d5afcb819295339f2c872bebdeb7;hpb=8c18ef4b933521326f7b352829305dcaaeb8e7c4;p=epoint diff --git a/epoint-server.go b/epoint-server.go index 8ceef64..786c70c 100644 --- a/epoint-server.go +++ b/epoint-server.go @@ -10,8 +10,8 @@ import ( ) const ( - port = ":8080" - rootdir = "teststore" + addr = ":8080" + rootdir = "docroot" seckey = "./key.sec" ) @@ -19,18 +19,6 @@ 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) @@ -68,33 +56,64 @@ func initkey() (err error) { return } +func httpError(w http.ResponseWriter, code int, msg string) { + log.Printf("error: %d %s", code, msg) + http.Error(w, fmt.Sprintf("%d %s\n\n%s\n", code, http.StatusText(code), msg), code) +} + +func httpReq(r *http.Request) string { + err := r.ParseForm() + form := "" + if err != nil { + form = err.Error() + } else { + a := []string{} + for k := range r.Form { + a = append(a, k) + } + form = fmt.Sprintf("%v", a) + } + return fmt.Sprintf("%s %s params:%s", r.Method, r.URL.Raw, form) +} + func defaultHandler(w http.ResponseWriter, r *http.Request) { - log.Printf("%s %s %s\n", r.RemoteAddr, r.Method, r.URL.Raw) + log.Printf("%s %s", r.RemoteAddr, httpReq(r)) 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) + log.Printf("%s %s", r.RemoteAddr, httpReq(r)) draft := r.FormValue("draft") debit := r.FormValue("debit") - if len(draft) > 0 { + key := r.FormValue("key") + switch { + case draft != "": 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) + msg := fmt.Sprintf("eval draft failed: %s", err) + httpError(w, 404, msg) } else { w.Write(cert) } - } else if len(debit) > 0 { + case debit != "": 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) + msg := fmt.Sprintf("eval debit failed: %s", err) + httpError(w, 404, msg) } else { w.Write(cert) } - } else { - fmt.Fprintf(w, "expected draft or debit param, got: %s %s\n", r.Method, r.URL.Raw) + case key != "": + err := logic.AddKeys([]byte(key)) + if err != nil { + msg := fmt.Sprintf("add keys failed: %s", err) + httpError(w, 404, msg) + } else { + w.Write([]byte("ok\nTODO: create cert 1 here?")) + } + default: + msg := fmt.Sprintf("expected key, draft or debit param, got: %s", httpReq(r)) + httpError(w, 404, msg) } } @@ -103,26 +122,42 @@ func main() { if err != nil { log.Fatal(err) } - err = logic.Init() + err = logic.Init(rootdir) if err != nil { log.Fatal(err) } - http.HandleFunc("/", defaultHandler) + // TODO: url from key + f, err := os.Create(rootdir + "/form.html") + if err != nil { + log.Fatal(err) + } + _, _ = fmt.Fprintf(f, `epoint-server submit form +

epoint-server submit form

+

web form

+

submit one document at once +

+

key:
+

draft:
+

debit:
+

+

+

command line

+
+curl --data-urlencode name@path/to/file.txt host/submit
+
+where 'name' is 'key', 'draft' or 'debit'. + +`, addr) + _ = f.Close() // 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) + http.Handle("/", http.FileServer(http.Dir(rootdir))) // 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)) + log.Printf("start service on %s, server key id: %X\n", addr, serverkey.PrimaryKey.Fingerprint) + log.Fatal(http.ListenAndServe(addr, nil)) }