* chore(deps): bump the go group across 7 directories with 5 updates Bumps the go group with 4 updates in the / directory: [github.com/coder/websocket](https://github.com/coder/websocket), [github.com/docker/docker](https://github.com/docker/docker), [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) and [mvdan.cc/gofumpt](https://github.com/mvdan/gofumpt). Bumps the go group with 2 updates in the /api directory: [github.com/coder/websocket](https://github.com/coder/websocket) and [github.com/hashicorp/boundary/sdk](https://github.com/hashicorp/boundary). Bumps the go group with 1 update in the /plugins/boundary/mains/aws directory: [github.com/hashicorp/boundary/sdk](https://github.com/hashicorp/boundary). Bumps the go group with 1 update in the /plugins/boundary/mains/azure directory: [github.com/hashicorp/boundary/sdk](https://github.com/hashicorp/boundary). Bumps the go group with 1 update in the /plugins/boundary/mains/gcp directory: [github.com/hashicorp/boundary/sdk](https://github.com/hashicorp/boundary). Bumps the go group with 1 update in the /plugins/boundary/mains/minio directory: [github.com/hashicorp/boundary/sdk](https://github.com/hashicorp/boundary). Bumps the go group with 1 update in the /sdk directory: [github.com/coder/websocket](https://github.com/coder/websocket). Updates `github.com/coder/websocket` from 1.8.13 to 1.8.14 - [Release notes](https://github.com/coder/websocket/releases) - [Commits](https://github.com/coder/websocket/compare/v1.8.13...v1.8.14) Updates `github.com/docker/docker` from 28.3.3+incompatible to 28.4.0+incompatible - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v28.3.3...v28.4.0) Updates `github.com/prometheus/client_golang` from 1.23.0 to 1.23.2 - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.23.0...v1.23.2) Updates `mvdan.cc/gofumpt` from 0.8.0 to 0.9.0 - [Release notes](https://github.com/mvdan/gofumpt/releases) - [Changelog](https://github.com/mvdan/gofumpt/blob/master/CHANGELOG.md) - [Commits](https://github.com/mvdan/gofumpt/compare/v0.8.0...v0.9.0) Updates `github.com/coder/websocket` from 1.8.13 to 1.8.14 - [Release notes](https://github.com/coder/websocket/releases) - [Commits](https://github.com/coder/websocket/compare/v1.8.13...v1.8.14) Updates `github.com/hashicorp/boundary/sdk` from 0.0.54 to 0.0.55 - [Release notes](https://github.com/hashicorp/boundary/releases) - [Changelog](https://github.com/hashicorp/boundary/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/boundary/compare/api/v0.0.54...api/v0.0.55) Updates `github.com/hashicorp/boundary/sdk` from 0.0.54 to 0.0.55 - [Release notes](https://github.com/hashicorp/boundary/releases) - [Changelog](https://github.com/hashicorp/boundary/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/boundary/compare/api/v0.0.54...api/v0.0.55) Updates `github.com/hashicorp/boundary/sdk` from 0.0.54 to 0.0.55 - [Release notes](https://github.com/hashicorp/boundary/releases) - [Changelog](https://github.com/hashicorp/boundary/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/boundary/compare/api/v0.0.54...api/v0.0.55) Updates `github.com/hashicorp/boundary/sdk` from 0.0.54 to 0.0.55 - [Release notes](https://github.com/hashicorp/boundary/releases) - [Changelog](https://github.com/hashicorp/boundary/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/boundary/compare/api/v0.0.54...api/v0.0.55) Updates `github.com/hashicorp/boundary/sdk` from 0.0.54 to 0.0.55 - [Release notes](https://github.com/hashicorp/boundary/releases) - [Changelog](https://github.com/hashicorp/boundary/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/boundary/compare/api/v0.0.54...api/v0.0.55) Updates `github.com/coder/websocket` from 1.8.13 to 1.8.14 - [Release notes](https://github.com/coder/websocket/releases) - [Commits](https://github.com/coder/websocket/compare/v1.8.13...v1.8.14) --- updated-dependencies: - dependency-name: github.com/coder/websocket dependency-version: 1.8.14 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/docker/docker dependency-version: 28.4.0+incompatible dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/prometheus/client_golang dependency-version: 1.23.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: mvdan.cc/gofumpt dependency-version: 0.9.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go - dependency-name: github.com/coder/websocket dependency-version: 1.8.14 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/hashicorp/boundary/sdk dependency-version: 0.0.55 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/hashicorp/boundary/sdk dependency-version: 0.0.55 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/hashicorp/boundary/sdk dependency-version: 0.0.55 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/hashicorp/boundary/sdk dependency-version: 0.0.55 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/hashicorp/boundary/sdk dependency-version: 0.0.55 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go - dependency-name: github.com/coder/websocket dependency-version: 1.8.14 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go ... Signed-off-by: dependabot[bot] <support@github.com> * Format files with latest gofumpt --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
164 lines
5.1 KiB
Go
164 lines
5.1 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package vault
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/hashicorp/boundary/internal/credential"
|
|
"github.com/hashicorp/boundary/internal/db"
|
|
"github.com/hashicorp/boundary/internal/errors"
|
|
"github.com/hashicorp/boundary/internal/event"
|
|
)
|
|
|
|
var _ credential.Issuer = (*Repository)(nil)
|
|
|
|
func insertQuery(c *Credential, sessionId string) (query string, queryValues []any) {
|
|
queryValues = []any{
|
|
sql.Named("public_id", c.PublicId),
|
|
sql.Named("library_id", c.LibraryId),
|
|
sql.Named("session_id", sessionId),
|
|
sql.Named("token_hmac", c.TokenHmac),
|
|
sql.Named("external_id", c.ExternalId),
|
|
sql.Named("is_renewable", c.IsRenewable),
|
|
sql.Named("status", c.Status),
|
|
sql.Named("last_renewal_time", "now()"),
|
|
}
|
|
switch {
|
|
case c.expiration == 0:
|
|
query = insertCredentialWithInfiniteExpirationQuery
|
|
default:
|
|
query = insertCredentialWithExpirationQuery
|
|
queryValues = append(queryValues, sql.Named("expiration_time", int(c.expiration.Round(time.Second).Seconds())))
|
|
}
|
|
return query, queryValues
|
|
}
|
|
|
|
func updateSessionQuery(c *Credential, sessionId string, purpose credential.Purpose) (query string, queryValues []any) {
|
|
queryValues = []any{
|
|
sql.Named("public_id", c.PublicId),
|
|
sql.Named("library_id", c.LibraryId),
|
|
sql.Named("session_id", sessionId),
|
|
sql.Named("purpose", string(purpose)),
|
|
}
|
|
query = updateSessionCredentialQuery
|
|
return query, queryValues
|
|
}
|
|
|
|
// Issue issues and returns dynamic credentials from Vault for all of the
|
|
// requests and assigns them to sessionId.
|
|
func (r *Repository) Issue(ctx context.Context, sessionId string, requests []credential.Request, opt ...credential.Option) ([]credential.Dynamic, error) {
|
|
const op = "vault.(Repository).Issue"
|
|
if sessionId == "" {
|
|
return nil, errors.New(ctx, errors.InvalidParameter, op, "no session id")
|
|
}
|
|
if len(requests) == 0 {
|
|
return nil, errors.New(ctx, errors.InvalidParameter, op, "no requests")
|
|
}
|
|
|
|
libs, err := r.getIssueCredLibraries(ctx, requests)
|
|
if err != nil {
|
|
return nil, errors.Wrap(ctx, err, op)
|
|
}
|
|
|
|
// TODO(mgaffney)(ICU-1329) 05/2021: if any error occurs, mark all credentials
|
|
// retrieved for revocation which will be handled by the revocation
|
|
// job.
|
|
|
|
var creds []credential.Dynamic
|
|
var minLease time.Duration
|
|
runJobsInterval := r.scheduler.GetRunJobsInterval()
|
|
for _, lib := range libs {
|
|
cred, err := lib.retrieveCredential(ctx, op, opt...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
creds = append(creds, cred)
|
|
if !cred.isRevokable() {
|
|
// No need to persist since the credential cannot be revoked nor renewed
|
|
continue
|
|
}
|
|
|
|
if cred.getExpiration() < runJobsInterval {
|
|
event.WriteError(ctx, op,
|
|
fmt.Errorf("WARNING: credential will expire before job scheduler can run"),
|
|
event.WithInfo("credential_public_id", cred.GetPublicId()),
|
|
event.WithInfo("credential_library_public_id", lib.GetPublicId()),
|
|
event.WithInfo("runJobsInterval", runJobsInterval.String()),
|
|
)
|
|
}
|
|
|
|
if minLease > cred.getExpiration() {
|
|
minLease = cred.getExpiration()
|
|
}
|
|
|
|
underlyingCred := cred.getCredential()
|
|
|
|
insertQuery, insertQueryValues := insertQuery(underlyingCred, sessionId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
updateQuery, updateQueryValues := updateSessionQuery(underlyingCred, sessionId, cred.Purpose())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if _, err := r.writer.DoTx(ctx, db.StdRetryCnt, db.ExpBackoff{},
|
|
func(_ db.Reader, w db.Writer) error {
|
|
rowsInserted, err := w.Exec(ctx, insertQuery, insertQueryValues)
|
|
switch {
|
|
case err != nil:
|
|
return errors.Wrap(ctx, err, op)
|
|
case rowsInserted > 1:
|
|
return errors.New(ctx, errors.MultipleRecords, op, "more than 1 credential would have been inserted")
|
|
}
|
|
|
|
rowsUpdated, err := w.Exec(ctx, updateQuery, updateQueryValues)
|
|
switch {
|
|
case err != nil:
|
|
return errors.Wrap(ctx, err, op)
|
|
case rowsUpdated == 0:
|
|
return errors.New(ctx, errors.InvalidDynamicCredential, op, "no matching dynamic credential for session found")
|
|
case rowsUpdated > 1:
|
|
return errors.New(ctx, errors.MultipleRecords, op, "more than 1 session credential would have been updated")
|
|
}
|
|
return nil
|
|
},
|
|
); err != nil {
|
|
return nil, errors.Wrap(ctx, err, op)
|
|
}
|
|
}
|
|
|
|
// Best effort update next run time of credential renewal job, but an error should not
|
|
// cause Issue to fail.
|
|
// TODO (lcr 06/2021): log error once repo has logger
|
|
_ = r.scheduler.UpdateJobNextRunInAtLeast(ctx, credentialRenewalJobName, minLease)
|
|
|
|
return creds, nil
|
|
}
|
|
|
|
var _ credential.Revoker = (*Repository)(nil)
|
|
|
|
// Revoke revokes all dynamic credentials issued from Vault for sessionId.
|
|
func (r *Repository) Revoke(ctx context.Context, sessionId string) error {
|
|
const op = "vault.(Repository).Revoke"
|
|
if sessionId == "" {
|
|
return errors.New(ctx, errors.InvalidParameter, op, "no session id")
|
|
}
|
|
|
|
_, err := r.writer.DoTx(ctx, db.StdRetryCnt, db.ExpBackoff{},
|
|
func(_ db.Reader, w db.Writer) error {
|
|
if _, err := w.Exec(ctx, revokeCredentialsQuery, []any{sessionId}); err != nil {
|
|
return errors.Wrap(ctx, err, op)
|
|
}
|
|
return nil
|
|
},
|
|
)
|
|
return err
|
|
}
|