19 var serverkey *openpgp.Entity
21 // todo: http header limit: 64K, body limit: 64K
23 // Dummy initialization of serverkey
24 func initkey() (err error) {
25 f, err := os.Open(seckey)
29 keys, err := openpgp.ReadKeyRing(f)
39 err = os.MkdirAll(rootdir, 0755)
43 f, err = os.Create(rootdir + "/serverkey")
47 err = serverkey.Serialize(f)
51 // TODO: make sure pubkey is replicated and available
60 func httpError(w http.ResponseWriter, code int, msg string) {
61 log.Printf("error: %d %s", code, msg)
62 http.Error(w, fmt.Sprintf("%d %s\n\n%s\n", code, http.StatusText(code), msg), code)
65 func httpReq(r *http.Request) string {
72 for k := range r.Form {
75 form = fmt.Sprintf("%v", a)
77 return fmt.Sprintf("%s %s params:%s", r.Method, r.URL.Raw, form)
80 func defaultHandler(w http.ResponseWriter, r *http.Request) {
81 log.Printf("%s %s", r.RemoteAddr, httpReq(r))
82 fmt.Fprintf(w, "not implemented: %s %s\n", r.Method, r.URL.Raw)
85 func submitHandler(w http.ResponseWriter, r *http.Request) {
86 log.Printf("%s %s", r.RemoteAddr, httpReq(r))
87 draft := r.FormValue("draft")
88 debit := r.FormValue("debit")
89 key := r.FormValue("key")
92 cert, err := server.EvalDraft([]byte(draft), serverkey)
94 msg := fmt.Sprintf("eval draft failed: %s", err)
95 httpError(w, 404, msg)
100 cert, err := server.EvalDebitCert([]byte(debit), serverkey)
102 msg := fmt.Sprintf("eval debit failed: %s", err)
103 httpError(w, 404, msg)
108 err := server.AddKeys([]byte(key))
110 msg := fmt.Sprintf("add keys failed: %s", err)
111 httpError(w, 404, msg)
113 w.Write([]byte("ok\nTODO: create cert 1 here?"))
116 msg := fmt.Sprintf("expected key, draft or debit param, got: %s", httpReq(r))
117 httpError(w, 404, msg)
126 err = server.Init(rootdir)
130 err = server.StoreSk(serverkey)
135 // TODO: url from key
136 f, err := os.Create(rootdir + "/form.html")
140 _, _ = fmt.Fprintf(f, `<html><head><title>epoint-server submit form</title></head><body>
141 <h2>epoint-server submit form</h2>
143 <p>submit one document at a time
144 <form method="post" action="/submit">
145 <p>key:<br><textarea name="key" rows="5" cols="80"></textarea>
146 <p>draft:<br><textarea name="draft" rows="5" cols="80"></textarea>
147 <p>debit:<br><textarea name="debit" rows="5" cols="80"></textarea>
148 <p><input type="submit">
150 <h3>command line</h3>
152 curl --data-urlencode name@path/to/file.txt host/submit
154 where 'name' is 'key', 'draft' or 'debit'.
160 http.Handle("/", http.FileServer(http.Dir(rootdir)))
163 // withdraw, draw, deposit, process, clear
164 http.HandleFunc("/submit", submitHandler)
166 log.Printf("start service on %s, server key id: %s\n", addr, key.Id(serverkey))
167 log.Fatal(http.ListenAndServe(addr, nil))