)
const (
- port = ":8080"
- rootdir = "teststore"
+ addr = ":8080"
+ rootdir = "docroot"
seckey = "./key.sec"
)
// 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)
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)
}
}
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, `<html><head><title>epoint-server submit form</title></head><body>
+<h2>epoint-server submit form</h2>
+<h3>web form</h3>
+<p>submit one document at once
+<form method="post" action="http://localhost%s/submit">
+<p>key:<br><textarea name="key" rows="5" cols="80"></textarea>
+<p>draft:<br><textarea name="draft" rows="5" cols="80"></textarea>
+<p>debit:<br><textarea name="debit" rows="5" cols="80"></textarea>
+<p><input type="submit">
+</form>
+<h3>command line</h3>
+<pre>
+curl --data-urlencode name@path/to/file.txt host/submit
+</pre>
+where 'name' is 'key', 'draft' or 'debit'.
+</body></html>
+`, 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))
}