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
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")
}
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)
if err != nil {
return
}
- w.out = c
certid := document.Id(signed)
err = db.Set("cert", certid, c)
if err != nil {
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
// internal error
return
}
- w.out = c
certid := document.Id(signed)
err = db.Set("cert", certid, c)
if err != nil {
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