fix balance check in server logic master
authornsz <nsz@port70.net>
Sun, 29 Jan 2012 19:00:26 +0000 (20:00 +0100)
committernsz <nsz@port70.net>
Sun, 29 Jan 2012 19:00:26 +0000 (20:00 +0100)
pkg/server/server.go

index 93d8da2..8be10b2 100644 (file)
@@ -429,6 +429,10 @@ func handleDebit(w *work) (c []byte, err error) {
        return
 }
 
+func isIssuer(c *document.Cert) bool {
+       return c.Issuer == c.Holder
+}
+
 func newDebitCert(w *work) (*document.DebitCert, error) {
        cert := new(document.DebitCert)
        cert.Holder = w.draft.Drawer
@@ -461,6 +465,7 @@ func newDebitCert(w *work) (*document.DebitCert, error) {
                        // internal error
                        return nil, err
                }
+               // TODO: make sure oldcert and newcert cannot become inconsistent
                // TODO: this is a hack
                oldcert, err := document.ToCert(iv)
                if err != nil {
@@ -473,8 +478,8 @@ func newDebitCert(w *work) (*document.DebitCert, error) {
                if cert.Balance <= -IntLimit {
                        return nil, fmt.Errorf("balance limit exceeded: %d", cert.Balance)
                }
-               if oldcert.Balance > 0 && cert.Balance < 0 {
-                       return nil, fmt.Errorf("insufficient funds: %d", oldcert.Balance)
+               if !isIssuer(&cert.Cert) && cert.Balance < 0 {
+                       return nil, fmt.Errorf("insufficient funds: %d, draft: %d", oldcert.Balance, cert.Difference)
                }
                cert.LastDebitSerial = oldcert.LastDebitSerial
                cert.LastCreditSerial = oldcert.LastCreditSerial
@@ -536,6 +541,10 @@ func newCreditCert(w *work) (*document.CreditCert, error) {
                if cert.Balance >= IntLimit {
                        return nil, fmt.Errorf("balance limit exceeded: %d", cert.Balance)
                }
+               // sanity check
+               if isIssuer(&cert.Cert) && cert.Balance > 0 {
+                       return nil, fmt.Errorf("internal error")
+               }
                cert.LastDebitSerial = oldcert.LastDebitSerial
                cert.LastCreditSerial = oldcert.LastCreditSerial
                if _, ok := iv.(*document.DebitCert); ok {