func handleSysEnableAuth( core *vault.Core, w http.ResponseWriter, r *http.Request, path string) { // Parse the request if we can var req EnableAuthRequest if err := parseRequest(r, &req); err != nil { respondError(w, http.StatusBadRequest, err) return } _, err := core.HandleRequest(requestAuth(r, &logical.Request{ Operation: logical.WriteOperation, Path: "sys/auth/" + path, Data: map[string]interface{}{ "type": req.Type, "description": req.Description, }, })) if err != nil { respondError(w, http.StatusInternalServerError, err) return } respondOk(w, nil) }
func handleSysRevokePrefix(core *vault.Core) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != "PUT" { respondError(w, http.StatusMethodNotAllowed, nil) return } // Determine the path... prefix := "/v1/sys/revoke-prefix/" if !strings.HasPrefix(r.URL.Path, prefix) { respondError(w, http.StatusNotFound, nil) return } path := r.URL.Path[len(prefix):] if path == "" { respondError(w, http.StatusNotFound, nil) return } _, err := core.HandleRequest(requestAuth(r, &logical.Request{ Operation: logical.WriteOperation, Path: "sys/revoke-prefix/" + path, Connection: getConnection(r), })) if err != nil { respondError(w, http.StatusBadRequest, err) return } respondOk(w, nil) }) }
func handleSysRemount(core *vault.Core) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.Method { case "PUT", "POST": default: respondError(w, http.StatusMethodNotAllowed, nil) return } // Parse the request if we can var req RemountRequest if err := parseRequest(r, &req); err != nil { respondError(w, http.StatusBadRequest, err) return } _, err := core.HandleRequest(requestAuth(r, &logical.Request{ Operation: logical.WriteOperation, Path: "sys/remount", Data: map[string]interface{}{ "from": req.From, "to": req.To, }, })) if err != nil { respondError(w, http.StatusInternalServerError, err) return } respondOk(w, nil) }) }
// request is a helper to perform a request and properly exit in the // case of an error. func request(core *vault.Core, w http.ResponseWriter, rawReq *http.Request, r *logical.Request) (*logical.Response, bool) { resp, err := core.HandleRequest(r) if errwrap.Contains(err, vault.ErrStandby.Error()) { respondStandby(core, w, rawReq.URL) return resp, false } if respondErrorCommon(w, resp, err) { return resp, false } return resp, true }
// request is a helper to perform a request and properly exit in the // case of an error. func request(core *vault.Core, w http.ResponseWriter, rawReq *http.Request, r *logical.Request) (*logical.Response, bool) { resp, err := core.HandleRequest(r) if err == vault.ErrStandby { respondStandby(core, w, rawReq.URL) return resp, false } if respondCommon(w, resp, err) { return resp, false } if err != nil { respondError(w, http.StatusInternalServerError, err) return resp, false } return resp, true }
func handleSysDisableAuth( core *vault.Core, w http.ResponseWriter, r *http.Request, path string) { _, err := core.HandleRequest(requestAuth(r, &logical.Request{ Operation: logical.DeleteOperation, Path: "sys/auth/" + path, })) if err != nil { respondError(w, http.StatusInternalServerError, err) return } respondOk(w, nil) }
func handleHelp(core *vault.Core, w http.ResponseWriter, req *http.Request) { path, ok := stripPrefix("/v1/", req.URL.Path) if !ok { respondError(w, http.StatusNotFound, nil) return } resp, err := core.HandleRequest(requestAuth(req, &logical.Request{ Operation: logical.HelpOperation, Path: path, })) if err != nil { respondError(w, http.StatusInternalServerError, err) return } respondOk(w, resp.Data) }
func handleSysKeyStatus(core *vault.Core) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { respondError(w, http.StatusMethodNotAllowed, nil) return } resp, err := core.HandleRequest(requestAuth(r, &logical.Request{ Operation: logical.ReadOperation, Path: "sys/key-status", Connection: getConnection(r), })) if err != nil { respondError(w, http.StatusInternalServerError, err) return } respondOk(w, resp.Data) }) }
func handleHelp(core *vault.Core, w http.ResponseWriter, req *http.Request) { path, ok := stripPrefix("/v1/", req.URL.Path) if !ok { respondError(w, http.StatusNotFound, nil) return } lreq := requestAuth(core, req, &logical.Request{ Operation: logical.HelpOperation, Path: path, Connection: getConnection(req), }) resp, err := core.HandleRequest(lreq) if err != nil { respondErrorCommon(w, resp, err) return } respondOk(w, resp.Data) }
func handleSysRotate(core *vault.Core) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.Method { case "POST": case "PUT": default: respondError(w, http.StatusMethodNotAllowed, nil) return } _, err := core.HandleRequest(requestAuth(r, &logical.Request{ Operation: logical.WriteOperation, Path: "sys/rotate", Connection: getConnection(r), })) if err != nil { respondError(w, http.StatusInternalServerError, err) return } respondOk(w, nil) }) }
func (c *ServerCommand) enableDev(core *vault.Core, rootTokenID string) (*vault.InitResult, error) { // Initialize it with a basic single key init, err := core.Initialize(&vault.SealConfig{ SecretShares: 1, SecretThreshold: 1, }, nil) if err != nil { return nil, err } // Copy the key so that it can be zeroed key := make([]byte, len(init.SecretShares[0])) copy(key, init.SecretShares[0]) // Unseal the core unsealed, err := core.Unseal(key) if err != nil { return nil, err } if !unsealed { return nil, fmt.Errorf("failed to unseal Vault for dev mode") } if rootTokenID != "" { req := &logical.Request{ Operation: logical.UpdateOperation, ClientToken: init.RootToken, Path: "auth/token/create", Data: map[string]interface{}{ "id": rootTokenID, "policies": []string{"root"}, "no_parent": true, "no_default_policy": true, }, } resp, err := core.HandleRequest(req) if err != nil { return nil, fmt.Errorf("failed to create root token with ID %s: %s", rootTokenID, err) } if resp == nil { return nil, fmt.Errorf("nil response when creating root token with ID %s", rootTokenID) } if resp.Auth == nil { return nil, fmt.Errorf("nil auth when creating root token with ID %s", rootTokenID) } init.RootToken = resp.Auth.ClientToken req.Path = "auth/token/revoke-self" req.Data = nil resp, err = core.HandleRequest(req) if err != nil { return nil, fmt.Errorf("failed to revoke initial root token: %s", err) } } // Set the token tokenHelper, err := c.TokenHelper() if err != nil { return nil, err } if err := tokenHelper.Store(init.RootToken); err != nil { return nil, err } return init, nil }
func (c *ServerCommand) enableDev(core *vault.Core, rootTokenID string) (*vault.InitResult, error) { // Initialize it with a basic single key init, err := core.Initialize(&vault.InitParams{ BarrierConfig: &vault.SealConfig{ SecretShares: 1, SecretThreshold: 1, }, RecoveryConfig: nil, }) if err != nil { return nil, err } // Copy the key so that it can be zeroed key := make([]byte, len(init.SecretShares[0])) copy(key, init.SecretShares[0]) // Unseal the core unsealed, err := core.Unseal(key) if err != nil { return nil, err } if !unsealed { return nil, fmt.Errorf("failed to unseal Vault for dev mode") } isLeader, _, err := core.Leader() if err != nil && err != vault.ErrHANotEnabled { return nil, fmt.Errorf("failed to check active status: %v", err) } if err == nil { leaderCount := 5 for !isLeader { if leaderCount == 0 { buf := make([]byte, 1<<16) runtime.Stack(buf, true) return nil, fmt.Errorf("failed to get active status after five seconds; call stack is\n%s\n", buf) } time.Sleep(1 * time.Second) isLeader, _, err = core.Leader() if err != nil { return nil, fmt.Errorf("failed to check active status: %v", err) } leaderCount-- } } if rootTokenID != "" { req := &logical.Request{ ID: "dev-gen-root", Operation: logical.UpdateOperation, ClientToken: init.RootToken, Path: "auth/token/create", Data: map[string]interface{}{ "id": rootTokenID, "policies": []string{"root"}, "no_parent": true, "no_default_policy": true, }, } resp, err := core.HandleRequest(req) if err != nil { return nil, fmt.Errorf("failed to create root token with ID %s: %s", rootTokenID, err) } if resp == nil { return nil, fmt.Errorf("nil response when creating root token with ID %s", rootTokenID) } if resp.Auth == nil { return nil, fmt.Errorf("nil auth when creating root token with ID %s", rootTokenID) } init.RootToken = resp.Auth.ClientToken req.ID = "dev-revoke-init-root" req.Path = "auth/token/revoke-self" req.Data = nil resp, err = core.HandleRequest(req) if err != nil { return nil, fmt.Errorf("failed to revoke initial root token: %s", err) } } // Set the token tokenHelper, err := c.TokenHelper() if err != nil { return nil, err } if err := tokenHelper.Store(init.RootToken); err != nil { return nil, err } return init, nil }