From 2646267e4d7f7981e5bf63c18f9e0400e3de2f49 Mon Sep 17 00:00:00 2001 From: nsz Date: Tue, 13 Dec 2011 22:13:09 +0100 Subject: [PATCH] insert key into store only if it does not exist --- cmd/epoint-client/epoint-client.go | 35 +++++++++++++++++++++++++++++- pkg/server/server.go | 25 ++++++++++++--------- pkg/store/store.go | 32 +++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 11 deletions(-) diff --git a/cmd/epoint-client/epoint-client.go b/cmd/epoint-client/epoint-client.go index fb95488..8ffc615 100644 --- a/cmd/epoint-client/epoint-client.go +++ b/cmd/epoint-client/epoint-client.go @@ -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 diff --git a/pkg/server/server.go b/pkg/server/server.go index 614c256..9822a64 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -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 } diff --git a/pkg/store/store.go b/pkg/store/store.go index a27935c..e476a7e 100644 --- a/pkg/store/store.go +++ b/pkg/store/store.go @@ -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 } -- 2.20.1