113 lines
2.9 KiB
Go
113 lines
2.9 KiB
Go
// Copyright IBM Corp. 2020, 2026
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package password
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/hashicorp/boundary/internal/auth/password/store"
|
|
"github.com/hashicorp/boundary/internal/db/timestamp"
|
|
"github.com/hashicorp/boundary/internal/errors"
|
|
"github.com/hashicorp/boundary/internal/oplog"
|
|
"github.com/hashicorp/boundary/internal/types/resource"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
// An Account contains a user name. It is owned by an auth method.
|
|
type Account struct {
|
|
*store.Account
|
|
tableName string
|
|
|
|
// CredentialId is included when Authenticate or ChangePassword is
|
|
// called. A new CredentialId is generated when a password is changed.
|
|
CredentialId string `gorm:"->"`
|
|
}
|
|
|
|
func allocAccount() *Account {
|
|
return &Account{
|
|
Account: &store.Account{},
|
|
}
|
|
}
|
|
|
|
// NewAccount creates a new in memory Account. LoginName, name, and
|
|
// description are the only valid options. All other options are ignored.
|
|
func NewAccount(ctx context.Context, authMethodId string, opt ...Option) (*Account, error) {
|
|
const op = "password.NewAccount"
|
|
// NOTE(mgaffney): The scopeId in the embedded *store.Account is
|
|
// populated by a trigger in the database.
|
|
if authMethodId == "" {
|
|
return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id")
|
|
}
|
|
|
|
opts := GetOpts(opt...)
|
|
a := &Account{
|
|
Account: &store.Account{
|
|
AuthMethodId: authMethodId,
|
|
LoginName: opts.WithLoginName,
|
|
Name: opts.withName,
|
|
Description: opts.withDescription,
|
|
},
|
|
}
|
|
return a, nil
|
|
}
|
|
|
|
func (a *Account) clone() *Account {
|
|
cp := proto.Clone(a.Account)
|
|
return &Account{
|
|
Account: cp.(*store.Account),
|
|
}
|
|
}
|
|
|
|
// TableName returns the table name.
|
|
func (a *Account) TableName() string {
|
|
if a.tableName != "" {
|
|
return a.tableName
|
|
}
|
|
return "auth_password_account"
|
|
}
|
|
|
|
// SetTableName sets the table name.
|
|
func (a *Account) SetTableName(n string) {
|
|
a.tableName = n
|
|
}
|
|
|
|
// GetResourceType returns the resource type of the Account
|
|
func (a *Account) GetResourceType() resource.Type {
|
|
return resource.Account
|
|
}
|
|
|
|
// GetEmail returns the email, which will always be empty as this type doesn't
|
|
// currently support email
|
|
func (a *Account) GetEmail() string {
|
|
return ""
|
|
}
|
|
|
|
// GetSubject returns the subject, which will always be empty as this type
|
|
// doesn't currently support subject
|
|
func (a *Account) GetSubject() string {
|
|
return ""
|
|
}
|
|
|
|
func (a *Account) oplog(op oplog.OpType) oplog.Metadata {
|
|
metadata := oplog.Metadata{
|
|
"resource-public-id": []string{a.GetPublicId()},
|
|
"resource-type": []string{"password account"},
|
|
"op-type": []string{op.String()},
|
|
}
|
|
if a.AuthMethodId != "" {
|
|
metadata["auth-method-id"] = []string{a.AuthMethodId}
|
|
}
|
|
return metadata
|
|
}
|
|
|
|
type deletedAccount struct {
|
|
PublicId string `gorm:"primary_key"`
|
|
DeleteTime *timestamp.Timestamp
|
|
}
|
|
|
|
// TableName returns the tablename to override the default gorm table name
|
|
func (s *deletedAccount) TableName() string {
|
|
return "auth_password_account_deleted"
|
|
}
|