diff --git a/client/client.go b/client/client.go index 4255dd0..92ebac2 100644 --- a/client/client.go +++ b/client/client.go @@ -106,6 +106,20 @@ func unmarshalResponseData(respBytes []byte) (*core.ResponseData, error) { return response, nil } +func unmarshalOwnersData(respBytes []byte) (*core.OwnersData, error) { + response := new(core.OwnersData) + err := json.Unmarshal(respBytes, response) + if err != nil { + return nil, err + } + + if response.Status != "ok" { + return nil, errors.New(response.Status) + } + + return response, nil +} + // Create creates an admin account at the remote server func (c *RemoteServer) Create(req core.CreateRequest) (*core.ResponseData, error) { reqBytes, err := json.Marshal(req) @@ -284,6 +298,21 @@ func (c *RemoteServer) Password(req []byte) (*core.ResponseData, error) { return unmarshalResponseData(respBytes) } +// Owners issues an Owners request to the remote server +func (c *RemoteServer) Owners(req core.OwnersRequest) (*core.OwnersData, error) { + reqBytes, err := json.Marshal(req) + if err != nil { + return nil, err + } + + respBytes, err := c.doAction("owners", reqBytes) + if err != nil { + return nil, err + } + + return unmarshalOwnersData(respBytes) +} + // Order issues an order request to the remote server func (c *RemoteServer) Order(req core.OrderRequest) (*core.ResponseData, error) { reqBytes, err := json.Marshal(req) diff --git a/cmd/ro/main.go b/cmd/ro/main.go index 1e6fa96..2bd2ff6 100644 --- a/cmd/ro/main.go +++ b/cmd/ro/main.go @@ -21,7 +21,7 @@ var action, user, pswd, userEnv, pswdEnv, server, caPath string var owners, lefters, righters, inPath, labels, outPath, outEnv string -var uses int +var uses, minUsers int var duration, users string @@ -42,6 +42,7 @@ var commandSet = map[string]command{ "decrypt": command{Run: runDecrypt, Desc: "decrypt a file"}, "re-encrypt": command{Run: runReEncrypt, Desc: "re-encrypt a file"}, "order": command{Run: runOrder, Desc: "place an order for delegations"}, + "owners": command{Run: runOwner, Desc: "show owners list"}, } func registerFlags() { @@ -50,6 +51,7 @@ func registerFlags() { flag.StringVar(&owners, "owners", "", "comma separated owner list") flag.StringVar(&users, "users", "", "comma separated user list") flag.IntVar(&uses, "uses", 0, "number of delegated key uses") + flag.IntVar(&minUsers, "minUsers", 2, "minimum number of delegations") flag.StringVar(&duration, "time", "0h", "duration of delegated key uses") flag.StringVar(&lefters, "left", "", "comma separated left owners") flag.StringVar(&righters, "right", "", "comma separated right owners") @@ -131,6 +133,7 @@ func runEncrypt() { req := core.EncryptRequest{ Name: user, Password: pswd, + Minimum: minUsers, Owners: processCSL(owners), LeftOwners: processCSL(lefters), RightOwners: processCSL(righters), @@ -241,6 +244,21 @@ func runOrder() { fmt.Println(resp.Status) } +func runOwner() { + inBytes, err := ioutil.ReadFile(inPath) + processError(err) + + req := core.OwnersRequest{ + Data: inBytes, + } + + resp, err := roServer.Owners(req) + processError(err) + + fmt.Println(resp.Status) + fmt.Println(resp) +} + func main() { flag.Usage = func() { fmt.Println("Usage: ro [options] subcommand")