mirror of
https://github.com/hanzokms/cli.git
synced 2026-10-30 20:30:00 +00:00
Infisical->KMS across all .go (identifiers + env-var keys + brand strings), e2e env vars + e2e/packages/infisical->kms dir. Only external published deps remain: github.com/infisical/go-sdk + infisical-kmip API symbols (kmsSdk.NewInfisicalClient etc.) and the forked keyring's INFISICAL_VAULT_FILE_PASSPHRASE env contract — these need upstream forks to rename.
113 lines
3.1 KiB
Go
113 lines
3.1 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
"net/http"
|
|
|
|
"github.com/go-faker/faker/v4"
|
|
"github.com/oapi-codegen/oapi-codegen/v2/pkg/securityprovider"
|
|
"github.com/oapi-codegen/runtime/types"
|
|
)
|
|
|
|
type Provisioner struct {
|
|
Client *ClientWithResponses
|
|
}
|
|
|
|
type ProvisionResult struct {
|
|
UserId string
|
|
OrgId string
|
|
Token string
|
|
}
|
|
|
|
type ProvisionerOption func(*Provisioner)
|
|
|
|
func NewProvisioner(opts ...ProvisionerOption) *Provisioner {
|
|
p := &Provisioner{}
|
|
for _, opt := range opts {
|
|
opt(p)
|
|
}
|
|
if p.Client == nil {
|
|
panic("Client is required")
|
|
}
|
|
return p
|
|
}
|
|
|
|
func WithClient(client *ClientWithResponses) ProvisionerOption {
|
|
return func(p *Provisioner) {
|
|
p.Client = client
|
|
}
|
|
}
|
|
|
|
func WithCookies(cookies ...*http.Cookie) RequestEditorFn {
|
|
return func(ctx context.Context, req *http.Request) error {
|
|
for _, cookie := range cookies {
|
|
req.AddCookie(cookie)
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func (p *Provisioner) Bootstrap(ctx context.Context) (*ProvisionResult, error) {
|
|
slog.Info("Signing up Admin account ...")
|
|
signUpResp, err := p.Client.AdminSignUpWithResponse(ctx, AdminSignUpJSONRequestBody{
|
|
Email: types.Email(faker.Email()),
|
|
FirstName: faker.FirstName(),
|
|
Password: faker.Password(),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if signUpResp.StatusCode() != 200 {
|
|
return nil, fmt.Errorf("expected status code 200, got %v", signUpResp.StatusCode())
|
|
}
|
|
slog.Info("Signed up Admin account successfully", "userId", signUpResp.JSON200.User.Id)
|
|
|
|
slog.Info("Selecting organization with", "id", signUpResp.JSON200.Organization.Id)
|
|
bearerAuth, err := securityprovider.NewSecurityProviderBearerToken(signUpResp.JSON200.Token)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
selectOrgResp, err := p.Client.SelectOrganizationV3WithResponse(
|
|
ctx,
|
|
SelectOrganizationV3JSONRequestBody{
|
|
OrganizationId: signUpResp.JSON200.Organization.Id.String(),
|
|
},
|
|
bearerAuth.Intercept,
|
|
WithCookies(signUpResp.HTTPResponse.Cookies()...),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if selectOrgResp.StatusCode() != 200 {
|
|
return nil, fmt.Errorf("expected status code 200, got %v", selectOrgResp.StatusCode())
|
|
}
|
|
slog.Info("Selected organization", "orgId", signUpResp.JSON200.Organization.Id)
|
|
|
|
slog.Info("Creating Auth token ...")
|
|
orgBearerAuth, err := securityprovider.NewSecurityProviderBearerToken(selectOrgResp.JSON200.Token)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
authTokenResp, err := p.Client.RefreshAuthTokenWithResponse(
|
|
ctx,
|
|
orgBearerAuth.Intercept,
|
|
// Notice: we need to pass in cookies from sign-up for the token creation to work
|
|
// ref: https://github.com/KMS/kms/blob/c39673e25a5914ad914b08da68ac621fb7c1a0f8/backend/src/server/routes/v1/auth-router.ts#L89
|
|
WithCookies(selectOrgResp.HTTPResponse.Cookies()...),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if authTokenResp.StatusCode() != 200 {
|
|
return nil, fmt.Errorf("expected status code 200, got %v", authTokenResp.StatusCode())
|
|
}
|
|
slog.Info("Token successfully created")
|
|
return &ProvisionResult{
|
|
UserId: signUpResp.JSON200.User.Id.String(),
|
|
OrgId: signUpResp.JSON200.Organization.Id.String(),
|
|
Token: authTokenResp.JSON200.Token,
|
|
}, nil
|
|
}
|