X-Git-Url: http://nsz.repo.hu/git/?p=epoint;a=blobdiff_plain;f=pkg%2Fserver%2Fserver.go;fp=pkg%2Fserver%2Fserver.go;h=8f113328d144dec7d575d4bafa86be62fd126e3c;hp=ab41250ec995a5750f26ebe76e0f070747ab7156;hb=d24526e0d767f7b45956d362180d2684e1e17294;hpb=b9595460ff43dfd8cf07fe56f9908583456dc9c6 diff --git a/pkg/server/server.go b/pkg/server/server.go index ab41250..8f11332 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -5,11 +5,11 @@ package server import ( "bytes" "crypto/openpgp" - "crypto/rand" "epoint/document" "epoint/key" "epoint/store" "fmt" + "log" "time" ) @@ -33,7 +33,7 @@ type work struct { var db *store.Conn var serverkey *openpgp.Entity var newchan chan *work -var delchan chan string +var delchan chan *work type worklist struct { head *work @@ -64,31 +64,19 @@ func popwork(ws *worklist) *work { func setserverkey(e *openpgp.Entity) (err error) { serverkey = e - - // TODO: maybe Serialize should do this internally - for _, ident := range e.Identities { - err = ident.SelfSignature.SignUserId(rand.Reader, ident.UserId.Id, e.PrimaryKey, e.PrivateKey) - if err != nil { - return - } - } - for _, subkey := range e.Subkeys { - err = subkey.Sig.SignKey(rand.Reader, subkey.PublicKey, e.PrivateKey) - if err != nil { - return - } + err = key.SelfSign(e) + if err != nil { + return } - - b := new(bytes.Buffer) - err = e.Serialize(b) + d, err := key.Format(e) if err != nil { return } - err = db.Set("key", key.Id(e), b.Bytes()) + err = db.Set("key", key.Id(e), d) if err != nil { return } - err = db.Set("", "serverkey", b.Bytes()) + err = db.Set("", "serverkey", d) return } @@ -263,6 +251,7 @@ func addDraft(d []byte, signed *document.Signed, draft *document.Draft) (c []byt w.signed = signed w.draft = draft w.sync = make(chan int) + log.Printf("add draft work: %s", w.account) newchan <- w <-w.sync return w.out, w.err @@ -276,16 +265,19 @@ func addDebit(d []byte, signed *document.Signed, cert *document.DebitCert) (c [] w.signed = signed w.debit = cert w.sync = make(chan int) + log.Printf("add debit work: %s", w.account) newchan <- w <-w.sync return w.out, w.err } func dispatch() { + log.Printf("start dispatch") works := make(map[string]*worklist) for { select { case w := <-newchan: + log.Printf("queue work: %s", w.account) ws := works[w.account] if ws == nil { // TODO: unnecessary alloc @@ -294,19 +286,21 @@ func dispatch() { } else { pushwork(ws, w) } - case account := <-delchan: - ws := works[account] - w := popwork(ws) - if w == nil { - delete(works, account) + case w := <-delchan: + log.Printf("unqueue work: %s", w.account) + ws := works[w.account] + wnext := popwork(ws) + if wnext == nil { + delete(works, w.account) } else { - go handle(w) + go handle(wnext) } } } } func handle(w *work) { + log.Printf("start work: %s", w.account) if w.debit != nil { handleDebit(w) } else if w.draft != nil { @@ -314,7 +308,8 @@ func handle(w *work) { } else { panic("unreachable") } - delchan <- w.account + log.Printf("finish work: %s outlen: %d, errtype: %T", w.account, len(w.out), w.err) + delchan <- w w.sync <- 0 } @@ -358,8 +353,8 @@ func handleDraft(w *work) { if err != nil { return } - certid := document.Id(signed) w.out = c + certid := document.Id(signed) err = db.Set("cert", certid, c) if err != nil { // internal error @@ -417,6 +412,7 @@ func handleDebit(w *work) { // internal error return } + w.out = c certid := document.Id(signed) err = db.Set("cert", certid, c) if err != nil { @@ -607,6 +603,8 @@ func Init(rootdir string, sk *openpgp.Entity) (err error) { if err != nil { return } + newchan = make(chan *work) + delchan = make(chan *work) go dispatch() return }