fix new server logic
authornsz <nsz@port70.net>
Mon, 23 Jan 2012 21:04:40 +0000 (22:04 +0100)
committernsz <nsz@port70.net>
Mon, 23 Jan 2012 21:04:40 +0000 (22:04 +0100)
pkg/server/server.go

index 8f11332..0271155 100644 (file)
@@ -260,7 +260,7 @@ func addDraft(d []byte, signed *document.Signed, draft *document.Draft) (c []byt
 func addDebit(d []byte, signed *document.Signed, cert *document.DebitCert) (c []byte, err error) {
        w := new(work)
        w.docid = document.Id(signed)
-       w.account = fmt.Sprintf("%s.%s", cert.Holder, cert.Issuer)
+       w.account = fmt.Sprintf("%s.%s", cert.Beneficiary, cert.Issuer)
        w.in = d
        w.signed = signed
        w.debit = cert
@@ -302,9 +302,9 @@ func dispatch() {
 func handle(w *work) {
        log.Printf("start work: %s", w.account)
        if w.debit != nil {
-               handleDebit(w)
+               w.out, w.err = handleDebit(w)
        } else if w.draft != nil {
-               handleDraft(w)
+               w.out, w.err = handleDraft(w)
        } else {
                panic("unreachable")
        }
@@ -313,34 +313,30 @@ func handle(w *work) {
        w.sync <- 0
 }
 
-func handleDraft(w *work) {
+func handleDraft(w *work) (c []byte, err error) {
        nonce := fmt.Sprintf("%s.%s", w.account, w.draft.Nonce)
        oldid, err := db.Get("draftby/key.issuer.nonce", nonce)
        if err == nil {
                if string(oldid) != w.docid {
-                       w.err = fmt.Errorf("draft nonce is not unique (see draft %s)", oldid)
+                       err = fmt.Errorf("draft nonce is not unique (see draft %s)", oldid)
                } else {
-                       w.out, w.err = GetCert("certby/draft", w.docid)
+                       c, err = GetCert("certby/draft", w.docid)
                }
                return
        } else if _, ok := err.(store.NotFoundError); !ok {
-               w.err = err
                return
        }
 
        err = db.Begin(w.docid)
        if err != nil {
-               w.err = err
                return
        }
        err = db.Set("draft", w.docid, w.in)
        if err != nil {
-               w.err = err
                return
        }
        err = db.Set("draftby/key.issuer.nonce", nonce, []byte(w.docid))
        if err != nil {
-               w.err = err
                return
        }
        cert, err := newDebitCert(w)
@@ -353,7 +349,6 @@ func handleDraft(w *work) {
        if err != nil {
                return
        }
-       w.out = c
        certid := document.Id(signed)
        err = db.Set("cert", certid, c)
        if err != nil {
@@ -381,24 +376,20 @@ func handleDraft(w *work) {
        return
 }
 
-func handleDebit(w *work) {
-       c, err := GetCert("certby/debit", w.docid)
+func handleDebit(w *work) (c []byte, err error) {
+       c, err = GetCert("certby/debit", w.docid)
        if err == nil {
-               w.out = c
                return
        } else if _, ok := err.(store.NotFoundError); !ok {
                // internal error
-               w.err = err
                return
        }
        err = db.Begin(w.docid)
        if err != nil {
-               w.err = err
                return
        }
        err = db.Set("cert", w.docid, w.in)
        if err != nil {
-               w.err = err
                return
        }
        // TODO: check pubkey etc
@@ -412,7 +403,6 @@ func handleDebit(w *work) {
                // internal error
                return
        }
-       w.out = c
        certid := document.Id(signed)
        err = db.Set("cert", certid, c)
        if err != nil {
@@ -512,9 +502,13 @@ func newCreditCert(w *work) (*document.CreditCert, error) {
        cert.Drawer = w.debit.Holder
        cert.DebitCert = w.docid
 
-       oid, err := db.Get("certby/key", w.debit.Beneficiary)
+       oid, err := db.Get("certby/key.issuer", w.account)
        oldcertid := string(oid)
        if err != nil {
+               if _, ok := err.(store.NotFoundError); !ok {
+                       // internal error
+                       return nil, err
+               }
                // this is the first cert
                cert.Serial = 1
                cert.Balance = cert.Difference