18 var serverkey *openpgp.Entity
20 // todo: http header limit: 64K, body limit: 64K
22 // Dummy initialization of serverkey
23 func initkey() (err error) {
24 f, err := os.Open(seckey)
28 keys, err := openpgp.ReadKeyRing(f)
38 err = os.MkdirAll(rootdir, 0755)
42 f, err = os.Create(rootdir + "/serverkey")
46 err = serverkey.Serialize(f)
50 // TODO: make sure pubkey is replicated and available
59 func httpError(w http.ResponseWriter, code int, msg string) {
60 log.Printf("error: %d %s", code, msg)
61 http.Error(w, fmt.Sprintf("%d %s\n\n%s\n", code, http.StatusText(code), msg), code)
64 func httpReq(r *http.Request) string {
71 for k := range r.Form {
74 form = fmt.Sprintf("%v", a)
76 return fmt.Sprintf("%s %s params:%s", r.Method, r.URL.Raw, form)
79 func defaultHandler(w http.ResponseWriter, r *http.Request) {
80 log.Printf("%s %s", r.RemoteAddr, httpReq(r))
81 fmt.Fprintf(w, "not implemented: %s %s\n", r.Method, r.URL.Raw)
84 func submitHandler(w http.ResponseWriter, r *http.Request) {
85 log.Printf("%s %s", r.RemoteAddr, httpReq(r))
86 draft := r.FormValue("draft")
87 debit := r.FormValue("debit")
88 key := r.FormValue("key")
91 cert, err := logic.EvalDraft([]byte(draft), serverkey)
93 msg := fmt.Sprintf("eval draft failed: %s", err)
94 httpError(w, 404, msg)
99 cert, err := logic.EvalDebitCert([]byte(debit), serverkey)
101 msg := fmt.Sprintf("eval debit failed: %s", err)
102 httpError(w, 404, msg)
107 err := logic.AddKeys([]byte(key))
109 msg := fmt.Sprintf("add keys failed: %s", err)
110 httpError(w, 404, msg)
112 w.Write([]byte("ok\nTODO: create cert 1 here?"))
115 msg := fmt.Sprintf("expected key, draft or debit param, got: %s", httpReq(r))
116 httpError(w, 404, msg)
125 err = logic.Init(rootdir)
130 // TODO: url from key
131 f, err := os.Create(rootdir + "/form.html")
135 _, _ = fmt.Fprintf(f, `<html><head><title>epoint-server submit form</title></head><body>
136 <h2>epoint-server submit form</h2>
138 <p>submit one document at once
139 <form method="post" action="http://localhost%s/submit">
140 <p>key:<br><textarea name="key" rows="5" cols="80"></textarea>
141 <p>draft:<br><textarea name="draft" rows="5" cols="80"></textarea>
142 <p>debit:<br><textarea name="debit" rows="5" cols="80"></textarea>
143 <p><input type="submit">
145 <h3>command line</h3>
147 curl --data-urlencode name@path/to/file.txt host/submit
149 where 'name' is 'key', 'draft' or 'debit'.
155 http.Handle("/", http.FileServer(http.Dir(rootdir)))
158 // withdraw, draw, deposit, process, clear
159 http.HandleFunc("/submit", submitHandler)
161 log.Printf("start service on %s, server key id: %X\n", addr, serverkey.PrimaryKey.Fingerprint)
162 log.Fatal(http.ListenAndServe(addr, nil))