"epoint/document"
"epoint/key"
"epoint/store"
+ "flag"
"fmt"
"io"
"log"
"strconv"
)
-// TODO: store documents, query document by id, easy submit
+// TODO: create certby/ draftby/
+// TODO: query document by id, easy submit
var db *store.Conn
-const usage = `usage: ./epoint-client [i|h|d|r|q|s|v|c] [args..] < [seed|document]
-server is http://localhost:8080 by default
+const usage = `usage: ./epoint-client [flags] [i|h|d|r|q|s|v|c] [args..] < [seed|document]
+flags - one of -help, -dir rootdir, -server serveraddr
i - make issuer key, use seed for generation, args: denomination
h - make holder key, use seed for generation, args: issuer
d - make draft, use seed for signing key, args: targetid value
r - sign raw document, use seed for signing key, args: document
-q - query document, args: k|d|c id [server]
-s - submit a (key|draft|cert) document, args: k|d|c [server]
+q - query document, args: k|d|c id
+s - submit a (key|draft|cert) document, args: k|d|c
v - verify a document (prints body of the document if ok)
-c - connect to server and get server key, args: [server]
+c - connect to server and get server key
`
+var (
+ rootdir = flag.String("dir", "", "root dir for storage, empty sets a sane default")
+ server = flag.String("server", "http://localhost:8080", "server address")
+ // TODO: verbose
+)
+
func rnd(n int) (r []byte, err error) {
r = make([]byte, n)
_, err = io.ReadFull(rand.Reader, r)
log.Printf("found %s in local store", id)
return
}
- resp, err := http.Get(server+"/"+k+"/"+id)
+ resp, err := http.Get(server + "/" + k + "/" + id)
if err != nil {
return
}
if err != nil {
return
}
+ if cmd == "k" {
+ // TODO: signed reply?
+ return
+ }
cert, s, err := document.Parse(b)
if err != nil {
return
// TODO: commmon code with server
func initstore(dir string) (db *store.Conn, err error) {
- log.Printf("using root dir %s", dir)
+ // log.Printf("using root dir %s", dir)
db, err = store.Open(dir)
if err != nil {
return
if err != nil {
return
}
- err = db.Ensure("certby/key")
+ err = db.Ensure("certby/key.issuer")
if err != nil {
return
}
- err = db.Ensure("certby/key.serial")
+ err = db.Ensure("certby/key.issuer.serial")
if err != nil {
return
}
return b
}
+func cmdargs() (cmd string, args []string) {
+ a := flag.Args()
+ cmd = a[0]
+ args = a[1:]
+ return
+}
+
func main() {
- if len(os.Args) < 2 {
+ flag.Parse()
+ if flag.NArg() < 1 {
log.Fatal(usage)
}
+ cmd, args := cmdargs()
var err error
- db, err = initstore(storedir())
- server := "http://localhost:8080"
- switch os.Args[1] {
+ dir := *rootdir
+ if dir == "" {
+ dir = storedir()
+ }
+ db, err = initstore(dir)
+ switch cmd {
case "h", "i":
- if len(os.Args) != 3 {
+ if len(args) != 1 {
log.Fatal(usage)
}
- err = k(read(), os.Args[1], os.Args[2])
+ err = k(read(), cmd, args[0])
case "d":
- if len(os.Args) != 4 {
+ if len(args) != 2 {
log.Fatal(usage)
}
- err = d(read(), os.Args[2], os.Args[3])
+ err = d(read(), args[0], args[1])
case "r":
- if len(os.Args) != 3 {
+ if len(os.Args) != 1 {
log.Fatal(usage)
}
- err = raw(read(), os.Args[2])
+ err = raw(read(), args[0])
case "q":
- cmd := ""
- id := ""
- if len(os.Args) == 5 {
- cmd = os.Args[2]
- id = os.Args[3]
- server = os.Args[4]
- } else if len(os.Args) == 4 {
- cmd = os.Args[2]
- id = os.Args[3]
- } else {
+ if len(args) != 2 {
log.Fatal(usage)
}
- err = q(cmd, id, server)
+ err = q(args[0], args[1], *server)
case "s":
- cmd := ""
- if len(os.Args) == 4 {
- cmd = os.Args[2]
- server = os.Args[3]
- } else if len(os.Args) == 3 {
- cmd = os.Args[2]
- } else {
+ if len(args) != 1 {
log.Fatal(usage)
}
- err = s(read(), cmd, server)
+ err = s(read(), args[0], *server)
case "v":
- if len(os.Args) != 2 {
+ if len(args) != 0 {
log.Fatal(usage)
}
err = v(read())
case "c":
- if len(os.Args) == 3 {
- server = os.Args[2]
- } else if len(os.Args) != 2 {
+ if len(args) != 0 {
log.Fatal(usage)
}
- err = c(server)
+ err = c(*server)
default:
log.Fatal(usage)
}