package main
import (
+ "bytes"
"crypto/openpgp"
"crypto/openpgp/armor"
"crypto/rand"
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
}
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)
return
}
fpr := key.Id(e)
- err = db.Set("key", fpr, b.Bytes())
+ err = db.Insert("key", fpr, b.Bytes())
if err != nil {
return
}
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)
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 {
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)
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)
return
}
+// Close db connection
func (c *Conn) Close() (err error) {
return
}