Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | add role to file manifest testimony signed by author, or auditor, etc. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
a3307626647e86a2d1b9e0433643f3d8 |
User & Date: | dnc 2019-05-27 13:33:02 |
Context
2019-05-27
| ||
13:54 | model: improved documentation check-in: 8618055a5e user: dnc tags: trunk | |
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 | |
Changes
Changes to cmd/hancock/manifest.go.
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
..
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() {
command.RegisterOperation(command.Operation{
Handler: manifestMain,
Name: "manifest",
Syntax: "manifest [-r] <file or directory> [...]",
Description: "Creates summaries of a files, suitable for signing.",
})
}
func manifestMain() error {
recurseFlag := command.OperationFlagSet.Bool("r", false, "descend into directories, processing all files")
err := command.OperationFlagSet.Parse(command.Args()[1:])
if err != nil {
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()
................................................................................
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 {
|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
..
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
// expected by `hancock-sign`. package main import ( "fmt" "os" "path/filepath" "strings" "time" "github.com/pkg/errors" "src.d10.dev/command" "src.d10.dev/hancock/model" ) func init() { command.RegisterOperation(command.Operation{ Handler: manifestMain, Name: "manifest", Syntax: "manifest [-r] [-role=<role>] <file or directory> [...]", Description: "Creates summaries of a files, suitable for signing.", }) } func manifestMain() error { recurseFlag := command.OperationFlagSet.Bool("r", false, "descend into directories, processing all files") roleFlag := command.OperationFlagSet.String("role", "", "indicates relationship to source (i.e. author or auditor)") err := command.OperationFlagSet.Parse(command.Args()[1:]) if err != nil { return err } // validate flags var role model.Role if *roleFlag != "" { roleNames := make([]string, 0, model.RoleCount) for i := 1; i < model.RoleCount; i++ { if strings.EqualFold(*roleFlag, model.Role(i).String()) { role = model.Role(i) break } roleNames = append(roleNames, model.Role(i).String()) } if role == model.RoleUnknown { return fmt.Errorf("Unexpected role (%q). Supported roles: %s. Omit -role flag for %q.", *roleFlag, strings.Join(roleNames, ", "), model.RoleUnknown.String()) } } 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() ................................................................................ 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 manifest.Role = role // encoded manifest to stdout fmt.Println(mustEncode(manifest)) return nil // continue walk }) if err == noRecurse { |
Changes to cmd/hancock/verify.go.
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
// 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 |
| | |
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
// 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 %s (%q) as %q on %s", filepath, manifest.Role, authority.name, manifest.Path, t.Format(time.RFC850)) } else { command.Infof("%q authenticated by %s (%q) on %s", filepath, manifest.Role, 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 |
Changes to model/manifest.go.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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
}
|
> > > > > > > > > > > > > > > > > > > > > < |
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import ( "encoding/json" "io" "os" "time" ) // Role is the relationship the testifier has to the source. type Role int const ( RoleUnknown Role = iota // zero // Author role indicates testimony provided by the author of the source. Author // Auditor role indicates testimony by a third party who has inspected the source. Auditor // Dependent role indicates testimony by a developer who includes the source as a dependency. Dependent // How many roles? RoleCount int = iota ) //go:generate stringer -type=Role type FileManifest struct { CID CID `json:"cid"` Path string `json:"path,omitempty"` Role Role `json:"role"` Time int64 `json:"timestamp"` } func NewFileManifest(path string) (*FileManifest, error) { f, err := os.Open(path) if err != nil { return nil, err } |