insert key into store only if it does not exist
authornsz <nsz@port70.net>
Tue, 13 Dec 2011 21:13:09 +0000 (22:13 +0100)
committernsz <nsz@port70.net>
Tue, 13 Dec 2011 21:13:09 +0000 (22:13 +0100)
cmd/epoint-client/epoint-client.go
pkg/server/server.go
pkg/store/store.go

index fb95488..8ffc615 100644 (file)
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "bytes"
        "crypto/openpgp"
        "crypto/openpgp/armor"
        "crypto/rand"
@@ -115,11 +116,43 @@ func s(d []byte, cmd, server string) (err error) {
        if err != nil {
                return
        }
-       fmt.Printf("%v", resp)
+       if resp.StatusCode != 200 {
+               log.Printf("request failed: %s\n", resp.Status)
+       }
+       _, err = io.Copy(os.Stdout, resp.Body)
+       if err != nil {
+               return
+       }
+       err = resp.Body.Close()
        return
 }
 
 func v(d []byte) (err error) {
+       // handle armored pubkey
+       if bytes.Index(d, []byte(openpgp.PublicKeyType)) >= 0 {
+               es, err1 := openpgp.ReadArmoredKeyRing(bytes.NewBuffer(d))
+               if err1 != nil {
+                       err = err1
+                       return
+               }
+               for _, e := range es {
+                       isIssuer, issuer, denom, err1 := key.Check(e)
+                       if err1 != nil {
+                               if err != nil {
+                                       log.Println(err)
+                               }
+                               err = err1
+                               continue
+                       }
+                       if isIssuer {
+                               fmt.Println("Issuer key")
+                       } else {
+                               fmt.Println("Holder key")
+                       }
+                       fmt.Printf("Issuer: %s\nDenomination: %s\nId: %s\n", issuer, denom, key.Id(e))
+               }
+               return
+       }
        _, s, err := document.Parse(d)
        if err != nil {
                return
index 614c256..9822a64 100644 (file)
@@ -52,22 +52,27 @@ func AddKeys(d []byte) (err error) {
        }
        for _, e := range entities {
                // TODO: various checks..
+               // TODO: collect errors instead of aborting addkeys
                isIssuer, issuer, denom, err1 := key.Check(e)
                err = err1
                if err != nil {
-                       // TODO..
-                       continue
+                       return
                }
                if !isIssuer {
-                       es, err := GetKeys(issuer)
+                       es, err1 := GetKeys(issuer)
+                       err = err1
+                       if err != nil {
+                               return
+                       }
+                       ok, _, den, err1 := key.Check(es[0])
+                       err = err1
                        if err != nil {
-                               // TODO..
-                               continue
+                               // internal error
+                               return
                        }
-                       ok, _, den, err := key.Check(es[0])
-                       if !ok || err != nil || den != denom {
-                               // TODO..
-                               continue
+                       if !ok || den != denom {
+                               err = fmt.Errorf("Issuer key check failed")
+                               return
                        }
                }
                b := new(bytes.Buffer)
@@ -76,7 +81,7 @@ func AddKeys(d []byte) (err error) {
                        return
                }
                fpr := key.Id(e)
-               err = db.Set("key", fpr, b.Bytes())
+               err = db.Insert("key", fpr, b.Bytes())
                if err != nil {
                        return
                }
index a27935c..e476a7e 100644 (file)
@@ -21,10 +21,19 @@ type NotFoundError struct {
        path string
 }
 
+type AlreadyExistsError struct {
+       path string
+}
+
 func (e NotFoundError) Error() string {
        return "not found: " + e.path
 }
 
+func (e AlreadyExistsError) Error() string {
+       return "already exists: " + e.path
+}
+
+// Open db connection
 func Open(root string) (c *Conn, err error) {
        c = new(Conn)
        c.path, err = filepath.Abs(root)
@@ -38,6 +47,7 @@ func Open(root string) (c *Conn, err error) {
        return
 }
 
+// Get the value of k
 func (c *Conn) Get(name, k string) (v []byte, err error) {
        v, err = ioutil.ReadFile(filepath.Join(c.path, name, k))
        if err != nil {
@@ -48,10 +58,12 @@ func (c *Conn) Get(name, k string) (v []byte, err error) {
        return
 }
 
+// Ensure k-v store with the given name exists
 func (c *Conn) Ensure(name string) (err error) {
        return os.MkdirAll(filepath.Join(c.path, name), 0755)
 }
 
+// Set k to v
 func (c *Conn) Set(name, k string, v []byte) (err error) {
        fn := filepath.Join(c.path, name, k)
        f, err := os.OpenFile(fn+".tmp", os.O_CREATE|os.O_TRUNC|os.O_WRONLY|os.O_SYNC, 0666)
@@ -67,6 +79,25 @@ func (c *Conn) Set(name, k string, v []byte) (err error) {
        return
 }
 
+// Set k to v, but fail if k already exists
+func (c *Conn) Insert(name, k string, v []byte) (err error) {
+       fn := filepath.Join(c.path, name, k)
+       f, err := os.OpenFile(fn, os.O_CREATE|os.O_EXCL|os.O_WRONLY|os.O_SYNC, 0666)
+       if err != nil {
+               if p, ok := err.(*os.PathError); ok && p.Err == os.EEXIST {
+                       err = AlreadyExistsError{name + "/" + k}
+               }
+               return
+       }
+       defer f.Close()
+       _, err = f.Write(v)
+       if err != nil {
+               return
+       }
+       return
+}
+
+// Append v to value of k
 func (c *Conn) Append(name, k string, v []byte) (err error) {
        fn := filepath.Join(c.path, name, k)
        f, err := os.OpenFile(fn, os.O_CREATE|os.O_APPEND|os.O_WRONLY|os.O_SYNC, 0666)
@@ -78,6 +109,7 @@ func (c *Conn) Append(name, k string, v []byte) (err error) {
        return
 }
 
+// Close db connection
 func (c *Conn) Close() (err error) {
        return
 }