hancock

Check-in [ea88da5a23]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:add timestamp to file manifest
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: ea88da5a2317bc39820c88a059e6235a22f8d7593a3a06d5320c99c4b5eda19b
User & Date: dnc 2019-05-24 16:15:52
Context
2019-05-27
13:33
add role to file manifest testimony signed by author, or auditor, etc. check-in: a330762664 user: dnc tags: trunk
2019-05-24
16:15
add timestamp to file manifest check-in: ea88da5a23 user: dnc tags: trunk
2019-05-23
16:53
go mod compatibility check-in: ee9d5b8297 user: dnc tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to cmd/hancock/manifest.go.

22
23
24
25
26
27
28

29
30
31
32
33
34
35
..
48
49
50
51
52
53
54


55
56
57
58
59
60
61
..
68
69
70
71
72
73
74

75
76
77
78
79
80
81
// expected by `hancock-sign`.
package main

import (
	"fmt"
	"os"
	"path/filepath"


	"github.com/pkg/errors"
	"src.d10.dev/command"
	"src.d10.dev/hancock/model"
)

func init() {
................................................................................
		return err
	}
	if len(command.OperationFlagSet.Args()) == 0 {
		return errors.New("Expected <file or directory> parameter.")
	}

	noRecurse := errors.New("no recurse") // prepare for filepath.Walk



	for _, arg := range command.OperationFlagSet.Args() {
		err = filepath.Walk(arg, func(filepath string, info os.FileInfo, err error) error {
			if err != nil {
				command.Error(err) // log error
				return nil         // continue walk
			}
................................................................................
			}

			manifest, err := model.NewFileManifest(filepath)
			if err != nil {
				command.Error(err) // log error
				return nil         // continue walk
			}


			// encoded manifest to stdout
			fmt.Println(mustEncode(manifest))

			return nil // continue walk
		})
		if err == noRecurse {







>







 







>
>







 







>







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
..
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
..
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// expected by `hancock-sign`.
package main

import (
	"fmt"
	"os"
	"path/filepath"
	"time"

	"github.com/pkg/errors"
	"src.d10.dev/command"
	"src.d10.dev/hancock/model"
)

func init() {
................................................................................
		return err
	}
	if len(command.OperationFlagSet.Args()) == 0 {
		return errors.New("Expected <file or directory> parameter.")
	}

	noRecurse := errors.New("no recurse") // prepare for filepath.Walk

	timestamp := time.Now().Unix()

	for _, arg := range command.OperationFlagSet.Args() {
		err = filepath.Walk(arg, func(filepath string, info os.FileInfo, err error) error {
			if err != nil {
				command.Error(err) // log error
				return nil         // continue walk
			}
................................................................................
			}

			manifest, err := model.NewFileManifest(filepath)
			if err != nil {
				command.Error(err) // log error
				return nil         // continue walk
			}
			manifest.Time = timestamp // give all manifests the same timestamp

			// encoded manifest to stdout
			fmt.Println(mustEncode(manifest))

			return nil // continue walk
		})
		if err == noRecurse {

Changes to cmd/hancock/verify.go.

197
198
199
200
201
202
203






204


205
206
207
208
209
210
211

							// path check is disabled because an identical file may appear in more than one place.  TODO(dnc) fix this, or enable strict mode
							//if manifest.Path != filepath {
							//	command.Infof("path mismatch (local: %q, testimony: %q)", filepath, manifest.Path)
							//	continue
							//}







							command.V(1).Infof("%q authenticated by %q", filepath, authority.name)


							verified = true // TODO(dnc): consider a count of weighted authorities, rather than simple verified or not
						default:
							command.V(2).Info(filepath, u.String(), resp.Status)
							continue
						} // end ipfs status
					default:
						command.V(2).Info(filepath, u.String(), resp.Status)







>
>
>
>
>
>
|
>
>







197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219

							// path check is disabled because an identical file may appear in more than one place.  TODO(dnc) fix this, or enable strict mode
							//if manifest.Path != filepath {
							//	command.Infof("path mismatch (local: %q, testimony: %q)", filepath, manifest.Path)
							//	continue
							//}

							if command.V(1) {
								t := time.Unix(manifest.Time, 0)
								// TODO(dnc) format time in friendly "days ago" syntax
								if filepath != manifest.Path {
									command.Infof("%q authenticated by %q as %q on %s", filepath, authority.name, manifest.Path, t.Format(time.RFC850))
								} else {
									command.Infof("%q authenticated by %q on %s", filepath, authority.name, t.Format(time.RFC850))
								}
							}
							verified = true // TODO(dnc): consider a count of weighted authorities, rather than simple verified or not
						default:
							command.V(2).Info(filepath, u.String(), resp.Status)
							continue
						} // end ipfs status
					default:
						command.V(2).Info(filepath, u.String(), resp.Status)

Changes to model/manifest.go.

15
16
17
18
19
20
21

22
23
24
25

26
27
28
29
30
31
32
..
35
36
37
38
39
40
41
42




43
44
45
46
47
48
49
50
51

package model

import (
	"encoding/json"
	"io"
	"os"

)

type FileManifest struct {
	Path string `json:"path,omitempty"`

	CID  CID    `json:"cid"`
}

func NewFileManifest(path string) (*FileManifest, error) {
	f, err := os.Open(path)
	if err != nil {
		return nil, err
................................................................................

	cid := NewSha256CID(nil)
	_, err = io.Copy(cid, f)
	if err != nil {
		return nil, err
	}

	return &FileManifest{Path: path, CID: cid.Encode()}, nil




}

func mustJSON(v interface{}) string {
	enc, err := json.MarshalIndent(v, "", "\t")
	if err != nil {
		panic(err)
	}
	return string(enc)
}







>




>







 







|
>
>
>
>









15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
..
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

package model

import (
	"encoding/json"
	"io"
	"os"
	"time"
)

type FileManifest struct {
	Path string `json:"path,omitempty"`
	Time int64  `json:"timestamp"`
	CID  CID    `json:"cid"`
}

func NewFileManifest(path string) (*FileManifest, error) {
	f, err := os.Open(path)
	if err != nil {
		return nil, err
................................................................................

	cid := NewSha256CID(nil)
	_, err = io.Copy(cid, f)
	if err != nil {
		return nil, err
	}

	return &FileManifest{
		Path: path,
		Time: time.Now().Unix(),
		CID:  cid.Encode(),
	}, nil
}

func mustJSON(v interface{}) string {
	enc, err := json.MarshalIndent(v, "", "\t")
	if err != nil {
		panic(err)
	}
	return string(enc)
}