From 9443fdbf7ac1c55d44730e42f6805df2060ffd63 Mon Sep 17 00:00:00 2001 From: J Delaney Date: Fri, 9 Oct 2015 13:00:08 -0700 Subject: [PATCH] Add dedicated API for creating users --- client/client.go | 15 ++++++++++++++ core/core.go | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ redoctober.go | 23 +++++++++++----------- 3 files changed, 78 insertions(+), 11 deletions(-) diff --git a/client/client.go b/client/client.go index ad19101..abb18f3 100644 --- a/client/client.go +++ b/client/client.go @@ -149,6 +149,21 @@ func (c *RemoteServer) Delegate(req core.DelegateRequest) (*core.ResponseData, e return unmarshalResponseData(respBytes) } +// CreateUser issues a create-user request to the remote server +func (c *RemoteServer) CreateUser(req core.CreateUserRequest) (*core.ResponseData, error) { + reqBytes, err := json.Marshal(req) + if err != nil { + return nil, err + } + + respBytes, err := c.doAction("create-user", reqBytes) + if err != nil { + return nil, err + } + + return unmarshalResponseData(respBytes) +} + // Purge issues a purge request to the remote server func (c *RemoteServer) Purge(req core.DelegateRequest) (*core.ResponseData, error) { reqBytes, err := json.Marshal(req) diff --git a/core/core.go b/core/core.go index a645c22..dabf3f4 100644 --- a/core/core.go +++ b/core/core.go @@ -51,6 +51,12 @@ type DelegateRequest struct { Labels []string } +type CreateUserRequest struct { + Name string + Password string + UserType string +} + type PasswordRequest struct { Name string Password string @@ -338,6 +344,51 @@ func Delegate(jsonIn []byte) ([]byte, error) { return jsonStatusOk() } +// Create User processes a create-user request. +func CreateUser(jsonIn []byte) ([]byte, error) { + var s CreateUserRequest + var err error + + defer func() { + if err != nil { + log.Printf("core.create-user failed: user=%s %v", s.Name, err) + } else { + log.Printf("core.create-user success: user=%s", s.Name) + } + }() + + if err = json.Unmarshal(jsonIn, &s); err != nil { + return jsonStatusError(err) + } + + // If no UserType if provided use the default one + if s.UserType == "" { + s.UserType = passvault.DefaultRecordType + } + + if records.NumRecords() == 0 { + err = errors.New("Vault is not created yet") + return jsonStatusError(err) + } + + // Validate the Name and Password as valid + if err = validateName(s.Name, s.Password); err != nil { + return jsonStatusError(err) + } + + _, found := records.GetRecord(s.Name) + if found { + err = errors.New("User with that name already exists") + return jsonStatusError(err) + } + + if _, err = records.AddNewRecord(s.Name, s.Password, false, s.UserType); err != nil { + return jsonStatusError(err) + } + + return jsonStatusOk() +} + // Password processes a password change request. func Password(jsonIn []byte) ([]byte, error) { var err error diff --git a/redoctober.go b/redoctober.go index e70eb5b..f0877d0 100644 --- a/redoctober.go +++ b/redoctober.go @@ -27,17 +27,18 @@ import ( // List of URLs to register and their related functions var functions = map[string]func([]byte) ([]byte, error){ - "/create": core.Create, - "/summary": core.Summary, - "/purge": core.Purge, - "/delegate": core.Delegate, - "/password": core.Password, - "/encrypt": core.Encrypt, - "/re-encrypt": core.ReEncrypt, - "/decrypt": core.Decrypt, - "/owners": core.Owners, - "/modify": core.Modify, - "/export": core.Export, + "/create": core.Create, + "/summary": core.Summary, + "/purge": core.Purge, + "/delegate": core.Delegate, + "/create-user": core.CreateUser, + "/password": core.Password, + "/encrypt": core.Encrypt, + "/re-encrypt": core.ReEncrypt, + "/decrypt": core.Decrypt, + "/owners": core.Owners, + "/modify": core.Modify, + "/export": core.Export, } type userRequest struct {