fix document test
[epoint] / pkg / document / document.go
index 22065fc..b82b167 100644 (file)
@@ -160,13 +160,13 @@ type Cert struct {
 
 type DebitCert struct {
        Cert
-       Beneficiary      string
+       Beneficiary string
 }
 
 type CreditCert struct {
        Cert
-       Drawer           string
-       DebitCert        string
+       Drawer    string
+       DebitCert string
 }
 
 type BounceCert struct {
@@ -180,6 +180,7 @@ type BounceCert struct {
        References   []string
 }
 
+// Common cert part of a debit or credit cert
 func ToCert(v interface{}) (cert *Cert, err error) {
        cert = new(Cert)
        switch x := v.(type) {
@@ -206,10 +207,10 @@ func cleanBody(s []byte) []byte {
 func Id(c *Signed) string {
        h := sha1.New()
        h.Write(c.Body)
-       return fmt.Sprintf("%040X", h.Sum())
+       return fmt.Sprintf("%040X", h.Sum(nil))
 }
 
-// parse an epoint document without checking the signature and format details
+// Parse an epoint document without checking the signature and format details
 func Parse(s []byte) (iv interface{}, c *Signed, err error) {
        c, err = ParseSigned(s)
        if err != nil {
@@ -223,7 +224,7 @@ func Parse(s []byte) (iv interface{}, c *Signed, err error) {
        return
 }
 
-// format and sign an epoint document
+// Format and sign an epoint document
 func Format(iv interface{}, key *openpgp.Entity) (s []byte, c *Signed, err error) {
        doc, err := FormatStruct(iv)
        if err != nil {
@@ -241,17 +242,15 @@ func Format(iv interface{}, key *openpgp.Entity) (s []byte, c *Signed, err error
        return
 }
 
-// verify an epoint document, return the cleaned version as well
-func Verify(c *Signed, key openpgp.KeyRing) (err error) {
+// Verify an epoint document, return the cleaned version as well
+func Verify(c *Signed, keys openpgp.KeyRing) (err error) {
        msg := bytes.NewBuffer(c.Body)
        sig := bytes.NewBuffer(c.Signature)
-       // TODO: verify signature
-       _, _ = msg, sig
-       //      _, err = openpgp.CheckArmoredDetachedSignature(key, msg, sig)
+       _, err = openpgp.CheckArmoredDetachedSignature(keys, msg, sig)
        return
 }
 
-// sign body with given secret key
+// Sign body with given secret key
 func Sign(body []byte, key *openpgp.Entity) (c *Signed, err error) {
        c = new(Signed)
        c.Hash = "SHA256"
@@ -470,7 +469,7 @@ func parseStruct(v reflect.Value, fields map[string]string, seen map[string]bool
                        fv.SetString(val)
                case "int":
                        var val int64
-                       val, err = strconv.Atoi64(s)
+                       val, err = strconv.ParseInt(s, 10, 64)
                        fv.SetInt(val)
                case "date":
                        var val int64
@@ -494,6 +493,7 @@ func parseStruct(v reflect.Value, fields map[string]string, seen map[string]bool
        return
 }
 
+// ParseStruct parses an epoint document and returns a struct representation
 func ParseStruct(doc *Document) (iv interface{}, err error) {
        switch doc.Type {
        case "Draft":
@@ -559,7 +559,7 @@ func formatStruct(v reflect.Value, doc *Document) (err error) {
                case "text":
                        val = formatString(fv.String())
                case "int":
-                       val = strconv.Itoa64(fv.Int())
+                       val = strconv.FormatInt(fv.Int(), 10)
                case "date":
                        val = formatDate(fv.Int())
                case "ids":
@@ -580,7 +580,7 @@ func formatStruct(v reflect.Value, doc *Document) (err error) {
        return
 }
 
-// turn a struct into a document
+// FormatStruct turns a struct into a document
 func FormatStruct(iv interface{}) (doc *Document, err error) {
        v := reflect.ValueOf(iv)
        if v.Kind() != reflect.Ptr || v.IsNil() || v.Elem().Kind() != reflect.Struct {
@@ -593,6 +593,7 @@ func FormatStruct(iv interface{}) (doc *Document, err error) {
        return
 }
 
+// ParseFields parses a key value sequence into a fields map
 func ParseFields(s []byte) (fields map[string]string, rest []byte, err error) {
        rest = s
        fields = make(map[string]string)
@@ -674,11 +675,11 @@ func parseDate(s string) (int64, error) {
        if err != nil {
                return 0, err
        }
-       return t.Seconds(), nil
+       return t.Unix(), nil
 }
 
 func formatDate(i int64) string {
-       return time.SecondsToUTC(i).Format(time.RFC3339)
+       return time.Unix(i,0).UTC().Format(time.RFC3339)
 }
 
 func getLine(data []byte) (line, rest []byte) {