| // Copyright (c) HashiCorp, Inc. |
| // SPDX-License-Identifier: MPL-2.0 |
| |
| package api |
| |
| import ( |
| "context" |
| "encoding/json" |
| "errors" |
| "net/http" |
| "time" |
| ) |
| |
| func (c *Sys) Rotate() error { |
| return c.RotateWithContext(context.Background()) |
| } |
| |
| func (c *Sys) RotateWithContext(ctx context.Context) error { |
| ctx, cancelFunc := c.c.withConfiguredTimeout(ctx) |
| defer cancelFunc() |
| |
| r := c.c.NewRequest(http.MethodPost, "/v1/sys/rotate") |
| |
| resp, err := c.c.rawRequestWithContext(ctx, r) |
| if err == nil { |
| defer resp.Body.Close() |
| } |
| return err |
| } |
| |
| func (c *Sys) KeyStatus() (*KeyStatus, error) { |
| return c.KeyStatusWithContext(context.Background()) |
| } |
| |
| func (c *Sys) KeyStatusWithContext(ctx context.Context) (*KeyStatus, error) { |
| ctx, cancelFunc := c.c.withConfiguredTimeout(ctx) |
| defer cancelFunc() |
| |
| r := c.c.NewRequest(http.MethodGet, "/v1/sys/key-status") |
| |
| resp, err := c.c.rawRequestWithContext(ctx, r) |
| if err != nil { |
| return nil, err |
| } |
| defer resp.Body.Close() |
| |
| secret, err := ParseSecret(resp.Body) |
| if err != nil { |
| return nil, err |
| } |
| if secret == nil || secret.Data == nil { |
| return nil, errors.New("data from server response is empty") |
| } |
| |
| var result KeyStatus |
| |
| termRaw, ok := secret.Data["term"] |
| if !ok { |
| return nil, errors.New("term not found in response") |
| } |
| term, ok := termRaw.(json.Number) |
| if !ok { |
| return nil, errors.New("could not convert term to a number") |
| } |
| term64, err := term.Int64() |
| if err != nil { |
| return nil, err |
| } |
| result.Term = int(term64) |
| |
| installTimeRaw, ok := secret.Data["install_time"] |
| if !ok { |
| return nil, errors.New("install_time not found in response") |
| } |
| installTimeStr, ok := installTimeRaw.(string) |
| if !ok { |
| return nil, errors.New("could not convert install_time to a string") |
| } |
| installTime, err := time.Parse(time.RFC3339Nano, installTimeStr) |
| if err != nil { |
| return nil, err |
| } |
| result.InstallTime = installTime |
| |
| encryptionsRaw, ok := secret.Data["encryptions"] |
| if ok { |
| encryptions, ok := encryptionsRaw.(json.Number) |
| if !ok { |
| return nil, errors.New("could not convert encryptions to a number") |
| } |
| encryptions64, err := encryptions.Int64() |
| if err != nil { |
| return nil, err |
| } |
| result.Encryptions = int(encryptions64) |
| } |
| |
| return &result, err |
| } |
| |
| type KeyStatus struct { |
| Term int `json:"term"` |
| InstallTime time.Time `json:"install_time"` |
| Encryptions int `json:"encryptions"` |
| } |